Édition de trajectoires pour le SFT/DPO
Les annotateurs réécrivent les étapes d'une trace d'agent pour corriger une étape de raisonnement erronée, rectifier un appel d'outil ou renforcer la réponse finale, et Potato exporte chaque paire originale/corrigée comme cibles de fine-tuning supervisé et paires de préférence DPO.
Le schéma trajectory_edit permet aux annotateurs de réécrire les étapes d'une trace d'agent et exporte chaque correction sous forme de données d'entraînement. Corrigez une étape de raisonnement erronée, rectifiez un appel d'outil comportant une faute de frappe ou renforcez la réponse finale, et Potato enregistre la trajectoire corrigée à côté de l'originale. L'exportateur trajectory_correction transforme ensuite chaque paire (original, corrected) en cibles de fine-tuning supervisé (SFT) et en paires de préférence d'optimisation directe des préférences (DPO).
Cela fait de Potato un outil de production de données d'entraînement, et pas seulement un outil d'évaluation. C'est le pendant en mode édition de la notation au niveau de l'étape : au lieu d'évaluer une trajectoire, les annotateurs la réparent, et la réparation devient un signal d'apprentissage.
Une étape d'agent affichée avec un original en lecture seule et un cadre corrigé modifiable avec un diff au niveau du mot
Démarrage rapide
Exécutez l'exemple fourni depuis la racine du dépôt :
python potato/flask_server.py start examples/agent-traces/trajectory-correction/config.yaml -p 8000Fonctionnement
Chaque étape d'agent est rendue sous forme de carte affichant le texte original (en lecture seule) et un cadre corrigé modifiable prérempli avec l'original. À mesure que l'annotateur saisit :
- un diff en direct au niveau du mot met en évidence les insertions (en vert) et les suppressions (barré en rouge),
- les mots et les caractères modifiés sont comptés, et
- une mention « modifié » apparaît sur les champs modifiés.
Un bouton « Réinitialiser » restaure l'original champ par champ. Avec edit_final_answer: true, la réponse finale obtient son propre éditeur. Rien n'est obligatoire : une trace non modifiée ne produit tout simplement aucune paire d'entraînement.
Configuration
annotation_schemes:
- annotation_type: trajectory_edit
name: corrected_trajectory
description: "Fix any wrong steps, then correct the final answer"
steps_key: steps # instance field holding the step list
step_text_key: action # the default per-step editable field
editable_fields: # which fields get an editor
- action
# - thought # add to also edit reasoning
show_diff: true
show_edit_distance: true
allow_reset: true
require_reason_on_edit: false # add a per-field "reason" input
edit_final_answer: true
final_answer_key: final_answer| Option | Par défaut | Description |
|---|---|---|
steps_key | steps | Champ d'instance contenant la liste des étapes. |
step_text_key | action | Champ modifiable par défaut pour chaque étape. |
editable_fields | [step_text_key] | Quels champs d'étape obtiennent un éditeur, par ex. [action, thought]. |
show_diff | true | Affiche le diff en direct au niveau du mot. |
show_edit_distance | true | Affiche les mots et les caractères modifiés. |
allow_reset | true | Bouton « Réinitialiser à l'original » par champ. |
require_reason_on_edit | false | Champ de saisie « motif de la modification » par champ. |
edit_final_answer | false | Ajoute un éditeur pour la réponse finale. |
final_answer_key | final_answer | Champ d'instance contenant la réponse finale. |
Format des données
Le schéma lit les étapes de l'instance sous steps_key. Chaque étape est un objet dont les champs (action, thought, etc.) peuvent être modifiés ; les étapes constituées d'une simple chaîne sont modifiées comme le champ step_text_key.
{
"id": "traj_001",
"task_description": "Find the weather in San Francisco.",
"steps": [
{"thought": "Look it up.", "action": "web_search(queyr='SF weather')"},
{"thought": "Open it.", "action": "open_url(results[0])"}
],
"final_answer": "It is sunny."
}Exportation
Exécutez l'exportateur trajectory_correction. Il écrit trois fichiers :
trajectory_corrections.json— chaque enregistrement : l'original_trace, lecorrected_tracereconstruit et, par champ, leseditsavec les distances d'édition et les motifs.trajectory_sft.jsonl— une ligne par trace modifiée :{"prompt": <task>, "completion": <corrected_trace>}.trajectory_dpo.jsonl— une ligne par trace modifiée :{"prompt": <task>, "chosen": <corrected_trace>, "rejected": <original_trace>}.
Les traces non modifiées sont comptées mais exclues du SFT/DPO, car s'entraîner sur une trajectoire inchangée n'apporte rien ; le nombre d'éléments ignorés apparaît dans les statistiques d'exportation. Avec plusieurs annotateurs, chaque annotateur ayant modifié une trace produit un enregistrement SFT/DPO.
Notes et limites
- Le diff est au niveau du mot. Pour les appels d'outils ressemblant à du code et sans espaces, un seul jeton peut apparaître comme entièrement modifié même pour une correction d'un seul caractère ; le compteur de distance de caractères est le signal précis.
- Combinez-le avec la notation au niveau de l'étape si vous souhaitez aussi une exactitude par étape ou une taxonomie des erreurs sur la même trace.
Voir aussi
- Évaluation de trace à trois volets — vue en lecture seule du raisonnement, des appels et de la réponse
- Annotation agentique — modèles d'affichage et d'évaluation de traces d'agent
- Formats d'exportation — la référence complète de l'exportateur
Pour les détails d'implémentation, consultez la documentation source.