Módulo de tokenizador de texto
O módulo de tokenizador de texto converte strings em sequências de IDs de token utilizáveis pelo modelo.
Esta camada faz apenas tokenização, codificação e decodificação reversa; não realiza inferência do modelo. O fluxo típico é primeiro codificar o texto em MLMultiArray ou onnxruntime.tensor e então passar o resultado codificado ao request CoreML ou ONNX Runtime correspondente.
O objetivo deste módulo é oferecer o suficiente para “inferência no dispositivo”:
WordPiecetem a maior compatibilidade e é adequado para modelos comoBERTeCN-CLIP.BPEeSentencePieceusam estratégias leves de compatibilidade, adequadas à maioria dos cenários de codificação no dispositivo.- O treinamento de tokenizadores complexos, a amostragem e todo o comportamento do ecossistema upstream não são incorporados ao runtime.
Este módulo só está disponível em versões posteriores a 20260319
Criar um tokenizador
coreml.new_text_tokenizer(opts)
objeto_tokenizador_de_texto, mensagem_de_erro = coreml.new_text_tokenizer({
type = tipo_de_tokenizador,
vocab_path = caminho_do_vocabulário,
merges_path = caminho_do_arquivo_de_merges,
model_path = caminho_do_modelo_SentencePiece,
pattern = expressão_regular,
context_length = comprimento_de_contexto,
do_lower_case = converter_para_minúsculas,
vocab_limit = limite_do_vocabulário,
clean_text = limpar_o_texto_antes,
add_bos = adicionar_token_inicial,
add_eos = adicionar_token_final,
bos_token = texto_do_token_inicial,
eos_token = texto_do_token_final,
pad_token = texto_do_token_de_preenchimento,
unk_token = texto_do_token_desconhecido,
})
Valores de type
wordpiece/bert/cn_clipbpe/gpt2_bpe/clip_bpesentencepiece/spmregex/patternbyte/byteswhitespace/spacecharacter/char
O padrão é wordpiece.
Se o primeiro argumento de coreml.new_text_tokenizer(...) não for uma table, ele será tratado diretamente como uma construção rápida wordpiece, equivalente ao uso de coreml.new_wordpiece_tokenizer(vocab_path).
Parâmetros comuns
-
vocab_path
Texto: caminho do arquivo de vocabulário. -
merges_path
Texto: caminho do arquivo de merges usado pelos tokenizadores da famíliaBPE. -
model_path
Texto: caminho do arquivo.modelque pode ser usado pelo modo compatível comSentencePiece. -
pattern
Texto: expressão regular usada pelo tokenizadorRegex. -
context_length
Inteiro opcional que define o comprimento da sequência de tokens de saída. -
do_lower_case
Booleano opcional que define se o texto deve ser convertido primeiro para minúsculas. -
vocab_limit
Inteiro opcional, usado principalmente porWordPiecepara limitar o tamanho do vocabulário. -
clean_text
Booleano opcional que define se uma limpeza básica do texto deve ser feita antes da tokenização. -
add_bos / add_eos
Booleanos opcionais que definem se tokens inicial / final serão anexados antes / depois do resultado codificado. -
bos_token / eos_token / pad_token / unk_token
Texto opcional correspondente ao texto desses tokens especiais no vocabulário.
Nem todo tipo de tokenizador aceita todos os campos acima. Os campos obrigatórios e valores padrão da implementação atual são:
wordpiece
Aceita receber diretamente uma stringvocab_pathou uma table; exige quevocab_pathexista; o padrão écontext_length = 52,do_lower_case = true,vocab_limit = 21128, e o vocabulário deve conter[PAD],[UNK],[CLS]e[SEP].bpe
Aceita somente table; exigevocab_pathemerges_path; o padrão écontext_length = 77,do_lower_case = false,clean_text = false,add_bos = falseeadd_eos = false.sentencepiece
Aceita somente table; exige pelo menos um entrevocab_pathemodel_path; o padrão écontext_length = 77,do_lower_case = false,clean_text = true,bos_token = "<s>",eos_token = "</s>",pad_token = "<pad>"eunk_token = "<unk>".regex
Aceita somente table; exigevocab_pathepattern; o padrão écontext_length = 77,do_lower_case = falseeclean_text = true.whitespace/character/byte
Aceita somente table; exigevocab_path; o padrão écontext_length = 77,do_lower_case = falseeclean_text = true.
Recomendações de escolha:
- Se o modelo usa
vocab.txt + WordPiece, escolhawordpiece. - Se o modelo usa
vocab.json + merges.txt, escolhabpe. - Se o modelo usa
.vocabou.model, escolhasentencepiece. - Considere
regex,whitespace,characteroubytesomente quando precisar de uma tokenização baseada em regras simples.
Valores retornados
-
objeto tokenizador de texto
Tipo objeto; retornanilse a criação falhar. -
mensagem de erro
Tipo texto; énilem caso de sucesso e contém a mensagem de erro em caso de falha.
Observações
- É adequado criar o objeto tokenizador uma vez e reutilizá-lo; não é recomendável reconstruí-lo a cada codificação.
- A criação determina principalmente três coisas: algoritmo de tokenização, origem do vocabulário e comprimento fixo da saída.
- Se o resultado do modelo estiver claramente incorreto, verifique primeiro o tipo do tokenizador, o arquivo de vocabulário, a configuração de tokens especiais e se
context_lengthcoincide com o usado no treinamento. WordPieceé atualmente a opção mais completa e estável.BPEeSentencePiecetêm como objetivo a compatibilidade da codificação no dispositivo e não prometem reproduzir todos os detalhes de cada implementação upstream.
Construtores rápidos
As funções rápidas abaixo são essencialmente encaminhamentos para coreml.new_text_tokenizer(...); use-as quando o tipo do tokenizador já estiver definido.
coreml.new_wordpiece_tokenizer(opts)
- Equivale a
coreml.new_text_tokenizer({ type = "wordpiece", ... }). - É adequado para modelos de texto no estilo
WordPiece, comoBERTeCN-CLIP. - Também aceita diretamente uma string de caminho do vocabulário:
coreml.new_wordpiece_tokenizer(vocab_path).
coreml.new_bpe_tokenizer(opts)
- Equivale a
coreml.new_text_tokenizer({ type = "bpe", ... }). - Também abrange modelos
gpt2_bpeeclip_bpedo tipovocab.json + merges.txt.
coreml.new_sentencepiece_tokenizer(opts)
- Equivale a
coreml.new_text_tokenizer({ type = "sentencepiece", ... }). - Usa uma implementação leve e compatível voltada à inferência no dispositivo.
- Aceita
.vocabe.model.
coreml.new_regex_tokenizer(opts)
- Equivale a
coreml.new_text_tokenizer({ type = "regex", ... }). - É adequado a cenários de tokenização baseada em regras e mapeamento simples de vocabulário.
coreml.new_byte_tokenizer(opts)
- Equivale a
coreml.new_text_tokenizer({ type = "byte", ... }). - Primeiro converte o texto em um fluxo de bytes
UTF-8e depois consulta o vocabulário por byte.
coreml.new_whitespace_tokenizer(opts)
- Equivale a
coreml.new_text_tokenizer({ type = "whitespace", ... }). - É adequado para modelos de texto leves que tokenizam por espaço e consultam diretamente o vocabulário.
coreml.new_character_tokenizer(opts)
- Equivale a
coreml.new_text_tokenizer({ type = "character", ... }). - É adequado para modelos de texto em nível de caractere.
Verificação de tipo
coreml.is_text_tokenizer(value)
é_tokenizador_de_texto = coreml.is_text_tokenizer(valor_a_verificar)
Verifica se um valor é um coreml_text_tokenizer_object.
Métodos do objeto
:encode(text[, opts])
resultado_codificado, mensagem_de_erro = objeto_tokenizador_de_texto:encode(texto)
ou
resultado_codificado, mensagem_de_erro = objeto_tokenizador_de_texto:encode(texto, {
output = "table" ou "MLMultiArray" ou "ort_tensor",
data_type = tipo_de_dado,
pair_text = texto_em_par,
max_length = comprimento_máximo,
padding = estratégia_de_preenchimento,
truncation = estratégia_de_truncamento,
return_attention_mask = retornar_attention_mask,
return_token_type_ids = retornar_token_type_ids,
return_special_tokens_mask = retornar_special_tokens_mask,
})
Codifica um único texto em uma sequência de tokens.
:encode_batch(texts[, opts])
resultado_codificado, mensagem_de_erro = objeto_tokenizador_de_texto:encode_batch(array_de_textos)
ou
resultado_codificado, mensagem_de_erro = objeto_tokenizador_de_texto:encode_batch(array_de_textos, {
output = "table" ou "MLMultiArray" ou "ort_tensor",
data_type = tipo_de_dado,
pair_text = texto_em_par_ou_array_de_textos_em_par,
max_length = comprimento_máximo,
padding = estratégia_de_preenchimento,
truncation = estratégia_de_truncamento,
return_attention_mask = retornar_attention_mask,
return_token_type_ids = retornar_token_type_ids,
return_special_tokens_mask = retornar_special_tokens_mask,
})
Codifica vários textos de uma vez e retorna sequências de tokens em formato batch.
:decode(ids)
texto, mensagem_de_erro = objeto_tokenizador_de_texto:decode(ids)
Decodifica reversamente uma sequência de IDs de token individual em texto.
idspode ser um array Lua,MLMultiArrayou userdata semelhante a tensor, como um tensor ORT.idstambém pode ser qualquer userdata semelhante a tensor que implementeshape()eto_table().- Se os dados passados forem um batch, ocorrerá um erro solicitando o uso de
decode_batch().
:decode_batch(batch_ids)
array_de_textos, mensagem_de_erro = objeto_tokenizador_de_texto:decode_batch(batch_ids)
Decodifica reversamente sequências batch de IDs de token em um array de textos.
batch_idspode ser um array Lua aninhado,MLMultiArrayou userdata semelhante a tensor, como um tensor ORT.batch_idstambém pode ser qualquer userdata semelhante a tensor que implementeshape()eto_table().
:vocab_size()
tamanho_do_vocabulário = objeto_tokenizador_de_texto:vocab_size()
Retorna o tamanho do vocabulário disponível no tokenizador atual.
:context_length()
comprimento_de_contexto = objeto_tokenizador_de_texto:context_length()
Retorna o comprimento fixo de saída do tokenizador atual, isto é, o comprimento ao qual cada codificação será preenchida ou truncada.
Observações sobre codificação e retorno
- O padrão de
outputé"MLMultiArray", adequado para ser passado diretamente a um modelo CoreML. output = "table"é adequado para depuração, visualização de IDs de token ou compatibilidade com scripts antigos.output = "ort_tensor"é adequado para ser passado diretamente a um modelo de texto ONNX Runtime.- Antes de
output = "ort_tensor", é necessário executarrequire("onnxruntime")para que a interface de ponte ORT seja injetada. output = "ort_tensor"depende do ONNX Runtime e, portanto, só é compatível com iOS 13+.- Para compatibilidade com scripts antigos, o campo
multi_array_outputcontinua sendo lido; em código novo, useoutputde maneira uniforme.
Regras de data_type
- Com
output = "MLMultiArray",data_typeaceita"int32","float32","float16"e"double";"float64"pode ser usado como alias de"double". - Com
output = "MLMultiArray", o padrão édata_type = "int32". - Com
output = "ort_tensor",data_typeaceita"float16","float32","uint8","int8","int32","int64","double"e"bool". - Com
output = "ort_tensor", o padrão édata_type = "int64".
padding / truncation
paddingpode ser booleano ou string.trueé mapeado para"max_length".falseé mapeado para"do_not_pad".
truncationpode ser booleano ou string.trueé mapeado para"longest_first".falseé mapeado para"do_not_truncate".
pair_text
encode()aceita um únicopair_text.encode_batch()aceita um únicopair_textou um array de strings com o mesmo tamanho do batch.
Retorno estruturado
Quando qualquer um dos campos abaixo for true, encode() / encode_batch() retornará uma tabela estruturada, e não apenas uma sequência de tokens bruta:
return_attention_maskreturn_token_type_idsreturn_special_tokens_mask
Campos comuns do resultado estruturado:
input_idslengthattention_masktoken_type_idsspecial_tokens_mask
Para codificação em batch:
- Com
output = "table", o comprimento próprio de cada amostra é preservado. - Com
output = "MLMultiArray"/"ort_tensor", o batch é preenchido até formar uma matriz regular antes de ser retornado.
Exemplo
local tokenizer = assert(coreml.new_text_tokenizer({
type = "wordpiece",
vocab_path = XXT_HOME_PATH.."/models/demo/vocab.txt",
context_length = 52,
}))
local ids = assert(tokenizer:encode("星星", {
output = "MLMultiArray",
data_type = "int32",
}))
local structured = assert(tokenizer:encode("星星", {
output = "table",
return_attention_mask = true,
return_token_type_ids = true,
}))
local ort = require("onnxruntime")
local input_ids = assert(tokenizer:encode("星星", {
output = "ort_tensor",
data_type = "int64",
}))
local batch = assert(tokenizer:encode_batch({
"星星",
"月亮",
}, {
output = "ort_tensor",
}))
print(tokenizer:decode(structured.input_ids))
print(tokenizer:vocab_size())
print(tokenizer:context_length())