Capítulo 02 · Tokenização · 8 min

Do texto aos tokens

Como o texto se torna números. BPE, subpalavras, e por que os LLMs têm dificuldade em contar letras.

Por que tokens?

Um modelo de linguagem não consegue manipular texto diretamente. Ele manipula números. O primeiro passo, sempre que você fala com um LLM, é transformar o texto em uma sequência de inteiros: os token IDs.

A tokenização é o corte que torna essa conversão possível.

Por que não um token por palavra?

À primeira vista, poderíamos imaginar: uma palavra = um token. Simples.

Mas não funciona:

  • A língua contém milhões de palavras possíveis (flexões, neologismos, nomes próprios, erros de digitação...). Ter um token por palavra exigiria um vocabulário gigantesco.
  • O modelo não consegue fazer nada com uma palavra que nunca viu.
  • Algumas línguas (chinês, japonês) nem sequer usam espaços entre palavras.

A solução adotada por quase todos os LLM modernos: as subpalavras.

Tokenização por subpalavras

Com um tokenizer de subpalavras:

  • Palavras frequentes viram um único token (the, e, são)
  • Palavras raras são quebradas em partes menores (tokenizaçãotoken + ização)
  • Caracteres desconhecidos continuam decomponíveis até a letra

O resultado: um vocabulário de tamanho razoável (tipicamente de 30.000 a mais de 250.000 tokens: a faixa sobe com o tempo, porque os tokenizadores recentes cobrem muito mais línguas) que consegue representar qualquer texto.

O algoritmo mais usado se chama BPE (Byte Pair Encoding). Ele começa com caracteres individuais e funde iterativamente os pares mais frequentes no corpus de treinamento.

BPE em trinta segundos

Imagine um mini-corpus de três palavras: low, lower, lowest. Começamos tokenizando no nível do caractere:

l o w
l o w e r
l o w e s t

A cada iteração, procuramos o par de tokens adjacentes mais frequente. Aqui, l o aparece três vezes — fundimos em lo:

lo w
lo w e r
lo w e s t

Agora lo w é o par mais frequente. Fundimos:

low
low e r
low e s t

Continuamos até atingir o tamanho de vocabulário desejado. Os pedaços que aparecem com frequência (low) viram um único token. Os raros (est) ficam decompostos. É exatamente isso que o BPE faz — sobre bilhões de palavras em vez de três, e sobre bytes em vez de caracteres nos modelos modernos (byte-level BPE), o que garante que nada fique "fora do vocabulário".

Alguns parentes que vale conhecer: WordPiece (BERT) e Unigram LM (T5, mT5) são, como o BPE, algoritmos de construção do vocabulário. Cuidado com uma confusão comum: SentencePiece, muitas vezes citado no mesmo nível, não é um algoritmo e sim uma biblioteca — ela implementa BPE e Unigram, e foi ela que serviu para T5, mT5 e os primeiros Llama (1 e 2). Desde o Llama 3 (2024), a Meta passou a um BPE byte-level de 128.000 tokens, no espírito do tiktoken. Todos compartilham a mesma ideia — um vocabulário de subpalavras — com heurísticas diferentes.

Tokens especiais

Além das subpalavras do texto, o tokenizer reserva alguns tokens especiais que nunca aparecem naturalmente:

  • <|im_start|>, <|im_end|> (OpenAI), [INST]…[/INST] (Llama 2 e Mistral), <|start_header_id|><|eot_id|> (Llama 3 e seguintes), <|user|> / <|assistant|> — delimitam os turnos de uma conversa. Cada família de modelos tem seu formato, e ele muda de uma geração para outra.
  • <|endoftext|> — fim de documento.
  • <|fim_prefix|>, <|fim_middle|> — para fill-in-the-middle, usado em completação de código.

É o que permite transformar um diálogo "Usuário disse X, Assistente respondeu Y" em uma sequência linear de tokens que o modelo consegue processar. Quando você manda uma mensagem para o ChatGPT, esses marcadores são adicionados automaticamente antes da tokenização.

Teste

À direita aparecem as sub-palavras: cada token é um fragmento reutilizável, não necessariamente uma palavra inteira. As palavras frequentes cabem em um único token; as raras se decompõem em vários pedaços.

Algumas coisas para observar:

  • Palavras curtas e frequentes raramente são cortadas.
  • Palavras longas ou raras muitas vezes acabam em várias partes.
  • O espaço antes de uma palavra faz parte do token (por isso · hello e hello são tokens diferentes).
  • Em português, a relação token/palavra costuma ser um pouco maior que em inglês (cerca de 1.3-1.7 contra 1.2-1.4 nos tokenizadores da geração GPT-3/GPT-4), também porque os modelos viram mais inglês durante o treinamento. Os tokenizadores recentes, com vocabulários bem maiores e mais multilíngues, estreitaram a diferença. Não a apagaram: o português continua mais caro que o inglês.

Consequências práticas

Essa história de tokens tem muitas implicações inesperadas:

  • LLMs contam mal letras. "Quantos R existem em strawberry?" ficou como a pegadinha célebre de 2024: muitos modelos respondiam 2 em vez de 3, porque a palavra chega em poucos tokens, não como letras separadas. Hoje os grandes modelos acertam — mas a causa estrutural não mudou nem um pouco. Eles aprenderam a contornar, soletrando a palavra letra por letra antes de contar. Se você fizer a pergunta a um modelo recente, olhe o raciocínio dele: essa etapa de soletração costuma estar lá. É a confissão de que a contagem direta, essa sim, continua não funcionando.
  • Os preços de API são calculados em tokens, não em palavras. O português pode custar um pouco mais para processar do que o inglês.
  • As janelas de contexto (128k tokens, 200k tokens...) também são medidas em tokens. Um livro de 100.000 palavras em português pode representar cerca de 140.000 tokens.

Para o modelo, "tokenização" e "tok·en·iza·ção" são a mesma coisa. Ele só vê pedaços.

O próximo passo

Agora que seu texto virou uma sequência de inteiros, esses inteiros entram no modelo. Primeiro passo lá dentro: eles são transformados em vetores, em um espaço de centenas de dimensões onde o significado vira uma posição geométrica.

Esse é o tema do próximo capítulo.

Atualizado em