00-03-02 — Como um LLM Pensa: Próximo Token e Alucinações

⏱ 8 min Fontes validadas em: 2026-04-29

TL;DR

Um LLM não "pensa" — ele prevê o próximo token mais provável, um de cada vez, repetidamente, até completar a resposta. Alucinações acontecem porque o modelo está sempre produzindo o output mais plausível dado o contexto, mesmo quando não tem a informação — ele não sabe que não sabe. Temperatura controla o quão "criativo" (ou aleatório) é esse processo de seleção.

Desmontando a Metáfora da "Inteligência"

Depois de entender embeddings e atenção, você tem as ferramentas para entender como um LLM realmente funciona — e por que é importante não antropomorfizar o processo. O modelo não raciocina, não consulta memória, não "sabe" coisas no sentido humano. O que ele faz é matematicamente elegante e ao mesmo tempo mais simples do que parece.

A operação central de um LLM é: dado um texto de entrada (o contexto), produzir uma distribuição de probabilidade sobre todos os possíveis tokens que poderiam vir a seguir. Depois, samplear um token dessa distribuição. Acrescentar esse token ao contexto. Repetir.

O Loop de Previsão do Próximo Token

Vamos tornar isso concreto. Você envia a mensagem: "A capital do Brasil é". O modelo processa esse texto, passa por todas as camadas de atenção, e chega a uma distribuição de probabilidade aproximadamente assim:

  • "Brasília" → 94%
  • "São Paulo" → 3%
  • "Rio" → 2%
  • outros → 1%

O modelo seleciona "Brasília". Agora o contexto é "A capital do Brasil é Brasília". O modelo processa novamente e prevê o próximo token — talvez "," (vírgula) com 60%, "." com 25%, etc. Isso continua até o modelo prever um token especial de fim de sequência.

Toda a "resposta" é gerada assim: um token de cada vez, cada um condicionado a todos os anteriores. Não há plano antecipado. O modelo não decide primeiro "o que" vai dizer e depois escreve — ele escreve e descobre o que vai dizer no processo.

💡
Implicação surpreendente: Isso significa que modelos que "pensam em voz alta" (chain-of-thought) realmente se beneficiam do processo. Escrever os passos intermediários não é só para o usuário — os tokens intermediários ficam no contexto e condicionam os tokens seguintes. O raciocínio escrito ajuda o modelo a raciocinar melhor.

Por que Alucinações são Inevitáveis (e como Mitigar)

As alucinações — quando modelos inventam fatos com confiança — fazem sentido total quando você entende o mecanismo de geração. O modelo está sempre gerando o próximo token mais plausível. Se alguém pergunta "Qual é o CEO da Empresa X?", o modelo procura padrões do tipo "CEO da Empresa X é [nome]" e gera o nome mais plausível dado o contexto — mesmo que esse nome seja inventado.

O modelo não tem um "flag" interno de "eu não sei isso". Ele sempre produz output. Quando o output não tem base no treinamento, o resultado é estatisticamente plausível mas factualmente errado — uma alucinação.

As principais estratégias de mitigação:

  • RAG: forneça as informações corretas no contexto — o modelo usa o que você deu, não o que inventou
  • Grounding explícito: instrua o modelo a responder apenas com base em fontes fornecidas, e a dizer "não sei" quando a informação não está lá
  • Temperature baixa: reduz aleatoriedade, mas não elimina alucinações — só as torna mais consistentes
  • Verificação estruturada: faça o modelo gerar afirmações com citações que você pode verificar programaticamente
⚠️
Ilusão de confiança: O modelo gera alucinações com o mesmo tom confiante que gera fatos corretos. Não há sinal de "incerteza" no texto que você pode usar para detectar automaticamente. Em aplicações críticas (saúde, jurídico, financeiro), toda afirmação precisa de mecanismo de verificação.

Temperatura: Controlando a Aleatoriedade

Voltando à distribuição de probabilidade sobre o próximo token: a temperatura é um parâmetro que ajusta essa distribuição antes de samplear. É o que transforma um modelo determinístico em um espectro de criatividade.

Temperature = 0: sempre seleciona o token de maior probabilidade. Respostas determinísticas, consistentes, previsíveis. Ideal para extração de dados, classificação, código com formato específico.

Temperature = 1: usa a distribuição original aprendida pelo modelo. Equilíbrio entre criatividade e coerência. O padrão para a maioria dos usos conversacionais.

Temperature = 2: "achatamento" da distribuição — tokens menos prováveis ganham mais chance. Respostas mais diversas, criativas, mas potencialmente incoerentes. Útil para brainstorming e geração criativa.

💡
Temperature não é criatividade pura: Ela aumenta aleatoriedade — o que pode produzir outputs interessantes ou outputs nonsense. Para criatividade genuína, a qualidade dos dados de treinamento importa muito mais que a temperatura. Aumentar temperatura em um modelo ruim só produz lixo mais variado.

O que um LLM Realmente é: Compressão com Perdas

Uma forma útil de pensar em LLMs: eles são compressores de texto com perdas. Durante o treinamento, o modelo "comprimiu" padrões de trilhões de tokens em bilhões de parâmetros. Quando você faz uma query, ele está "descomprimindo" — extraindo padrões relevantes para gerar uma resposta.

Como qualquer compressão com perdas, detalhes específicos se perdem. O modelo retém padrões gerais (relações entre conceitos, estrutura narrativa, estilos de escrita) mas pode perder fatos específicos ou distorcê-los. É por isso que é excelente para síntese, geração e raciocínio sobre padrões, mas não confiável como banco de dados de fatos.

🏢
Na Stack Microsoft: Azure OpenAI expõe o parâmetro temperature em todas as chamadas. O modelo o1 (reasoning) usa uma abordagem diferente — gera um "scratchpad" interno de raciocínio antes de produzir a resposta final, o que reduz alucinações em problemas que exigem raciocínio multi-step.

Demonstração: Temperatura no Código

// Azure OpenAI SDK — controlando temperatura
var chatClient = openAIClient.GetChatClient("gpt-4o");

// Temperatura 0: determinístico, para tarefas estruturadas
var deterministicOptions = new ChatCompletionOptions { Temperature = 0 };
var structured = await chatClient.CompleteChatAsync(
    [new UserChatMessage("Extraia os dados em JSON: João, 35 anos, SP")],
    deterministicOptions);
// → {"nome": "João", "idade": 35, "estado": "SP"} (sempre igual)

// Temperatura 1: padrão conversacional
var defaultOptions = new ChatCompletionOptions { Temperature = 1 };
var creative = await chatClient.CompleteChatAsync(
    [new UserChatMessage("Escreva um slogan para consultoria de IA")],
    defaultOptions);
// → resposta varia a cada chamada

// Temperatura 0.2: baixa aleatoriedade, bom para código
var codeOptions = new ChatCompletionOptions { Temperature = 0.2f };
// Para geração de código, baixa temperatura mantém consistência
// sem ser completamente determinístico (evita repetição em loops)