Skip to content

Edición de trayectorias para SFT/DPO

Los anotadores reescriben los pasos de una traza de agente para corregir un paso de razonamiento erróneo, arreglar una llamada a herramienta o reforzar la respuesta final, y Potato exporta cada par original/corregido como objetivos de ajuste fino supervisado y pares de preferencia DPO.

El esquema trajectory_edit permite a los anotadores reescribir los pasos de una traza de agente y exporta cada corrección como datos de entrenamiento. Corrige un paso de razonamiento erróneo, arregla una llamada a herramienta con una errata o refuerza la respuesta final, y Potato guarda la trayectoria corregida junto a la original. Después, el exportador trajectory_correction convierte cada par (original, corrected) en objetivos de ajuste fino supervisado (SFT) y pares de preferencia de optimización directa de preferencias (DPO).

Esto convierte a Potato en una herramienta de producción de datos de entrenamiento, no solo de evaluación. Es la contraparte editora de la puntuación a nivel de paso: en lugar de calificar una trayectoria, los anotadores la reparan, y la reparación se convierte en una señal de aprendizaje.

Editor de corrección de trayectorias con diff en vivoUn paso de agente mostrado con un original de solo lectura y un cuadro corregido editable con un diff a nivel de palabra

Inicio rápido

Ejecuta el ejemplo incluido desde la raíz del repositorio:

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

Cómo funciona

Cada paso de agente se representa como una tarjeta que muestra el texto original (solo lectura) y un cuadro corregido editable precargado con el original. A medida que el anotador escribe:

  • un diff en vivo a nivel de palabra resalta las inserciones (verde) y las eliminaciones (tachado rojo),
  • se cuentan las palabras y los caracteres modificados, y
  • aparece una marca de «editado» en los campos modificados.

Un botón «Restablecer» recupera el original por campo. Con edit_final_answer: true, la respuesta final obtiene su propio editor. Nada es obligatorio: una traza sin editar simplemente no produce ningún par de entrenamiento.

Configuración

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
OpciónPredeterminadoDescripción
steps_keystepsCampo de la instancia que contiene la lista de pasos.
step_text_keyactionCampo editable predeterminado por paso.
editable_fields[step_text_key]Qué campos de paso obtienen un editor, p. ej. [action, thought].
show_difftrueMuestra el diff en vivo a nivel de palabra.
show_edit_distancetrueMuestra las palabras y los caracteres modificados.
allow_resettrueBotón «Restablecer al original» por campo.
require_reason_on_editfalseCampo de entrada «motivo de la edición» por campo.
edit_final_answerfalseAñade un editor para la respuesta final.
final_answer_keyfinal_answerCampo de la instancia que contiene la respuesta final.

Formato de los datos

El esquema lee los pasos de la instancia bajo steps_key. Cada paso es un objeto cuyos campos (action, thought, etc.) pueden editarse; los pasos de cadena simple se editan como el 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."
}

Exportación

Ejecuta el exportador trajectory_correction. Escribe tres archivos:

  • trajectory_corrections.json — cada registro: el original_trace, el corrected_trace reconstruido y, por campo, las edits con distancias de edición y motivos.
  • trajectory_sft.jsonl — una línea por traza editada: {"prompt": <task>, "completion": <corrected_trace>}.
  • trajectory_dpo.jsonl — una línea por traza editada: {"prompt": <task>, "chosen": <corrected_trace>, "rejected": <original_trace>}.

Las trazas sin editar se cuentan pero se excluyen de SFT/DPO, ya que entrenar con una trayectoria sin cambios no aporta nada; el recuento de omitidas aparece en las estadísticas de exportación. Con varios anotadores, cada anotador que editó una traza produce un registro SFT/DPO.

Notas y limitaciones

  • El diff es a nivel de palabra. Para llamadas a herramientas con aspecto de código y sin espacios, un solo token puede mostrarse como completamente modificado incluso para un arreglo de un carácter; el contador de distancia de caracteres es la señal precisa.
  • Combínalo con la puntuación a nivel de paso si también quieres corrección por paso o una taxonomía de errores sobre la misma traza.

Relacionado

Para más detalles de implementación, consulta la documentación fuente.