Transformers documentation

Tokenizers

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Tokenizers

Tokenizer mengubah teks menjadi tensor, yang merupakan input untuk model. Tokenizer menormalisasi dan memecah teks, menerapkan algoritma tokenisasi, menambahkan token khusus, dan mengodekan kembali id output menjadi teks.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer("Sphinx of black quartz, judge my vow.", return_tensors="pt")
{
    'input_ids': tensor([[     2, 235277,  82913,    576,   2656,  30407, 235269,  11490,    970,  29871, 235265]]),
    'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
}

Panduan ini membahas pemuatan, pengkodean, penguraian, pemrosesan batch, dan backend tokenizer yang tersedia.

Muat tokenizer

Muat tokenizer dengan kelas AutoTokenizer atau kelas tokenizer yang spesifik untuk model.

AutoTokenizer
tokenizer spesifik model

AutoTokenizer.from_pretrained() membaca konfigurasi model, menentukan kelas tokenizer yang tepat, dan mengembalikan instansnya. Anda tidak perlu mengetahui kelas tokenizer sebelumnya. Sebagian besar tokenizer teresolusi ke subkelas dari TokenizersBackend, yaitu tokenizer berbasis Rust yang cepat dari pustaka Tokenizers.

Memuat dengan AutoTokenizer adalah pendekatan yang direkomendasikan.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")

Enkode dan dekode

Metode TokenizersBackend.call() mengkodekan teks atau kumpulan teks menjadi input_ids, attention_mask, dan input model lainnya. Metode ini juga mengontrol padding, pemotongan, dan penyisipan token khusus.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer("Sphinx of black quartz, judge my vow.", return_tensors="pt")
{
    'input_ids': tensor([[     2, 235277,  82913,    576,   2656,  30407, 235269,  11490,    970,  29871, 235265]]),
    'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
}

TokenizersBackend.encode() serupa tetapi hanya mengembalikan input_ids.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
input_ids = tokenizer.encode("Sphinx of black quartz, judge my vow.")
[2, 235277, 82913, 576, 2656, 30407, 235269, 11490, 970, 29871, 235265]

TokenizersBackend.decode() mengonversi satu urutan atau batch input_ids yang telah ditokenisasi kembali menjadi teks.

tokenizer.decode(input_ids)
'<bos>Sphinx of black quartz, judge my vow.'

TokenizersBackend.decode() mempertahankan spasi tokenisasi yang tepat. Atur clean_up_tokenization_spaces untuk menghapus spasi sebelum tanda baca, dan skip_special_tokens untuk menghilangkan token khusus dari output.

tokenizer.decode(input_ids, skip_special_tokens=True)
'Sphinx of black quartz, judge my vow.'

Token khusus

Token khusus menandai batas struktural dalam sebuah urutan, seperti posisi awal-urutan atau padding. Setiap model mendefinisikan set token khususnya sendiri. Tokenizer menambahkannya saat Anda memanggilnya.

input_ids = tokenizer.encode("Sphinx of black quartz, judge my vow.")
[2, 235277, 82913, 576, 2656, 30407, 235269, 11490, 970, 29871, 235265]
tokenizer.decode(input_ids)
'<bos>Sphinx of black quartz, judge my vow.'

Daftarkan token khusus bernama tambahan dengan argumen extra_special_tokens. Model multimodal menggunakannya sebagai placeholder untuk gambar, video, atau audio.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(
    "google/gemma-3-4b-pt",
    extra_special_tokens={"image_token": "<image>"}
)

Pemrosesan batch

Pemrosesan batch melakukan tokenisasi beberapa urutan dalam satu panggilan. TokenizersBackend menangani batch besar lebih cepat karena backend berbasis Rust-nya memparalelkan pekerjaan di antara thread.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer(
    [
        "Sphinx of black quartz, judge my vow.",
        "Pack my box with five dozen liquor jugs.",
        "How vexingly quick daft zebras jump!"
    ],
    return_tensors="pt"
)

Pemrosesan batch mengharuskan semua urutan memiliki panjang yang sama. Padding dan truncation adalah strategi untuk menangani urutan dengan panjang yang bervariasi.

Padding

Padding menambahkan token khusus agar urutan yang lebih pendek sesuai dengan urutan terpanjang dalam batch. Attention mask menandai posisi padding sebagai 0 sehingga model mengabaikannya. Atur padding=True untuk melakukan padding hingga urutan terpanjang atau berikan max_length untuk melakukan padding hingga ukuran tetap.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer(
    [
        "Sphinx of black quartz, judge my vow.",
        "Pack my box with five dozen liquor jugs.",
        "How vexingly quick daft zebras jump!"
    ],
    return_tensors="pt",
    padding=True,
)
{
    'input_ids': tensor([
        [     2, 235277,  82913,    576,   2656,  30407, 235269,  11490,    970,  29871, 235265],
        [     0,      2,   6519,    970,   3741,    675,   4105,  25955,  42184, 225789, 235265],
        [     0,      2,   2299,  73378,  17844,   4320, 224463,   4949,  48977,  9902, 235341]
    ]),
    'attention_mask': tensor([
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    ])
}

Model bahasa besar melakukan padding di sisi kiri untuk menghindari gangguan pada generasi, yang memprediksi token berikutnya dari sisi kanan.

Pemotongan

Truncation memangkas token agar urutan muat dalam panjang maksimum. Atur truncation=True dan tentukan max_length untuk mengaktifkannya.

Padding dan truncation bekerja bersama. Urutan pendek memperoleh token padding, sementara urutan panjang kehilangan token di bagian akhir. Bersama-sama, keduanya menghasilkan tensor persegi panjang yang padat.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer(
    [
        "Sphinx of black quartz, judge my vow.",
        "Pack my box with five dozen liquor jugs.",
        "How vexingly quick daft zebras jump!"
    ],
    return_tensors="pt",
    padding=True,
    truncation=True,
    max_length=5
)
{
    'input_ids': tensor([
        [     2, 235277,  82913,    576,   2656],
        [     2,   6519,    970,   3741,    675],
        [     2,   2299,  73378,  17844,   4320]
    ]),
    'attention_mask': tensor([
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1]
    ])
}

Backend

Setiap model tokenizer didefinisikan dalam satu file dan mendukung empat backend tokenisasi.

backendimplementasideskripsi
TokenizersBackendTokenizersdefault untuk sebagian besar model
SentencePieceBackendSentencePiecemodel yang memerlukan SentencePiece
PythonBackendPythonmodel yang memerlukan tokenizer khusus
MistralCommonBackendmistral-commonModel Mistral dan Pixtral

Semua backend mewarisi dari PreTrainedTokenizerBase dan berbagi API yang sama untuk encoding, decoding, padding, truncation, saving, dan loading. Perbedaannya terletak pada pipeline tokenisasi yang berjalan di baliknya.

AutoTokenizer memilih backend terbaik yang tersedia saat Anda memanggil from_pretrained().

  1. Ia membaca file tokenizer_config.json untuk bidang tokenizer_class.
  2. Registry mencocokkan tokenizer_class dengan nama kelas. Kelas yang dipecahkan mewarisi dari salah satu dari empat backend. Misalnya, GemmaTokenizer mewarisi dari TokenizersBackend, dan SiglipTokenizer mewarisi dari SentencePieceBackend. Beberapa model, seperti GLM, dipetakan langsung ke TokenizersBackend karena file tokenizer.json sepenuhnya mendeskripsikan pipeline. GemmaTokenizer ada sebagai subclass karena mendefinisikan pengaturan spesifik model tambahan dalam Python yang tidak tertangkap oleh tokenizer.json. Ketika backend seperti mistral-common tidak terpasang, AutoTokenizer kembali ke TokenizersBackend.

Fallback ke TokenizersBackend

Beberapa model tidak memiliki kelas tokenizer khusus, dan beberapa checkpoint memiliki tokenizer_class yang tidak cocok dengan file tokenizer.json mereka yang sebenarnya. AutoTokenizer menangani kedua kasus ini dengan memuat pipeline dari tokenizer.json melalui TokenizersBackend yang generik. Ini memprioritaskan tokenizer yang diserialisasi di atas nama kelas dari Hub, yang memperbaiki masalah seperti ketika tokenizer_class yang tidak cocok menghasilkan token id yang salah.

Sebuah checkpoint dipecah menjadi TokenizersBackend generik karena salah satu dari tiga alasan.

AlasanPerilakuContoh
Tidak ada kelas tokenizer khususJenis model dipetakan langsung ke TokenizersBackend karena tokenizer.json sepenuhnya mendeskripsikan pipeline.GLM, Granite, OLMo 2, GPT BigCode
Kelas tokenizer Hub yang diketahui salahtokenizer_class yang tercatat di Hub salah untuk tipe model, sehingga AutoTokenizer mengabaikannya dan memuat tokenizer.json sebagai gantinya.DeepSeek V3, LLaVA, Qwen2, ModernBERT
Penimpaan checkpoint tertentuCheckpoint yang konfigurasi Hub-nya masih perlu diperbaiki akan dicocokkan berdasarkan model id-nya dan dipaksa menggunakan backend tersebut.deepseek-ai/DeepSeek-R1-Distill-*, Salesforce/blip2-*, google/umt5-small

Jenis model dan checkpoint yang terpengaruh bertambah seiring dengan dikoreksinya konfigurasi di Hub. Untuk set saat ini, lihat definisi MODELS_WITH_INCORRECT_HUB_TOKENIZER_CLASS dan MODEL_IDS_TO_TOKENIZERS_BACKEND di tokenization_auto.py.

Fallback bersifat otomatis dan tidak mengubah cara Anda memanggil from_pretrained(). Tokenizer yang dihasilkan melakukan encoding dan decoding persis seperti yang ditentukan oleh tokenizer.json.

Periksa backend yang digunakan oleh tokenizer dengan properti backend.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
tokenizer.backend
'tokenizers'

Periksa arsitektur tokenizer

Periksa komponen internal tokenizer (normalizer, pre-tokenizer, model, decoder) dengan atribut _tokenizer.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b")
print(tokenizer._tokenizer.normalizer)
print(tokenizer._tokenizer.pre_tokenizer)
print(tokenizer._tokenizer.model)
print(tokenizer._tokenizer.decoder)

Sumber daya

Update on GitHub