Quando l'output di un LLM deve entrare in un sistema – non sotto gli occhi di un umano – il testo libero è una bomba a orologeria: virgole in più, markdown attorno al JSON, campi inventati. Le soluzioni, in ordine di forza:
- JSON mode: il modello è vincolato a emettere JSON sintatticamente valido – ma con lo schema che vuole lui
- structured output vero: fornisci un JSON Schema e il vincolo agisce durante la generazione (constrained decoding): l'output rispetta lo schema per costruzione, campi e tipi inclusi. Dove disponibile, è la scelta giusta – e il function calling ne è il caso speciale più famoso
- cintura e bretelle: valida comunque (lo schema non garantisce la sensatezza dei valori) e gestisci il caso raro di rifiuto o campo nullo
Bonus di qualità: uno schema stretto con descrizioni dei campi è anche un ottimo prompt – costringe te a definire cosa vuoi e il modello a divagare meno.