Dataset Validator — validate tool-calling fine-tuning datasets in your browser

1 min read Original article ↗

Ogni riga è un esempio di addestramento = una conversazione completa. Forma di primo livello:

{
  "_kind": "sft",
  "tools":  [ /* the tools the model may call in THIS example */ ],
  "messages": [ /* the conversation, in order */ ]
}

Forma dei messaggi (ruolo per ruolo)

{"role":"system","content":"Sei un assistente personale."}
{"role":"user","content":"che ore sono?"}
{"role":"assistant","content":"Sono le 14:00."}
{"role":"assistant","tool_calls":[
   {"function":{"name":"email_send","arguments":"{\"to\":\"a@b.it\"}"}}]}
{"role":"tool","content":"Email inviata a a@b.it"}

arguments può essere una stringa JSON o un oggetto.

Regole che il generatore impone (= ciò che questo validatore controlla)

  • solo ruoli: system · user · assistant · tool
  • ogni tool_call dell'assistant è seguito da esattamente un risultato tool (per chiamata): niente orfani, niente chiamate pendenti
  • la conversazione termina con una risposta testuale dell'assistant (non con una tool call in sospeso)
  • ogni tool_call.name esiste nel tuo catalogo; gli argomenti rispettano lo schema (required presenti, nessuna chiave inventata, tipi corretti)
  • nessun tool allucinato, nessun arg inventato, nessun turno assistant vuoto/placeholder

Esempio completo (una riga .jsonl)

{"tools":[{"name":"email_send","parameters":{"type":"object","properties":{"to":{"type":"string"},"body":{"type":"string"}},"required":["to","body"]}}],"messages":[{"role":"system","content":"Sei un assistente personale."},{"role":"user","content":"manda una mail a mario@x.it: arrivo alle 15"},{"role":"assistant","tool_calls":[{"function":{"name":"email_send","arguments":"{\"to\":\"mario@x.it\",\"body\":\"Arrivo alle 15.\"}"}}]},{"role":"tool","content":"Email inviata a mario@x.it"},{"role":"assistant","content":"Fatto, ho scritto a Mario che arrivi alle 15."}]}