Text-Tokenizer-Modul
Das Text-Tokenizer-Modul wandelt Zeichenketten in vom Modell verwendbare Token-ID-Sequenzen um.
Es übernimmt nur Tokenisierung, Kodierung und Dekodierung, nicht die Modellinferenz. Typischerweise wird der Text zunächst in ein MLMultiArray oder einen onnxruntime.tensor kodiert und das Ergebnis anschließend an den jeweiligen CoreML- oder ONNX-Runtime-Inferenz-Request übergeben.
Dieses Modul ist auf „ausreichende Inferenz auf dem Gerät“ ausgerichtet:
WordPiecebietet die höchste Kompatibilität und eignet sich für Modelle wieBERTundCN-CLIP.BPEundSentencePieceverwenden eine leichte Kompatibilitätsstrategie und eignen sich für die meisten Kodierungsszenarien auf dem Gerät.- Komplexes Tokenizer-Training, Sampling oder das vollständige Verhalten der Upstream-Ökosysteme wird nicht in die Laufzeit übernommen.
Dieses Modul ist in Versionen nach 20260319 verfügbar
Tokenizer erstellen
coreml.new_text_tokenizer(opts)
SentencePiece_tokenizer, err = coreml.new_text_tokenizer({
type = tokenizer_type,
vocab_path = vocab_path,
merges_path = merges_path,
model_path = sentencepiece_model_path,
pattern = regex_pattern,
context_length = context_length,
do_lower_case = use_lower_case,
vocab_limit = vocab_limit,
clean_text = clean_text,
add_bos = add_bos,
add_eos = add_eos,
bos_token = bos_token_text,
eos_token = eos_token_text,
pad_token = pad_token_text,
unk_token = unk_token_text, -- SentencePiece token text
})
Werte für type
wordpiece/bert/cn_clipbpe/gpt2_bpe/clip_bpesentencepiece/spmregex/patternbyte/byteswhitespace/spacecharacter/char
Standardwert ist wordpiece.
Wenn das erste Argument von coreml.new_text_tokenizer(...) keine Tabelle ist, wird direkt die wordpiece-Kurzform verwendet, entsprechend etwa coreml.new_wordpiece_tokenizer(vocab_path).
Häufige Parameter
-
vocab_path
Zeichenkette. Pfad zur Vokabulardatei. -
merges_path
Zeichenkette. Pfad zur vonBPE-Tokenizern verwendeten Merges-Datei. -
model_path
Zeichenkette. Pfad zu einer.model-Datei für denSentencePiece-Kompatibilitätsmodus. -
pattern
Zeichenkette. Regulärer Ausdruck für denRegex-Tokenizer. -
context_length
Ganzzahl, optional. Länge der ausgegebenen Token-Sequenz. -
do_lower_case
Boolean, optional. Gibt an, ob zunächst in Kleinbuchstaben umgewandelt wird. -
vocab_limit
Ganzzahl, optional, hauptsächlich fürWordPiece. Begrenzt die Größe des Vokabulars. -
clean_text
Boolean, optional. Gibt an, ob vor der Tokenisierung eine grundlegende Textbereinigung erfolgt. -
add_bos / add_eos
Boolean, optional. Gibt an, ob der Kodierung am Anfang bzw. Ende Start-/End-Token angefügt werden. -
bos_token / eos_token / pad_token / unk_token
Zeichenkette, optional. Der Text der jeweiligen Special-Token im Vokabular.
Nicht jeder Tokenizer-Typ unterstützt alle obigen Felder. Erforderliche Felder und Standardwerte der aktuellen Implementierung:
wordpieceUnterstützt die direkte Übergabe einervocab_path-Zeichenkette oder einer Tabelle;vocab_pathmuss vorhanden sein. Standard sindcontext_length = 52,do_lower_case = trueundvocab_limit = 21128; das Vokabular muss[PAD],[UNK],[CLS]und[SEP]enthalten.bpeAkzeptiert nur eine Tabelle;vocab_pathundmerges_pathsind erforderlich. Standard sindcontext_length = 77,do_lower_case = false,clean_text = false,add_bos = falseundadd_eos = false.sentencepieceAkzeptiert nur eine Tabelle; mindestensvocab_pathodermodel_pathist erforderlich. Standard sindcontext_length = 77,do_lower_case = false,clean_text = true,bos_token = "<s>",eos_token = "</s>",pad_token = "<pad>"undunk_token = "<unk>".regexAkzeptiert nur eine Tabelle;vocab_pathundpatternsind erforderlich. Standard sindcontext_length = 77,do_lower_case = falseundclean_text = true.whitespace/character/byteAkzeptiert nur eine Tabelle;vocab_pathist erforderlich. Standard sindcontext_length = 77,do_lower_case = falseundclean_text = true.
Auswahlempfehlungen:
- Wenn das Modell
vocab.txt + WordPieceverwendet,wordpiecewählen. - Wenn das Modell
vocab.json + merges.txtverwendet,bpewählen. - Wenn das Modell
.vocaboder.modelverwendet,sentencepiecewählen. regex,whitespace,characteroderbytenur bei einfachen regelbasierten Tokenisierungsanforderungen erwägen.
Rückgabewerte
-
tokenizer
Objekt; bei einem Fehlernil. -
err
Zeichenkette; bei Erfolgnil, bei einem Fehler die Fehlermeldung.
Hinweise
- Das Tokenizerobjekt sollte einmal erstellt und wiederverwendet werden; eine Neuerstellung für jede Kodierung wird nicht empfohlen.
- Beim Erstellen werden vor allem drei Dinge festgelegt: Tokenisierungsalgorithmus, Vokabularquelle und feste Ausgabelänge.
- Bei deutlich falschen Modellergebnissen zuerst Tokenizer-Typ, Vokabulardatei, Special-Token-Konfiguration und die Übereinstimmung von
context_lengthmit dem Training prüfen. WordPieceist derzeit die vollständigste und stabilste Variante.BPEundSentencePiecezielen auf kompatible Kodierung auf dem Gerät und versprechen keine vollständige Reproduktion aller Upstream-Details.
Kurz-Tokenizer
Die folgenden Kurzfunktionen leiten im Wesentlichen an coreml.new_text_tokenizer(...) weiter und eignen sich, wenn der Tokenizer-Typ bereits feststeht.
coreml.new_wordpiece_tokenizer(opts)
- Entspricht
coreml.new_text_tokenizer({ type = "wordpiece", ... }). - Geeignet für Textmodelle im
WordPiece-Stil wieBERTundCN-CLIP. - Unterstützt auch die direkte Übergabe eines Vokabularpfads:
coreml.new_wordpiece_tokenizer(vocab_path).
coreml.new_bpe_tokenizer(opts)
- Entspricht
coreml.new_text_tokenizer({ type = "bpe", ... }). - Deckt auch Modelle wie
gpt2_bpeundclip_bpemitvocab.json + merges.txtab.
coreml.new_sentencepiece_tokenizer(opts)
- Entspricht
coreml.new_text_tokenizer({ type = "sentencepiece", ... }). - Verwendet eine leichte, für Inferenz auf dem Gerät ausgelegte Kompatibilitätsimplementierung.
- Unterstützt
.vocabund.model.
coreml.new_regex_tokenizer(opts)
- Entspricht
coreml.new_text_tokenizer({ type = "regex", ... }). - Geeignet für regelbasierte Tokenisierung und einfache Vokabularzuordnung.
coreml.new_byte_tokenizer(opts)
- Entspricht
coreml.new_text_tokenizer({ type = "byte", ... }). - Wandelt den Text zunächst in einen
UTF-8-Byte-Stream um und sucht anschließend byteweise im Vokabular.
coreml.new_whitespace_tokenizer(opts)
- Entspricht
coreml.new_text_tokenizer({ type = "whitespace", ... }). - Geeignet für leichte Textmodelle mit Leerzeichen-Tokenisierung und direkter Vokabularsuche.
coreml.new_character_tokenizer(opts)
- Entspricht
coreml.new_text_tokenizer({ type = "character", ... }). - Geeignet für zeichenbasierte Textmodelle.
Typprüfung
coreml.is_text_tokenizer(value)
is_tokenizer = coreml.is_text_tokenizer(value)
Prüft, ob ein Wert ein coreml_text_tokenizer_object ist.
Objektmethoden
:encode(text[, opts])
encoded_token, err = tokenizer:encode(text)
oder
encoded, err = tokenizer:encode(text, {
output = "table" or "MLMultiArray" or "ort_tensor",
data_type = data_type,
pair_text = token_pair_text,
max_length = max_length,
padding = padding_strategy,
truncation = truncation_strategy,
return_attention_mask = return_attention_mask,
return_token_type_ids = token_type_ids,
return_special_tokens_mask = return_special_tokens_mask, -- token sequence
})
Kodiert einen einzelnen Text in eine Token-Sequenz.
:encode_batch(texts[, opts])
encoded, err = tokenizer:encode_batch(texts)
oder
encoded, err = tokenizer:encode_batch(texts, {
output = "table" or "MLMultiArray" or "ort_tensor",
data_type = data_type,
pair_text = pair_text_or_texts,
max_length = max_length,
padding = padding_strategy,
truncation = truncation_strategy,
return_attention_mask = return_attention_mask,
return_token_type_ids = return_token_type_ids,
return_special_tokens_mask = return_special_tokens_mask, -- token output
})
Kodiert mehrere Texte auf einmal und gibt Token-Sequenzen im Batch-Format zurück.
:decode(ids)
text, err = tokenizer:decode(ids)
Dekodiert eine einzelne Token-ID-Sequenz zurück in Text.
idskann ein Lua-Array, einMLMultiArrayoder eine tensorähnliche ORT-Tensor-Userdata sein.idskann auch jede tensorähnliche Userdata sein, dieshape()undto_table()implementiert.- Bei Batch-Daten wird ein Fehler ausgegeben und auf
decode_batch()verwiesen.
:decode_batch(batch_ids)
texts, err = tokenizer:decode_batch(batch_ids)
Dekodiert Batch-Token-ID-Sequenzen zurück in ein Textarray.
batch_idskann ein verschachteltes Lua-Array, einMLMultiArrayoder eine tensorähnliche ORT-Tensor-Userdata sein.batch_idskann auch jede tensorähnliche Userdata sein, dieshape()undto_table()implementiert.
:vocab_size()
vocab_size = tokenizer:vocab_size()
Gibt die Größe des verfügbaren Vokabulars des aktuellen Tokenizers zurück.
:context_length()
context_length = tokenizer:context_length()
Gibt die feste Ausgabelänge des aktuellen Tokenizers zurück, auf die eine einzelne Kodierung aufgefüllt oder gekürzt wird.
Hinweise zu Kodierung und Rückgabewerten
outputist standardmäßig"MLMultiArray"und eignet sich zur direkten Übergabe an CoreML-Modelle.output = "table"eignet sich für Debugging, die Anzeige von Token-IDs oder die Kompatibilität mit älteren Skripten.output = "ort_tensor"eignet sich zur direkten Übergabe an ONNX-Runtime-Textmodelle.- Vor
output = "ort_tensor"mussrequire("onnxruntime")ausgeführt werden, damit die ORT-Bridge-Schnittstelle eingefügt wird. output = "ort_tensor"hängt von ONNX Runtime ab und unterstützt daher nur iOS 13+.- Zur Kompatibilität mit älteren Skripten wird das Feld
multi_array_outputweiterhin gelesen; in neuem Code sollte einheitlichoutputverwendet werden.
Regeln für data_type
- Bei
output = "MLMultiArray"kanndata_type"int32","float32","float16"oder"double"sein;"float64"ist ein Alias für"double". - Bei
output = "MLMultiArray"istdata_type = "int32"der Standard. - Bei
output = "ort_tensor"kanndata_type"float16","float32","uint8","int8","int32","int64","double"oder"bool"sein. - Bei
output = "ort_tensor"istdata_type = "int64"der Standard.
padding / truncation
paddingkann ein Boolean oder eine Zeichenkette sein.truewird auf"max_length"abgebildet.falsewird auf"do_not_pad"abgebildet.
truncationkann ein Boolean oder eine Zeichenkette sein.truewird auf"longest_first"abgebildet.falsewird auf"do_not_truncate"abgebildet.
pair_text
- In
encode()kann ein einzelnespair_textübergeben werden. - In
encode_batch()kann ein einzelnespair_textoder ein Zeichenkettenarray mit der Batchgröße übergeben werden.
Strukturierte Rückgabe
Wenn eines der folgenden Felder true ist, geben encode() / encode_batch() eine strukturierte Ergebnistabelle statt nur einer rohen Token-Sequenz zurück:
return_attention_maskreturn_token_type_idsreturn_special_tokens_mask
Häufige Felder des strukturierten Ergebnisses:
input_idslengthattention_masktoken_type_idsspecial_tokens_mask
Bei Batch-Kodierung gilt:
- Bei
output = "table"bleibt die individuelle Länge jedes Beispiels erhalten. - Bei
output = "MLMultiArray"/"ort_tensor"wird der Batch vor der Rückgabe zu einer regulären Matrix aufgefüllt.
Beispiel
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())