Pular para o conteúdo principal

Transformadores v5 Tokenização: Guia de arquitetura e migração

Atualize para o Transformers v5. Um guia prático sobre o backend Rust unificado, mudanças na API e padrões de migração lado a lado da v4 para a v5 para codificação e chat.
Atualizado 27 de jan. de 2026  · 8 min lido

A tokenização é parte do pilha do Transformer do HuggingFace que a gente mal percebe, até começar a aparecer nos resultados. Um único espaço em branco pode mudar os limites dos tokens, a decodificação pode gerar strings inesperadas e os prompts de chat podem quebrar silenciosamente durante a criação de modelos. 

O Transformers v5 resolve esses problemas com um novo design de tokenização que padroniza o comportamento em todas as implementações, simplifica a interface da API e facilita a inspeção interna do tokenizador quando precisamos depurar.

Neste tutorial, vou começar explicando o básico sobre o que a tokenização faz e como o pipeline funciona, e depois vou mostrar o que realmente mudou na versão 5, com foco na migração. Você vai ver os padrões de código v4 e v5 lado a lado para codificação, decodificação, modelos de chat e serialização, pra poder atualizar suas bases de código.

Se você é novo no mundo da tokenização, recomendo dar uma olhada no curso curso Introdução ao Processamento de Linguagem Natural em Python.

O que é tokenização?

Uma definição bem comum de tokenização é que ela transforma texto em IDs de token, o que é correto, mas incompleto. Na produção, a tokenização é mais bem entendida como um contrato. Dado um texto bruto, o tokenizador precisa criar uma codificação estruturada que o modelo possa usar sem problemas.

No mínimo, esse contrato inclui:

  • input_ids, que são IDs de token inteiros que indexam a tabela de incorporação do modelo.
  • Também inclui o attention_mask, que mostra quais posições são tokens reais e quais são preenchimentos.
  • Os deslocamentos/alinhamentos (se disponíveis) mapeiam os intervalos de tokens de volta para intervalos de caracteres ou palavras no texto original, o que é necessário para realce, NER e atribuição.
  • A semântica especial dos tokens precisa ser mantida, ou seja, a localização e os IDs de BOS/EOS/PAD/UNK precisam seguir as regras usadas durante o treinamento do modelo.
  • Para modelos de chat, a formatação do chat faz parte do contrato, então geralmente aplicamos o modelo de chat do modelo antes de fazer a tokenização.

No Transformers, essas responsabilidades ficam na camada do tokenizador (não dentro da passagem para frente do modelo), e é por isso que AutoTokenizer é o ponto de entrada padrão. Aqui vai um exemplo simples:

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM3-3B")
enc = tokenizer("Hello world")
print(enc["input_ids"])
print(tokenizer.convert_ids_to_tokens(enc["input_ids"]))

Aqui está o resultado esperado:

[9906, 1917]
['Hello', 'Ġworld']

Aqui, enc é um objeto BatchEncoding (um contêiner tipo dicionário) que guarda os campos prontos para o modelo produzidos pelo tokenizador (como input_ids e, muitas vezes, attention_mask). A saída retorna [9906, 1917], que são os IDs de token inteiros para a string de entrada, junto com ['Hello', 'Ġworld'], que mostra as strings de token correspondentes. 

Observação: O prefixo Ġ é uma convenção comum que indica que o token tem um espaço à frente, então Ġworld representa “world” em vez de “world” sem espaço.

Tokenização como um pipeline: Como a v5 torna isso depurável

Problemas de tokenização geralmente aparecem como pequenos problemas, como espaços extras, divisões Unicode estranhas, um aumento repentino na contagem de tokens ou prompts de chat que não seguem as funções corretamente. 

A maneira mais simples de resolver esses problemas é pensar na tokenização como um pipeline de etapas. Depois de saber qual etapa é responsável por quê, você pode isolar os problemas rapidamente, em vez de ficar adivinhando. Aqui estão algumas dicas para você ter em mente:

A tokenização é um pipeline que dá pra montar

O primeiro objetivo é acabar com o equívoco comum de que um tokenizador é só um WordPiece. Em vez disso, é uma sequência de etapas distintas de transformação, incluindo normalização, pré-tokenização, modelagem de subpalavras, pós-processamento e decodificação. Cada etapa controla uma parte diferente do comportamento final.

Modelo mental depurável

Dividir a tokenização em etapas nos dá um mapa confiável para a resolução de problemas:

  • As peculiaridades dos espaços em branco geralmente vêm do pré-tokenizador ou do decodificador.
  • O Unicode geralmente vem do normalizador.
  • Explosões de tokens geralmente são causadas pelo modelo de subpalavras, junto com seu vocabulário/fusões.
  • Os erros de formatação do chat vêm principalmente dos modelos ou do pós-processamento.

Explicito e inspecionável por padrão

O Transformers v5 facilita a inspeção dos tokenizadores, principalmente os que são baseados no mecanismo de tokenizadores Rust. 

Quando usamos o backend Rust, dá pra dar uma olhada nos componentes por trás do normalizador, pré-tokenizador, modelo, pós-processador e decodificador ( tokenizer._tokenizer ). Não usamos o _tokenizer todos os dias, mas ele é útil com o lançamento da versão 5, que torna os internos visíveis quando precisamos depurar.

Isso naturalmente leva à diferença entre motor e wrapper:

  • Motor (tokenizers): A implementação de baixo nível em Rust que faz as coisas principais, tipo normalização, divisão, segmentação de subpalavras e criação de IDs de tokens (e offsets, quando disponíveis).
  • Wrapper (transformers): Essa é a camada voltada para o modelo que transforma essas mecânicas ementradas prontas para omodelo , aplicando convenções como tratamento de tokens especiais, modelos de bate-papo, regras de preenchimento/truncagem e saídas de tensor específicas da estrutura.

O que mudou no Transformers v5?

O Transformers v5 é uma versão padronizada importante, e a tokenização é uma das áreas com mudanças visíveis para o usuário. A versão reduz implementações duplicadas, torna o comportamento do tokenizador mais consistente entre os modelos e facilita a inspeção e (em alguns casos) o treinamento dos tokenizadores a partir do zero. Abaixo estão as mudanças que mais afetam os usuários no dia a dia.

Uma implementação de tokenizador por modelo

Nas versões anteriores, muitos modelos tinham:

  • um tokenizador Python lento
  • uma implementação rápida do tokenizador com suporte em Rust

Na versão 5, o Transformers junta tudo em um único arquivo tokenizador por modelo e prefere o caminho com suporte do Rust. Eis por que o tokenizador com suporte em Rust funciona:

  • Isso elimina implementações duplicadas lentas e rápidas.
  • Isso reduz os erros de paridade causados por pequenas diferenças de comportamento entre essas implementações.
  • Essa implementação do tokenizador reduz e simplifica a superfície de teste, já que só tem um caminho de código principal para validar.
  • Ele também cria uma única “fonte de verdade” para o comportamento do tokenizador em todos os modelos.

Migração da API de codificação

A API v4 encode_plus() foi descontinuada, e agora é melhor chamar o tokenizador direto. Aqui tá a diferença entre a versão 4 e a versão 5:

versão v4

enc = tokenizer.encode_plus(
    text,
    truncation=True,
    padding="max_length",
    max_length=128,
    return_tensors="pt",
)

versão v5

enc = tokenizer(
    text,
    truncation=True,
    padding="max_length",
    max_length=128,
    return_tensors="pt",
)

Mudar de encode_plus() para um único ponto de entrada tokenizer() reduz os modos de falha reais que aparecem no código de produção. 

Na versão 4, ter vários métodos de codificação significava que diferenças sutis no preenchimento, truncamento, agrupamento ou conversão de tensores podiam aparecer dependendo do caminho usado, muitas vezes aparecendo só quando se mudava de entradas únicas para cargas de trabalho agrupadas. 

A versão 5 padroniza tudo em um caminho de codificação que sempre retorna um BatchEncoding, o que torna o comportamento mais previsível e reduz tanto os bugs de casos extremos quanto a quantidade de código necessária para manter a consistência dos pipelines de tokenização.

Entendendo a migração da API

A versão 5 unifica a decodificação, de modo que decode() lida com entradas únicas e em lote, alinhando o comportamento da decodificação com o comportamento da codificação.

versão v4

texts = tokenizer.batch_decode(batch_ids, skip_special_tokens=True)

versão v5

texts = tokenizer.decode(batch_ids, skip_special_tokens=True)

Na versão 5, a decodificação foi feita pra ser igual à codificação. Assim como tokenizer() pode aceitar uma única string ou um lote de strings, decode() pode aceitar uma única sequência de IDs de tokens ou um lote de sequências. 

O principal aqui é o tipo de retorno, ou seja, se você passar uma sequência, vai receber uma única string, mas se passar um lote (como list[list[int]]), vai receber uma lista de strings. Isso deixa a API mais limpa no geral, mas também quer dizer que qualquer código que ache que decode() sempre retorna uma string precisa ser atualizado pra lidar com os dois casos.

Modelos de chat

Na versão 4, apply_chat_template retornava input_ids bruto para compatibilidade com versões anteriores. Na versão 5, ele retorna um objeto ` BatchEncoding `, assim como outros métodos tokenizadores.

versão v4

input_ids = tokenizer.apply_chat_template(messages, return_tensors="pt")

versão v5

enc = tokenizer.apply_chat_template(messages, return_tensors="pt")
input_ids = enc["input_ids"]
attention_mask = enc["attention_mask"]

Na versão 5, apply_chat_template() é tratado como um ponto de entrada do tokenizador adequado, em vez de um auxiliar para casos especiais. Em vez de retornar apenas input_ids, ele retorna um objeto BatchEncoding completo (com campos como input_ids e attention_mask). 

Isso é importante porque agora as entradas no formato de chat se encaixam no mesmo fluxo de trabalho de agrupamento, preenchimento, truncamento e retorno de tensor que a tokenização normal. Então, não precisamos de código extra para reconstruir máscaras ou alinhar manualmente os formatos antes de enviar entradas para o modelo.

Serialização do tokenizador

Na versão 5, a serialização do tokenizador ficou mais simples, juntando os metadados de tokens especiais e tokens adicionados em menos artefatos, mas ainda dando suporte a arquivos antigos para manter a compatibilidade. Isso reduz o risco de vários arquivos de “fonte de verdade” ficarem fora de sincronia e facilita o carregamento e a reutilização de ativos tokenizadores em ferramentas downstream que funcionam fora da biblioteca Transformers.

Tokenizadores como arquiteturas configuráveis

Na versão 5, a grande mudança é que um tokenizador é tratado como um pipeline definido junto com artefatos aprendidos, em vez de ser só algo que carregamos de arquivos serializados.

  • A classe tokenizer define como o texto é normalizado, dividido em pedaços, transformado em tokens de subpalavras e, por fim, decodificado de volta em texto.
  • O vocabulário e as regras de mesclagem são artefatos aprendidos, ou seja, são as peças treinadas que determinam quais tokens existem e como o texto é compactado em IDs de token.
  • Essa separação permite fluxos de trabalho que priorizam a arquitetura. Para tokenizadores compatíveis, você pode instanciar um tokenizador que siga o design de um modelo e, em seguida, carregar ou treinar o vocabulário/fusões separadamente, o que torna a personalização e o retreinamento muito mais simples.

Considerações finais 

A tokenização do Transformers v5 é um grande passo em direção à padronização e simplificação. Agora tem um caminho de comportamento mais padrão (diminuindo a diferença entre lento e rápido), uma API mais simples, modelos de chat que devolvem o mesmo objeto estruturado BatchEncoding que a tokenização normal e uma serialização consolidada que reduz suposições frágeis no nível do arquivo. 

Isso também leva a um modelo mental que prioriza a arquitetura, onde os tokenizadores são mais fáceis de inspecionar e, nos casos compatíveis, treinar do zero. Para migrar tranquilamente da versão 4, troque encode_plus() por tokenizer(), troque batch_decode() por decode(), atualize os sites de chamada apply_chat_template() para funcionar com BatchEncoding, evite codificar nomes de arquivos tokenizadores antigos ao salvar e espere que quaisquer peculiaridades lentas do tokenizador convergem para o comportamento apoiado pelos tokenizadores.

Se você quiser saber mais sobre os lançamentos recentes, aqui estão as notas de lançamento. Também recomendo o programa Hugging Face Fundamentals para você praticar um pouco.

Perguntas frequentes sobre a tokenização v5

Ainda preciso escolher entre as classes de tokenizador “Rápido” (Rust) e “Lento” (Python)?

Não. O Transformers v5 junta tudo isso numa única implementação por modelo. Agora, a biblioteca usa por padrão o backend Rust super otimizado (bibliotecatokenizers ) para todos os modelos compatíveis, sem precisar escolher manualmente entre LlamaTokenizerFast e LlamaTokenizer.

O meu código encode_plus atual vai parar de funcionar imediatamente?

Não imediatamente, mas está obsoleto. Embora a versão 5 possa atualmente suportar encode_plus com um aviso, é altamente recomendável mudar para o método direto tokenizer(__call__). Isso garante que você tenha os novos comportamentos de agrupamento unificados e prepara seu código para o futuro.

Por que o apply_chat_template agora retorna um dicionário BatchEncoding em vez de uma string?

Tratar as entradas do chat como qualquer outra entrada do modelo. Ao devolver um dicionário (com input_ids e attention_mask), a v5 permite que os dados formatados como chat sejam instantaneamente agrupados, preenchidos e truncados sem precisar de uma segunda etapa de tokenização.

Ainda posso usar return_tensors="tf" ou return_tensors="jax"?

Não. Como parte das mudanças na arquitetura da versão 5, o Transformers deixou de oferecer suporte oficial para os backends TensorFlow e Flax/JAX para se concentrar totalmente no PyTorch. Você vai precisar usar o backend do PyTorch ou exportar modelos para formatos como ONNX/GGUF para outras estruturas.

Como faço para depurar erros de tokenização “silenciosos” na versão 5?

Use os componentes internos inspecionáveis. Na versão 5, você pode acessar o pipeline Rust subjacente através de tokenizer._tokenizer. Isso permite que você verifique etapas específicas — como o Normalizador ou o Pré-tokenizador — isoladamente para ver exatamente onde uma string está sendo dividida ou modificada de forma inesperada.


Aashi Dutt's photo
Author
Aashi Dutt
LinkedIn
Twitter

Sou Especialista Google Developers em ML (Gen AI), tricampeã no Kaggle e Embaixadora Women Techmakers, com mais de três anos de experiência na área de tecnologia. Cofundei uma startup de saúde em 2020 e atualmente faço um mestrado em ciência da computação na Georgia Tech, com foco em aprendizado de máquina.

Tópicos

Cursos mais populares do DataCamp

Programa

Fundamentos de Hugging Face

12 h
Encontre os modelos, conjuntos de dados e aplicativos de IA de código aberto mais recentes, crie agentes de IA e ajuste LLMs com o Hugging Face. Junte-se hoje mesmo à maior comunidade de IA!
Ver detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

blog

A OpenAI anuncia o GPT-4 Turbo com visão: O que sabemos até o momento

Descubra a atualização mais recente da OpenAI, GPT-4 Turbo com visão, e seus principais recursos, incluindo o corte de conhecimento aprimorado, uma janela de contexto expandida, preço acessível e muito mais.
Richie Cotton's photo

Richie Cotton

7 min

blog

Tudo o que sabemos sobre o GPT-5

Saiba como o GPT-5 evoluirá para um sistema unificado com recursos avançados, visando um lançamento no verão de 2025, com base no mais recente roteiro da OpenAI e no histórico do GPT.
Josep Ferrer's photo

Josep Ferrer

8 min

Tutorial

Tutorial do modelo de transformador no PyTorch: Da teoria ao código

Saiba como criar um modelo Transformer usando o PyTorch, uma ferramenta poderosa do machine learning moderno.
Arjun Sarkar's photo

Arjun Sarkar

Tutorial

Guia para iniciantes no uso da API do ChatGPT

Este guia o orienta sobre os conceitos básicos da API ChatGPT, demonstrando seu potencial no processamento de linguagem natural e na comunicação orientada por IA.
Moez Ali's photo

Moez Ali

Tutorial

Guia de Introdução ao Ajuste Fino de LLMs

O ajuste fino dos grandes modelos de linguagem (LLMs, Large Language Models) revolucionou o processamento de linguagem natural (PLN), oferecendo recursos sem precedentes em tarefas como tradução de idiomas, análise de sentimentos e geração de textos. Essa abordagem transformadora aproveita modelos pré-treinados como o GPT-2, aprimorando seu desempenho em domínios específicos pelo processo de ajuste fino.
Josep Ferrer's photo

Josep Ferrer

Tutorial

Tutorial da API de assistentes da OpenAI

Uma visão geral abrangente da API Assistants com nosso artigo, que oferece uma análise aprofundada de seus recursos, usos no setor, orientação de configuração e práticas recomendadas para maximizar seu potencial em vários aplicativos de negócios.
Zoumana Keita 's photo

Zoumana Keita

Ver maisVer mais