Skip to content

É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.

Éditeur de correction de trajectoire avec diff en directUne é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 :

bash
python potato/flask_server.py start examples/agent-traces/trajectory-correction/config.yaml -p 8000

Fonctionnement

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

yaml
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
OptionPar défautDescription
steps_keystepsChamp d'instance contenant la liste des étapes.
step_text_keyactionChamp modifiable par défaut pour chaque étape.
editable_fields[step_text_key]Quels champs d'étape obtiennent un éditeur, par ex. [action, thought].
show_difftrueAffiche le diff en direct au niveau du mot.
show_edit_distancetrueAffiche les mots et les caractères modifiés.
allow_resettrueBouton « Réinitialiser à l'original » par champ.
require_reason_on_editfalseChamp de saisie « motif de la modification » par champ.
edit_final_answerfalseAjoute un éditeur pour la réponse finale.
final_answer_keyfinal_answerChamp 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.

json
{
  "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, le corrected_trace reconstruit et, par champ, les edits avec 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

Pour les détails d'implémentation, consultez la documentation source.