Tổng hợp kiến thức liên quan đến Trình mã hóa văn bản v5- Định nghĩa mô hình đơn giản, cung cấp năng lượng cho hệ sinh thái AI
Tổng hợp kiến thức liên quan đến Trình mã hóa văn bản v5, cung cấp năng lượng cho hệ sinh thái AI
- 18 min read
Tokenization in Transformers v5: Simpler, Clearer, and More Modular
Transformers v5 mang đến một cuộc cải tổ lớn về cách thức hoạt động của tokenizers. Bản định dạng lại tokenizers lớn này tách biệt thiết kế của tokenizer khỏi bộ từ vựng đã được huấn luyện (tương tự như cách PyTorch tách kiến trúc mạng nơ-ron khỏi trọng số đã học). Kết quả là chúng ta có các tokenizer mà bạn có thể kiểm tra, tùy chỉnh và huấn luyện từ đầu một cách dễ dàng hơn nhiều.
Tóm tắt: Bài viết này giải thích cách tokenization hoạt động trong Transformers và tại sao v5 lại là một bản thiết kế lại lớn, với nội bộ rõ ràng hơn, hệ thống phân cấp lớp sạch sẽ và một backend nhanh duy nhất. Đây là một hướng dẫn thực tế cho bất kỳ ai muốn hiểu, tùy chỉnh hoặc huấn luyện các tokenizer dành riêng cho mô hình thay vì coi chúng như những hộp đen.
Bảng Mục Lục
- What is Tokenization?
- The Tokenization Pipeline
- Tokenization Algorithms
- Accessing
tokenizersthroughtransformers - The Tokenizer Class Hierarchy in
transformers AutoTokenizerAutomatically Selects the Correct Tokenizer Class- v5 Separates Tokenizer Architecture from Trained Vocab
- Summary
Dành cho chuyên gia: Nếu bạn đã quen thuộc với các khái niệm và muốn hiểu những thay đổi trong v5, hãy chuyển đến v5 Separates Tokenizer Architecture from Trained Vocab
Trước khi đi sâu vào các thay đổi, hãy cùng xem lại nhanh về tokenization làm gì và các bộ phận khớp với nhau như thế nào.
What is tokenization?
Các mô hình ngôn ngữ lớn không đọc văn bản thô. Chúng tiêu thụ các chuỗi số nguyên thường được gọi là token IDs hoặc input IDs. Tokenization là quá trình chuyển đổi văn bản thô thành các token ID này. (Hãy thử playground tokenization ở đây để hình dung tokenization.)
Tokenization là một khái niệm rộng được sử dụng trong xử lý ngôn ngữ tự nhiên và xử lý văn bản nói chung. Bài viết này tập trung đặc biệt vào tokenization cho các Mô hình Ngôn ngữ Lớn (LLMs) bằng cách sử dụng thư viện transformers và tokenizers.
python from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(“HuggingFaceTB/SmolLM3-3B”)
text = “Hello world” tokens = tokenizer(text)
print(tokens[“input_ids”])
[9906, 1917]
print(tokenizer.convert_ids_to_tokens(tokens[“input_ids”]))
[‘Hello’, ‘Ġworld’]
Ġworld(ở trên) là một token duy nhất đại diện cho chuỗi ký tự " world" (có khoảng trắng).
Một token là đơn vị chuỗi nhỏ nhất mà mô hình nhìn thấy. Nó có thể là một ký tự, một từ, hoặc một đoạn từ con như “play” hoặc “##ing” ("##" là một mẫu, đừng lo lắng nếu bạn chưa hiểu rõ lắm 🤗). Bộ từ vựng (vocabulary) ánh xạ mỗi token duy nhất sang token ID.
python from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“HuggingFaceTB/SmolLM3-3B”) print(tokenizer.vocab)
{‘ÎĹÎľ’: 106502, ‘ĠPeel’: 89694, ‘.languages’: 91078, …}
Một tokenizer tốt nén văn bản thành lượng token nhỏ nhất. Ít token hơn có nghĩa là ngữ cảnh sử dụng nhiều hơn mà không làm tăng kích thước mô hình. Việc huấn luyện một tokenizer về cơ bản là tìm ra các quy tắc nén tốt nhất cho tập dữ liệu của bạn. Ví dụ, nếu bạn làm việc với một kho ngữ liệu tiếng Trung, đôi khi bạn có thể tìm thấy những điều bất ngờ thú vị 😉.
The tokenization pipeline
Tokenization diễn ra theo từng giai đoạn. Mỗi giai đoạn biến đổi văn bản trước khi chuyển nó sang giai đoạn tiếp theo:
| Stage | Purpose | Example |
|---|---|---|
| Normalizer | Tiêu chuẩn hóa văn bản (chữ thường, chuẩn hóa unicode, làm sạch khoảng trắng) | "HELLO World" → "hello world" |
| Pre-tokenizer | Tách văn bản thành các khối sơ bộ | "hello world" → ["hello", " world"] |
| Model | Áp dụng thuật toán tokenization (BPE, Unigram, v.v.) | ["hello", " world"] → [9906, 1917] |
| Post-processor | Thêm các token đặc biệt (BOS, EOS, padding) | [9906, 1917] → [1, 9906, 1917, 2] |
| Decoder | Chuyển đổi token IDs trở lại văn bản | [9906, 1917] → "hello world" |
Mỗi thành phần là độc lập. Bạn có thể thay đổi normalizers hoặc thay đổi algorithm mà không cần viết lại mọi thứ khác.
Bạn có thể truy cập tokenizer dựa trên rust thông qua
_tokenizer. Chúng tôi sẽ đi sâu hơn về nó trong phần này.
python from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“google/gemma-3-270m-it”)
print(f"{tokenizer._tokenizer.normalizer=}")
Replace(…)
print(f"{tokenizer._tokenizer.pre_tokenizer=}")
Split(…)
print(f"{tokenizer._tokenizer.model=}")
BPE(…)
print(f"{tokenizer._tokenizer.post_processor=}")
TemplateProcessing(…)
print(f"{tokenizer._tokenizer.decoder=}")
Sequence(decoders=[Replace(…), ByteFallback(), Fuse()])
Tokenization algorithms
Các thuật toán tokenization sau đây chiếm ưu thế trong các tokenizer mô hình ngôn ngữ hiện đại:
-
Byte Pair Encoding (BPE) lặp đi lặp lại việc hợp nhất các cặp ký tự xuất hiện thường xuyên nhất. Thuật toán này có tính xác định và được sử dụng rộng rãi. (Đọc thêm về BPE)
python from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“openai/gpt-oss-20b”) print(tokenizer._tokenizer.model)
BPE(…)
-
Unigram sử dụng phương pháp xác suất, chọn cách phân tách có khả năng xảy ra nhất từ một bộ từ vựng ban đầu lớn. Điều này linh hoạt hơn BPE nghiêm ngặt. (Đọc thêm về Unigram)
python from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“google-t5/t5-base”) print(tokenizer._tokenizer.model)
Unigram(…)
-
WordPiece tương tự BPE nhưng sử dụng các tiêu chí hợp nhất khác nhau dựa trên khả năng xảy ra. (Đọc thêm về WordPiece)
python from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“bert-base-uncased”) print(tokenizer._tokenizer.model)
WordPiece(…)
Accessing tokenizers through transformers
Thư viện tokenizers là một công cụ tokenization dựa trên Rust. Nó nhanh, hiệu quả và hoàn toàn độc lập với mô hình ngôn ngữ. Thư viện này xử lý các cơ chế chuyển đổi văn bản thành token IDs và ngược lại. Thư viện tokenizers là một công cụ đa dụng triển khai các thuật toán tokenization, nhưng không triển khai các quy ước kết nối các thuật toán đó với các mô hình ngôn ngữ cụ thể.
Hãy xem xét những gì xảy ra khi bạn sử dụng tokenizers trực tiếp với mô hình SmolLM3-3B:
python from tokenizers import Tokenizer
tokenizer = Tokenizer.from_pretrained(“HuggingFaceTB/SmolLM3-3B”) text = “Hello world” encodings = tokenizer.encode(text)
print(encodings.ids)
[9906, 1917]
print(encodings.tokens)
[‘Hello’, ‘Ġworld’]
Kết quả là tokenization thô. Bạn nhận được token IDs và các đoạn chuỗi tương ứng. Không có gì khác.
Bây giờ hãy xem xét những gì còn thiếu. SmolLM3-3B là một mô hình hội thoại. Khi bạn tương tác với nó, bạn thường cấu trúc đầu vào của mình dưới dạng một cuộc trò chuyện với các vai trò như “user” và “assistant”. Mô hình ngôn ngữ mong đợi các token định dạng đặc biệt để biểu thị các vai trò này. Thư viện tokenizers thô không có khái niệm nào về điều này.
How do you bridge the gap between raw tokenization and model requirements?
Thư viện transformers thu hẹp khoảng cách này. Thư viện này chủ yếu được biết đến như một thư viện định nghĩa mô hình, nhưng nó cũng cung cấp một lớp trừu tượng tokenizer gói gọn backend tokenizers thô và thêm chức năng nhận biết mô hình.
Đây là cùng một tokenization với wrapper transformers:
python from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“HuggingFaceTB/SmolLM3-3B”)
Định dạng một cuộc trò chuyện bằng cách sử dụng mẫu chat của mô hình
prompt = “Give me a brief explanation of gravity in simple terms.” messages = [{“role”: “user”, “content”: prompt}] text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, )
print(text)
<|im_start|>system
…
<|im_start|>user
Give me a brief explanation of gravity in simple terms.<|im_end|>
<|im_start|>assistant
model_inputs = tokenizer([text], return_tensors=“pt”)
Lưu ý cách các token đặc biệt như <|im_start|> và <|im_end|> được áp dụng cho prompt trước khi tokenization. Điều này hữu ích để mô hình học được vị trí bắt đầu và kết thúc của một chuỗi mới.
Tokenizer transformers bổ sung mọi thứ mà thư viện thô còn thiếu:
- Áp dụng mẫu chat. Phương thức
apply_chat_templateđịnh dạng các cuộc trò chuyện theo các mẫu Jinja được lưu trữ trong cấu hình tokenizer, chèn các token và dấu phân cách đặc biệt chính xác. - Chèn token đặc biệt tự động. Các token bắt đầu chuỗi và kết thúc chuỗi được thêm vào những nơi mô hình mong đợi chúng.
- Cắt bớt đến độ dài ngữ cảnh. Bạn có thể chỉ định
truncation=Truevà tokenizer sẽ tôn trọng độ dài chuỗi tối đa của mô hình. - Mã hóa theo lô với padding. Nhiều đầu vào có thể được đệm đến cùng một độ dài với token padding và hướng chính xác.
- Tùy chọn định dạng trả về. Bạn có thể yêu cầu các tensor PyTorch (
return_tensors="pt") , mảng NumPy và các định dạng khác.
transformerstriển khai API tokenization được sử dụng phổ biến nhất trong toàn bộ cộng đồng ML (encode,decode,convert_tokens_to_ids, v.v.)
The Tokenizer Class Hierarchy in transformers
Thư viện transformers tổ chức các tokenizer thành một hệ thống phân cấp lớp. Ở trên cùng là một lớp cơ sở định nghĩa giao diện chung. Bên dưới nó, các lớp backend xử lý tokenization thực tế bằng cách sử dụng các engine khác nhau. Ở dưới cùng, các lớp dành riêng cho mô hình cấu hình các backend cho các mô hình cụ thể.
| Layer | Component | Responsibility |
|---|---|---|
| Entry Point | AutoTokenizer |
Tự động chọn và khởi tạo lớp tokenizer chính xác |
| Model-Specific | LlamaTokenizer, GPT2Tokenizer, v.v. |
Cấu hình backend với kiến trúc chuẩn hóa, tiền xử lý, v.v., token đặc biệt và cài đặt dành riêng cho mô hình |
| Backend | TokenizersBackend, PythonBackend, SentencePieceBackend |
Thực hiện tokenization thực tế bằng cách sử dụng engine cụ thể |
| Base | PreTrainedTokenizerBase |
Định nghĩa giao diện chung và chức năng được chia sẻ |
| Engine | tokenizers (Rust), SentencePiece, Pure Python |
Thực hiện tokenization thô |
PreTrainedTokenizerBase defines the common interface for all tokenizers
PreTrainedTokenizerBase là lớp cơ sở trừu tượng cho tất cả các tokenizer trong transformers. Nó định nghĩa giao diện mà mọi tokenizer phải triển khai.
Lớp cơ sở xử lý các chức năng không phụ thuộc vào backend tokenization:
- Thuộc tính token đặc biệt. Các thuộc tính như
bos_token,eos_token,pad_tokenvàunk_tokenđược định nghĩa ở đây. Các thuộc tính này cung cấp quyền truy cập vào các token đặc biệt mà mô hình sử dụng để đánh dấu ranh giới chuỗi và xử lý các đầu vào không xác định. - Giao diện mã hóa. Các phương thức
__call__,encodevàencode_plusđược định nghĩa ở đây. Các phương thức này chấp nhận đầu vào văn bản và trả về token IDs cùng với mặt nạ chú ý và siêu dữ liệu khác. - Giao diện giải mã. Các phương thức
decodevàbatch_decodechuyển đổi token IDs trở lại văn bản. - Serialize. Các phương thức
save_pretrainedvàfrom_pretrainedxử lý việc tải xuống các tệp chính xác, đọc thông tin, lưu trữ tokenizer vào đĩa, v.v. - Hỗ trợ mẫu chat. Phương thức
apply_chat_templatenằm ở đây, định dạng các cuộc trò chuyện theo mẫu Jinja được lưu trữ trong cấu hình tokenizer.
Mọi tokenizer trong transformers cuối cùng đều kế thừa từ PreTrainedTokenizerBase. Lớp cơ sở đảm bảo hành vi nhất quán trên tất cả các tokenizer, bất kể chúng sử dụng backend nào cho tokenization thực tế.
TokenizersBackend wraps the tokenizers library
TokenizersBackend là lớp backend chính cho hầu hết các tokenizer hiện đại. Nó kế thừa từ PreTrainedTokenizerBase và gói gọn thư viện tokenizers dựa trên Rust.
Lớp này lưu trữ đối tượng tokenizer Rust bên trong:
python class TokenizersBackend(PreTrainedTokenizerBase): def init(self, tokenizer_object, …): self._tokenizer = tokenizer_object # The Rust tokenizer …
Khi bạn gọi các phương thức mã hóa trên một tokenizer TokenizersBackend, lớp này sẽ ủy quyền tokenization thực tế cho backend Rust:
python def _batch_encode_plus(self, batch_text_or_text_pairs, …): encodings = self._tokenizer.encode_batch(batch_text_or_text_pairs, …) …
Backend Rust thực hiện công việc tính toán chuyên sâu, trong khi lớp wrapper Python thêm các tính năng nhận biết mô hình ở trên.
Nhiều tokenizer dành riêng cho mô hình kế thừa từ TokenizersBackend, ví dụ bao gồm:
LlamaTokenizerGemmaTokenizer
Các lớp dành riêng cho mô hình này cấu hình backend với bộ từ vựng, quy tắc hợp nhất, token đặc biệt và cài đặt chính xác cho các mô hình tương ứng của chúng.
PythonBackend provides a pure-Python mixin
PythonBackend kế thừa từ PreTrainedTokenizerBase và triển khai tokenization bằng Python thuần túy. Lớp này được đặt tên là PreTrainedTokenizer.
Backend Python thuần túy tồn tại vì một số lý do:
- Logic tokenization tùy chỉnh. Một số mô hình yêu cầu hành vi tokenization không phù hợp với quy trình
tokenizerstiêu chuẩn. - Tương thích di sản. Các triển khai mô hình cũ hơn có thể dựa vào hành vi dành riêng cho Python.
Backend Python chậm hơn backend Rust. Đối với hầu hết các trường hợp sử dụng, backend dựa trên Rust
TokenizersBackendđược ưu tiên.
Các tokenizer dành riêng cho mô hình kế thừa từ PythonBackend (hoặc bí danh PreTrainedTokenizer của nó) bao gồm một số mô hình cũ hoặc chuyên biệt, như:
CTRLTokenizerCanineTokenizer
SentencePieceBackend handles SentencePiece models
SentencePieceBackend kế thừa từ PythonBackend và cung cấp tích hợp với thư viện SentencePiece của Google. SentencePiece là một thư viện tokenization độc lập mà nhiều mô hình sử dụng, đặc biệt là những mô hình được Google huấn luyện.
Backend này gói gọn một bộ xử lý SentencePiece:
python class SentencePieceBackend(PythonBackend): def init(self, vocab_file, …): self.sp_model = spm.SentencePieceProcessor() self.sp_model.Load(vocab_file) …
Các mô hình sử dụng SentencePiece tokenization kế thừa từ backend này. Ví dụ bao gồm:
SiglipTokenizerBartphoTokenizer
Backend SentencePiece kế thừa từ PythonBackend thay vì trực tiếp từ PreTrainedTokenizerBase vì nó chia sẻ phần lớn giao diện và logic padding/truncation tương tự.
AutoTokenizer Automatically Selects the Correct Tokenizer Class
AutoTokenizer là điểm truy cập được khuyến nghị để tải tokenizer. Nó tự động xác định lớp tokenizer nào cần sử dụng cho một mô hình nhất định và trả về một instance của lớp đó.
python from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(“gpt2”)
Bên dưới bề mặt, AutoTokenizer thực hiện các bước sau:
-
Tải xuống cấu hình tokenizer. Phương thức
from_pretrainedlấytokenizer_config.jsontừ Hub (hoặc từ thư mục cục bộ). -
Xác định loại mô hình. Cấu hình chứa siêu dữ liệu giúp xác định loại mô hình (ví dụ: “gpt2”, “llama”, “bert”).
-
Tra cứu lớp tokenizer.
AutoTokenizerduy trì một ánh xạ gọi là TOKENIZER_MAPPING_NAMES ánh xạ các loại mô hình với tên lớp tokenizer:python TOKENIZER_MAPPING_NAMES = { “gpt2”: “GPT2Tokenizer”, “llama”: “LlamaTokenizer”, “bert”: “BertTokenizer”, … }
-
Khởi tạo lớp chính xác.
AutoTokenizernhập lớp tokenizer phù hợp và gọi phương thứcfrom_pretrainedcủa nó. -
Trả về tokenizer đã cấu hình. Bạn nhận được một tokenizer dành riêng cho mô hình được cấu hình đầy đủ, sẵn sàng để sử dụng.
Lợi ích của
AutoTokenizerlà bạn không cần biết mô hình sử dụng lớp tokenizer nào. Cho dù mô hình sử dụngLlamaTokenizer,GPT2TokenizerhayBertTokenizer, cùng một lệnh gọiAutoTokenizer.from_pretrained("model-name")đều hoạt động.
Hệ thống tokenizer trong transformers tạo thành một kiến trúc phân lớp:
| Layer | Component | Responsibility |
|---|---|---|
| Entry Point | AutoTokenizer |
Tự động chọn và khởi tạo lớp tokenizer chính xác |
| Model-Specific | LlamaTokenizer, GPT2Tokenizer, v.v. |
Cấu hình backend với kiến trúc chuẩn hóa, tiền xử lý, v.v., token đặc biệt và cài đặt dành riêng cho mô hình |
| Backend | TokenizersBackend, PythonBackend, SentencePieceBackend |
Thực hiện tokenization thực tế bằng cách sử dụng engine cụ thể |
| Base | PreTrainedTokenizerBase |
Định nghĩa giao diện chung và chức năng được chia sẻ |
| Engine | tokenizers (Rust), SentencePiece, Pure Python |
Thực hiện tokenization thô |
v5 Separates Tokenizer Architecture from Trained Vocab
Thay đổi quan trọng nhất trong Transformers v5 là sự thay đổi triết lý trong cách định nghĩa tokenizer. Tokenizer hiện hoạt động như nn.Module của PyTorch: trước tiên bạn định nghĩa kiến trúc, sau đó điền vào nó các tham số đã học.
The problem with v4: tokenizers were opaque and tightly coupled
Trong v4, tokenizer là những hộp đen gắn liền với các tệp checkpoint đã được huấn luyện trước. Nếu bạn tải LlamaTokenizerFast, bạn không thể dễ dàng trả lời các câu hỏi cơ bản về nó:
- Nó là BPE hay Unigram?
- Nó chuẩn hóa văn bản như thế nào?
- Nó sử dụng chiến lược tiền xử lý nào?
- Các token đặc biệt là gì và vị trí của chúng ở đâu?
Phương thức __init__ không cung cấp bất kỳ gợi ý nào. Bạn phải đào sâu vào các tệp được serialize hoặc tài liệu bên ngoài để hiểu tokenizer thực sự làm gì.
python
LlamaTokenizerFast như trong transformers v4
V4 cũng duy trì hai triển khai song song cho mỗi mô hình:
- một tokenizer Python “chậm” (LlamaTokenizer kế thừa từ
PreTrainedTokenizer) và - một tokenizer “nhanh” dựa trên Rust (LlamaTokenizerFast kế thừa từ
PreTrainedTokenizerFast).
Điều này có nghĩa là:
- Hai tệp cho mỗi mô hình (ví dụ:
tokenization_llama.pyvàtokenization_llama_fast.py) - Sao chép mã trên hàng trăm mô hình
- Sự khác biệt về hành vi giữa phiên bản chậm và nhanh, dẫn đến các lỗi tinh vi
- Bộ kiểm thử ngày càng tăng dành riêng cho việc xác minh rằng các tokenizer chậm và nhanh tạo ra kết quả giống hệt nhau
- Sự nhầm lẫn của người dùng về việc nên sử dụng tokenizer nào và khi nào
Quan trọng nhất, bạn không thể tạo một kiến trúc tokenizer trống. Nếu bạn muốn huấn luyện một tokenizer kiểu LLaMA trên dữ liệu dành riêng cho miền của mình, sẽ không có cách rõ ràng nào để khởi tạo một tokenizer LLaMA “trống” và điền vào đó bộ từ vựng và các quy tắc hợp nhất của bạn. Tokenizer chỉ tồn tại dưới dạng các checkpoint đã tải, không phải dưới dạng các mẫu có thể cấu hình.
The v5 solution: architecture and parameters are now separate
V5 coi kiến trúc tokenizer (normalizer, pre-tokenizer, loại mô hình, post-processor, decoder) là riêng biệt với các tham số đã được huấn luyện (bộ từ vựng, quy tắc hợp nhất). Điều này phản ánh cách PyTorch tách kiến trúc mô hình khỏi trọng số đã học.
Với nn.Module, bạn định nghĩa các lớp trước:
python from torch import nn
model = nn.Sequential( nn.Embedding(vocab_size, embed_dim), nn.Linear(embed_dim, hidden_dim), )
Kiến trúc đã được định nghĩa; trọng số được khởi tạo ngẫu nhiên hoặc tải sau
Tokenizer v5 tuân theo cùng một mẫu:
python from transformers import LlamaTokenizer
Khởi tạo tokenizer trống
tokenizer = LlamaTokenizer()
Huấn luyện trên dữ liệu của riêng bạn để điền vào bộ từ vựng và quy tắc hợp nhất
tokenizer.train(files=[“my_corpus.txt”])
Lớp tokenizer hiện khai báo rõ ràng cấu trúc của nó. Nhìn vào LlamaTokenizer trong v5, bạn có thể thấy ngay:
- Nó sử dụng BPE làm loại mô hình tokenization của nó
- Nó có thể thêm một tiền tố khoảng trắng trước văn bản
- Các token đặc biệt của nó (
unk,bos,eos) nằm ở các vị trí bộ từ vựng cụ thể - Nó không chuẩn hóa văn bản đầu vào
-
LlamaTokenizernhư trongtransformersv5
Sự minh bạch này là không thể có trong v4, nơi thông tin tương tự được chôn trong các tệp được serialize.
One file, one backend, one recommended path
V5 hợp nhất hệ thống hai tệp thành một tệp duy nhất cho mỗi mô hình. LlamaTokenizer hiện kế thừa từ TokenizersBackend, gói gọn tokenizer dựa trên Rust đã từng được hiển thị dưới dạng triển khai “nhanh” và hiện là mặc định.
Triển khai Python “chậm” trước đây nằm rõ ràng phía sau PythonBackend, và SentencePieceBackend vẫn dành cho các mô hình yêu cầu nó, nhưng tokenization dựa trên Rust là mặc định được ưu tiên.
Thay đổi này loại bỏ:
- Mã trùng lặp giữa các triển khai chậm/nhanh
- Quy ước đặt tên khó hiểu
Tokenizerso vớiTokenizerFast - Bộ kiểm thử dành riêng để kiểm tra sự tương đương chậm-nhanh
Người dùng hiện có một điểm vào rõ ràng. Người dùng nâng cao cần tùy chỉnh vẫn có thể truy cập các thành phần cấp thấp hơn, nhưng thư viện không còn buộc mọi người phải điều hướng hai triển khai song song nữa.
You can now train model specific tokenizers from scratch
Giả sử bạn muốn một tokenizer hoạt động giống hệt như của LLaMA – cùng một chuẩn hóa, cùng một tiền xử lý, cùng một loại mô hình BPE – nhưng được huấn luyện trên một kho ngữ liệu dành riêng cho miền (văn bản y tế, tài liệu pháp lý, một ngôn ngữ mới). Trong v4, điều này đòi hỏi phải xây dựng lại thủ công quy trình tokenizer từ các nguyên tắc cơ bản của thư viện tokenizers cấp thấp. Trong v5, bạn có thể khởi tạo kiến trúc trực tiếp và gọi train:
python from transformers import LlamaTokenizer from datasets import load_dataset
Khởi tạo tokenizer trống
tokenizer = LlamaTokenizer()
dataset = load_dataset(“wikitext”, “wikitext-2-raw-v1”, split=“train”)
def get_training_corpus(): batch = 1000 for i in range(0, len(dataset), batch): yield dataset[i : i + batch][“text”]
trained_tokenizer = tokenizer.train_new_from_iterator( text_iterator=get_training_corpus(), vocab_size=32000, length=len(dataset), show_progress=True, )
trained_tokenizer.push_to_hub(“my_custom_tokenizer”)
tokenizer = LlamaTokenizer.from_pretrained(“my_custom_tokenizer”)
Tokenizer kết quả sẽ có bộ từ vựng và quy tắc hợp nhất tùy chỉnh của bạn, nhưng sẽ xử lý văn bản giống như cách tokenizer LLaMA tiêu chuẩn sẽ làm với cùng xử lý khoảng trắng, cùng quy ước token đặc biệt, cùng hành vi giải mã.
| Aspect | V4 | V5 |
|---|---|---|
| Files per model | Two (tokenization_X.py, tokenization_X_fast.py) |
One (tokenization_X.py) |
| Default backend | Split between Python and Rust | Rust (TokenizersBackend) preferred |
| Architecture visibility | Hidden in serialized files | Explicit in class definition |
| Training from scratch | Required manual pipeline construction | tokenizer.train(files=[...]) |
| Component inspection | Difficult, undocumented | Direct properties (tokenizer.normalizer, etc.) |
| Parent classes | PreTrainedTokenizer, PreTrainedTokenizerFast |
TokenizersBackend (or SentencePieceBackend, PythonBackend) |
Sự chuyển đổi từ “tokenizer như các checkpoint đã tải” sang “tokenizer như các kiến trúc có thể cấu hình” làm cho thư viện trở nên mô-đun hơn, minh bạch hơn và phù hợp hơn với cách các chuyên gia nghĩ về việc xây dựng hệ thống ML.
Summary
Transformers v5 mang lại ba cải tiến cho tokenization:
- Một tệp cho mỗi mô hình thay vì các triển khai chậm/nhanh riêng biệt
- Kiến trúc hiển thị để bạn có thể kiểm tra normalizer, pre-tokenizer và decoder
- Các mẫu có thể huấn luyện cho phép bạn tạo các tokenizer tùy chỉnh phù hợp với thiết kế của bất kỳ mô hình nào
Lớp wrapper giữa tokenizers và Transformers vẫn rất cần thiết. Nó bổ sung nhận biết mô hình, độ dài ngữ cảnh, mẫu chat, token đặc biệt mà tokenization thô không cung cấp. V5 chỉ làm cho lớp đó rõ ràng hơn và có thể tùy chỉnh hơn.
Nếu bạn muốn tìm hiểu thêm về tokenization, đây là một số tài nguyên:
- Let’s build the GPT Tokenizer
- Gotchas in Tokenizer Behavior Every Developer Should Know
- Chat Templates
- A list of resources we have gathered from the community!