Datasets documentation

Carregar tarefas de avaliação de agentes

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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:

ColunaTipoDescrição
namestring[task].name de task.toml (geralmente org/name), ou o nome do diretório da tarefa.
descriptionstring[task].description de task.toml.
instructionstringConteúdo de instruction.md: o que o agente deve fazer.
keywordslist de string[task].keywords de task.toml.
schema_versionstringschema_version declarado por task.toml.
configdictO arquivo task.toml completo, como um objeto JSON: [task], [metadata], [verifier], [agent], [environment], [steps]…
metadatadictA seção de [metadata] livre do task.toml.
fileslist de stringTodos os arquivos da tarefa, com caminhos relativos ao diretório da tarefa.
locationstringLocal 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': '[email protected]'}]
>>> 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
63

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

Configuração

HarborConfig aceita alguns argumentos além dos habituais de load_dataset:

  • strip_canary (padrão True): 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 como False para manter o conteúdo original do arquivo.
  • include_files (padrão True): lista todos os arquivos de cada tarefa na coluna files. Defina como False para 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

Update on GitHub