Datasets documentation
Carregar tarefas de avaliação de agentes
Carregar tarefas de avaliação de agentes
Um conjunto de dados Harbor é uma coleção de tarefas usadas para avaliar agentes de IA: cada tarefa fornece ao agente uma instrução, um ambiente sandbox para trabalhar e um verificador que pontua seu trabalho.
Diferentemente de datasets tabulares, um dataset Harbor não é um arquivo com uma linha por exemplo: cada tarefa é um diretório.
O builder harbor lê esse repositório e gera uma linha por tarefa, de modo que um benchmark pode ser explorado,
filtrado e compartilhado como qualquer outro dataset:
>>> 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
})
})Carregar um dataset do Harbor apenas lê as tarefas: ele nunca executa um agente, constrói uma imagem ou executa um verificador, e não requer que o Harbor esteja instalado. Use a biblioteca Harbor para executar as tarefas de fato.
As configurações de tarefas do Harbor são arquivos TOML. O Python 3.11 e versões posteriores os leem com a biblioteca padrão (
tomllib); no Python 3.10, é necessário instalar um parser TOML como dependência extra. Consulte o guia de instalação para saber como instalá-lo.
Estrutura do repositório
Um diretório de tarefa é identificado por dois arquivos, task.toml e instruction.md, e geralmente também contém a definição do ambiente, o verificador e uma solução oracle:
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/
└── ...Um diretório é reconhecido como um conjunto de dados do Harbor assim que um de seus subdiretórios, independentemente da profundidade, for um diretório de tarefa (um arquivo task.toml e um arquivo instruction.md lado a lado): as tarefas são encontradas automaticamente, sem a necessidade de listar nenhum arquivo.
Carregar tarefas
Como os conjuntos de dados do Harbor são compostos por diretórios em vez de arquivos de dados, eles são carregados por caminho — sem o 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")Passar data_files explicitamente também é suportado, desde que o padrão inclua os arquivos task.toml e instruction.md — um par de arquivos correspondentes gera uma linha:
>>> dataset = load_dataset(
... "/path/to/my-harbor-dataset",
... data_files={"test": ["my-tasks-dir/*/task.toml", "my-tasks-dir/*/instruction.md"]},
... )Colunas
Cada linha descreve uma tarefa:
| Coluna | Tipo | Descrição |
|---|---|---|
name | string | [task].name de task.toml (geralmente org/name), ou o nome do diretório da tarefa. |
description | string | [task].description de task.toml. |
instruction | string | Conteúdo de instruction.md: o que o agente deve fazer. |
keywords | list de string | [task].keywords de task.toml. |
schema_version | string | schema_version declarado por task.toml. |
config | dict | O arquivo task.toml completo, como um objeto JSON: [task], [metadata], [verifier], [agent], [environment], [steps]… |
metadata | dict | A seção de [metadata] livre do task.toml. |
files | list de string | Todos os arquivos da tarefa, com caminhos relativos ao diretório da tarefa. |
location | string | Local do diretório da tarefa no conjunto de dados. |
>>> 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'O arquivo task.toml completo está disponível em config, portanto, nada é perdido quando uma tarefa usa campos que não são promovidos para sua própria coluna:
>>> 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 um benchmark
Como os metadados da tarefa são carregados como um dicionário, um benchmark pode ser explorado com os métodos usuais filter() e 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']A coluna files lista tudo o que a tarefa inclui, o que é útil para verificar como uma tarefa é validada:
>>> pytest_verifiers = dataset.filter(lambda task: any(f.startswith("tests/") and f.endswith(".py") for f in task["files"]))
>>> pytest_verifiers.num_rows
63Leia os outros arquivos de uma tarefa
Apenas a instrução e a configuração de uma tarefa são carregadas como colunas: seus arquivos de ambiente, verificador e solução são listados na coluna files, como caminhos relativos ao diretório da tarefa. Combine task_id e files para abrir qualquer um deles com 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 GUIDConfiguração
HarborConfig aceita alguns argumentos além dos habituais de load_dataset:
strip_canary(padrãoTrue): remove as linhas de comentário iniciais “benchmark data canary” das instruções, da mesma forma que o Harbor faz ao enviá-las a um agente. Defina comoFalsepara manter o conteúdo original do arquivo.include_files(padrãoTrue): lista todos os arquivos de cada tarefa na colunafiles. Defina comoFalsepara pular a listagem dos diretórios das tarefas, o que é mais rápido quando o conjunto de dados está em um sistema de arquivos remoto ou possui milhares de arquivos por tarefa.
As tarefas também podem ser transmitidas em streaming, o que evita o download de todo o benchmark antecipadamente:
>>> from datasets import load_dataset
>>> dataset = load_dataset("harborframework/terminal-bench", streaming=True)
>>> for task in dataset["test"]:
... print(task["name"])Veja também
- A documentação de referência de Harbor e HarborConfig.
- A documentação do Harbor para executar as tarefas de um benchmark com agentes e verificadores.