Tokenizers
O crate tokenizers da Hugging Face em Rust - pipelines rápidos de BPE/WordPiece para pré-processamento de LLM e classificadores.
Receita
use tokenizers::Tokenizer;
fn encode_line(tok: &Tokenizer, text: &str) -> tokenizers::Result<Vec<u32>> {
Ok(tok.encode(text, true)?.get_ids().to_vec())
}Quando usar isto:
- Todo caminho de inferência de NLP precisa de IDs antes dos tensores
- Compartilhamento de tokenizer.json entre treinamento em Python e serviço em Rust
- Agrupamento de prompts com padding para inferência de GPU
- Construção de pipelines RAG que dividem documentos de forma consistente
Exemplo de Trabalho
use tokenizers::Tokenizer;
use tokenizers::PaddingParams;
use tokenizers::TruncationParams;
fn main() -> tokenizers::Result<()> {
let mut tok = Tokenizer::from_file("tokenizer.json")?;
tok.with_padding(Some(PaddingParams::default()));
tok.with_truncation(Some(TruncationParams::default()))?;
let batch = tok.encode_batch(
vec!["Rust ML é rápido", "Tokenizers importam"],
true,
)?;
for enc in &batch {
println!("len {} ids {:?}", enc.get_ids().len(), enc.get_ids());
}
Ok(())
}O que isto demonstra:
- Carregamento de JSON de tokenizer compatível com HF
- Configuração de políticas de padding e truncamento
- Codificação em lote para strings de comprimento variável
Mergulho Profundo
Como Funciona
- O tokenizer mescla regras (BPE) ou mapeia o vocabulário de texto para IDs offline em Rust.
encoderetornaEncodingcom ids, tokens, máscara de atenção, offsets.- O padding alinha os tensores em lote; o truncamento impõe
max_lengthda configuração do modelo. - Tokens especiais (
[CLS],<s>, etc.) são inseridos quandoadd_special_tokensé true.
APIs Chave
| API | Propósito |
|---|---|
encode / encode_batch | Texto para IDs |
decode | IDs de volta para string |
with_truncation | Limitar o comprimento da sequência |
with_padding | Alinhamento em lote |
Armadilhas
tokenizer.jsonerrado para os pesos - gerações incorretas. Correção: baixe o tokenizer da revisão exata do modelo.- Lado de truncamento errado - truncar à esquerda vs. à direita muda o significado para modelos de QA. Correção: corresponda à política
tokenizer.model_max_lengthdo HF. - Sem padding no lote - não é possível empilhar tensores. Correção: defina
PaddingParamscompad_iddo vocabulário. - Derivação de normalização Unicode - NFC vs. NFKC muda as divisões de tokens em comparação com Python. Correção: normalize as strings de entrada tanto no treinamento quanto no serviço.
- Reconstrução do tokenizer por solicitação - E/S de arquivo lenta. Correção:
Arc<Tokenizer>carregado uma vez na inicialização.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| tiktoken (bindings) | Modelos OpenAI | Modelos HF tokenizer.json |
| crate sentencepiece | Modelos SPM nativamente | Já padronizado em HF JSON |
| Tokenizers Python em sidecar | Hack rápido | Orçamento de latência de produção |
| Manual em nível de caractere | Alfabetos minúsculos | Modelos de vocabulário Transformer |
FAQs
Onde obtenho o tokenizer.json?
Do repositório de modelos Hugging Face - a mesma revisão dos arquivos de peso.
Como defino o comprimento máximo?
TruncationParams::max_length deve corresponder à configuração config.max_position_embeddings do modelo ou ao valor de treinamento.
Máscaras de atenção?
Encoding::get_attention_mask() fornece flags 1/0 para posições preenchidas nas entradas do transformer.
Modelos de chat?
Aplique strings de modelo no código do aplicativo antes de encode - os modelos são específicos da família do modelo.
Segurança de thread?
O Tokenizer é barato para clonar; compartilhe imutavelmente entre manipuladores Axum com Arc.
Quão rápido em comparação com Python?
A codificação em lote em Rust geralmente é 2-10x mais rápida em caminhos de serviço com uso intensivo de CPU - compare o tamanho do seu vocabulário.
Vocabulário personalizado?
Treine com a CLI tokenizers do HF, exporte JSON, carregue em Rust - o mesmo pipeline em ambos os lados.
Offsets para destaque?
get_offsets() mapeia tokens para intervalos de string de origem para atribuição na UI.
Codificação de par?
encode((text_a, text_b), true) para modelos de par de sentenças como NLI.
Relacionado
- Inferência e Serviço de LLM - loop de geração
- candle - forward do transformer
- Embeddings e Busca Vetorial - divisão de documentos
- Noções Básicas de ML em Rust - exemplo de tokenização
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.