Menu

Tree of thought prompting: come funziona ed esempi

Il tree of thought prompting (albero di pensiero) fa esplorare al modello più soluzioni parziali, fa valutare ciascuna e tiene solo i rami promettenti. Qui vedi come funziona il metodo originale, una versione in un solo prompt da provare e dove quella versione non basta.

Ogni prompt qui sotto è modificabile: cambialo, poi aprilo in ChatGPT, Claude o un'altra app di AI.

Il tree of thought prompting (albero di pensiero) fa lavorare un modello linguistico su un problema come faresti tu su carta: annotare qualche possibile passo successivo, giudicare quali sembrano promettenti, proseguire con quelli e abbandonare un ramo quando non porta da nessuna parte. L'idea viene da Yao et al. 2023, "Tree of Thoughts: Deliberate Problem Solving with Large Language Models". Estende il chain of thought prompting, che segue un'unica linea di ragionamento, a una ricerca tra molte linee.

Questa pagina spiega come funziona il metodo originale, ti dà una versione in un solo prompt da provare in ChatGPT, Claude o Gemini e mostra il ciclo nel codice per quando un prompt non basta.

Come funziona il tree of thoughts

L'articolo divide il metodo in quattro decisioni.

  1. Cosa conta come pensiero. Un pensiero è un passo intermedio, abbastanza piccolo perché il modello lo produca bene e abbastanza grande da poterlo giudicare. In un rompicapo matematico è un'equazione; in un compito di scrittura è un breve piano.
  2. Come generare i pensieri. Partendo dalla soluzione parziale attuale, il modello propone più passi successivi candidati, campionandoli in modo indipendente oppure elencandoli in un'unica risposta.
  3. Come valutarli. Al modello si chiede di valutare ogni soluzione parziale. L'articolo ha usato due stili: valutare ogni stato da solo (per esempio come "sicuro", "probabile" o "impossibile"), oppure mostrare al modello più stati e fargli votare il migliore.
  4. Come cercare. Un programma tiene i pochi stati migliori a ogni livello (ricerca in ampiezza) oppure segue un ramo in profondità e torna indietro quando la valutazione dice che non ha speranze (ricerca in profondità).

Prendi il compito Game of 24 dell'articolo: usa i numeri 4, 9, 10 e 13 una volta ciascuno, con le quattro operazioni di base, per ottenere 24. Una chain of thought si impegna con la sua prima equazione e deve tenersela. Un tree of thoughts potrebbe provare 13 - 9 = 4, 10 - 4 = 6 e 4 + 9 = 13 come primi passi, chiedere al modello con quali numeri rimasti si può ancora arrivare a 24, scartare il vicolo cieco (con 10, 13 e 13 non si fa 24) e arrivare a (10 - 4) * (13 - 9) = 24.

Cosa ha mostrato l'articolo

Gli autori hanno scelto tre compiti che GPT-4 trovava difficili anche con la chain of thought, perché ognuno richiede pianificazione o ricerca: il Game of 24, un compito di scrittura creativa con frasi finali fissate e mini cruciverba 5x5. Con GPT-4, la ricerca ad albero ha risolto molti più rompicapi del Game of 24 rispetto al chain of thought prompting o al campionamento di più catene con la risposta di maggioranza, e ha fatto meglio anche negli altri due compiti.

Il prezzo sono le chiamate. Ogni passo candidato e ogni valutazione sono una richiesta separata, quindi risolvere un problema può richiedere decine di chiamate al modello dove la chain of thought ne costa una. Lo scambio ha senso per i problemi difficili e nessun senso per quelli semplici.

Tree of thought in un solo prompt

Puoi approssimare l'idea in un solo messaggio: chiedi più approcci distinti, un verdetto su ciascuno in base ai fatti che hai dato e lo sviluppo del solo sopravvissuto. Le schede qui sotto inviano lo stesso problema nei due modi.

La nostra web app è veloce per gli utenti in Europa, ma impiega circa 12 secondi a caricarsi per gli utenti in Australia. Il server è a Francoforte. Quando la pagina si carica, il browser fa 40 piccole richieste API, una dopo l'altra. Qual è la causa e cosa dovremmo fare?
Try it
Example replyReplies vary between models and runs.

La causa principale è la distanza fisica tra l'Australia e il tuo server a Francoforte. Ogni richiesta deve viaggiare fino in Europa e tornare indietro, e con 40 richieste a ogni caricamento di pagina quel ritardo si accumula.

La soluzione standard è una CDN (content delivery network). Una CDN tiene copie del tuo sito su server sparsi per il mondo, così gli utenti australiani scaricano da un punto vicino invece che da Francoforte. La maggior parte dei provider ti permette di metterne una davanti a un sito esistente senza cambiare il codice.

Puoi anche comprimere le immagini e attivare la cache del browser per ridurre ancora i tempi di caricamento.

La risposta diretta non è assurda; tiene perfino conto delle 40 richieste, ma ha preso la prima spiegazione che quadrava ("la distanza") ed è andata avanti con quella. La risposta ramificata ha confrontato ogni spiegazione con i dettagli del prompt, ed è così che ha notato che "una dopo l'altra" conta più di "Australia", e che la CDN lascerebbe intatte le chiamate API.

Un modello riutilizzabile

La stessa struttura funziona per scelte di progettazione e piani. Inserisci il problema e i criteri che ti interessano; la risposta mostra il valore predefinito già compilato.

Ramifica, giudica, scegli
Fill in
Problema: Il nostro team di tre persone deve scegliere come fare il deploy di una piccola API Node.js. Criteri: costo mensile, tempo di configurazione, manutenzione continua Proponi 3 approcci davvero diversi. Per ciascuno, valutalo rispetto a ogni criterio in una riga breve e dai un verdetto: tenere o scartare. Poi sviluppa solo l'approccio migliore in cinque primi passi concreti. Se due approcci sono alla pari, di' quale informazione deciderebbe tra i due.
Try it
Example replyReplies vary between models and runs.

Platform as a service (un hosting gestito per app) Costo: moderato, cresce con il traffico. Configurazione: meno di un'ora partendo da un repository Git. Manutenzione: bassa, il provider aggiorna il sistema operativo. Tenere.

Un tuo server virtuale Costo: il più basso. Configurazione: una giornata per server, TLS e process manager. Manutenzione: alta, aggiornamenti e riavvii sono a carico tuo. Scartare per un team di tre.

Funzioni serverless Costo: molto basso su piccola scala. Configurazione: moderata, un'app server esistente potrebbe dover essere ristrutturata. Manutenzione: bassa, ma gli avvii a freddo aggiungono latenza. Tenere come seconda scelta.

Migliore: platform as a service. Primi passi:

  1. Aggiungi uno script di avvio e leggi la porta da una variabile d'ambiente.
  2. Sposta i segreti nelle impostazioni d'ambiente del provider.
  3. Collega il repository e fai il deploy del branch principale.
  4. Aggiungi un endpoint di health check.
  5. Imposta un avviso sulla spesa.

Dove un solo prompt non basta

La versione in un solo prompt mantiene il vocabolario del metodo ma perde gran parte del meccanismo.

  • Nessun vero ritorno indietro. Il modello scrive tutti i rami e i verdetti in un solo passaggio. Se il passo 3 del ramo scelto fallisce, niente lo rimanda al passo 1.
  • Il giudice è l'autore. La stessa risposta che ha proposto un'idea la valuta anche, quindi tende a favorire il ramo che aveva già in mente. Nell'articolo la valutazione è una chiamata separata, fatta dopo che i candidati esistono.
  • I rami non sono indipendenti. Le idee elencate in una stessa risposta si influenzano a vicenda e spesso finiscono per essere variazioni su un unico tema. Chiedere approcci "davvero diversi", come fa il modello, spinge contro questo effetto ma non lo elimina.
  • I modelli di ragionamento ramificano già. I modelli che pensano prima di rispondere provano e scartano approcci internamente. Per loro il prompt aggiunge meno precisione; il valore che resta è che vedi le opzioni scartate e puoi non essere d'accordo con il ragionamento.

Una vera ricerca ad albero nel codice

Il metodo completo è un ciclo nel tuo programma: genera i passi candidati, valuta ogni soluzione parziale in una chiamata separata, tieni i pochi migliori, ripeti. Questa è una versione minima in ampiezza con l'SDK Python di OpenAI; la stessa forma funziona con qualsiasi provider.

from openai import OpenAI

client = OpenAI()
MODEL = "your-model-id"  # e.g. from your provider's model list

def ask(prompt, temperature=0.7):
    response = client.chat.completions.create(
        model=MODEL,
        messages=[{"role": "user", "content": prompt}],
        temperature=temperature,
    )
    return response.choices[0].message.content.strip()

def propose(problem, path, k=3):
    steps = "\n".join(path) or "(none yet)"
    prompt = f"Problem: {problem}\nSteps so far:\n{steps}\nPropose the next step only."
    return [ask(prompt) for _ in range(k)]

def score(problem, path):
    steps = "\n".join(path)
    prompt = (f"Problem: {problem}\nPartial solution:\n{steps}\n"
              "How likely is this to lead to a correct solution? Reply with a number from 1 to 10 only.")
    try:
        return float(ask(prompt, temperature=0))
    except ValueError:
        return 0.0

def tree_of_thought(problem, depth=3, keep=2):
    frontier = [[]]
    for _ in range(depth):
        candidates = [path + [step] for path in frontier for step in propose(problem, path)]
        candidates.sort(key=lambda p: score(problem, p), reverse=True)
        frontier = candidates[:keep]
    return frontier[0]

Con depth=3, keep=2 e tre proposte per stato, un'esecuzione fa circa trenta chiamate. Per molti compiti, il self-consistency prompting (più risposte complete e voto a maggioranza) o una sequenza fissa di passi con il prompt chaining ottiene la maggior parte del beneficio con meno chiamate. Scegli un albero quando il compito richiede una ricerca: molte prime mosse possibili e un modo per riconoscere presto un vicolo cieco.

Domande frequenti

Cos'è il tree of thought prompting?

Il tree of thought prompting è un modo di risolvere problemi in cui il modello propone più passi successivi possibili, valuta quanto è promettente ciascuno e prosegue solo i rami migliori, tornando indietro quando un ramo fallisce. Viene dall'articolo del 2023 "Tree of Thoughts: Deliberate Problem Solving with Large Language Models" di Yao et al. Nell'articolo la ramificazione e la valutazione sono gestite da un programma che chiama il modello molte volte.

Che differenza c'è tra tree of thoughts e chain of thought?

La chain of thought segue un'unica linea di ragionamento dall'inizio alla fine, quindi un errore iniziale arriva fino alla risposta. Il tree of thoughts tiene in vita più soluzioni parziali insieme, le valuta e scarta quelle deboli, quindi può riprendersi da un primo passo sbagliato. Il prezzo sono molte più chiamate al modello.

Posso usare il tree of thoughts in ChatGPT o Claude?

Puoi usarne un'approssimazione: un prompt che chiede al modello di elencare più approcci, giudicarli in base ai tuoi criteri, scartare quelli deboli e sviluppare il migliore. Funziona in qualsiasi app di chat. Non è il metodo completo, perché tutto avviene in una sola risposta e il modello valuta le proprie idee nello stesso passaggio in cui le ha scritte.

Il tree of thought prompting serve ancora con i modelli di ragionamento?

Meno di prima. I modelli che pensano prima di rispondere provano e scartano già gli approcci internamente, quindi chiedere loro di ramificare aggiunge meno. La versione in un solo prompt resta utile quando vuoi vedere le opzioni e i motivi per cui sono state scartate, così puoi controllare tu quel giudizio.

Quando conviene usare il tree of thought prompting?

Usalo per problemi con più approcci plausibili in cui la prima idea spesso è sbagliata: pianificazione, scelte di progettazione, diagnosi di un problema a partire dai sintomi e rompicapi che richiedono una ricerca. Per una domanda con una strada ovvia, la semplice chain of thought costa meno ed è altrettanto buona.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA