← Todos os Posts

Como os LLMs enxergam texto: o que meu sistema de i18n me ensinou sobre economia de tokens

Quando construí o sistema de tradução i18n para meu site, descobri que traduzir um post de blog em inglês com 1.500 palavras para coreano consumia 2,8x mais tokens do que o texto original em inglês. O mesmo conteúdo semântico, o mesmo significado, mas 2,8x o custo de API. O japonês ficou em 2,4x. O chinês tradicional em 2,1x. O espanhol em 1,15x. A economia de tokens do conteúdo multilíngue me pegou desprevenido porque eu não entendia como os tokenizadores funcionam.1

TL;DR

A tokenização converte texto legível por humanos em tokens numéricos que os modelos de linguagem processam. Depois de traduzir 27 posts de blog em 6 idiomas, tenho dados reais de custo: scripts não latinos consomem 2-3x mais tokens por unidade semântica do que o inglês. O visualizador interativo abaixo permite que você cole texto em qualquer idioma e veja a decomposição em tokens. Entender a tokenização me ajudou a orçar meu pipeline de tradução com precisão, otimizar meus prompts para reduzir o custo em 35% e depurar um problema de formatação em que as traduções em coreano perdiam a estrutura do markdown porque o tokenizador dividia marcadores de notas de rodapé entre fronteiras de tokens.



Meus dados de custo de tokens com i18n

Traduzi 27 posts de blog em 6 idiomas usando Claude. A qualidade da tradução exigia modelos de nível Opus (nunca modelos mais baratos — uma lição que aprendi quando o Haiku produziu traduções que pareciam saída de máquina). O consumo de tokens por idioma me surpreendeu:

Idioma Tokens médios/Post Multiplicador vs. Inglês Tipo de script
Inglês (fonte) 1.850 1,0x Latino
Espanhol 2.128 1,15x Latino
Alemão 2.220 1,20x Latino
Francês 2.090 1,13x Latino
Coreano 5.180 2,80x Hangul
Japonês 4.440 2,40x CJK misto
Chinês tradicional 3.885 2,10x CJK

Os idiomas de script latino (espanhol, alemão, francês) ficaram dentro de 20% do inglês. Os idiomas CJK e Hangul saltaram 2-3x. A diferença de custo se acumula ao longo de 27 posts × 6 idiomas = 162 traduções.2

Por que a diferença existe

A maioria dos tokenizadores (BPE, usado tanto pelo Claude quanto pelo GPT-4) é treinada predominantemente em texto em inglês. Palavras em inglês têm representações de tokens otimizadas porque os dados de treinamento contêm mais inglês do que qualquer outro idioma. Palavras comuns em inglês (“the”, “and”, “is”) mapeiam para tokens únicos. Blocos silábicos coreanos, kanji japoneses e caracteres chineses frequentemente se dividem em 2-3 tokens em nível de byte porque o tokenizador os encontrou com menos frequência durante o treinamento.3

O efeito é sistemático, não aleatório. Cada tradução para coreano custa aproximadamente 2,8x o equivalente em inglês. Consigo orçar com precisão porque o multiplicador é consistente.


O bug de tokenização

Durante meu primeiro lote de traduções para coreano, os posts traduzidos perderam toda a formatação markdown: referências de notas de rodapé ([^1]) desapareceram, blocos de código perderam suas tags de idioma, e marcadores de título (##) se fundiram ao texto do corpo.

O diagnóstico levou uma hora. A causa raiz: meu prompt de tradução dizia “Traduza este post de blog para coreano” sem especificar a preservação da formatação. O tokenizador dividiu a sintaxe markdown em fronteiras de tokens de forma diferente no contexto coreano do que no contexto inglês. O modelo tratou [^1] como conteúdo traduzível em vez de marcação estrutural.

A correção: adicionei restrições explícitas ao meu prompt de tradução:

Preserve all markdown formatting exactly:
- Keep [^N] footnote references unchanged
- Keep ``` code fences with language tags unchanged
- Keep ## heading markers unchanged
- Keep **bold** and *italic* markers unchanged

Cada restrição eliminou um modo de falha. A lista de restrições ficou maior que a instrução de tradução — um padrão que descrevo no meu framework OODA de engenharia de prompts.4


O que são tokens

De caracteres a tokens

Uma abordagem ingênua do processamento de texto trataria cada caractere como uma unidade de entrada. “Hello world” se torna 11 caracteres. O processamento em nível de caractere captura todos os detalhes, mas produz sequências extremamente longas: um documento de 1.000 palavras se torna aproximadamente 5.000 caracteres.5

O processamento em nível de palavra reduz o comprimento da sequência, mas falha com palavras desconhecidas. Um vocabulário de 50.000 entradas em nível de palavra não consegue processar “unfathomability” a menos que exatamente essa palavra tenha aparecido no treinamento.

A tokenização de subpalavras encontra um meio-termo. Palavras comuns (“the”, “and”) permanecem como tokens únicos. Palavras incomuns se dividem em pedaços de subpalavras. “Unfathomability” se divide em [“un”, “fath”, “om”, “ability”], onde cada pedaço aparece com frequência suficiente para ter uma representação treinada.

Byte-Pair Encoding (BPE)

BPE, usado pelo Claude e pelo GPT-4, começa com bytes individuais e mescla iterativamente os pares adjacentes mais frequentes:6

  1. Comece com caracteres individuais: [l, o, w, e, r]
  2. Par mais frequente: (l, o) → mescla para [lo, w, e, r]
  3. Par mais frequente: (e, r) → mescla para [lo, w, er]
  4. Par mais frequente: (lo, w) → mescla para [low, er]
  5. Par mais frequente: (low, er) → mescla para [lower]

O vocabulário final contém todos os bytes originais mais cada token mesclado, tipicamente entre 50.000 e 100.000 entradas. Palavras em inglês dominam os tokens mesclados porque o inglês domina os dados de treinamento.


Como otimizei meus prompts

Após descobrir a diferença de custo por tokens, otimizei meu pipeline de tradução para reduzir o custo em 35%:

Otimização 1: Agrupar por família linguística

Idiomas de script latino (espanhol, francês, alemão) compartilham similaridades estruturais. Agrupe o prompt de tradução para produzir os três em uma única chamada de API quando o post fonte for curto o suficiente para caber na janela de contexto com todas as três saídas. O contexto compartilhado (o texto fonte em inglês) é pago uma vez em vez de três.7

Otimização 2: Deduplicação de restrições

Meu prompt de tradução original repetia restrições para cada idioma. A versão otimizada define as restrições uma vez e as aplica a todas as saídas:

# Constraints (apply to ALL translations below):
- Preserve markdown structure, footnotes, code blocks
- Keep proper nouns in English
- Adapt idioms, don't transliterate

# Translate the following post into: Spanish, French, German

A seção de restrições consome tokens uma vez. A alternativa (repetir restrições por idioma) consome 3x.

Otimização 3: Instruções concisas

Meu prompt original usava 340 tokens de instruções. Após a otimização: 180 tokens. A redução de 47% se acumula ao longo de 162 traduções.

Métrica Antes Depois Economia
Tokens de instrução 340 180 47%
Total por lote latino 6.780 4.438 35%
Total por idioma CJK 5.520 5.180 6%

Idiomas CJK se beneficiam menos da otimização de prompts porque os tokens de saída (a tradução em si) dominam o custo. A saída é inerentemente mais longa em termos de tokens, independentemente de quão concisas sejam as instruções.8


Aplicações práticas

Estimando custos

Uma heurística aproximada para texto em inglês: 1 token equivale a aproximadamente 0,75 palavras, ou aproximadamente 4 caracteres. Um documento de 1.000 palavras consome aproximadamente 1.333 tokens. Aplique o multiplicador de idioma da minha tabela acima para conteúdo não inglês.9

Tokenização de código

Código é tokenizado de forma diferente da prosa. Palavras-chave comuns (def, return, if) mapeiam para tokens únicos. Nomes de variáveis se dividem com base na frequência:

# "def calculate_total(items):" splits approximately as:
# ["def", " calculate", "_total", "(", "items", "):", ]

Convenções de nomenclatura consistentes reduzem a contagem de tokens. Minha infraestrutura de hooks usa a convenção verb-noun.sh (git-safety-guardian, recursion-guard, blog-quality-gate). O padrão consistente ajuda o tokenizador a prever e mesclar subpalavras comuns de forma eficiente.

Depurando comportamento inesperado

Quando um modelo produz uma saída inesperada, a tokenização pode explicar o porquê. Meu bug de formatação em coreano aconteceu porque o tokenizador dividiu [^1] de forma diferente no contexto coreano do que no inglês. Entender o padrão de divisão levou diretamente à correção (restrições explícitas de preservação).


Principais conclusões

Para engenheiros usando APIs de LLM: - Meça os custos de tokens por idioma antes de se comprometer com suporte multilíngue; idiomas CJK custam 2-3x mais por unidade semântica do que o inglês - Otimize as instruções dos prompts (redação concisa, restrições deduplicadas) para uma redução de 30-50% no custo em pipelines de tradução de alto volume - Teste a tokenização de termos específicos do domínio e sintaxe markdown antes do deploy em produção; divisões inesperadas causam bugs de formatação

Para gerentes de produto orçando funcionalidades de IA: - O suporte a idiomas não ingleses custa 1,5-3x mais por chamada de API do que o inglês; orce funcionalidades multilíngues de IA usando o multiplicador de idioma, não uma estimativa fixa por idioma - Os limites da janela de contexto afetam idiomas CJK desproporcionalmente; uma janela de 200K tokens comporta 40% menos conteúdo em coreano do que em inglês


Referências


  1. Pipeline de tradução i18n do autor. 27 posts traduzidos em 6 idiomas. Consumo de tokens medido por idioma, revelando multiplicador de 2,8x para coreano. 

  2. Dados de custo de tradução do autor. Médias de tokens por idioma calculadas em 27 posts, cada um traduzido independentemente usando Claude Opus. 

  3. Petrov, Aleksandar et al., “Language Model Tokenizers Introduce Unfairness Between Languages,” NeurIPS 2023

  4. Correção de formatação de tradução do autor. Restrições explícitas de preservação de markdown adicionadas após traduções em coreano perderem notas de rodapé, blocos de código e marcadores de título. 

  5. Sennrich, Rico et al., “Neural Machine Translation of Rare Words with Subword Units,” ACL 2016

  6. Gage, Philip, “A New Algorithm for Data Compression,” The C Users Journal, 12(2), 23-38, 1994. 

  7. Otimização de prompts do autor. Agrupamento de idiomas de script latino e deduplicação de restrições reduziram o custo total do pipeline em 35%. 

  8. Métricas de otimização de prompts do autor. Tokens de instrução reduzidos de 340 para 180 (47%). Economia total por lote: 35% para latino, 6% para CJK. 

  9. Anthropic, “Claude API Pricing,” 2025. Modelo de precificação baseado em tokens.