Datasets documentation
Cargar tareas de evaluación de agentes
Cargar tareas de evaluación de agentes
Un conjunto de datos de Harbor es una colección de tareas utilizadas para evaluar agentes de IA: cada tarea proporciona al agente una instrucción, un entorno aislado en el que trabajar y un verificador que puntúa su trabajo.
A diferencia de los conjuntos de datos tabulares, un conjunto de datos de Harbor no es un archivo con una fila por ejemplo: cada tarea es un directorio.
El constructor harbor lee dicho repositorio y genera una fila por tarea, de modo que un benchmark puede explorarse,
filtrarse y compartirse como cualquier otro conjunto de datos:
>>> from datasets import load_dataset
>>> dataset = load_dataset("harborframework/terminal-bench")
>>> dataset
DatasetDict({
test: Dataset({
features: ['name', 'instruction', 'description', 'keywords', 'schema_version', 'config', 'metadata', 'files', 'location'],
num_rows: 66
})
})Cargar un conjunto de datos de Harbor solo lee las tareas: nunca ejecuta un agente, construye una imagen ni ejecuta un verificador, y no requiere que Harbor esté instalado. Utilice la biblioteca Harbor para ejecutar realmente las tareas.
Las configuraciones de tareas de Harbor son archivos TOML. Python 3.11 y versiones posteriores los leen con la biblioteca estándar (
tomllib); en Python 3.10, es necesario instalar un analizador TOML como dependencia adicional. Consulta la guía de instalación para aprender a instalarlo.
Estructura del repositorio
Un directorio de tareas se identifica por dos archivos, task.toml y instruction.md, y normalmente también contiene la definición del entorno, el verificador y una solución oráculo:
my-harbor-dataset/
├── README.md
└── tasks/
├── task-a/
│ ├── task.toml # configuration: metadata, resources, timeouts...
│ ├── instruction.md # what the agent is asked to do
│ ├── README.md # optional human-readable description
│ ├── environment/ # Dockerfile / docker-compose.yaml + files of the sandbox
│ ├── tests/ # verifier
│ └── solution/ # oracle solution
└── task-b/
└── ...Un directorio se reconoce como un conjunto de datos de Harbor en cuanto uno de sus subdirectorios, sin importar su profundidad, sea un directorio de tarea (un archivo task.toml y un archivo instruction.md en el mismo nivel): las tareas se encuentran automáticamente, sin necesidad de enumerar ningún archivo.
Cargar tareas
Dado que los conjuntos de datos de Harbor están compuestos por directorios en lugar de archivos de datos, se cargan por path: no se necesita el argumento data_files:
>>> from datasets import load_dataset
>>> # a dataset repository on the Hub
>>> dataset = load_dataset("harborframework/terminal-bench")
>>> # a local directory of tasks
>>> dataset = load_dataset("/path/to/my-harbor-dataset")
>>> # the tasks of a repository that are in a sub-directory
>>> dataset = load_dataset("harborframework/terminal-bench", data_dir="tasks")También se admite pasar data_files de forma explícita, siempre que el patrón incluya los archivos task.toml y instruction.md: un par de archivos coincidentes genera una fila:
>>> dataset = load_dataset(
... "/path/to/my-harbor-dataset",
... data_files={"test": ["my-tasks-dir/*/task.toml", "my-tasks-dir/*/instruction.md"]},
... )Columnas
Cada fila describe una tarea:
| Columna | Tipo | Descripción |
|---|---|---|
name | string | [task].name de task.toml (normalmente org/name), o el nombre del directorio de la tarea. |
description | string | [task].description de task.toml. |
instruction | string | Contenido de instruction.md: lo que debe hacer el agente. |
keywords | list de string | [task].keywords de task.toml. |
schema_version | string | schema_version declarado por task.toml. |
config | dict | El archivo completo task.toml, como un objeto JSON: [task], [metadata], [verifier], [agent], [environment], [steps]… |
metadata | dict | La sección de [metadata] libre de task.toml. |
files | list de string | Todos los archivos de la tarea, con rutas relativas al directorio de la tarea. |
location | string | Ubicación del directorio de la tarea en el conjunto de datos. |
>>> dataset = load_dataset("harborframework/terminal-bench", split="test")
>>> dataset[0]["name"]
'terminal-bench/atrx-vep-crispr'
>>> dataset[0]["instruction"][:90]
'You are provided with a region of genomic DNA representing the human ATRX locus plus sequence'
>>> dataset[0]["config"]["task"]["authors"]
[{'name': 'ScaleAI', 'email': 'tbench@scale.com'}]
>>> dataset[0]["metadata"]["category"]
'Science'
>>> dataset[0]["config"]["environment"]
{'build_timeout_sec': 1800.0, 'cpus': 2, 'memory_mb': 4096, 'storage_mb': 10240, 'gpus': 0}
>>> dataset[0]["files"][:4]
['LICENSE.md', 'README.md', 'environment/Dockerfile', 'environment/data/CDS-information.txt']
>>> dataset[0]["location"]
'tasks/atrx-vep-crispr'Todo el task.toml está disponible en config, por lo que no se pierde nada cuando una tarea utiliza campos que no se han promovido a su propia columna:
>>> dataset = dataset.map(lambda task: {"timeout_min": task["config"]["verifier"]["timeout_sec"] / 60})
>>> sorted(set(dataset["timeout_min"]))[:6]
[1.0, 2.0, 3.0, 4.0, 5.0, 7.0]Filtrar un benchmark
Dado que los metadatos de la tarea se cargan como un diccionario, un benchmark puede explorarse con los métodos habituales filter() y map():
>>> security_tasks = dataset.filter(lambda task: task["metadata"].get("category") == "Security")
>>> [task["name"] for task in security_tasks]
['terminal-bench/formal-crypto', 'terminal-bench/html-js-filter', 'terminal-bench/interleaved-vigenere', 'terminal-bench/shadow-relay', 'terminal-bench/uefi-bootkit']La columna files enumera todo lo que incluye la tarea, lo cual resulta útil para ver cómo se verifica una tarea:
>>> pytest_verifiers = dataset.filter(lambda task: any(f.startswith("tests/") and f.endswith(".py") for f in task["files"]))
>>> pytest_verifiers.num_rows
63Leer los otros archivos de una tarea
Solo se cargan como columnas la instrucción y la configuración de una tarea: sus archivos de entorno, verificador y solución se enumeran en la columna files, como rutas relativas al directorio de la tarea. Combina task_id y files para abrir cualquiera de ellos con fsspec:
>>> from huggingface_hub import hffs
>>> dataset_path = "hf://datasets/harborframework/terminal-bench"
>>> with hffs.open(f"{dataset_path}/tasks/cumulative-layout-shift/environment/Dockerfile", "r") as f:
... print(f.read()[:20])
'# harbor-canary GUIDConfiguración
HarborConfig acepta algunos argumentos además de los habituales de load_dataset:
strip_canary(por defectoTrue): elimina las líneas de comentario iniciales de “benchmark data canary” de las instrucciones, de la misma manera que lo hace Harbor cuando las envía a un agente. Establécelo enFalsepara conservar el contenido original del archivo.include_files(por defectoTrue): lista todos los archivos de cada tarea en la columnafiles. Establézcalo enFalsepara omitir la lista de los directorios de las tareas, lo cual es más rápido cuando el conjunto de datos está en un sistema de archivos remoto o tiene miles de archivos por tarea.
Las tareas también se pueden transmitir en streaming, lo que evita descargar todo el benchmark de antemano:
>>> from datasets import load_dataset
>>> dataset = load_dataset("harborframework/terminal-bench", streaming=True)
>>> for task in dataset["test"]:
... print(task["name"])Véase también
- La documentación de referencia de Harbor y HarborConfig.
- La documentación de Harbor para ejecutar las tareas de un benchmark con agentes y verificadores.