Self-consistency prompting (prompt de autoconsistência) é fazer ao modelo a mesma pergunta de raciocínio várias vezes e ficar com a resposta que aparece mais. Cada execução escreve o próprio raciocínio, como no chain of thought, e como o modelo sorteia as palavras com alguma aleatoriedade, as execuções seguem caminhos diferentes. Os caminhos corretos tendem a chegar à mesma resposta. Os erros tendem a se espalhar por respostas erradas diferentes. O voto da maioria aproveita essa diferença.
A técnica vem de Wang et al. 2022, "Self-Consistency Improves Chain of Thought Reasoning in Language Models". O artigo comparou amostrar muitos caminhos de raciocínio e votar com pegar uma única resposta gulosa, e descobriu que a votação melhorava a precisão em benchmarks de aritmética e de raciocínio de senso comum.
O bloco abaixo mostra três execuções do mesmo prompt. Cada aba é uma execução com a própria resposta. Duas execuções contam certo; uma comete um deslize fácil de cometer.
Vou contar os 7 por posição.
- Unidades: 7, 17, 27, 37, 47, 57, 67, 77, 87, 97. São 10 setes.
- Dezenas: de 70 a 79. São mais 10 setes.
- Centenas: só o 100 tem três algarismos, e ele não tem 7.
O 77 aparece nas duas listas, o que está certo, porque ele tem dois 7.
Resposta: 20
A execução 2 respondeu a uma pergunta um pouco diferente: quantos números contêm um 7, e não quantas vezes o algarismo aparece. O raciocínio dela parece tão confiante quanto os outros dois e, olhando só para ela, você não teria motivo para desconfiar. Nas três execuções, a votação fica 20, 19, 20, e a resposta da maioria é a correta.
Como o self-consistency funciona
- Escreva um prompt de chain of thought com uma linha de resposta fixa. Peça primeiro o raciocínio e por último a resposta final, em uma forma que você consiga encontrar, como "Resposta: N". Sem uma linha fixa, você precisa ler cada execução inteira para achar a resposta.
- Gere várias execuções com a aleatoriedade ligada. Cada execução precisa de liberdade para seguir um caminho diferente. Na API, uma temperatura acima de 0 faz isso. Com temperatura 0, a maioria das execuções repetiria o mesmo raciocínio, e repetir um erro cinco vezes não é evidência.
- Extraia a resposta final de cada execução. Ignore o raciocínio nesta etapa. Duas execuções que chegaram a 20 por caminhos diferentes contam como dois votos para 20.
- Fique com a resposta mais comum. Normalize antes de contar, para que "20", "20." e "vinte" contem como a mesma resposta.
A própria concordância é uma informação útil. Quando as cinco execuções concordam, um deslize aleatório é improvável. Quando os votos se dividem em três, a pergunta é difícil para o modelo, e isso é um sinal para você mesmo conferir a resposta ou reescrever o prompt. O artigo também relatou que perguntas com mais concordância entre as amostras tinham mais chance de ser respondidas corretamente.
Self-consistency à mão
Você pode aplicar a técnica em qualquer app de chat. Envie o prompt, anote a linha final e depois consiga outra execução independente: aperte o botão de gerar de novo ou cole o mesmo prompt em um chat novo. Repita até ter três ou cinco respostas.
Não pergunte de novo na mesma conversa com "Tem certeza?" ou "Tente de novo". O modelo vê a resposta anterior, então a nova resposta não é independente: ela tende a repetir a primeira ou a mudá-la só porque você pareceu duvidar. Nenhuma das duas coisas é um voto.
Este prompt está pronto para votação. Coloque a sua pergunta e o formato da resposta e rode várias vezes.
12 canetas são 12 ÷ 3 = 4 pacotes.
4 pacotes custam 4 × R 8.
Troco de R 10 menos R 2.
Resposta: R$ 2
A parte de formato é o que torna a votação possível. Desligue-a e as execuções tendem a formular a resposta de jeitos diferentes, muitas vezes em algum lugar no meio do texto, o que transforma uma contagem simples em uma leitura cuidadosa.
Self-consistency no código
No código, o loop é curto: rode o mesmo prompt N vezes, extraia as linhas de resposta e conte. Esta versão usa o SDK Python da OpenAI; qualquer API que deixe você definir uma temperatura funciona do mesmo jeito. O prompt do código pede a linha em inglês, "Answer: N", e a expressão regular procura esse rótulo; se o seu prompt pedir "Resposta: N", troque o rótulo nos dois lugares.
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.")
As execuções são independentes, então em produção você as enviaria em paralelo, e não uma depois da outra. Alguns modelos de raciocínio só aceitam a temperatura padrão e retornam um erro se você definir uma; nesses casos, deixe o temperature de fora. As execuções continuam variando, porque o padrão já faz amostragem.
Quando usar, e quanto custa
O self-consistency vale a pena quando três coisas são verdade: a resposta é curta e comparável (um número, um rótulo, uma alternativa), uma resposta errada custa mais do que algumas chamadas extras e o modelo ainda não é confiável na tarefa. Problemas de matemática com enunciado, classificação com casos limítrofes complicados e perguntas de múltipla escolha se encaixam bem.
Ele custa mais ou menos N vezes os tokens de uma única resposta, e não ajuda quando o modelo tem o mesmo equívoco em todas as execuções. Se as cinco execuções cometem o mesmo erro, a votação é unânime e errada. A votação reduz deslizes aleatórios, não erros sistemáticos, então ela não substitui conferir as respostas com um resultado conhecido de vez em quando.
Modelos que raciocinam internamente antes de responder já trabalham o problema longamente em cada execução, o que tende a diminuir o ganho da votação. Ela ainda pode compensar em perguntas difíceis em que as execuções deles discordam.
O self-consistency vota só em respostas prontas. O tree of thought vai um passo além e compara raciocínios parciais enquanto o problema ainda está sendo resolvido, mantendo os ramos promissores e descartando os fracos antes que cheguem a uma resposta.
Perguntas frequentes
O que é self-consistency prompting?
Self-consistency prompting é uma técnica de Wang et al. (2022). Você envia o mesmo prompt de chain of thought várias vezes com a amostragem ligada, para que cada execução raciocine por um caminho diferente, e depois fica com a resposta final que aparece mais vezes. Em vez de confiar em uma única cadeia de raciocínio, você faz uma votação entre várias.
Quantas amostras usar no self-consistency?
No uso do dia a dia, de três a cinco execuções bastam para derrotar um deslize ocasional na votação, e um número ímpar evita empates entre duas respostas. O artigo original amostrou muito mais caminhos por pergunta e viu que a precisão continuava subindo com mais amostras, mas com ganhos cada vez menores. Use mais execuções quando uma resposta errada custa caro e menos quando custo ou velocidade importam.
Qual é a diferença entre self-consistency e chain of thought?
O chain of thought é uma execução em que o modelo escreve o raciocínio antes da resposta. O self-consistency parte dele: roda o chain of thought várias vezes e vota nas respostas finais. O chain of thought muda o prompt; o self-consistency muda quantas respostas você coleta e como escolhe uma.
O self-consistency funciona para redações ou respostas abertas?
Não diretamente, porque uma votação precisa de respostas que possam ser comparadas por igualdade: um número, um rótulo, uma letra de múltipla escolha ou um fato curto. Para textos abertos, uma alternativa comum é gerar várias versões e perguntar ao modelo qual concorda mais com as outras, mas isso é um julgamento, não uma contagem.
Dá para usar self-consistency no ChatGPT ou no Claude?
Dá, à mão. Envie o prompt em vários chats novos, ou gere a resposta de novo várias vezes, e anote a resposta final de cada execução. Use um chat novo ou o botão de gerar de novo em vez de perguntar outra vez na mesma conversa, porque um modelo que vê a resposta anterior tende a repeti-la.