Il prompt engineering è raramente un processo one-shot. I migliori prompt emergono attraverso l'iterazione—testando, osservando e raffinando fino a raggiungere i risultati desiderati.

<Callout type="info" title="Prima Bozza, Non Bozza Finale">
Pensa al tuo primo prompt come una bozza grezza. Anche i prompt engineer esperti raramente centrano al primo tentativo.
</Callout>

## Il Ciclo di Iterazione

Il raffinamento efficace dei prompt segue un ciclo prevedibile: scrivi, testa, analizza e migliora. Ogni iterazione ti avvicina a un prompt che produce affidabilmente i risultati di cui hai bisogno.

<IterativeRefinementDemo />

## Pattern di Raffinamento Comuni

La maggior parte dei fallimenti dei prompt rientra in una manciata di categorie. Imparare a riconoscere questi pattern ti permette di diagnosticare e correggere rapidamente i problemi senza ricominciare da zero.

### Problema: Output Troppo Lungo

Uno dei problemi più comuni. Senza vincoli espliciti, i modelli tendono ad essere esaustivi piuttosto che concisi.

<DiffView 
  before="Spiega come funziona la fotosintesi."
  after={`Spiega come funziona la fotosintesi in 3-4 frasi adatte a un bambino di 10 anni.`}
  beforeLabel="Originale"
  afterLabel="Raffinato"
/>

### Problema: Output Troppo Vago

Prompt vaghi producono output vaghi. Il modello non può leggere la tua mente su cosa significa "migliore" o quali aspetti ti interessano di più.

<DiffView 
  before="Dammi consigli per presentazioni migliori."
  after={`Dammi 5 consigli specifici e azionabili per migliorare presentazioni tecniche a stakeholder non tecnici. Per ogni consiglio, includi un esempio concreto.`}
  beforeLabel="Originale"
  afterLabel="Raffinato"
/>

### Problema: Tono Sbagliato

Il tono è soggettivo e varia in base al contesto. Quello che suona "professionale" al modello potrebbe non corrispondere alla voce della tua organizzazione o alla relazione con il tuo destinatario.

<DiffView 
  before="Scrivi un'email di scuse per aver mancato una scadenza."
  after={`Scrivi un'email di scuse professionale ma calorosa per aver mancato una scadenza di progetto. Il tono dovrebbe essere responsabile senza essere eccessivamente apologetico. Includi un piano concreto per prevenire ritardi futuri.`}
  beforeLabel="Originale"
  afterLabel="Raffinato"
/>

### Problema: Informazioni Chiave Mancanti

Richieste aperte ottengono risposte aperte. Se hai bisogno di tipi specifici di feedback, devi chiederli esplicitamente.

<DiffView 
  before="Revisiona questo codice."
  after={`Revisiona questo codice Python per:
1. Bug ed errori logici
2. Problemi di performance
3. Vulnerabilità di sicurezza
4. Stile del codice (PEP 8)

Per ogni problema trovato, spiega il problema e suggerisci un fix.

[codice]`}
  beforeLabel="Originale"
  afterLabel="Raffinato"
/>

### Problema: Formato Inconsistente

Senza un template, il modello strutturerà ogni risposta diversamente, rendendo il confronto difficile e l'automazione impossibile.

<DiffView 
  before="Analizza questi tre prodotti."
  after={`Analizza questi tre prodotti usando questo formato esatto per ciascuno:

## [Nome Prodotto]
**Prezzo:** €X
**Pro:** [lista puntata]
**Contro:** [lista puntata]
**Migliore Per:** [una frase]
**Valutazione:** X/10

[prodotti]`}
  beforeLabel="Originale"
  afterLabel="Raffinato"
/>

## Approccio di Raffinamento Sistematico

Cambiamenti casuali sprecano tempo. Un approccio sistematico ti aiuta a identificare i problemi rapidamente e correggerli efficientemente.

### Passo 1: Diagnostica il Problema

Prima di cambiare qualsiasi cosa, identifica cosa c'è effettivamente di sbagliato. Usa questa tabella diagnostica per mappare sintomi a soluzioni:

<div className="my-4 grid gap-2">
  <div className="grid grid-cols-3 gap-2 p-3 bg-muted/50 rounded-lg text-sm">
    <span className="font-semibold">Sintomo</span>
    <span className="font-semibold">Causa Probabile</span>
    <span className="font-semibold">Soluzione</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Troppo lungo</span>
    <span className="text-muted-foreground">Nessun vincolo di lunghezza</span>
    <span className="text-green-600 dark:text-green-400">Aggiungi limiti parole/frasi</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Troppo corto</span>
    <span className="text-muted-foreground">Manca richiesta di dettagli</span>
    <span className="text-green-600 dark:text-green-400">Chiedi elaborazione</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Fuori tema</span>
    <span className="text-muted-foreground">Istruzioni vaghe</span>
    <span className="text-green-600 dark:text-green-400">Sii più specifico</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Formato sbagliato</span>
    <span className="text-muted-foreground">Formato non specificato</span>
    <span className="text-green-600 dark:text-green-400">Definisci struttura esatta</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Tono sbagliato</span>
    <span className="text-muted-foreground">Pubblico non chiaro</span>
    <span className="text-green-600 dark:text-green-400">Specifica pubblico/stile</span>
  </div>
  <div className="grid grid-cols-3 gap-2 p-3 bg-red-50 dark:bg-red-950/20 rounded-lg text-sm">
    <span>Inconsistente</span>
    <span className="text-muted-foreground">Nessun esempio fornito</span>
    <span className="text-green-600 dark:text-green-400">Aggiungi esempi few-shot</span>
  </div>
</div>

### Passo 2: Fai Cambiamenti Mirati

Resisti all'impulso di riscrivere tutto. Cambiare molteplici variabili contemporaneamente rende impossibile sapere cosa ha aiutato e cosa ha peggiorato. Fai un cambiamento, testalo, poi procedi:

```
Iterazione 1: Aggiungi vincolo di lunghezza
Iterazione 2: Specifica formato
Iterazione 3: Aggiungi esempio
Iterazione 4: Raffina istruzioni sul tono
```

### Passo 3: Documenta Cosa Funziona

La conoscenza del prompt engineering si perde facilmente. Tieni un log di cosa hai provato e perché. Questo risparmia tempo quando ritorni sul prompt più tardi o affronti sfide simili:

```markdown
## Prompt: Risposta Email Cliente

### Versione 1 (troppo formale)
"Scrivi una risposta a questo reclamo cliente."

### Versione 2 (tono migliore, manca ancora struttura)
"Scrivi una risposta amichevole ma professionale a questo reclamo. 
Mostra empatia prima."

### Versione 3 (finale - buoni risultati)
"Scrivi una risposta a questo reclamo cliente. Struttura:
1. Riconosci la loro frustrazione (1 frase)
2. Scusati specificamente (1 frase)  
3. Spiega la soluzione (2-3 frasi)
4. Offri aiuto aggiuntivo (1 frase)

Tono: Amichevole, professionale, empatico ma non servile."
```

## Esempio di Iterazione del Mondo Reale

Camminiamo attraverso un ciclo di iterazione completo per vedere come ogni raffinamento si costruisce sul precedente. Nota come ogni versione affronta carenze specifiche della precedente.

### Compito: Generare Nomi Prodotto

<VersionDiff versions={[
  {
    label: "Versione 1",
    content: "Genera nomi per una nuova app di produttività.",
    note: "Troppo generico, nessun contesto"
  },
  {
    label: "Versione 2",
    content: `Genera nomi per una nuova app di produttività. L'app usa l'IA per programmare automaticamente i tuoi compiti basandosi sui livelli di energia e disponibilità del calendario.`,
    note: "Aggiunto contesto, ancora generico"
  },
  {
    label: "Versione 3",
    content: `Genera 10 nomi unici e memorabili per un'app di produttività con queste caratteristiche:
- Usa l'IA per programmare compiti basandosi sui livelli di energia
- Pubblico target: professionisti impegnati 25-40 anni
- Tono del brand: moderno, intelligente, leggermente giocoso
- Evita: parole generiche come "pro", "smart", "AI", "task"

Per ogni nome, spiega perché funziona.`,
    note: "Aggiunti vincoli e ragionamento"
  },
  {
    label: "Versione 4 (finale)",
    content: `Genera 10 nomi unici e memorabili per un'app di produttività.

Contesto:
- Usa l'IA per programmare compiti basandosi sui livelli di energia
- Target: professionisti impegnati, 25-40
- Tono: moderno, intelligente, leggermente giocoso

Requisiti:
- Massimo 2-3 sillabe
- Facile da scrivere e pronunciare
- Disponibile come dominio .com (verifica se plausibile)
- Evita: parole generiche (pro, smart, AI, task, flow)

Formato:
Nome | Pronuncia | Perché Funziona | Stima Disponibilità Dominio`,
    note: "Formato strutturato, requisiti specifici"
  }
]} />

## Strategie di Raffinamento per Tipo di Compito

Compiti diversi falliscono in modi prevedibili. Conoscere le modalità di fallimento comuni ti aiuta a diagnosticare e correggere i problemi più velocemente.

### Per la Generazione di Contenuti

La generazione di contenuti spesso produce output generico, fuori target o mal formattato. Il fix di solito coinvolge essere più specifico sui vincoli, fornire esempi concreti o definire esplicitamente la voce del tuo brand.

<InfoGrid items={[
  { icon: "target", title: "Troppo Generico", description: "Aggiungi vincoli specifici e contesto", example: "\"Scrivi sui cani\" → \"Scrivi sui golden retriever per proprietari alla prima esperienza, concentrandoti su addestramento e bisogni di esercizio\"" },
  { icon: "scissors", title: "Troppo Lungo", description: "Imposta limiti parole/paragrafi", example: "Aggiungi: \"Mantieni la risposta sotto 150 parole\" o \"Massimo 3 paragrafi\"" },
  { icon: "palette", title: "Stile Sbagliato", description: "Fornisci esempi di stile", example: "\"Scrivi nello stile di questo esempio: [incolla testo campione]\"" },
  { icon: "megaphone", title: "Fuori Brand", description: "Includi linee guida sulla voce del brand", example: "\"Usa tono amichevole, informale. Evita gergo. Rivolgiti al lettore come 'tu'.\"" }
]} />

### Per la Generazione di Codice

L'output di codice può fallire tecnicamente (errori di sintassi, funzionalità di linguaggio sbagliate) o architetturalmente (pattern scarsi, casi mancanti). Problemi tecnici necessitano specifiche versione/ambiente; problemi architetturali necessitano guida al design.

<InfoGrid items={[
  { icon: "code", title: "Errori di Sintassi", description: "Specifica versione linguaggio", example: "\"Usa sintassi Python 3.11+ con type hints\" o \"JavaScript ES2022\"" },
  { icon: "git-branch", title: "Approccio Sbagliato", description: "Descrivi pattern preferiti", example: "\"Usa approccio funzionale, evita classi\" o \"Segui pattern repository\"" },
  { icon: "shield", title: "Casi Limite Mancanti", description: "Elenca scenari da gestire", example: "\"Gestisci: input vuoto, valori null, timeout di rete, formati invalidi\"" },
  { icon: "tag", title: "Naming Scarso", description: "Includi convenzioni di naming", example: "\"Usa camelCase per variabili, PascalCase per classi, UPPER_SNAKE per costanti\"" }
]} />

### Per l'Analisi

I compiti di analisi spesso producono risultati superficiali o non strutturati. Guida il modello con framework specifici (SWOT, Cinque Forze di Porter), richiedi molteplici punti di vista o fornisci un template per la struttura dell'output.

<InfoGrid items={[
  { icon: "layers", title: "Troppo Superficiale", description: "Chiedi framework specifici", example: "\"Analizza usando framework SWOT\" o \"Applica le Cinque Forze di Porter\"" },
  { icon: "scale", title: "Parziale", description: "Richiedi molteplici prospettive", example: "\"Presenta argomenti pro e contro\" o \"Includi punto di vista scettico\"" },
  { icon: "database", title: "Dati Mancanti", description: "Specifica cosa analizzare", example: "\"Concentrati su: dimensione mercato, tasso di crescita, player chiave, barriere all'ingresso\"" },
  { icon: "layout", title: "Non Strutturato", description: "Fornisci template di analisi", example: "\"Formatta come: Riepilogo → Risultati Chiave → Implicazioni → Raccomandazioni\"" }
]} />

### Per Q&A

Il question-answering può essere troppo conciso o troppo prolisso, e potrebbe mancare indicatori di confidenza o fonti. Specifica il livello di dettaglio di cui hai bisogno e se vuoi citazioni o incertezza espressa.

<InfoGrid items={[
  { icon: "plus", title: "Troppo Corto", description: "Chiedi elaborazione", example: "\"Spiega in dettaglio con esempi\" o \"Elabora su ogni punto\"" },
  { icon: "minus", title: "Troppo Lungo", description: "Richiedi risposta concisa", example: "\"Rispondi in 2-3 frasi\" o \"Dammi il TL;DR\"" },
  { icon: "help-circle", title: "Incerto", description: "Chiedi livello di confidenza", example: "\"Valuta la tua confidenza 1-10\" o \"Nota eventuali assunzioni fatte\"" },
  { icon: "link", title: "Senza Fonti", description: "Richiedi citazioni", example: "\"Cita fonti per le affermazioni\" o \"Includi riferimenti dove possibile\"" }
]} />

## La Tecnica del Feedback Loop

Ecco una meta-tecnica: usa il modello stesso per aiutarti a migliorare i tuoi prompt. Condividi cosa hai provato, cosa hai ottenuto e cosa volevi. Il modello può spesso suggerire miglioramenti che non avevi considerato.

```
Ho usato questo prompt:
"[il tuo prompt]"

E ho ottenuto questo output:
"[output del modello]"

Volevo qualcosa di più [descrivi la lacuna]. Come dovrei modificare 
il mio prompt per ottenere risultati migliori?
```

## A/B Testing dei Prompt

Per prompt che saranno usati ripetutamente o su larga scala, non scegliere solo il primo che funziona. Testa variazioni per trovare l'approccio più affidabile e di massima qualità.

```
Prompt A: "Riassumi questo articolo in 3 punti elenco."
Prompt B: "Estrai le 3 intuizioni più importanti da questo articolo."
Prompt C: "Quali sono i punti chiave di questo articolo? Elencane 3."
```

Esegui ciascuno più volte, confronta:
- Consistenza dell'output
- Qualità delle informazioni
- Rilevanza per le tue esigenze

## Quando Smettere di Iterare

La perfezione è nemica del buono. Sappi quando il tuo prompt è pronto per l'uso e quando stai solo lucidando per rendimenti decrescenti.

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconCheck className="h-4 w-4" /> Pronto per il Rilascio</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">L'output soddisfa consistentemente i requisiti</p>
      <p className="m-0!">I casi limite sono gestiti appropriatamente</p>
      <p className="m-0!">Il formato è affidabile e parsabile</p>
      <p className="m-0!">Ulteriori miglioramenti mostrano rendimenti decrescenti</p>
    </div>
  </div>
  <div className="border rounded-lg bg-red-50/50 dark:bg-red-950/20 border-red-200 dark:border-red-900">
    <p className="text-sm font-semibold text-red-700 dark:text-red-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconX className="h-4 w-4" /> Continua a Iterare</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">L'output è inconsistente tra le esecuzioni</p>
      <p className="m-0!">I casi limite causano fallimenti</p>
      <p className="m-0!">Requisiti critici vengono mancati</p>
      <p className="m-0!">Non hai testato abbastanza variazioni</p>
    </div>
  </div>
</div>

## Controllo Versione per i Prompt

I prompt sono codice. Per qualsiasi prompt usato in produzione, trattalo con lo stesso rigore: controllo versione, changelog e la possibilità di rollback se qualcosa si rompe.

<Callout type="tip" title="Versioning Integrato">
prompts.chat include cronologia automatica delle versioni per i tuoi prompt. Ogni modifica viene salvata, così puoi confrontare versioni e ripristinare iterazioni precedenti con un click.
</Callout>

Per prompt autogestiti, usa una struttura di cartelle:

```
prompts/
├── risposta-cliente/
│   ├── v1.0.txt    # Versione iniziale
│   ├── v1.1.txt    # Corretto problema tono
│   ├── v2.0.txt    # Ristrutturazione maggiore
│   └── current.txt # Symlink alla versione attiva
└── changelog.md    # Documenta modifiche
```

## Riepilogo

<Callout type="tip" title="Punti Chiave">
Inizia semplice, osserva attentamente, cambia una cosa alla volta, documenta cosa funziona e sappi quando fermarti. I migliori prompt non vengono scritti—vengono scoperti attraverso iterazione sistematica.
</Callout>

<Quiz 
  question="Qual è l'approccio migliore quando si raffina un prompt che produce risultati sbagliati?"
  options={[
    "Riscrivere l'intero prompt da zero",
    "Aggiungere più esempi finché funziona",
    "Cambiare una cosa alla volta e testare ogni cambiamento",
    "Rendere il prompt il più lungo possibile"
  ]}
  correctIndex={2}
  explanation="Cambiare una cosa alla volta ti permette di isolare cosa funziona e cosa no. Se cambi molteplici cose contemporaneamente, non saprai quale cambiamento ha corretto il problema o quale lo ha peggiorato."
/>

## Pratica: Migliora Questo Prompt

Prova a migliorare questo prompt debole tu stesso. Modificalo, poi usa l'IA per confrontare la tua versione con l'originale:

<BeforeAfterEditor
  title="Raffina Questo Prompt Email"
  badPrompt="Scrivi un'email."
  idealPrompt={`Sei uno scrittore business professionale.

Compito: Scrivi un'email di follow-up a un potenziale cliente dopo un incontro di vendita.

Contesto:
- Incontro con Sarah Chen, VP Marketing presso TechCorp
- Discusso la nostra piattaforma di analytics
- Ha espresso interesse nelle funzionalità di reporting
- L'incontro era ieri

Requisiti:
- Tono professionale ma caloroso
- Riferimento a punti specifici dal nostro incontro
- Includi un passo successivo chiaro (programmare una demo)
- Mantieni sotto 150 parole

Formato: Oggetto + corpo email`}
  task="Trasforma questo prompt email vago in qualcosa che produrrà un risultato professionale ed efficace."
/>

Nel prossimo capitolo, esploreremo il prompting JSON e YAML per applicazioni di dati strutturati.
