
Ontem iniciei uma série de posts destrinchando as entranhas dos LLMs. Ontem falamos sobre embeddings. Hoje vamos falar sobre o mecanismo de atenção (self-attention).
E o que os dois têm em comum? Bem mais do que parece.
Os embeddings transformam palavras em vetores numéricos que capturam regularidades estatísticas e propriedades semânticas aprendidas durante o treinamento. Mas, isoladamente, eles ainda são insuficientes. Antes de serem contextualizadas pelo processamento do Transformer, palavras iguais partem essencialmente da mesma representação inicial. A palavra “manga”, por exemplo, começa com praticamente o mesmo vetor, independentemente de estar em uma feira ou em uma camisa.
É justamente o mecanismo de atenção, em conjunto com as demais operações do Transformer, que permite transformar essas representações iniciais em representações contextualizadas.
Em outras palavras, os embeddings respondem à pergunta: como representar um token? A atenção responde a outra pergunta muito mais importante: como essa representação deve mudar quando observamos todo o contexto?
Se eu tivesse que escolher a inovação arquitetural mais decisiva para o surgimento dos grandes modelos de linguagem, provavelmente escolheria justamente essa ideia apresentada em 2017 no artigo Attention Is All You Need: o mecanismo de atenção. Evidentemente, o sucesso dos LLMs também dependeu de diversos outros fatores, como maior capacidade computacional, grandes volumes de dados, avanços nos algoritmos de treinamento, tokenização eficiente, leis de escala (scaling laws) e inúmeras otimizações introduzidas desde então. Ainda assim, na minha opinião, foi a arquitetura Transformer que mudou definitivamente o jogo.
Para entender por quê, vamos olhar rapidamente para o passado.
Antes do Transformer, os modelos de linguagem eram baseados principalmente em arquiteturas recorrentes, como RNNs e LSTMs. Eles processavam o texto de forma essencialmente sequencial, palavra após palavra. Era como ler um livro apenas da esquerda para a direita, carregando uma memória resumida do que já havia sido lido.
Embora conseguissem capturar relações de curto prazo, tinham dificuldade para preservar dependências ao longo de textos extensos. Quanto maior a distância entre duas palavras relacionadas, maior a tendência de essa informação se degradar.
Esse limite não era apenas um problema de desempenho. Era uma consequência da própria arquitetura.
Durante o treinamento e durante o processamento inicial do texto de entrada (o chamado prefill do prompt), todos os tokens da sequência podem ser processados em paralelo. Em vez de depender apenas das palavras anteriores, cada token calcula simultaneamente quanto deve incorporar de informação proveniente dos demais tokens presentes na janela de contexto, atribuindo pesos diferentes a cada uma dessas relações por meio do mecanismo de atenção.
Isso não significa, entretanto, que a geração da resposta deixe de ser sequencial. Depois que o prompt foi processado, o modelo continua produzindo um token por vez, em um processo autorregressivo. Para tornar esse processo eficiente, ele reutiliza representações já calculadas do contexto anterior, armazenadas em estruturas conhecidas como KV Cache, evitando recalcular toda a sequência a cada novo token. A atenção passa então a calcular como o novo token deve interagir com esse contexto previamente construído.
Como todos os tokens são processados em paralelo durante o prefill, surge outra questão: como o modelo sabe qual palavra veio antes ou depois?
Afinal, diferentemente das RNNs, o Transformer não possui uma ordem natural de processamento.
A solução foi incorporar informações de posição aos próprios tokens por meio das chamadas codificações posicionais (positional encodings) ou mecanismos equivalentes utilizados nas arquiteturas mais recentes. Assim, cada token carrega não apenas uma representação de seu conteúdo, mas também informações sobre sua posição relativa na sequência.
Graças a isso, o modelo consegue distinguir frases como “o cachorro mordeu o homem” de “o homem mordeu o cachorro”.
Essa mudança parece simples, mas altera completamente a forma como o significado é construído.
Em vez de perguntar apenas “qual é a próxima palavra?”, o modelo passa implicitamente a resolver outra questão muito mais rica: quais partes deste contexto são mais relevantes para interpretar este token?.
É exatamente essa a ideia por trás do nome atenção. Naturalmente, o modelo não “presta atenção” no sentido humano da palavra. Trata-se de um mecanismo matemático que aprende a atribuir diferentes pesos às relações entre os tokens do contexto.
Tecnicamente, cada token projeta sua representação em três novos vetores, conhecidos como Query, Key e Value. A atenção utiliza a similaridade entre Queries e Keys para estimar quanto cada token deve influenciar os demais, produzindo novas representações enriquecidas pelo contexto.
Alguns tokens exercem pouca influência; outros tornam-se decisivos. Esses pesos não são definidos por regras linguísticas programadas manualmente. Eles são aprendidos durante o treinamento e recalculados para cada nova sequência processada. Isso significa que o significado representado por um token não permanece fixo. Sua representação evolui continuamente em função do contexto.
Considere a frase: “O executivo assinou o contrato no banco antes que ele fechasse.”. A palavra “banco” possui pelo menos dois significados comuns: uma instituição financeira ou um banco de praça.
O pronome “ele” também é ambíguo. Nós resolvemos essa ambiguidade quase instantaneamente. O modelo procura fazer algo semelhante.
Ao processar “banco”, a atenção tende a atribuir maior peso a palavras como “assinou”, “contrato” e “fechasse” do que a palavras funcionais como “o”, “no” ou “antes”. Esse conjunto de relações torna muito mais provável que “banco” seja interpretado como uma instituição financeira.
Algo semelhante ocorre com o pronome “ele”. O modelo avalia quais elementos do contexto apresentam maior compatibilidade com o verbo “fechasse”, aumentando a probabilidade de associá-lo ao banco, e não ao executivo ou ao contrato.
Naturalmente, essa inferência nem sempre é perfeita. Mas essa arquitetura captura dependências contextuais muito mais eficientemente do que as gerações anteriores de modelos.
O interessante é que esse processo acontece simultaneamente para todos os tokens durante essa etapa de processamento.
Enquanto “banco” recebe informação de “contrato”, “contrato” também incorpora informação de “banco”. O verbo influencia o substantivo, que influencia o pronome, formando uma rede dinâmica de relações.
Outro aspecto pouco conhecido é que esse cálculo não acontece apenas uma vez. Os LLMs modernos possuem dezenas de camadas de atenção.
A cada camada, as representações dos tokens vão sendo refinadas sucessivamente. Diversos estudos mostram que, em muitos modelos, as primeiras camadas tendem a capturar relações mais locais e aspectos sintáticos, enquanto camadas mais profundas frequentemente representam dependências semânticas mais abstratas e relações de longo alcance. Trata-se de uma tendência observada empiricamente, e não de uma divisão rígida.
Além disso, cada camada possui diversos mecanismos de atenção funcionando em paralelo, conhecidos como attention heads.
Também não existe evidência de que cada cabeça desempenhe uma função fixa. Diversos trabalhos mostram que muitas acabam desenvolvendo especializações emergentes. Algumas tendem a capturar relações sintáticas, outras acompanham referências pronominais, outras identificam estruturas linguísticas específicas e outras representam relações semânticas mais abstratas. Ao mesmo tempo, existe redundância significativa entre várias delas. É justamente a combinação dessas diferentes perspectivas que produz representações tão ricas.
Esse é um dos motivos pelos quais os embeddings produzidos ao longo das camadas do Transformer tornam-se contextualizados.
A palavra “manga” deixa de possuir uma única representação. Em “comprei uma manga na feira”, ela ocupa uma região diferente do espaço vetorial daquela produzida em “rasguei a manga da camisa”. O contexto modifica progressivamente a representação daquele token.
Naturalmente, essa capacidade tem um custo. Na formulação clássica da self-attention, cada token pode interagir com todos os demais tokens da sequência. Por isso, o número de interações cresce aproximadamente com o quadrado do tamanho do contexto. Esse comportamento explica por que janelas de contexto cada vez maiores exigem muito mais memória e capacidade computacional e motivam pesquisas em mecanismos de atenção mais eficientes, como variantes esparsas, agrupadas ou lineares.
É justamente esse mecanismo que permite aos LLMs lidar muito melhor com ambiguidades, metáforas, referências indiretas e estruturas linguísticas complexas do que as arquiteturas anteriores.
O modelo não consulta um dicionário interno para descobrir o significado das palavras. A cada novo token processado, ele calcula como essa representação deve interagir com as representações já construídas do contexto. No fundo, talvez essa seja a principal mudança de paradigma introduzida pelos Transformers.
Ontem vimos que os embeddings transformam palavras em vetores. Hoje vimos que a atenção modifica continuamente essas representações à medida que incorpora relações contextuais. Os embeddings fornecem o ponto de partida. A atenção, juntamente com as demais operações do Transformer, transforma essas representações iniciais em representações cada vez mais ricas e dependentes do contexto.
É dessa combinação que emerge grande parte da extraordinária capacidade linguística dos LLMs modernos.






