O tree of thought prompting (árvore de pensamentos) faz um modelo de linguagem trabalhar em um problema como você faria no papel: anotar alguns próximos passos possíveis, julgar quais parecem promissores, continuar esses e abandonar um ramo quando ele não leva a lugar nenhum. A ideia vem de Yao et al. 2023, "Tree of Thoughts: Deliberate Problem Solving with Large Language Models". Ela amplia o chain of thought, que segue uma única linha de raciocínio, para uma busca por muitas linhas.
Esta página explica como o método original funciona, dá uma versão em um único prompt para você testar no ChatGPT, no Claude ou no Gemini e mostra o loop em código para quando um prompt só não basta.
Como o tree of thoughts funciona
O artigo divide o método em quatro decisões.
- O que conta como um pensamento. Um pensamento é um passo intermediário, pequeno o bastante para o modelo produzir bem e grande o bastante para ser julgado. Em um quebra-cabeça de matemática, é uma equação; em uma tarefa de escrita, é um plano curto.
- Como gerar pensamentos. A partir da solução parcial atual, o modelo propõe vários candidatos a próximo passo, seja sorteando de forma independente, seja listando todos em uma resposta.
- Como avaliá-los. Pede-se ao modelo que dê uma nota a cada solução parcial. O artigo usou dois estilos: avaliar cada estado sozinho (por exemplo, como "certo", "provável" ou "impossível") ou mostrar vários estados ao modelo e deixar que ele vote no melhor.
- Como buscar. Um programa mantém os melhores estados em cada nível (busca em largura) ou segue um ramo até o fundo e volta atrás quando a avaliação diz que ele não tem saída (busca em profundidade).
Pegue a tarefa do Jogo do 24 do artigo: usar os números 4, 9, 10 e 13 uma vez cada, com as quatro operações básicas, para chegar a 24. Um chain of thought se compromete com a primeira equação e tem de conviver com ela. Uma árvore de pensamentos poderia testar 13 - 9 = 4, 10 - 4 = 6 e 4 + 9 = 13 como primeiros passos, perguntar ao modelo quais números restantes ainda podem chegar a 24, descartar o beco sem saída (10, 13 e 13 não chegam a 24) e terminar em (10 - 4) * (13 - 9) = 24.
O que o artigo mostrou
Os autores escolheram três tarefas que o GPT-4 achava difíceis mesmo com chain of thought, porque cada uma exige planejamento ou busca: o Jogo do 24, uma tarefa de escrita criativa com frases finais fixas e minipalavras cruzadas 5x5. Com o GPT-4, a busca em árvore resolveu muito mais problemas do Jogo do 24 do que o chain of thought ou do que gerar várias cadeias e ficar com a resposta da maioria, e também foi melhor nas outras duas tarefas.
O preço são as chamadas. Cada passo candidato e cada avaliação é uma requisição separada, então um problema resolvido pode custar dezenas de chamadas ao modelo, onde o chain of thought custa uma. Essa troca faz sentido para problemas difíceis e nenhum sentido para os simples.
Tree of thought em um único prompt
Você pode aproximar a ideia em uma mensagem: peça várias abordagens diferentes, um veredito sobre cada uma com base nos fatos que você deu e o desenvolvimento só da sobrevivente. As abas abaixo enviam o mesmo problema dos dois jeitos.
A causa principal é a distância física entre a Austrália e o seu servidor em Frankfurt. Cada requisição precisa ir até a Europa e voltar, e com 40 requisições a cada carregamento de página, esse atraso vai se acumulando.
A solução padrão é uma CDN (rede de distribuição de conteúdo). Uma CDN mantém cópias do seu site em servidores pelo mundo, então os usuários australianos baixam de um local próximo em vez de Frankfurt. A maioria dos fornecedores deixa você colocar uma na frente de um site existente sem mudar o código.
Você também pode comprimir imagens e ativar o cache do navegador para reduzir ainda mais o tempo de carregamento.
A resposta direta não é absurda; ela até conta as 40 requisições, mas pegou a primeira explicação que servia ("distância") e seguiu com ela. A resposta com ramos conferiu cada explicação com os detalhes do prompt, e foi assim que percebeu que "uma depois da outra" importa mais do que "Austrália" e que a CDN deixaria as chamadas de API intactas.
Um template reutilizável
A mesma estrutura funciona para escolhas de design e planos. Preencha o problema e os critérios que importam para você; a resposta mostra o padrão preenchido.
Plataforma como serviço (um host de apps gerenciado) Custo: moderado, sobe com o tráfego. Configuração: menos de uma hora a partir de um repositório Git. Manutenção: baixa, o host atualiza o sistema operacional. Manter.
Um servidor virtual próprio Custo: o mais baixo. Configuração: um dia para o servidor, o TLS e um gerenciador de processos. Manutenção: alta, as atualizações e reinicializações ficam com vocês. Descartar para uma equipe de três.
Funções serverless Custo: muito baixo em pequena escala. Configuração: moderada, um app de servidor existente pode precisar ser reestruturado. Manutenção: baixa, mas os cold starts acrescentam latência. Manter como segunda opção.
Melhor: plataforma como serviço. Primeiros passos:
- Acrescentar um script de start e ler a porta de uma variável de ambiente.
- Mover os segredos para as configurações de ambiente do host.
- Conectar o repositório e publicar o branch principal.
- Acrescentar um endpoint de health check.
- Configurar um alerta de gastos.
Onde o prompt único fica devendo
A versão em um único prompt mantém o vocabulário do método, mas perde a maior parte do mecanismo.
- Não há volta atrás de verdade. O modelo escreve todos os ramos e vereditos em uma única passada. Se o passo 3 do ramo escolhido falhar, nada o manda de volta ao passo 1.
- O juiz é o autor. A mesma resposta que propôs uma ideia também dá a nota, então ela tende a favorecer o ramo que já tinha em mente. No artigo, a avaliação é uma chamada separada, feita depois que os candidatos existem.
- Os ramos não são independentes. Ideias listadas em uma mesma resposta se influenciam e muitas vezes acabam como variações de um mesmo tema. Pedir abordagens "realmente diferentes", como o template faz, empurra contra isso, mas não resolve.
- Os modelos de raciocínio já ramificam. Modelos que pensam antes de responder testam e descartam abordagens internamente. Para eles, o prompt acrescenta menos precisão; o valor que sobra é você ver as opções rejeitadas e poder discordar do raciocínio.
Rodando uma busca em árvore de verdade no código
O método completo é um loop no seu programa: gerar passos candidatos, avaliar cada solução parcial em uma chamada separada, manter os melhores e repetir. Esta é uma versão mínima em largura com o SDK Python da OpenAI; a mesma estrutura funciona com qualquer fornecedor.
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]
Com depth=3, keep=2 e três propostas por estado, uma execução faz cerca de trinta chamadas. Em muitas tarefas, o self-consistency (várias respostas completas e voto da maioria) ou uma sequência fixa de etapas com encadeamento de prompts traz a maior parte do benefício com menos chamadas. Recorra à árvore quando a tarefa exige busca: muitos primeiros movimentos possíveis e um jeito de reconhecer cedo um beco sem saída.
Perguntas frequentes
O que é tree of thought prompting?
Tree of thought prompting é um jeito de resolver problemas em que o modelo propõe vários próximos passos possíveis, avalia quão promissor é cada um e continua só os melhores ramos, voltando atrás quando um ramo falha. Ele vem do artigo de 2023 "Tree of Thoughts: Deliberate Problem Solving with Large Language Models", de Yao et al. No artigo, a ramificação e a avaliação são feitas por um programa que chama o modelo muitas vezes.
Qual é a diferença entre tree of thoughts e chain of thought?
O chain of thought segue uma única linha de raciocínio do começo ao fim, então um erro no início vai até a resposta. O tree of thoughts mantém várias soluções parciais vivas ao mesmo tempo, avalia todas e descarta as fracas, então consegue se recuperar de um primeiro passo ruim. O custo é fazer muito mais chamadas ao modelo.
Dá para usar tree of thoughts no ChatGPT ou no Claude?
Dá para usar uma aproximação: um prompt que pede ao modelo que liste várias abordagens, avalie cada uma segundo os seus critérios, descarte as fracas e desenvolva a melhor. Funciona em qualquer app de chat. Não é o método completo, porque tudo acontece em uma única resposta e o modelo avalia as próprias ideias na mesma passada em que as escreveu.
O tree of thought ainda é útil com modelos de raciocínio?
Menos do que era. Modelos que pensam antes de responder já testam e descartam abordagens internamente, então pedir que ramifiquem acrescenta menos. A versão em um único prompt ainda é útil quando você quer ver as opções e os motivos pelos quais foram rejeitadas, para conferir o julgamento você mesmo.
Quando usar tree of thought prompting?
Use em problemas com várias abordagens plausíveis em que a primeira ideia muitas vezes está errada: planejamento, escolhas de design, diagnóstico de um problema a partir dos sintomas e quebra-cabeças que exigem busca. Para uma pergunta com um caminho óbvio, o chain of thought simples é mais barato e igualmente bom.