Delegación de subagentes y procesamiento por lotes de Hermes Agent

Este capítulo presenta dos capacidades de procesamiento paralelo de Hermes: la delegación de subagentes permite que un agente principal distribuya tareas a múltiples subagentes para que se ejecuten en paralelo, y el sistema de procesamiento por lotes puede ejecutar agentes en paralelo sobre cientos de prompts y generar datos de entrenamiento estructurados.


Delegación de subagentes y paralelismo

Hermes admite delegar tareas del agente principal a subagentes para lograr flujos de trabajo paralelos.

Los subagentes se implementan mediante eldelegationconjunto de herramientas:

Ejemplo

# Ruta del archivo: ~/.hermes/config.yaml
# Asegúrate de que el conjunto de herramientas delegation esté habilitado
toolsets
:
 - delegation

El agente principal utilizaspawn_agentospawn_parallella herramienta para generar subagentes.

El siguiente pseudocódigo ilustra el mecanismo de delegación paralela:

Ejemplo

# Mecanismo de delegación paralela del agente en la sesión (pseudocódigo, explica el principio)
# spawn_parallel lanza múltiples subagentes a la vez, cada uno se ejecuta de forma independiente

spawn_parallel([
  {"prompt": "Analiza los datos de ventas del primer trimestre y genera un informe de tendencias"},
  {"prompt": "Analiza los datos de ventas del segundo trimestre y genera un informe de tendencias"},
  {"prompt": "Analiza los datos de ventas del tercer trimestre y genera un informe de tendencias"}
])
# Los tres subagentes trabajan en paralelo, los resultados se agregan y se devuelven al agente principal

Tareas en segundo plano

Inicia tareas en segundo plano directamente en la sesión:

Ejemplo

# Iniciar una tarea en segundo plano en la sesión
/background verifica todos los servidores e informa sobre las caídas

Colaboración multiagente con Kanban

El conjunto de herramientas Kanban proporciona una colaboración multiagente más estructurada: un agente orquestador distribuye las tareas al tablero, y varios agentes trabajadores las reclaman y ejecutan:

Ejemplo

# Habilitar el conjunto de herramientas kanban (requiere habilitación explícita; all/* tampoco lo activa automáticamente)
hermes tools enable kanban

# Agrega descripciones de rol al Perfil para que el orquestador conozca las capacidades de cada agente
hermes profile create researcher \
  --description "Capaz de leer código fuente y documentación externa, y producir informes de investigación"
hermes profile create coder \
  --description "Capaz de implementar funciones, corregir errores y escribir pruebas"

El conjunto de herramientas Kanban debe habilitarse explícitamente: ni siquiera all o * lo activan automáticamente. Esto es un diseño intencional, porque la colaboración multiagente consume más tokens.


Procesamiento por lotes y generación de datos de entrenamiento para RL

El procesamiento por lotes te permite ejecutar agentes en paralelo sobre cientos o miles de prompts, generando datos de trayectoria estructurados, principalmente para la generación de datos de entrenamiento de ajuste fino de modelos y para evaluación.

Inicio rápido

Ejemplo

# Preparar un conjunto de datos de prompts en formato JSONL
cat data/prompts.jsonl
# {"prompt": "Escribe una función en Python para encontrar la subcadena palindrómica más larga"}
# {"prompt": "Crea un endpoint de API REST de autenticación de usuarios con Flask"}
# {"prompt": "Depura este error: TypeError: cannot unpack non-iterable"}

# Ejecutar el procesamiento por lotes
python batch_runner.py \
    --dataset_file=data/prompts.jsonl \
    --batch_size=10 \
    --run_name=my_first_run \
    --model=anthropic/claude-sonnet-4-6 \
    --num_workers=4

# Reanudar tareas interrumpidas desde un punto de control
python batch_runner.py \
    --dataset_file=data/prompts.jsonl \
    --batch_size=10 \
    --run_name=my_first_run \
    --resume

Formato del conjunto de datos

Cada línea es un objeto JSON, debe contener elpromptcampo, y opcionalmente puede incluir contexto adicional:

Ejemplo

{"prompt": "Escribe una función en Python para encontrar palíndromos"}
{"prompt": "Depura este error", "cwd": "/home/user/project", "docker_image": "python:3.12"}

Parámetros principales

ParámetroValor por defectoDescripción
--dataset_fileObligatorioRuta del conjunto de datos JSONL
--batch_sizeObligatorioNúmero de prompts por lote
--run_nameObligatorioNombre de la ejecución (para el directorio de salida y la reanudación desde un punto de control)
--modelclaude-sonnet-4.6Modelo utilizado
--num_workers4Número de procesos de trabajo en paralelo
--max_turns10Máximo de rondas de llamadas a herramientas por prompt
--distribution"default"Distribución de conjuntos de herramientas (muestreo aleatorio de diferentes combinaciones de herramientas)
--reasoning_effort—Nivel de esfuerzo de razonamiento: none/minimal/low/medium/high/xhigh
--resumefalseReanudar desde un punto de control

Estructura de salida

El procesamiento por lotes genera la siguiente estructura de directorios:

data/my_first_run/
├── trajectories.jsonl    # 最终合并输出(所有批次)
├── batch_0.jsonl         # 各批次结果
├── batch_1.jsonl
├── checkpoint.json       # 断点续传记录
└── statistics.json       # 工具使用统计

Cada trayectoria se genera en formato ShareGPT, e incluye el historial completo de conversación, los registros de llamadas a herramientas y las estadísticas de cobertura de razonamiento:

Ejemplo

{
  "prompt_index": 42,
  "conversations": [
{"from": "human", "value": "Escribe una función para encontrar palíndromos..."},
{"from": "gpt", "value": "Voy a crear esta función...",
     "tool_calls": [{"name": "terminal", "arguments": {...}}]},
{"from": "tool", "value": "...resultado de la ejecución..."},
{"from": "gpt", "value": "Esta es la función completa..."}
  ],
  "completed": true,
  "toolsets_used": ["terminal", "file"],
  "tool_stats": {
    "terminal": {"count": 2, "success": 2, "failure": 0}
  }
}

Filtrado de calidad

Al finalizar la ejecución por lotes, se aplican automáticamente dos filtros:

Elemento de filtroReglaPropósito
Filtro de cero razonamientoSe descartan las muestras sin ningún rastro de razonamientoAsegura que la salida incluya el proceso de pensamiento, mejorando la calidad de los datos de entrenamiento
Filtro de nombres de herramientas alucinadosSe filtran las entradas que contienen llamadas a herramientas que no están en la lista de herramientas válidasExcluye las llamadas a herramientas no válidas generadas por alucinaciones del modelo

Los rastros de razonamiento se refieren a la marca <REASONING_SCRATCHPAD> o a los thinking tokens nativos. Los datos filtrados son más adecuados para el ajuste fino de modelos.

Integración con el entorno RL de Atropos

El procesamiento por lotes puede generar directamente datos de entrenamiento compatibles con Atropos:

Ejemplo

# Generar datos de entrenamiento compatibles con Atropos
python batch_runner.py \
    --dataset_file=data/coding_tasks.jsonl \
    --run_name=atropos_run \
    --model=nous-hermes-3.1 \
    --num_workers=8 \
    --reasoning_effort=high

# El trajectories.jsonl generado se puede usar directamente como entrada de entrenamiento para Atropos
Otras extensiones