Datasets documentation

Cargar tareas de evaluación de agentes

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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:

ColumnaTipoDescripción
namestring[task].name de task.toml (normalmente org/name), o el nombre del directorio de la tarea.
descriptionstring[task].description de task.toml.
instructionstringContenido de instruction.md: lo que debe hacer el agente.
keywordslist de string[task].keywords de task.toml.
schema_versionstringschema_version declarado por task.toml.
configdictEl archivo completo task.toml, como un objeto JSON: [task], [metadata], [verifier], [agent], [environment], [steps]…
metadatadictLa sección de [metadata] libre de task.toml.
fileslist de stringTodos los archivos de la tarea, con rutas relativas al directorio de la tarea.
locationstringUbicació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
63

Leer 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 GUID

Configuración

HarborConfig acepta algunos argumentos además de los habituales de load_dataset:

  • strip_canary (por defecto True): 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 en False para conservar el contenido original del archivo.
  • include_files (por defecto True): lista todos los archivos de cada tarea en la columna files. Establézcalo en False para 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

Update on GitHub