Menu

Self-consistency: risposte a maggioranza di voti

La self-consistency (autoconsistenza) pone la stessa domanda di ragionamento più volte, lascia che ogni esecuzione ragioni a modo suo e tiene la risposta che compare più spesso. Qui vedi come funziona, come applicarla a mano e come farlo nel codice.

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

La self-consistency (self-consistency prompting, o autoconsistenza) consiste nel porre a un modello la stessa domanda di ragionamento più volte e tenere la risposta che compare più spesso. Ogni esecuzione scrive il proprio ragionamento, come nel chain of thought prompting, e siccome il modello sceglie le parole con una certa casualità, le esecuzioni seguono percorsi diversi. I percorsi corretti tendono ad arrivare alla stessa risposta. Gli errori tendono a sparpagliarsi tra risposte sbagliate diverse. Un voto a maggioranza sfrutta questa differenza.

La tecnica viene da Wang et al. 2022, "Self-Consistency Improves Chain of Thought Reasoning in Language Models". L'articolo ha confrontato il campionamento di molti percorsi di ragionamento con voto contro una singola risposta greedy, e ha visto che il voto migliorava la precisione nei benchmark di aritmetica e di ragionamento di senso comune.

Il blocco qui sotto mostra tre esecuzioni dello stesso prompt. Ogni scheda è un'esecuzione con la sua risposta. Due esecuzioni contano bene; una fa una svista in cui è facile cadere.

Quante volte compare la cifra 7 se scrivi tutti i numeri interi da 1 a 100? Ragiona passo dopo passo, poi dai la risposta finale sull'ultima riga nella forma "Risposta: N".
Try it
Example replyReplies vary between models and runs.

Conto i 7 per posizione.

  • Unità: 7, 17, 27, 37, 47, 57, 67, 77, 87, 97. Sono 10 sette.
  • Decine: da 70 a 79. Sono altri 10 sette.
  • Centinaia: solo 100 ha tre cifre, e non contiene nessun 7.

77 compare in entrambi gli elenchi, ed è giusto, perché contiene due 7.

Risposta: 20

L'esecuzione 2 ha risposto a una domanda leggermente diversa: quanti numeri contengono un 7, non quante volte compare la cifra. Il suo ragionamento suona sicuro quanto gli altri due, e da solo non ti darebbe motivo di dubitarne. Su tre esecuzioni il voto è 20, 19, 20, e la risposta di maggioranza è quella corretta.

Come funziona la self-consistency

  1. Scrivi un prompt chain of thought con una riga di risposta fissa. Chiedi prima il ragionamento e alla fine la risposta, in una forma che puoi trovare, come "Risposta: N". Senza una riga fissa devi leggere ogni esecuzione per trovarne la risposta.
  2. Campiona più esecuzioni con la casualità attiva. Ogni esecuzione ha bisogno della libertà di prendere un percorso diverso. Nell'API ci pensa una temperatura sopra lo 0. A temperatura 0 la maggior parte delle esecuzioni ripeterebbe lo stesso ragionamento, e ripetere un errore cinque volte non è una prova.
  3. Estrai la risposta finale da ogni esecuzione. In questa fase ignora il ragionamento. Due esecuzioni che sono arrivate a 20 per strade diverse contano come due voti per 20.
  4. Prendi la risposta più frequente. Normalizza prima di contare, così che "20", "20." e "venti" contino come la stessa risposta.

Il grado di accordo è di per sé un'informazione utile. Quando tutte e cinque le esecuzioni concordano, una svista casuale è improbabile. Quando i voti si dividono in tre, la domanda è difficile per il modello, ed è un segnale per controllare tu la risposta o riscrivere il prompt. L'articolo ha anche riportato che le domande con un accordo più forte tra i campioni avevano più probabilità di ricevere una risposta corretta.

Self-consistency a mano

Puoi applicare la tecnica in qualsiasi app di chat. Invia il prompt, annota l'ultima riga, poi ottieni un'altra esecuzione indipendente: premi rigenera, oppure incolla lo stesso prompt in una chat nuova. Ripeti finché non hai tre o cinque risposte.

Non chiedere di nuovo nella stessa conversazione con "Sei sicuro?" o "Riprova". Il modello vede la sua risposta precedente, quindi la nuova risposta non è indipendente: tende a ripetere la prima o a cambiarla solo perché sei sembrato dubbioso. Nessuna delle due cose è un voto.

Questo prompt è pronto per il voto. Inserisci la tua domanda e il formato della risposta, poi eseguilo più volte.

Un prompt pronto per il voto
Fill in
Parts
Un negozio vende penne in confezioni da 3 a 2 €. Maya compra 12 penne e paga con una banconota da 10 €. Quanto resto riceve?
Ragiona passo dopo passo. Poi dai la risposta finale da sola sull'ultima riga nella forma "Risposta: un importo in euro".
Try it
Example replyReplies vary between models and runs.

12 penne sono 12 ÷ 3 = 4 confezioni.

4 confezioni costano 4 × 2 € = 8 €.

Resto da 10 €: 10 € meno 8 € = 2 €.

Risposta: 2 €

È la parte sul formato a rendere possibile il voto. Disattivala e le esecuzioni tendono a formulare le risposte in modo diverso, spesso a metà del testo, e un semplice conteggio diventa una lettura attenta.

Self-consistency nel codice

Nel codice il ciclo è breve: esegui lo stesso prompt N volte, estrai le righe di risposta e contale. Questa versione usa l'SDK Python di OpenAI; qualsiasi API che ti permette di impostare una temperatura funziona allo stesso modo.

import re
from collections import Counter
from openai import OpenAI

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

PROMPT = (
    "How many times does the digit 7 appear when you write out all the whole "
    "numbers from 1 to 100? Think it through step by step, then give the final "
    'answer on the last line in the form "Answer: N".'
)

def final_answer(text):
    # Also matches "**Answer: 20**", since chat models often bold the last line.
    lines = re.findall(r"^\**Answer:\**\s*(.+)$", text, re.MULTILINE)
    return lines[-1].strip(" *.") if lines else None

answers = []
for _ in range(5):
    response = client.chat.completions.create(
        model=MODEL,
        temperature=0.8,
        messages=[{"role": "user", "content": PROMPT}],
    )
    answers.append(final_answer(response.choices[0].message.content))

votes = Counter(a for a in answers if a is not None)
if votes:
    best, count = votes.most_common(1)[0]
    print(f"{best} ({count} of {len(answers)} runs agree)")
else:
    print("No run gave an answer line.")

Le esecuzioni sono indipendenti, quindi in produzione le invieresti in parallelo invece che una dopo l'altra. Alcuni modelli di ragionamento accettano solo la temperatura predefinita e restituiscono un errore se ne imposti una; per questi, ometti temperature. Le loro esecuzioni variano comunque, perché il valore predefinito campiona già.

Quando usarla e quanto costa

La self-consistency vale la pena quando sono vere tre cose: la risposta è breve e confrontabile (un numero, un'etichetta, una scelta), una risposta sbagliata costa più di qualche chiamata in più, e il modello non è già affidabile sul compito. Problemi di matematica a parole, classificazioni con casi limite insidiosi e domande a risposta multipla sono adatti.

Costa circa N volte i token di una singola risposta, e non aiuta quando il modello ha lo stesso equivoco in ogni esecuzione. Se tutte e cinque le esecuzioni fanno lo stesso errore, il voto è unanime e sbagliato. Il voto riduce le sviste casuali, non gli errori sistematici, quindi non sostituisce il controllo periodico delle risposte su un risultato noto.

I modelli che ragionano internamente prima di rispondere affrontano già il problema a lungo in ogni esecuzione, e questo tende a ridurre il guadagno del voto. Può comunque ripagare nelle domande difficili in cui le loro esecuzioni non concordano.

La self-consistency vota solo sulle risposte finite. Il tree of thought prompting fa un passo in più e confronta i ragionamenti parziali mentre il problema è ancora in corso di soluzione, tenendo i rami promettenti e scartando quelli deboli prima che arrivino a una risposta.

Domande frequenti

Cos'è la self-consistency nel prompting?

La self-consistency è una tecnica di Wang et al. (2022). Invii lo stesso prompt chain of thought più volte con il campionamento attivo, così ogni esecuzione ragiona lungo un percorso diverso, poi tieni la risposta finale che compare più spesso. Al posto della fiducia in un'unica catena di ragionamento c'è un voto tra più catene.

Quanti campioni servono per la self-consistency?

Per l'uso quotidiano, da tre a cinque esecuzioni bastano a mettere in minoranza una svista occasionale, e un numero dispari evita il pareggio tra due risposte. L'articolo originale campionava molti più percorsi per domanda e ha visto che la precisione continuava a salire con più campioni, ma con guadagni sempre più piccoli. Usa più esecuzioni quando una risposta sbagliata costa cara e meno quando contano il costo o la velocità.

Che differenza c'è tra self-consistency e chain of thought?

La chain of thought è una singola esecuzione in cui il modello scrive il ragionamento prima della risposta. La self-consistency si basa su di essa: esegue la chain of thought più volte e vota tra le risposte finali. La chain of thought cambia il prompt; la self-consistency cambia quante risposte raccogli e come ne scegli una.

La self-consistency funziona per temi o risposte aperte?

Non direttamente, perché un voto richiede risposte che si possano confrontare per vedere se sono uguali: un numero, un'etichetta, la lettera di una risposta multipla o un dato breve. Per i testi aperti, una soluzione comune è generare più versioni e chiedere al modello quale concorda di più con le altre, ma quello è un giudizio, non un conteggio.

Posso usare la self-consistency in ChatGPT o Claude?

Sì, a mano. Invia il prompt in più chat nuove, oppure rigenera la risposta più volte, e annota la risposta finale di ogni esecuzione. Usa una chat nuova o il pulsante per rigenerare invece di chiedere di nuovo nella stessa conversazione, perché un modello che vede la sua risposta precedente tende a ripeterla.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA