Como o ChatGPT funciona: a matemática por trás de cada resposta

Quando você faz uma pergunta ao ChatGPT, o modelo prevê a resposta token por token. Cada token é escolhido a partir de uma distribuição de probabilidade calculada por bilhões de multiplicações de matrizes que executam tokenização, embeddings, mecanismo de atenção e amostragem. Esse processo se repete até a resposta terminar.
Você digita "Qual é a capital do Brasil?" e aperta enter. Em alguns segundos, a resposta aparece: "A capital do Brasil é Brasília." Entre o enter e essa resposta, o sistema executou bilhões de multiplicações. Esse artigo descreve, sem fórmula, o que está acontecendo nessas multiplicações.
A descrição vale para qualquer LLM moderno — Claude, Gemini, Llama, DeepSeek, Mistral, ChatGPT. As escolhas de arquitetura mudam nos detalhes. O processo é o mesmo, e o objetivo também: prever a próxima palavra. Nesse artigo vamos detalhar um pouco mais o mecanismo por trás dessa suposta inteligência.
Pra simplificar, vamos focar num único momento desse processo: quando o modelo, já tendo começado a escrever "A capital do Brasil é", precisa decidir qual palavra vem a seguir.
Como a sua frase vira números: a tokenização
O modelo não lê português. Lê números. A primeira coisa que acontece com a sua frase é a tokenização: o texto é quebrado em pedaços chamados tokens. Um token pode ser uma palavra inteira, um pedaço de palavra, ou um sinal de pontuação.
"A capital do Brasil é" vira algo como ["A", " capital", " do", " Brasil", " é"] — cinco tokens, mais ou menos um por palavra. Palavras comuns viram um token só. Palavras raras viram vários. "Brasília", a resposta que o modelo vai gerar daqui a pouco, pode virar ["Bras", "ília"] — dois tokens, porque é palavra menos frequente em corpus dominado pelo inglês.
Cada token tem um número de identificação fixo numa tabela chamada vocabulário, que tem entre 32 mil e 200 mil entradas dependendo do modelo. Sua frase sai do tokenizador como uma lista de inteiros, algo do tipo [32, 5847, 401, 6420, 244]. É só isso que o modelo vê dali pra frente.
Como cada número vira uma posição no espaço: os embeddings
Cada um desses inteiros é trocado por um vetor. Vetor, na prática, é uma lista de números. O que torna ele interessante é que essa lista descreve uma posição num espaço — não um espaço de duas ou três dimensões como o do mundo físico, mas um espaço com, digamos, 4096 dimensões.
Para visualizar: imagina que cada palavra do dicionário tem coordenadas (x, y) num plano. Palavras parecidas ficam perto, palavras diferentes ficam longe. Agora generaliza para 4096 coordenadas em vez de 2. Cada dimensão captura, de forma aprendida durante o treino, algum aspecto abstrato do significado. Nenhuma dimensão isolada significa "verbo" ou "ação humana". O significado vem da combinação das 4096.
Dois tokens com sentidos parecidos, como "Brasil" e "Argentina", terminam com vetores geometricamente próximos nesse espaço multidimensional. "Brasil" e "fotossíntese" ficam longe. A geometria do espaço chega a capturar relações conceituais: o vetor de "rei" menos o vetor de "homem" mais o vetor de "mulher" cai perto do vetor de "rainha". Essa proximidade é o que o modelo usa pra "saber" o que cada palavra quer dizer.
Esse passo se chama embedding. A saída é uma matriz: uma linha por token, 4096 colunas. Para "A capital do Brasil é", você tem agora uma matriz 5 por 4096 de números, e é isso que entra na próxima etapa.
Como funciona o mecanismo de atenção em um LLM
Agora a parte que faz o LLM parecer entender contexto. O modelo precisa decidir o que vem depois de "é". Para isso, cada palavra da frase precisa olhar pras outras e decidir quanto cada uma importa pro contexto que está sendo construído.
Vamos focar no token "é", que é onde a previsão vai sair. Para prever o que vem depois dele, ele precisa de uma resposta clara para: quais palavras anteriores são mais relevantes? Intuitivamente, "capital" e "Brasil" são as que carregam a informação que define a resposta. "A", "do" e "é" mesmo carregam pouca coisa.
Para fazer essa escolha automaticamente, o modelo dá a cada palavra três vetores. A Query (Q) pode ser lida como "o que eu estou procurando agora?". A Key (K) é "como eu me anuncio pras outras me acharem?". O Value (V) é "se alguém me achar relevante, o que eu entrego?".
Pra calcular quanto "capital" importa pra "é", o modelo faz um produto escalar entre o Q de "é" e o K de "capital". Produto escalar é uma das contas mais simples da matemática: multiplica elemento por elemento e soma tudo. O resultado é um número que mede o quanto duas direções estão alinhadas. Se Q de "é" e K de "capital" apontam pro mesmo lado, número alto. Se apontam pra lados perpendiculares, perto de zero.
O modelo faz essa conta entre o Q de "é" e o K de cada uma das outras palavras. Os números resultantes passam por uma normalização chamada softmax, que vira o conjunto de scores em pesos que somam 1. "Capital" e "Brasil" pegam quase toda a massa. "A" e "do" ficam com quase nada.
Para terminar, o modelo soma os Values de todas as palavras, cada um multiplicado pelo seu peso. Essa soma é o novo vetor de "é". Ele agora "viu" a frase inteira, com mais peso vindo das palavras mais relevantes para prever o próximo token.
Isso é a atenção. Repetida em paralelo em várias "cabeças" — cada cabeça aprende um tipo diferente de relevância, como concordância gramatical, ligação de pronome, ou relação semântica — e empilhada em dezenas a centenas de camadas. Em cada camada, cada palavra refaz a operação com Q, K e V recém-projetados a partir da representação que saiu da camada anterior.
O que são parâmetros: a multiplicação de matrizes por baixo
Tudo o que descrevi até agora é somente uma combinação de multiplicação de matrizes intercalada com algumas operações não lineares.
Pense numa matriz como uma máquina de transformar vetores. Você entrega um vetor de entrada, a matriz devolve um vetor de saída. Cada elemento do vetor de saída é uma combinação ponderada dos elementos do vetor de entrada, e os pesos dessa combinação são os números dentro da matriz.
Em termos práticos: se o vetor de entrada tem 4096 números e a matriz é 4096 por 4096, cada um dos 4096 elementos da saída é o resultado de uma "pergunta" diferente feita ao vetor de entrada. Uma linha da matriz pode estar perguntando "esse token parece um pronome?". Outra, "esse token está no começo de uma frase?". O modelo não escolhe essas perguntas, são embutidas durante seu processo de treinamento. Os números da matriz são ajustados durante o pré-treino para fazer com que essas combinações sejam úteis para prever a próxima palavra.
Cada matriz dentro do LLM é uma camada de perguntas aprendidas. Empilhar várias matrizes é inserir essas perguntas, cada nível mais abstrato que o anterior. O que parece raciocínio é, no fundo, essa cascata.
Esses números têm um nome: parâmetros. Quando você lê que o GPT-3 tem 175 bilhões de parâmetros, ou que o Llama 70B tem 70 bilhões, é literalmente isso — a soma total dos números dentro de todas as matrizes do modelo. Cada parâmetro é um peso que foi ajustado individualmente, durante o treino, para fazer o conjunto inteiro prever bem a próxima palavra.
Uma única matriz 4096 por 4096 já tem quase 17 milhões de parâmetros. Multiplica isso pelas dezenas a centenas de camadas que um LLM moderno empilha, soma as matrizes maiores que cobrem o vocabulário inteiro, e você chega na casa dos bilhões. Cada token que o modelo gera dispara trilhões de multiplicações usando esses parâmetros para atravessar todas as camadas. Não tem mágica. Tem escala o suficiente para parecer mágica.
Como o LLM escolhe a próxima palavra
Quando "A capital do Brasil é" termina de atravessar todas as camadas, o modelo tem um vetor final que carrega o "estado" condicionado em tudo que veio antes. É esse vetor que vai escolher a próxima palavra.
Ele é multiplicado por uma matriz gigante chamada matriz de unembedding. Ela tem 4096 linhas, igual à dimensão do vetor, e tantas colunas quanto o vocabulário tem entradas — digamos, 100 mil. A multiplicação devolve um vetor com 100 mil números. Cada número é o logit de um token possível, bruto, sem normalização: "quão atraente o modelo achou esse token agora?".
Esse vetor passa por softmax. O resultado é uma distribuição de probabilidade sobre o vocabulário inteiro. Cada token recebe uma probabilidade entre 0 e 1, e a soma das 100 mil probabilidades dá 1.
Para "A capital do Brasil é", a distribuição se concentra em poucos candidatos. Algo como "Bras" 0,82, "Rio" 0,09, "São" 0,04, "uma" 0,02, e cauda longa nos outros 99.996 tokens dividindo o que sobrou.
Esse é o ponto que muda tudo. O modelo nunca produz "uma resposta". Ele produz uma distribuição. A resposta nasce da escolha de um token a partir dessa distribuição.
Temperatura, top-k e top-p: como o modelo amostra a resposta
Como o sistema escolhe um token a partir da distribuição? A estratégia mais simples se chama greedy: pega sempre o token de maior probabilidade. No nosso exemplo, greedy escolhe "Bras". Determinístico, mas tende a travar em loops quando aplicado em respostas longas.
A maioria dos sistemas usa amostragem com temperatura. Os logits são divididos por um número antes do softmax. Temperatura baixa concentra mais a massa no topo trazendo respostas mais conservadoras. Temperatura alta achata a distribuição gerando respostas mais criativas, ou seja, mais imprevisíveis. Com temperatura alta o suficiente, "Rio" pode sair em vez de "Bras", mesmo com bem menos probabilidade.
Outras técnicas — top-k e top-p — cortam a cauda da distribuição antes de amostrar, para evitar tokens muito improváveis. Só os candidatos mais prováveis entram no sorteio.
A consequência prática: a mesma pergunta, no mesmo modelo, com o mesmo prompt, pode gerar respostas diferentes em rodadas diferentes. A geração é estocástica por construção.
Escolhido um token, ele é colado no fim da sequência. "A capital do Brasil é" vira "A capital do Brasil é Bras". Tudo começa de novo: o novo conjunto de tokens passa pelas camadas, gera um novo vetor final, sai uma nova distribuição. Agora "ília" ganha quase toda a massa, porque a sequência inteira torna óbvio o que vem depois de "Bras". O modelo escolhe "ília", cola na sequência, e repete. Depois vem um ponto final, ou um token especial de "fim".
A resposta que você lê é o produto dessa repetição. Centenas ou milhares de decisões sequenciais, cada uma sendo uma amostragem de uma distribuição condicionada em tudo que veio antes.
De onde vieram os pesos: pré-treino e RLHF
Tudo isso pressupõe que as matrizes do modelo já estão com os números certos. Esses números vieram do treino, em duas fases.
Pré-treino. Bilhões de páginas de texto, vindas de livros, internet, código, são jogadas no modelo. Pra cada janela de texto, o modelo é forçado a prever o próximo token. Os pesos das matrizes são ajustados, por gradiente descendente, pra minimizar o erro dessa previsão. Não tem nenhum sinal de "isso é verdade" ou "isso é falso" no pré-treino. O único sinal é "isso é estatisticamente comum no corpus".
Alinhamento (RLHF e variantes). Em cima do pré-treino, anotadores humanos comparam respostas do modelo a perguntas reais e dizem qual preferem. Um segundo modelo, chamado modelo de recompensa, aprende a aproximar essa preferência. O LLM original é então ajustado pra produzir respostas que o modelo de recompensa avalia bem. Isso o deixa mais útil, mais educado, e — detalhe importante — mais confiante. Humanos preferem respostas firmes a hesitantes, e o modelo aprende isso.
O que está dentro do LLM depois dessas duas fases não é um banco de fatos. É um corpus comprimido em pesos. Quando você pergunta "qual a capital do Brasil?", o modelo não consulta nada. Continua "a capital do Brasil é" da forma estatisticamente mais provável dado o que viu no corpus. Acerta porque "Brasília" segue essa frase em proporção esmagadora dos exemplos.
Por que entender o mecanismo do ChatGPT importa
Voltando ao começo: você apertou enter em "Qual é a capital do Brasil?", e a resposta apareceu na tela token por token — "A", " capital", " do", " Brasil", " é", "Bras", "ília", ponto final. Cada um desses tokens disparou o pipeline inteiro: tokenização do contexto até ali, embedding, dezenas de camadas de atenção, uma multiplicação final pra ter logits sobre todo o vocabulário, softmax, amostragem. Cada palavra da resposta é uma rodada completa desse processo.
A resposta que você lê foi construída palavra por palavra, como a continuação mais provável da conversa. Quando essa continuação bate com a verdade — capital do Brasil, fórmula de Bhaskara, sintaxe de Python — o sistema parece um banco de conhecimento. Porém, quando não está alinhada — pedido do seu cliente, política interna da sua empresa, fato recente que não estava no corpus — o sistema continua respondendo do mesmo jeito, com a mesma fluência.
Esse é o mecanismo. Por que ele leva a alucinação, e o que fazer a respeito, é assunto de outro artigo.