Il chain of thought prompting (catena di pensiero) chiede a un modello linguistico di scrivere i passaggi intermedi di un problema prima di dare la risposta finale. Nei problemi a più passaggi, come i problemi di testo, i rompicapi logici e gli orari, lavorare allo scoperto tende a dare più risposte corrette che rispondere subito, e ti lascia passaggi da controllare. La versione più breve è una sola frase aggiunta al prompt: "Ragioniamo passo dopo passo".
Perché scrivere i passaggi aiuta
Un modello produce la risposta un token alla volta, e tutto ciò che ha già scritto diventa input per il token successivo. Se un prompt pretende la risposta subito, il modello deve produrla prima che sulla pagina esista qualsiasi risultato intermedio. Se prima scrive "Le vendite di caffè del lunedì ammontano a $168", quel numero ora è nel contesto, e il passaggio successivo può basarsi su di esso invece di tenerlo implicito.
Questa è l'intuizione. Le prove sono arrivate da due articoli del 2022. Wei et al., "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models", hanno mostrato che esempi svolti con il ragionamento scritto miglioravano i modelli grandi in compiti di aritmetica, buon senso e ragionamento simbolico. Hanno anche scoperto che il beneficio dipendeva dalla dimensione: i modelli più piccoli non ne traevano vantaggio, e spesso scrivevano un ragionamento scorrevole che portava a risposte sbagliate. Poi Kojima et al., "Large Language Models are Zero-Shot Reasoners", hanno mostrato che anche una sola frase senza esempi, "Let's think step by step" (ragioniamo passo dopo passo), migliorava molto i risultati, anche se in genere meno degli esempi svolti.
Risposta diretta o chain of thought
Le due schede fanno la stessa domanda. La prima chiede solo l'importo; la seconda chiede lo svolgimento e mette la risposta su un'ultima riga fissa.
$258
La risposta diretta mostra un errore tipico: 168 di caffè di lunedì più i $90 di muffin di martedì, quindi ha dimenticato che martedì si sono venduti 10 caffè in meno. La risposta passo dopo passo dà al numero di caffè di martedì una riga tutta sua, così quel passaggio non può essere saltato in silenzio. Un modello attuale potrebbe azzeccare anche la versione diretta; il divario cresce quando i problemi sono più lunghi e i passaggi dipendono di più l'uno dall'altro.
I passaggi scritti hanno un secondo vantaggio: quando una risposta è sbagliata, vedi quale passaggio si è rotto e puoi correggere il prompt o l'input in quel punto.
Chain of thought few-shot
La tecnica originale di Wei et al. mette nel prompt esempi svolti le cui risposte mostrano il ragionamento, e il modello risponde alla nuova domanda allo stesso modo. L'esempio qui sotto è adattato dalla prima figura del loro articolo; la domanda che segue è nuova. Cambia la domanda per provare la tua.
La biblioteca aveva all'inizio 120 libri. Prestandone 45 ne sono rimasti 75 sugli scaffali. Riavendone indietro 18 si è arrivati a 93. La donazione di 30 ha portato il totale a 123. La risposta è 123.
Il CoT few-shot ti dà il controllo sulla forma del ragionamento: quanto è lungo, cosa esplicita e come viene enunciata la risposta. "La risposta è 11" nell'esempio è una chiusura fissa, e la risposta l'ha copiata. Il CoT zero-shot è più rapido da scrivere, ma lascia queste scelte al modello. Per saperne di più su come costruire serie di esempi, vedi few-shot prompting; per la versione con sole istruzioni, vedi zero-shot prompting.
Metti la risposta su una riga a parte
Appena la risposta contiene un ragionamento, il risultato finisce da qualche parte dentro un paragrafo, e questo è un problema quando un programma deve leggerlo. Chiedi la risposta in una forma fissa sull'ultima riga, come fa il prompt del bar con "Answer: $X" (un'etichetta fissa da lasciare così com'è, perché è quella che cerca il codice), e leggi quella riga nel codice:
import re
matches = re.findall(r"^Answer:\s*(.+)$", reply, re.MULTILINE)
answer = matches[-1] if matches else None
Prendere l'ultima corrispondenza è importante, perché il ragionamento stesso può contenere una riga che inizia con "Answer:" prima che il modello si corregga. Se gli utenti devono vedere solo la risposta, chiedi il ragionamento dentro una coppia di tag e la risposta dentro un'altra, poi mostra solo la seconda. Output strutturato spiega come chiedere un JSON quando ti serve più di un campo.
Modelli di ragionamento
Alcuni modelli attuali sono fatti per pensare prima di rispondere: generano un ragionamento interno, spesso nascosto o riassunto, prima della risposta visibile. Per loro "Ragioniamo passo dopo passo" conta molto meno, perché i passaggi avvengono comunque, che tu lo chieda o no. Aggiungerlo di solito allunga soltanto la risposta visibile.
Con un modello di ragionamento continua ad aiutare tutto ciò che sta intorno al ragionamento: una descrizione completa del problema, i vincoli che una risposta corretta deve rispettare e il formato della risposta finale. Descrivi com'è una buona risposta invece di sceneggiare ogni passaggio; una ricetta fissa di passaggi può allontanare il modello da una strada migliore che avrebbe trovato da solo.
Quando non usare il chain of thought
Il chain of thought costa token e tempo, e ripaga solo quando un compito ha passaggi che dipendono l'uno dall'altro. Per una ricerca semplice, una traduzione, una riscrittura o una classificazione semplice, allunga solo la risposta. Un modello può anche scrivere un ragionamento che sembra solido e arrivare comunque a una risposta sbagliata, quindi controlla il risultato finale a parte, non solo i passaggi che ci hanno portato.
Per i problemi difficili in cui una sola catena può sbagliare, ci sono due estensioni che si basano su di essa. Il self-consistency prompting genera diverse catene e tiene la risposta a cui arriva la maggioranza, e il tree of thought prompting esplora e confronta diverse linee parziali di ragionamento prima di impegnarsi su una.
Domande frequenti
Cos'è il chain of thought prompting?
Il chain of thought (CoT), o catena di pensiero, chiede a un modello linguistico di scrivere i passaggi intermedi di un problema prima della risposta finale, mostrando esempi svolti che includono il ragionamento oppure aggiungendo un'istruzione come "Ragioniamo passo dopo passo". Nei problemi a più passaggi questo tende a dare più risposte corrette, e ti permette di controllare ogni passaggio.
"Ragioniamo passo dopo passo" funziona ancora?
Con i normali modelli di chat aiuta ancora nei problemi che richiedono diversi passaggi, soprattutto quando il prompt spingerebbe altrimenti verso una risposta immediata. I modelli di ragionamento, che pensano prima di rispondere, lo fanno già internamente, quindi per loro la frase aggiunge poco oltre a una risposta più lunga. Con questi modelli, descrivi invece con chiarezza il problema e il formato della risposta.
Quando aiuta il chain of thought e quando no?
Aiuta nei compiti che richiedono diversi passaggi dipendenti tra loro: problemi di testo, aritmetica, rompicapi logici, pianificazione con vincoli e capire cosa fa un codice. Aggiunge poco a ricerche semplici, traduzioni, riscritture o classificazioni semplici, dove rende solo la risposta più lunga e lenta.
Che differenza c'è tra chain of thought zero-shot e few-shot?
Il CoT few-shot, introdotto da Wei et al. nel 2022, mette nel prompt esempi svolti con il loro ragionamento, e il modello imita quello stile di ragionamento. Il CoT zero-shot, di Kojima et al. 2022, non usa esempi e aggiunge solo un'istruzione come "Ragioniamo passo dopo passo". Lo zero-shot è più rapido da scrivere; il few-shot dà più controllo su come appaiono i passaggi.
Il ragionamento scritto è davvero il modo in cui il modello è arrivato alla risposta?
Non necessariamente. I passaggi sono testo generato dal modello, e possono sembrare solidi anche quando la risposta finale è sbagliata, oppure contenere un errore anche quando la risposta risulta giusta. Tratta il ragionamento come qualcosa da controllare, non come una prova, e verifica la risposta finale a parte.