Délégation de sous-agents et traitement par lots avec Hermes Agent

Ce chapitre présente les deux capacités de traitement parallèle d'Hermes : la délégation de sous-agents, qui permet à un agent principal de répartir des tâches entre plusieurs sous-agents pour une exécution parallèle, et un système de traitement par lots capable d'exécuter des agents en parallèle sur des centaines de prompts et de générer des données d'entraînement structurées.


Délégation de sous-agents et parallélisme

Hermes prend en charge la délégation de tâches de l'agent principal vers des sous-agents, ce qui permet des flux de travail parallèles.

Sous-agents viadelegationImplémentation du jeu d'outils :

Exemple

# Chemin du fichier : ~/.hermes/config.yaml
# Assurez-vous que le jeu d'outils delegation est activé
toolsets
:
 - delegation

L'agent principal utilisespawn_agentouspawn_parallelAgent dérivé d'un outil.

Le pseudo-code suivant illustre le mécanisme de délégation parallèle :

Exemple

# Le mécanisme de délégation parallèle de l'Agent dans les sessions (pseudo-code, expliquant le principe)
# spawn_parallel distribue plusieurs sous-agents simultanément, chacun s'exécutant indépendamment.

spawn_parallel([
  {"prompt": "Analyser les données de ventes du T1 et générer un rapport de tendance"},
  {"prompt": "Analyser les données de ventes du T2 et générer un rapport de tendance"},
  {"prompt": "Analyser les données de ventes du T3 et générer un rapport de tendance"}
])
# Trois sous-agents travaillent en parallèle, les résultats sont agrégés et renvoyés à l'Agent principal

Tâche en arrière-plan

Démarrer directement les tâches en arrière-plan dans la session :

Exemple

# Démarrer une tâche en arrière-plan dans la session
/background vérifier tous les serveurs et signaler les indisponibilités

Collaboration multi-agents Kanban

L’ensemble d’outils Kanban offre une collaboration multi-agents plus structurée — un Agent orchestrateur distribue les tâches au tableau, et plusieurs Agents travailleurs les réclament et les exécutent :

Exemple

# Activer l’ensemble d’outils kanban (nécessite une activation explicite ; all/* ne l’activera pas automatiquement)
hermes tools enable kanban

# Ajouter des descriptions de rôle au Profile afin que l’orchestrateur connaisse les capacités de chaque Agent.
hermes profile create researcher \
  --description "Compétent pour lire le code source et la documentation externe, produire des rapports de recherche"
hermes profile create coder \
  --description "Compétent pour implémenter des fonctionnalités, corriger des bugs et écrire des tests"

L’ensemble d’outils Kanban doit être explicitement activé — même all ou * ne l’activera pas automatiquement. C’est une conception intentionnelle, car la collaboration multi-agents consomme plus de tokens.


Traitement par lots et génération de données d’entraînement RL

Le traitement par lots vous permet d’exécuter des agents en parallèle sur des centaines ou des milliers de prompts, en générant des données de trajectoire structurées — principalement utilisées pour la génération de données d’entraînement pour le fine-tuning de modèles et l’évaluation.

Démarrage rapide

Exemple

# Préparer un jeu de données de prompts au format JSONL
cat data/prompts.jsonl
# {"prompt": "Écrire une fonction Python pour trouver la plus longue sous-chaîne palindromique"}
# {"prompt": "Créer des points de terminaison d'API REST d'authentification utilisateur avec Flask"}
# {"prompt": "DebugThisError:TypeError: impossible de déballer un non-itérable"}

# Exécuter le traitement par lots
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

# Reprendre une tâche interrompue à partir d'un point de contrôle
python batch_runner.py \
    --dataset_file=data/prompts.jsonl \
    --batch_size=10 \
    --run_name=my_first_run \
    --resume

Format du jeu de données

Chaque ligne est un objet JSON, doit contenirpromptChamp, peut contenir un contexte supplémentaire :

Exemple

{"prompt": "Écrire une fonction Python pour trouver des palindromes"}
{"prompt": "DebugThisError", "cwd": "/home/user/project", "docker_image": "python:3.12"}

Paramètres principaux

ParamètreValeur par défautDescription
--dataset_fileRequisChemin du jeu de données JSONL
--batch_sizeRequisNombre de prompts par lot
--run_nameRequisNom de l'exécution (utilisé pour le répertoire de sortie et la reprise du point de contrôle)
--modelclaude-sonnet-4.6Modèles utilisés
--num_workers4Nombre de processus de travail parallèles
--max_turns10Nombre maximal de tours d'appel d'outil par invite
--distribution"default"Distribution des ensembles d'outils (échantillonnage aléatoire de différentes combinaisons d'outils)
--reasoning_effort—Effort de raisonnement : aucun/minimal/faible/moyen/élevé/xhigh
--resumefalseReprendre à partir du point de contrôle

Structure de sortie

Le traitement par lots génère la structure de répertoires suivante :

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

Chaque trajectoire est produite au format ShareGPT, incluant l'historique complet de la conversation, les enregistrements d'invocation d'outils et les statistiques de couverture du raisonnement :

Exemple

{
  "prompt_index": 42,
  "conversations": [
{"from": "human", "value": "Écrire une fonction pour trouver des palindromes..."},
{"from": "gpt", "value": "Je vais créer cette fonction...",}
     "tool_calls": [{"name": "terminal", "arguments": {...}}]},
{"from": "tool", "value": "...résultat d'exécution..."},
{"from": "gpt", "value": "Voici la fonction terminée..."}
  ],
  "completed":,
  "toolsets_used": ["terminal", "file"],
  "tool_stats": {
    "terminal": {"count": 2, "success": 2, "failure": 0}
  }
}

Filtrage de la qualité

Une fois l'exécution par lots terminée, deux filtres sont automatiquement appliqués :

Élément de filtreRèglesObjectif
Filtrage des cas sans inférenceLes échantillons sans aucune trace de raisonnement ont été écartés.Veiller à ce que la sortie contienne le processus de réflexion afin d'améliorer la qualité des données d'entraînement
Filtrage des noms d'outils hallucinésLes entrées contenant des appels d'outils qui ne figurent pas dans la liste des outils valides sont filtrées.Exclure les appels d'outils non valides produits par hallucination du modèle

Les traces de raisonnement font référence aux marqueurs <REASONING_SCRATCHPAD> ou aux tokens de réflexion natifs. Les données filtrées sont plus adaptées au fine-tuning du modèle.

Intégration avec l'environnement RL Atropos

Le traitement par lots peut générer directement des données d'entraînement compatibles Atropos :

Exemple

# Générer des données d'entraînement compatibles 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

# La sortie trajectories.jsonl peut être directement utilisée comme entrée d'entraînement Atropos
autres extensions