Puntata 118
Puntata 118 — Iterare il prompt
Livello: ✔️✔️ Doppie Spunte Blu · Capitolo 11 · Prompt engineering decente
Il primo prompt è una bozza. Il vero prompt nasce dall’osservazione: che ha sbagliato? perché? cosa correggere? Cinque iterazioni e un prompt mediocre diventa un prompt-modello.
Il prompt come codice
Pensa al prompt come a una funzione: input (l’istruzione e i dati) → output (la risposta). Come ogni funzione:
- La prima versione raramente funziona perfettamente.
- La debuggi guardando l’output e capendo cosa è andato male.
- La rifinisci, e itera.
Questo è prompt engineering iterativo. È meno glamour del “trovare il prompt magico”, ma è il modo in cui i prompt seri vengono costruiti in azienda.
Il loop a 4 stazioni
1. ✍️ Scrivi
Prima versione, applicando le 6 leggi (puntata 111). Non perfetta, ma ragionata.
2. 🤖 Esegui
Lanci il prompt su uno o più input di test.
3. 🔍 Osserva
Cosa è uscito? Confrontalo con quello che volevi. Trova lo scarto specifico:
- Manca un dato?
- C’è del rumore (frasi inutili)?
- Il formato è sbagliato?
- Il tono non è giusto?
- Il modello ha allucinato qualcosa?
- È troppo lungo / troppo corto?
4. ✏️ Correggi
Tocca solo le parti del prompt che corrispondono allo scarto. Non riscrivere tutto: pinpoint l’aggiunta che risolverà quel problema specifico.
Torna a 2. Ripeti.
Le 5 categorie di scarto e i loro fix
Scarto 1 — “Allucina informazioni”
Diagnosi: il modello inventa dati che non ha.
Fix:
- Aggiungi “se non sai, scrivi ‘NON HO QUESTA INFORMAZIONE’”.
- Aggiungi “non inventare nomi, citazioni, date” (puntata 116).
- Considera RAG (puntata 238).
Scarto 2 — “Output troppo generico”
Diagnosi: risposta vaga, “su entrambi i lati”, senza prospettiva.
Fix:
- Aggiungi role specifico (puntata 112).
- Aggiungi few-shot con esempi concreti (puntata 113).
- Aggiungi “prendi una posizione netta su X”.
Scarto 3 — “Formato sbagliato”
Diagnosi: testo libero quando volevi JSON; tabella senza separatori; lunghezza fuori target.
Fix:
- Specifica formato preciso (puntata 115).
- Per JSON, usa structured outputs / schema.
- Per lunghezza, aggiungi vincolo numerico + post-processing.
Scarto 4 — “Tono non adatto”
Diagnosi: troppo formale/informale, troppo “promo”, troppo lungo.
Fix:
- Vincoli negativi (puntata 116).
- Esempi di tono nel prompt.
- Specifica audience: “per programmatori junior, italiano colloquiale”.
Scarto 5 — “Logica sbagliata”
Diagnosi: l’output è ben formattato ma il ragionamento è errato.
Fix:
- Aggiungi CoT (puntata 114).
- Switcha a modello reasoning (puntata 128).
- Aggiungi step di self-verification.
Esempio reale di iterazione
Task: estrarre dati di vendita da una mail commerciale.
Iterazione 1
Estrai i dati di vendita da questa email.
Output: paragrafo discorsivo, niente struttura. Inutilizzabile da codice.
Iterazione 2
Estrai i dati di vendita da questa email in JSON con campi:
prodotto, quantità, prezzo_unitario, totale.
Output: JSON, ma a volte con commenti prima, virgolette miste, formato date inconsistente.
Iterazione 3
Estrai i dati di vendita da questa email in JSON.
Schema obbligatorio:
{
"prodotto": string,
"quantità": int,
"prezzo_unitario": float (euro),
"totale": float (euro),
"data_consegna": string in formato YYYY-MM-DD
}
Vincoli:
- Output ESCLUSIVAMENTE JSON, niente prima/dopo.
- Se un campo non è presente nel testo, valore null.
- Niente commenti dentro il JSON.
Output: JSON valido al 90%, formato date corretto. Quasi pronto per produzione.
Iterazione 4
[…stesso prompt iterazione 3…]
Few-shot:
Email: "Confermo l'ordine di 50 scatole di carta A4 a 2.40€ cad.
Consegna 12 giugno."
JSON: {"prodotto": "carta A4", "quantità": 50, "prezzo_unitario": 2.40,
"totale": 120.00, "data_consegna": "2026-06-12"}
Email: "Ti mando 200 pezzi del codice X44. Prezzo da definire."
JSON: {"prodotto": "X44", "quantità": 200, "prezzo_unitario": null,
"totale": null, "data_consegna": null}
Ora estrai da:
Email: "..."
Output: 99% accurato, formato stabile, gestisce edge case (campo null).
Iterazione 5 (produzione)
Aggiungi:
- Validazione con Pydantic dopo il parsing (puntata 115).
- Fallback se il JSON è invalido (retry con prompt rinforzato).
- Monitoring che logga gli output sospetti per review umana.
Dal “prompt che funziona a demo” al “componente di sistema”.
Quanti giri servono
Empiricamente:
- Task semplici (riformulare, tradurre): 1-2 iterazioni.
- Task medi (classificazione, estrazione strutturata): 3-5.
- Task complessi (multi-step, dominio specifico, vincoli stretti): 5-15.
Dopo 15-20 iterazioni senza convergenza: probabilmente serve un approccio diverso (RAG, fine-tuning, decomposizione del task).
L’eval-driven prompt engineering
In produzione, non iterare a caso. Costruisci una eval suite:
- Raccogli 10-50 input rappresentativi del problema reale.
- Per ognuno, definisci l’output corretto (manualmente, da esperti).
- Per ogni iterazione del prompt, lancia su tutti gli input e calcola la accuracy.
- Tieni traccia delle modifiche e dei risultati in un file.
Esempio struttura:
v1.0: prompt base accuracy: 62%
v1.1: + vincoli negativi accuracy: 71%
v1.2: + 3 esempi few-shot accuracy: 88%
v1.3: + JSON schema strict accuracy: 92%
v1.4: + edge case nei few-shot accuracy: 96%
v2.0: refactor + role più specifico accuracy: 95% ⚠️ regression
v2.1: rollback + raffinamento esempi accuracy: 97% ✓
Standard professionale: trattare i prompt come codice versionato con test.
Vedi anche puntate 221 (benchmark/eval) e 297 (LLMOps).
Iterare con il modello
Trucco potente: chiedi all’AI stessa di migliorare il tuo prompt.
“Questo è il mio prompt: [PROMPT]. Questo è l’output che ha generato: [OUTPUT]. Questo è l’output che volevo: [TARGET].
Trova le 3 modifiche al prompt che ridurrebbero lo scarto. Riformula il prompt completo. Spiegami brevemente cosa hai cambiato e perché.”
Il modello fa “prompt engineering su sé stesso”. Spesso funziona meglio di quanto pensiamo. È la base di tecniche come APE (Automatic Prompt Engineering, 2022) e DSPy (Stanford, 2023).
Iterazione “umile” — leggi gli output sbagliati
Trappola classica: guardi solo gli output “buoni” e ti convinci che il prompt funziona. Guarda gli output rotti — è lì che sta l’informazione.
Pratica utile: tieni un file failure-mode.md dove annoti:
- Esempio di input
- Output sbagliato
- Output corretto atteso
- Ipotesi sul perché ha sbagliato
Dopo 20-30 voci, emergono pattern. Quei pattern sono il prossimo set di vincoli da aggiungere al prompt.
Quando smettere di iterare
Tre segnali:
- Rendimenti decrescenti: l’ultimo cambiamento ha migliorato di <1%.
- Accuracy target raggiunta sull’eval suite (es. 95%).
- Costo del prompt (in token) è cresciuto troppo per giustificare i miglioramenti.
A quel punto: deploy + monitoring + revisione periodica (mensile, trimestrale).
TEST pratico (15 minuti)
Prendi un task ricorrente che vuoi affidare all’AI. Costruisci una mini-eval:
- Raccogli 5 input reali.
- Definisci per ognuno l’output ideale (scritto a mano).
- Lancia un prompt iniziale, segna accuratezza percepita (0-100 per ogni input).
- Itera: aggiungi un solo cambiamento alla volta, rilancia, ri-misura.
- Tieni traccia in una mini-tabella delle versioni.
Dopo 3-4 iterazioni, vedrai chiaramente:
- Quali aggiunte hanno portato accuracy.
- Quali sono state inutili (le togli).
- Dove il modello fatica strutturalmente (= cambiare modello o approccio).
In 15 minuti, hai un prompt-modello che vale settimane di tentativi caotici.
Take-away in una riga
Il prompt magico non esiste. Il prompt bravo nasce dall’osservazione iterativa: scarto specifico, fix specifico, ripeti finché converge.
➡️ Prossima puntata: Variabili e template riusabili — costruire una libreria personale.