Para quem trabalha com tecnologia e usa os LLMs, faço uma pergunta: como essas ferramentas, que são essencialmente programas matemáticos, conseguem lidar com algo tão rico e complexo quanto a linguagem humana? Ah, a resposta reside em uma transformação crucial, que é a conversão de palavras (e partes de palavras) em números, o processamento desses números e, finalmente, a reconversão dos números em palavras na resposta. Vamos aprender esse processo passo a passo?
Computadores são máquinas de calcular. Eles operam fundamentalmente com números e operações matemáticas. A linguagem humana, por outro lado, é simbólica, contextual, ambígua e cheia de nuances. Para que um LLM possa “entender”, ou, mais precisamente, modelar estatisticamente e gerar texto, ele precisa de uma ponte entre esses dois mundos.
O primeiro passo é a tokenização. Imagine que você precisa contar os elementos de uma coleção. Você não conta uma frase inteira como um único item, mas você a divide em unidades menores. É exatamente isso que a tokenização faz. Ela fragmenta o texto de entrada. Por exemplo, a frase “O gato persa é fofo” é dividida em unidades menores chamadas tokens. E o que é um token? Bem, pode ser uma palavra inteira (“O”, “gato”, “é”), ou parte de uma palavra (“pers”, “a” – para “persa”) ou uma subpalavra (unidades significativas menores que palavras, como prefixos, sufixos ou radicais comuns) e até mesmo pontuação e símbolos especiais, como o sinal de EOS (End of Sentence) que indica ao LLM para terminar a frase. Assim, a frase “O gato persa é fofo” poderia ser tokenizado como: [“O”, ” gato”, ” pers”, “a”, ” é”, ” fofo”]. Observem que os espaços podem ser incluídos ou tratados separadamente.
A seguir ele faz o mapeamento para IDs. Cada token único no vocabulário do modelo, que pode ter de dezenas de milhares a centenas de milhares de tokens, recebe um ID numérico único. Pense nisso como o índice de um dicionário. No exemplo, teremos “O” -> ID 5, ” gato” -> ID 1032, ” pers” -> ID 4501, “a” -> ID 8, ” é” -> ID 12 e ” fofo” -> ID 7890. Como resultado, a frase se transforma em uma sequência de números: [5, 1032, 4501, 8, 12, 7890]. Esta é a representação inicial que o modelo pode manipular.
O passo 2 é o chamado embedding, que dá significado aos números. IDs numéricos são apenas rótulos. Eles não carregam nenhum significado semântico ou relacional entre as palavras. É aí que entram os embeddings. São vetores numéricos densos. Ou seja, uma lista de números de ponto flutuante de alta dimensão, tipicamente com centenas a milhares de dimensões. Cada token no vocabulário possui seu embedding único, pré-aprendido durante o treinamento do modelo. Cada dimensão do vetor de embedding captura algum aspecto latente do significado ou uso do token. Pense em dimensões representando coisas como, animado vs. calmo, concreto vs. abstrato, positivo vs. negativo. Ou relações semânticas como rei – homem + mulher = rainha.
Na operação, o modelo consulta uma grande tabela, a chamada tabela de embeddings, usando o ID do token (5) e recupera seu vetor de embedding correspondente, como [0.21, -0.76, 0.03, …, 0.45]. A sequência de IDs [5, 1032, 4501, 8, 12, 7890] é então transformada em uma sequência de vetores densos. Agora temos uma representação numérica rica que captura as relações aproximadas de significado entre os tokens.
Esta sequência de vetores de embedding é a entrada real para o núcleo do LLM, que é a arquitetura Transformer. Esta é uma rede neural profunda complexa, mas seu papel principal aqui é capturar contexto. Através de mecanismos como Self-Attention, o modelo analisa como cada token se relaciona com todos os outros tokens na sequência de entrada, e possivelmente em sequências anteriores na conversa. Isso permite entender que “persa” modifica “gato”, que “fofo” se refere ao conjunto, etc. Para isso, os vetores passam por múltiplas camadas neurais. Em cada camada, a representação de cada token é refinada com base no contexto cada vez mais amplo extraído pela rede. E após passar por todas as camadas do transformer, cada token de entrada original é representado por um novo vetor numérico altamente contextualizado. Este vetor incorpora não apenas o significado da palavra isolada, mas exatamente o que ela significa naquele ponto específico da frase e conversa.
Bem, agora o modelo precisa gerar uma resposta. Ele opera token por token. O modelo recebe a sequência processada (vetores contextuais) e um token inicial para começar a resposta, que geralmente um token especial <s> ou o último token da entrada. A última camada do transformer é uma camada linear seguida de uma função softmax. Esta camada pega o vetor contextual do token atual (ou do contexto) e calcula uma distribuição de probabilidade sobre todos os tokens possíveis do vocabulário. Ela responde à pergunta: “Dado todo o contexto até agora, qual é o token mais provável de vir a seguir?”
No nosso exemplo, após o contexto “O gato persa é”, o modelo pode atribuir alta probabilidade a tokens como ” muito”, ” incrivelmente”, ” fofo”, ” elegante”, e baixa probabilidade a ” azul” ou ” corre”.
Para selecionar o próximo token, são usadas algumas técnicas de decodificação como “Greedy Decoding”, que simplesmente escolhe o token com a maior probabilidade, “Beam Search”, que mantém um pequeno conjunto das sequências parciais mais prováveis e “Sampling”, que escolhe um token aleatoriamente, mas ponderado pelas probabilidades. Essa opção permite mais criatividade e diversidade. A temperatura controla a aleatoriedade.
Então, o ID numérico do token selecionado é convertido de volta para sua representação em string usando o mesmo dicionário (vocabulário) usado na tokenização. No exemplo, ID 7890 -> ” fofo”. O token recém-gerado (” fofo”) é adicionado à sequência de entrada (contexto), convertido em embedding, processado pelo transformer novamente, para capturar o contexto que agora inclui a palavra que ele mesmo gerou, e o processo se repete para prever o próximo token (“.”, “!”, etc.). Assim, token por token, o modelo constrói a sequência de resposta, convertendo cada ID numérico previsto de volta em texto legível. “O gato persa é fofo.” é gerado como uma sequência de tokens convertidos.
A magia aparente dos LLMs em lidar com linguagem se baseia fundamentalmente nessa transformação bidirecional entre símbolos linguísticos e representações numéricas. A tokenização e os embeddings criam uma ponte que permite ao modelo, baseado em estatísticas aprendidas de enormes volumes de texto, manipular e gerar linguagem através de operações matemáticas complexas dentro da arquitetura transformer. A decodificação fecha o ciclo, traduzindo as previsões numéricas do modelo de volta para o domínio das palavras, permitindo a interação fluente e natural que experimentamos.
Entender esse fluxo básico de palavras -> tokens -> IDs -> embeddings -> processamento contextual -> previsão de IDs -> tokens -> palavras, é crucial para qualquer profissional de tecnologia que deseje compreender os fundamentos do funcionamento, potenciais e limitações dos LLMs. Na prática, mostra que os LLMs nem sabem o que vão gerar. Depende da probabilidade. Por isso, atribuir inteligência a um LLM que gera textos fluentes, mas que nem sabe qual será o próximo token a ser gerado, é muita ficção.



