00-03-02 — Como um LLM Pensa: Próximo Token e Alucinações
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.
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
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.
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.
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)