Skip to content

Modifica delle traiettorie per SFT/DPO

Gli annotatori riscrivono i passaggi di una traccia di agente per correggere un passaggio di ragionamento errato, sistemare una chiamata a strumento o rafforzare la risposta finale, e Potato esporta ogni coppia originale/corretta come obiettivi di fine-tuning supervisionato e coppie di preferenza DPO.

Lo schema trajectory_edit consente agli annotatori di riscrivere i passaggi di una traccia di agente ed esporta ogni correzione come dati di addestramento. Correggi un passaggio di ragionamento errato, sistema una chiamata a strumento con un refuso o rafforza la risposta finale, e Potato salva la traiettoria corretta accanto a quella originale. L'esportatore trajectory_correction trasforma poi ogni coppia (original, corrected) in obiettivi di fine-tuning supervisionato (SFT) e in coppie di preferenza di ottimizzazione diretta delle preferenze (DPO).

Questo rende Potato uno strumento di produzione di dati di addestramento, e non solo di valutazione. È la controparte in modalità modifica del punteggio a livello di passaggio: invece di valutare una traiettoria, gli annotatori la riparano, e la riparazione diventa un segnale di apprendimento.

Editor di correzione della traiettoria con diff in tempo realeUn passaggio di agente mostrato con un originale in sola lettura e un riquadro corretto modificabile con un diff a livello di parola

Avvio rapido

Esegui l'esempio incluso dalla radice del repository:

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

Come funziona

Ogni passaggio di agente viene reso come una scheda che mostra il testo originale (in sola lettura) e un riquadro corretto modificabile precompilato con l'originale. Mentre l'annotatore digita:

  • un diff in tempo reale a livello di parola evidenzia gli inserimenti (in verde) e le eliminazioni (barrato in rosso),
  • vengono conteggiate le parole e i caratteri modificati, e
  • compare un contrassegno «modificato» sui campi modificati.

Un pulsante «Ripristina» riporta l'originale per ogni campo. Con edit_final_answer: true la risposta finale ottiene un proprio editor. Niente è obbligatorio: una traccia non modificata semplicemente non produce alcuna coppia di addestramento.

Configurazione

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
OpzionePredefinitoDescrizione
steps_keystepsCampo dell'istanza che contiene l'elenco dei passaggi.
step_text_keyactionCampo modificabile predefinito per ogni passaggio.
editable_fields[step_text_key]Quali campi del passaggio ottengono un editor, ad es. [action, thought].
show_difftrueMostra il diff in tempo reale a livello di parola.
show_edit_distancetrueMostra le parole e i caratteri modificati.
allow_resettruePulsante «Ripristina all'originale» per ogni campo.
require_reason_on_editfalseCampo di immissione «motivo della modifica» per ogni campo.
edit_final_answerfalseAggiunge un editor per la risposta finale.
final_answer_keyfinal_answerCampo dell'istanza che contiene la risposta finale.

Formato dei dati

Lo schema legge i passaggi dall'istanza sotto steps_key. Ogni passaggio è un oggetto i cui campi (action, thought e così via) possono essere modificati; i passaggi costituiti da una semplice stringa vengono modificati come campo 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."
}

Esportazione

Esegui l'esportatore trajectory_correction. Scrive tre file:

  • trajectory_corrections.json — ogni record: l'original_trace, il corrected_trace ricostruito e, per ciascun campo, le edits con distanze di modifica e motivi.
  • trajectory_sft.jsonl — una riga per ogni traccia modificata: {"prompt": <task>, "completion": <corrected_trace>}.
  • trajectory_dpo.jsonl — una riga per ogni traccia modificata: {"prompt": <task>, "chosen": <corrected_trace>, "rejected": <original_trace>}.

Le tracce non modificate vengono conteggiate ma escluse da SFT/DPO, poiché addestrare su una traiettoria invariata non aggiunge nulla; il conteggio di quelle ignorate compare nelle statistiche di esportazione. Con più annotatori, ogni annotatore che ha modificato una traccia produce un record SFT/DPO.

Note e limitazioni

  • Il diff è a livello di parola. Per le chiamate a strumenti simili a codice e senza spazi, un singolo token può apparire come interamente modificato anche per una correzione di un solo carattere; il contatore della distanza tra caratteri è il segnale preciso.
  • Abbinalo al punteggio a livello di passaggio se desideri anche la correttezza per ogni passaggio o una tassonomia degli errori sulla stessa traccia.

Correlati

Per i dettagli di implementazione, consulta la documentazione sorgente.