Como Usar AgentTrove: Stream de 1.7M Trajetórias Agênticas

A Nova Fronteira do Ajuste Fino de Agentes: O que é o AgentTrove?

O ecossistema de Inteligência Artificial tem passado por uma transição fundamental: o foco mudou de modelos estáticos de chat para sistemas agênticos dinâmicos. No entanto, o treinamento desses agentes autônomos sempre enfrentou um gargalo crítico: a escassez de dados de alta qualidade sobre trajetórias de interação multi-turn (múltiplos turnos) com chamadas de ferramentas (tool use), execução de código e raciocínio intermediário (Chain-of-Thought).

É aqui que entra o AgentTrove, a maior coleção de código aberto de trajetórias de interação agêntica do mundo, contendo impressionantes 1.7 milhão de registros estruturados em um formato compatível com o padrão ShareGPT. Esse volume massivo de dados permite que desenvolvedores e pesquisadores realizem o ajuste fino supervisionado (SFT – Supervised Fine-Tuning) de Large Language Models (LLMs) para que eles se tornem agentes robustos, capazes de planejar, executar ferramentas e corrigir seus próprios erros com base no feedback do ambiente.

Neste guia técnico aprofundado, vamos explorar como manipular o AgentTrove utilizando Python. Em vez de realizar o download de centenas de gigabytes de dados de uma só vez, aprenderemos a realizar o streaming eficiente dos dados diretamente do Hugging Face, normalizar os turnos de conversação dos agentes, filtrar trajetórias com base em métricas de sucesso e exportar um dataset de SFT limpo e otimizado.

A Anatomia de 1.7 Milhão de Trajetórias: Estrutura do AgentTrove

Como Usar AgentTrove: Stream de 1.7M Trajetórias Agênticas
Asset por Computerizer via Pixabay

Para treinar um agente de forma eficaz, o modelo precisa aprender não apenas a dar a resposta correta, mas também a seguir um fluxo lógico que envolve:

  • Pensamento (Thought): O raciocínio interno sobre qual deve ser o próximo passo.
  • Ação (Action): A chamada de uma ferramenta específica com parâmetros definidos.
  • Observação (Observation): O retorno gerado pelo ambiente ou pela ferramenta executada.

O AgentTrove organiza essas interações complexas em um formato linearizado baseado no ShareGPT. Cada linha do dataset representa uma sessão completa de um agente tentando resolver uma tarefa (uma “trajetória”).

Comparativo de Estruturas: SFT Tradicional vs. SFT Agêntico (AgentTrove)

A tabela abaixo detalha as diferenças fundamentais entre os datasets de instrução convencionais e a estrutura rica fornecida pelo AgentTrove:

Característica Dataset SFT Tradicional (ex: Alpaca) Dataset Agêntico (AgentTrove)
Fluxo de Conversa Par único: Instrução -> Resposta Multi-turn complexo: Usuário -> Pensamento -> Chamada de Ferramenta -> Resposta do Sistema -> Resposta Final
Feedback do Ambiente Inexistente Integrado diretamente nos turnos do sistema (tool output)
Metadados de Sucesso Não aplicável Contém recompensas (rewards) e status de execução (sucesso/falha)
Volume de Dados Geralmente de 10k a 100k exemplos 1.7 milhão de trajetórias completas

Streaming de Grandes Datasets: Otimizando o Pipeline com Python

Trabalhar com datasets da magnitude do AgentTrove exige eficiência de hardware. Fazer o download completo do dataset para o disco local antes do processamento pode ser inviável devido a limitações de armazenamento e largura de banda. A biblioteca datasets do Hugging Face resolve esse problema por meio do recurso de streaming.

Ao definir streaming=True, os dados são carregados sob demanda (lazy loading), permitindo que você processe, filtre e salve os exemplos linha por linha com consumo mínimo de memória RAM.

Abaixo, apresentamos o código inicial para configurar o streaming do AgentTrove e inspecionar a estrutura nativa dos dados:

from datasets import load_dataset

# Definindo o identificador do dataset no Hugging Face (exemplo ilustrativo de carregamento)
dataset_id = "ServiceNow/AgentTrove"

try:
    # Carregando o dataset em modo streaming para otimização de memória
    streaming_dataset = load_dataset(dataset_id, streaming=True, split="train")
    print("[-] Conexão com o AgentTrove estabelecida com sucesso via streaming!")
    
    # Obtendo o primeiro registro para análise de esquema
    first_record = next(iter(streaming_dataset))
    print("\n[+] Estrutura das chaves do primeiro registro:")
    print(first_record.keys())
except Exception as e:
    print(f"[!] Erro ao carregar o dataset: {e}")

Normalização de Turnos de Agente e Extração de Comandos

Como Usar AgentTrove: Stream de 1.7M Trajetórias Agênticas
Asset por flutie8211 via Pixabay

Os dados brutos do AgentTrove podem conter diferentes formatações dependendo do ambiente em que o agente foi executado (por exemplo, chamadas de API em JSON, comandos Bash puros ou blocos de código Python). Para treinar um modelo de linguagem de forma consistente, é altamente recomendável normalizar esses turnos para um padrão limpo e unificado.

No padrão ShareGPT, os papéis (roles) dos participantes da conversa são simplificados para:

  • system: Define as diretrizes, ferramentas disponíveis e comportamento do agente.
  • human: A entrada do usuário ou a pergunta inicial do problema.
  • gpt: O raciocínio do modelo, geração de pensamentos e chamadas de ferramentas.
  • tool: O resultado retornado pela execução da ferramenta que o modelo chamou.

O script a seguir demonstra como criar uma função de normalização que analisa os dados brutos e os converte em uma estrutura ShareGPT limpa e padronizada:

import json
from typing import Dict, Any, List

def normalize_agent_trajectory(raw_record: Dict[str, Any]) -> List[Dict[str, str]]:
    """
    Normaliza um registro bruto do AgentTrove para o formato unificado ShareGPT.
    """
    normalized_conversation = []
    
    # Extração e normalização do prompt do sistema, se disponível
    system_prompt = raw_record.get("system_prompt", "Você é um assistente de IA prestativo equipado com ferramentas.")
    normalized_conversation.append({"from": "system", "value": system_prompt})
    
    # Processamento dos turnos de conversação
    raw_turns = raw_record.get("conversations", [])
    for turn in raw_turns:
        role = turn.get("from", "").lower()
        value = turn.get("value", "")
        
        # Mapeamento e limpeza de papéis
        if role in ["user", "human"]:
            normalized_conversation.append({"from": "human", "value": value})
        elif role in ["assistant", "gpt", "agent"]:
            normalized_conversation.append({"from": "gpt", "value": value})
        elif role in ["tool", "observation", "system_response"]:
            normalized_conversation.append({"from": "tool", "value": value})
            
    return normalized_conversation

# Exemplo de teste com um dicionário simulado
sample_raw = {
    "system_prompt": "Você tem acesso à ferramenta de calculadora.",
    "conversations": [
        {"from": "human", "value": "Quanto é 15 * 15?"},
        {"from": "gpt", "value": "Pensamento: Preciso multiplicar 15 por 15. Vou usar a calculadora.\nAction: calc(15 * 15)"},
        {"from": "tool", "value": "225"},
        {"from": "gpt", "value": "O resultado de 15 * 15 é 225."}
    ]
}

normalized_sample = normalize_agent_trajectory(sample_raw)
print(json.dumps(normalized_sample, indent=2, ensure_ascii=False))

Filtragem Avançada: Isolando Trajetórias de Sucesso para SFT de Alta Performance

Um dos maiores erros ao realizar o ajuste fino de LLMs para tarefas agênticas é treinar o modelo em trajetórias onde o agente falhou em resolver o problema. Se você alimentar o modelo com caminhos errados, ele aprenderá a repetir esses comportamentos ineficientes ou erráticos (alucinações).

Por isso, o processo de curadoria de dados deve aplicar filtros rigorosos para extrair apenas as trajetórias bem-sucedidas. No AgentTrove, os registros geralmente vêm acompanhados de metadados de recompensa (reward) ou indicadores de sucesso (success, is_solved). Uma trajetória ideal para SFT deve possuir:

  1. Uma pontuação de recompensa igual a 1.0 (ou o valor máximo definido pelo ambiente).
  2. Uma sequência lógica que termina com uma resposta conclusiva, evitando loops infinitos de chamadas de ferramentas.
  3. Ausência de erros críticos de sintaxe no código gerado pelo agente durante a trajetória.

Abaixo, criamos uma função utilitária que avalia se uma trajetória atende aos critérios de qualidade exigidos para o treinamento:

def is_high_quality_trajectory(raw_record: Dict[str, Any], min_reward: float = 1.0) -> bool:
    """
    Avalia se a trajetória do agente foi bem-sucedida e atende aos requisitos de qualidade.
    """
    # Verifica o indicador de recompensa ou sucesso nos metadados
    reward = raw_record.get("reward", 0.0)
    is_solved = raw_record.get("is_solved", None)
    
    # Se houver flag explícita de conclusão de tarefa
    if is_solved is False:
        return False
        
    # Filtragem com base na recompensa numérica
    if reward < min_reward:
        return False
        
    # Evitar trajetórias excessivamente longas que indicam loops de repetição de ferramentas
    conversations = raw_record.get("conversations", [])
    if len(conversations) > 30:
        return False
        
    # Evitar trajetórias vazias ou sem interação real
    if len(conversations) < 2:
        return False
        
    return True

Construindo o Dataset SFT Final no Padrão ShareGPT

Com as funções de streaming, normalização e filtragem prontas, podemos consolidar tudo em um pipeline de dados unificado. Este pipeline irá consumir o fluxo do AgentTrove em tempo real, filtrar as trajetórias de sucesso, normalizá-las e exportá-las para um arquivo local no formato JSON Lines (JSONL), pronto para ser consumido por frameworks de treinamento de ponta como Axolotl, LLaMA-Factory ou Hugging Face TRL (SFTTrainer).

import json
from datasets import load_dataset

def build_clean_sft_dataset(output_filepath: str, max_samples: int = 5000):
    """
    Executa o pipeline completo de streaming, filtragem, normalização e exportação.
    """
    print(f"[-] Iniciando pipeline de processamento de dados do AgentTrove...")
    
    # Carregando o dataset original em modo streaming
    try:
        dataset = load_dataset("ServiceNow/AgentTrove", streaming=True, split="train")
    except Exception as e:
        print(f"[!] Erro de conexão com Hugging Face: {e}")
        return

    saved_count = 0
    processed_count = 0
    
    with open(output_filepath, "w", encoding="utf-8") as outfile:
        for record in dataset:
            processed_count += 1
            
            # Aplicando filtros de qualidade e sucesso
            if is_high_quality_trajectory(record):
                # Normalizando o formato para ShareGPT
                normalized_conv = normalize_agent_trajectory(record)
                
                # Estruturando o objeto de saída final
                sft_entry = {
                    "id": f"agenttrove_{processed_count}",
                    "conversations": normalized_conv
                }
                
                # Escrevendo no arquivo JSONL
                outfile.write(json.dumps(sft_entry, ensure_ascii=False) + "\n")
                saved_count += 1
                
                if saved_count % 500 == 0:
                    print(f"[+] {saved_count} trajetórias limpas salvas com sucesso.")
            
            # Interrompe o processo ao atingir o limite de amostras desejado
            if saved_count >= max_samples:
                break
                
    print(f"\n[✓] Pipeline concluído!")
    print(f"Total de registros analisados: {processed_count}")
    print(f"Total de trajetórias SFT limpas e salvas: {saved_count}")
    print(f"Arquivo de saída gerado: {output_filepath}")

# Execução do pipeline para gerar 1000 amostras limpas de treinamento
# build_clean_sft_dataset("agenttrove_sft_clean.jsonl", max_samples=1000)

Impacto Prático e Próximos Passos no Treinamento de LLMs Agênticos

Ao final da execução deste pipeline, você terá em mãos um arquivo perfeitamente estruturado contendo milhares de exemplos de agentes de IA agindo de forma racional e bem-sucedida para resolver problemas complexos. Esse dataset é o combustível ideal para realizar o ajuste fino de modelos menores, como o LLaMA-3-8B ou Mistral-7B, transformando-os de meros assistentes de escrita em agentes autônomos de alta capacidade.

Durante o processo de treinamento (SFT), certifique-se de configurar as máscaras de perda (loss masks) corretamente para calcular a perda apenas nos turnos gerados pelo assistente (gpt), ignorando as respostas do ambiente (tool) e as instruções do usuário (human). Isso garante que o modelo aprenda a gerar as ações corretas com base no contexto, sem tentar prever as respostas que o ambiente externo deve fornecer.

As informações originais e a base teórica deste framework foram detalhadas no Artigo de Origem.

📚 Fontes E Referências

  1. How to Use AgentTrove: Streaming 1.7M Agentic Traces and Building a Clean ShareGPT SFT Dataset in PythonPortal Internacional

Deixe um comentário