Puntata 115
Puntata 115 — Formato output
Livello: ✔️✔️ Doppie Spunte Blu · Capitolo 11 · Prompt engineering decente
Tabella, JSON, elenco, markdown, codice. Specificare il formato è uno dei modi più semplici per trasformare il modello da “amico chiacchierone” a “componente di un sistema”.
Perché il formato è un’arma sottovalutata
L’AI sa scrivere in tanti formati. Ma se non glielo dici, sceglie il più “narrativo” — un paragrafo. Che è il peggior formato se:
- Devi comparare elementi → ti serve una tabella.
- Devi integrare con altro software → ti serve JSON.
- Devi stampare un cheatsheet → ti serve markdown strutturato.
- Devi eseguire qualcosa → ti serve codice.
Cambiare il formato non è cosmetica. Cambia come usi la risposta dopo.
I 7 formati che dovresti dominare
1. Paragrafo libero (default)
Per spiegazioni, narrativa, contenuti che si leggono. Default del modello, non serve specificarlo.
2. Lista puntata o numerata
“Rispondi in formato lista puntata, ogni voce di max 1 riga.”
Bene per: opzioni, ricette di prompt, take-aways. Velocità di lettura alta.
3. Tabella markdown
“Confronta i 3 modelli in una tabella markdown con colonne: nome, prezzo/1M token input, MMLU, context window. Una riga per modello.”
Resa visiva immediata. Funziona perfetto in Notion, Obsidian, GitHub.
4. JSON
“Output in JSON con questo schema: { ‘titolo’: string, ‘autori’: [string], ‘anno’: number, ‘parole_chiave’: [string] }. Niente testo extra prima o dopo il JSON.”
Per integrazione con codice. Vedi sotto la sezione JSON mode.
5. YAML
Più leggibile di JSON per umani, struttura simile. Usato in config DevOps.
6. Codice (Python/SQL/altro)
“Scrivi una funzione Python che [task]. Usa type hints. Aggiungi docstring. Non scrivere spiegazioni fuori dal codice.”
7. Diagrammi (Mermaid)
“Disegna un flow chart in sintassi Mermaid che rappresenti il processo di onboarding utente.”
Mermaid è leggibile come testo e renderizzabile su GitHub, Notion, Obsidian, vari tool. Disegnare diagrammi è diventato un prompt.
La sintassi-tipo
Frase chiave da incollare nel prompt:
“Output esclusivamente in [FORMATO]. Niente testo prima o dopo. Niente commenti.”
Le ultime due frasi sono importanti: senza, il modello tende ad aggiungere “Ecco il JSON che hai chiesto:” prima dell’output, rompendo il parsing automatico.
JSON mode: il caso più importante in produzione
In produzione, JSON valido è oro. Tutti i grandi provider hanno una modalità dedicata:
| Provider | Feature |
|---|---|
| OpenAI | response_format: { type: "json_object" } + structured outputs con JSON schema |
| Anthropic | Tool use forzato, structured output via XML/JSON schema |
| Gemini | responseSchema per JSON tipizzato |
| Modelli open (Llama, Qwen) | Tool / function calling, BAML, Outlines |
Senza modalità dedicata: il modello a volte rompe il JSON (virgolette sbagliate, virgole finali, commenti che non dovrebbero esserci).
Con modalità dedicata: il JSON è garantito sintatticamente valido. Cambia tutto per la stabilità in produzione.
⚠️ Garanzia sintattica ≠ semantica. JSON valido non significa “contenuto giusto”. Il modello può ancora allucinare i valori.
Schema-driven outputs
L’evoluzione di JSON mode: passi al modello uno schema preciso (JSON Schema, Pydantic, Zod) e il modello deve conformarsi.
Esempio Python con OpenAI SDK:
from pydantic import BaseModel
from openai import OpenAI
class EstrazioneFattura(BaseModel):
numero_fattura: str
data_emissione: str
importo_totale: float
iva_percentuale: float
cliente: str
client = OpenAI()
response = client.responses.parse(
model="gpt-5",
input=[{"role": "user", "content": "Estrai dati da: [PDF fattura]"}],
response_format=EstrazioneFattura
)
fattura = response.output_parsed
print(fattura.importo_totale)
Il modello restituisce un oggetto già tipizzato. Niente parsing manuale, niente errori di formato. Standard de-facto dal 2024.
Markdown ben gerarchizzato
Per documenti e report:
“Output in markdown, con: H1 per titolo, H2 per sezioni principali, H3 per sottosezioni, blockquotes per citazioni, code-block per esempi tecnici, tabelle per confronti. Niente HTML.”
Risultato: documento già pronto per essere incollato in Notion, Obsidian, GitHub README. Niente formattazione manuale.
I 5 errori più diffusi sul formato
1. Non specificare quando serve
“Genera 10 personas utente” → paragrafi lunghi, difficili da confrontare. Soluzione: “…in una tabella markdown con colonne: nome, età, lavoro, frustrazioni principali, motivazioni”.
2. Chiedere JSON senza specificare lo schema
“Output in JSON” → ogni run schema diverso. Inutilizzabile in produzione. Soluzione: includi lo schema esatto + esempio.
3. Mixare formati
“Scrivimi un riassunto in paragrafi + lista puntata + tabella” → il modello fa confusione, niente è ben strutturato. Soluzione: un solo formato dominante; eventualmente sezioni separate.
4. Dimenticare “no extra text”
JSON con prefisso “Ecco:” o suffisso “Fammi sapere se serve altro” → parser rotto. Soluzione: specifica esplicitamente “Output ESCLUSIVAMENTE [formato]. Niente prima, niente dopo.”
5. Strutture troppo profonde
JSON nidificati a 6 livelli → il modello sbaglia, alluci, perde tracciamento. Soluzione: appiattisci, usa array di oggetti semplici.
Formati misti utili
Esistono pattern in cui formati misti aiutano. Esempio per “analisi + raccomandazione”:
Output strutturato:
## Analisi
[paragrafo di 6-8 righe]
## Punti chiave
- bullet 1
- bullet 2
- bullet 3
## Raccomandazioni
| Priorità | Azione | Effort | Impatto atteso |
|---|---|---|---|
| Alta | … | Basso | Alto |
## Prossimi passi
1. …
2. …
Funziona: la struttura è fissa e prevedibile.
Output a lunghezza controllata
| Vincolo | Esempio sintassi |
|---|---|
| Numero di parole | ”Massimo 300 parole.” |
| Numero di righe/bullet | ”Esattamente 5 bullet.” |
| Numero di caratteri | ”Max 280 caratteri (tweet).” |
| Tempo di lettura | ”2 minuti di lettura.” |
| Numero di paragrafi | ”3 paragrafi distinti.” |
⚠️ I modelli non contano benissimo. Un “esattamente 5 bullet” può uscire con 4 o 6. Per garantirne 5 in produzione: post-processing nel codice, non fiducia cieca.
Streaming + formato
In produzione, vuoi mostrare la risposta mentre arriva (streaming). Il formato influisce sull’esperienza:
- Paragrafo: streaming naturale, leggibile in tempo reale.
- JSON: streaming “parziale” funziona solo con structured-output parsers (es.
partial-json). Altrimenti l’utente vede JSON rotto fino alla fine. - Tabella markdown: si renderizza male in streaming finché non è completa.
Strategia comune: JSON in modalità non-streaming per stabilità + paragrafo in streaming per UX.
TEST pratico (5 minuti)
Prendi una task ripetuta: estrazione dati da email, generazione descrizioni prodotto, classificazione feedback. Provala in 4 formati diversi:
- Paragrafo libero (zero formato).
- Lista puntata (formato leggero).
- Tabella markdown (struttura visiva).
- JSON con schema (per integrazione codice).
Per ognuno, misura:
- Tempo di lettura/parsing umano.
- Riusabilità da codice.
- Tasso di “errori di formato” su 10 run.
Sceglierai il formato giusto per il tuo caso. Nove volte su dieci il formato fa la differenza tra “demo che funziona” e “produzione stabile”.
Take-away in una riga
Il formato non è cosmetica: è interfaccia. JSON con schema è il “componente” del 2026; markdown ben gerarchizzato è il documento già pronto.
➡️ Prossima puntata: Vincoli negativi — dire cosa NON fare.