分詞器
3 秒看懂
分詞器(Tokenizer)是大型語言模型將原始文本轉化為模型可運算的離散符號(token)序列的核心元件。它定義了模型的“詞彙量”,直接決定模型如何理解每個字元、單詞與上下文,並影響推論成本、多語言能力以及最大有效上下文長度。
3 分鐘產業解釋
在 ChatGPT、LLaMA、文心一言等大型模型中,使用者輸入的任意文本並不能直接被 Transformer 計算。Tokenizer 就是那座橋樑:它先把文本規範化(例如處理全半形、大小寫),再按照一個學好的子詞詞表,將文本切割成 token 序列,最後將每個 token 對映為一個整數 ID,送入嵌入層。
主流的子詞分詞方案包括 BPE(位元組對編碼)、WordPiece、Unigram 和 SentencePiece。這些演算法的目標是在“詞彙量不宜過大(以免嵌入矩陣巨重)”與“儘可能保留完整單詞語義”之間取得平衡。分詞器的詞彙量通常設定在 3 萬到 10 萬之間,多語言模型會用到 25 萬甚至更多。對於未知字元,現代分詞器會回退到位元組級的表示(byte‑level BPE),徹底杜絕 <UNK>(未知詞標記)的出現。
產業中,分詞器不僅是模型訓練的一個預處理環節,更滲透到服務和商業模型:API 呼叫按 token 計費、上下文視窗以 token 數衡量、Prompt 設計需要計算 token 長度。一套高效、一致的分詞器庫(如 HuggingFace tokenizers、OpenAI tiktoken)已成為大型模型生態的標配基礎設施。
15 分鐘專家深入
Tokenization 流水線
一個完整的文本到 token 的流水線通常包括:
- 規範化(Normalization):統一字元形式,例如全形轉半形、大小寫摺疊、Unicode 正規化(NFKC/NFD)。
- 預分詞(Pre‑tokenization):將文本初步拆分為“詞”或“字元”段。常見方法是按空格和標點分割,或者基於正規表示式。
- 分詞模型(Tokenization Model):在預分詞的基礎上,應用子詞合併或分割演算法,將每個段進一步劃分為更小的 token。這是整個系統的核心。
- 後處理(Post‑processing):新增特殊 token(如 [CLS]、[SEP]、<s>、</s>、<pad>),並生成 attention mask 等。
主流子詞演算法概覽
- BPE(Byte Pair Encoding):從字元開始,反覆合併出現頻率最高的符號對,直到達到設定的詞彙量。GPT‑2、RoBERTa 均使用 BPE。因其基於頻率,確定性強,且易於實現。
- WordPiece:類似 BPE,但合併的依據是最大化訓練語料的似然(即選擇能最大提升語言模型機率的符號對)。BERT 採用此方案,詞彙量通常設為 30k 左右。
- Unigram Language Model:從一個大的種子詞彙表出發,通過 EM 演算法估算每個子詞的機率,然後反覆刪除低機率子詞,直到達到目標詞彙量。T5、XLNet 使用這種分詞器,訓練時容易通過子詞正則化(Subword Regularization)引入隨機性,提升魯棒性。
- SentencePiece:一種實現架構,將輸入文本視為原始位元組流,內部同時處理分詞和去分詞,語言完全無關。它既可以搭配 BPE,也可以搭配 Unigram。LLaMA 系列即基於 SentencePiece 的 BPE。
位元組級回退(Byte‑level Fallback)
GPT‑2 之後的模型普遍將最小單元下沉到位元組(共 256 個位元組 token),所有 Unicode 字元都可以用 UTF‑8 位元組序列表示。這樣,任何生僻字或程式碼都不會出現 <UNK>。合併時在這些位元組 token 上進行 BPE,最終詞彙量 = 256 + 合併出的符號數。
工程視角
- Fast vs Slow Tokenizer:HuggingFace 提供了 Rust 實現的高速 tokenizer,並可以直接與 Python 繫結,速度提升數十倍。
- 訓練成本:訓練一個分詞器本身不需要 GPU,但需要遍歷大規模語料進行頻率統計或 EM 迭代。詞彙量越大,所需語料越多,否則許多子詞得不到有意義的學習。
- 與模型訓練的耦合:Tokenizer 的詞彙量直接決定了模型嵌入層的大小(
V × d),通常在訓練前固定,之後不可更改。因此分詞器被視為模型權重的一部分,分發模型時需嚴格配套。
技術原理
BPE 的合併過程(確定性)
假設語料中只有單詞 “low”、“lower”、“newest”。初始詞彙為所有出現過的字元:{l,o,w,e,r,n,s,t}(空格作為單詞分隔符,不參與合併)。
- 遍歷語料,統計每個單詞內部相鄰符號對的頻率。例如在 “l o w” 中,
l o出現了 1 次,“o w” 出現了 1 次;在 “l o w e r” 中,“o w” 出現 1 次等。找出最高頻的符號對,如o w在 “low” 和 “lower” 中共出現 2 次,為最高頻之一。 - 將最高頻符號對(比如
o w)合併成一個新符號ow,更新詞彙表並將語料中所有o w替換為ow。 - 重複步驟 1‑2,直到詞彙表大小達到設定的
V(例如 32,000)。
程式碼化偽邏輯:
vocab = set(all characters)
pairs = count_bigram_freq(corpus)
while len(vocab) < target_vocab_size:
best_pair = max(pairs, key=pairs.get)
vocab.add(best_pair)
corpus = merge_corpus(corpus, best_pair)
pairs = recount_pairs(corpus)
WordPiece 的機率合併
不是根據頻率,而是計算一個語言模型下的似然增益。假設現有詞彙表 V,對每個候選合併符號對 (a, b) 組成新符號 ab,計算:
score = (freq(ab) / (freq(a) * freq(b)))
選擇使訓練集對數似然上升最多的合併。因此 WordPiece 更容易保留常見且不可分割的組合,而 BPE 可能因高頻噪聲合併錯誤。
Unigram 模型與 Viterbi 分割
Unigram 假設每個 token 獨立出現:
P(x) = ∏_{i=1}^n p(x_i)
給定一個文本序列,用 Viterbi 演算法尋找使 P 最大的分割方案。訓練時,通過 EM 演算法交替更新每個子詞的機率,並逐漸刪去機率低於閾值的子詞,直至詞彙量 V。訓練完成後,可使用子詞正則化:在 Viterbi 生成的多個合理分割中按機率取樣,增加模型對分詞變異性的魯棒性。
Byte‑level BPE 示例
輸入“你好”的 UTF‑8 編碼為 \xe4\xbd\xa0\xe5\xa5\xbd(6 個位元組)。初始位元組 token 對應 256 個 ID。經過 BPE 合併,可能形成 “\xe4\xbd” 和 “\xe5\xa5” 等複合字節 token。最終詞表包含這些位元組組合。無論什麼語言、表情符號、程式碼,都能表示為 token 序列。
關鍵引數
vocab_size:目標詞彙量,影響嵌入矩陣體積和子詞粒度。character_coverage:在 Unigram 種子中,覆蓋多少比例的字元種類,影響稀有字元的處理。max_sentencepiece_length:SentencePiece 限制的 token 長度,防止過長的位元組序列合併。byte_fallback:是否啟用位元組級回退,若啟用則不會產生<UNK>。
(注:具體數值因模型而異,未列明硬規格,以上為機制定性描述。)
技術演進史
- 基於詞的分詞(2013 以前):使用預先定義的詞典,將文本按空格和切詞規則分成詞。致命缺陷:詞表巨大,OOV 嚴重。
- 字元級分詞:每個字元為一個 token。詞彙量小但序列極長,模型難以捕獲長距離語義,訓練慢。
- BPE 引入機器翻譯(Sennrich et al., 2016):將 BPE 從資料壓縮遷移到 NLP,有效緩解了稀有詞翻譯問題,拉開子詞時代序幕。
- WordPiece 被 BERT 採納(Devlin et al., 2019):沿襲語音搜尋中的 WordPiece,BERT 的 30,522 詞彙量成為事實標準之一,推動預訓練分詞器普及。
- Unigram 與 SentencePiece(Kudo, 2018; Kudo & Richardson, 2018):提出語言完全無關的一體化方案,支援子詞正則化,被 T5、ALBERT、LLaMA 等眾多後續模型所使用。
- 位元組級 BPE(Radford et al., 2019):GPT‑2 直接將位元組作為最小單位,消除了
<UNK>,使模型能夠處理任意 Unicode 文本,成為後續 GPT‑3、GPT‑4 分詞器的基礎。 - 現代化的專用實現:HuggingFace
tokenizers(Rust, 2020)提供超高速無狀態分詞,OpenAItiktoken為 GPT‑3.5/4 提供確定性且高效的分詞,並與 API 計費體系緊耦合。 - Token‑free 範式的探索:ByT5、CANINE 等嘗試直接以位元組或畫素為輸入,但尚未動搖子詞分詞器的主導地位。
技術路線對比
| 方案 | 代表模型 | 底層演算法 | 最小單元 | 詞彙量典型範圍(1) | 是否可逆(2) | 多語言友好 | 去詞 (detokenization) |
|---|---|---|---|---|---|---|---|
| BPE | GPT‑2, RoBERTa | 頻率合併的 BPE | 字元/位元組 | 50k‑60k | 需空格處理 | 一般(未統一) | 需還原空格 |
| WordPiece | BERT | 似然合併的 BPE | 字元 | 約30k | 需處理 ## 字首 | 一般 | 拼接後去字首 |
| Unigram (SentencePiece) | T5, XLNet | 機率語言模型剪枝 | 字元/位元組 | 32k‑64k | 是(可重建) | 好(語言無關) | 直接拼接 |
| Byte‑level BPE (SentencePiece) | LLaMA 2, GPT‑4(3) | BPE 在位元組流上 | 位元組 | 32k‑100k(4) | 是(位元組級恢復) | 極好(無OOV) | 位元組拼回 UTF‑8 |
| 無分詞(token‑free) | ByT5 | 直接處理位元組序列 | 位元組 | 256 | 是 | 完美 | 位元組還原 |
注:(1) 根據相關論文常見配置及社群實踐估算; (2) 指是否可以從 token 序列無損恢復原始文本位元組;(3) GPT‑4 分詞器未完全開源,但基於位元組級 BPE,詞彙量超過 100k [據 OpenAI 技術報告/API 文件];(4) 具體以模型釋出版本為準。
上下游
上游:語料與工具
- 訓練語料:分詞器需先在目標領域的大規模無標註文本上進行訓練,語料規模通常與後續預訓練語料相同或更大範圍。語料質量直接影響子詞合併的合理性和稀有詞的覆蓋度。
- 開發工具庫:
HuggingFace tokenizers:Rust 實現,支援 BPE、WordPiece、Unigram,提供快速訓練和批次編碼。SentencePiece(Google):內建 BPE 和 Unigram,C++ 核心,命令列和 Python 介面。tiktoken(OpenAI):為 GPT 系列定製的 Python 庫,僅用於推斷,不支援訓練新分詞器。YouTokenToMe等第三方庫:追求更快的 BPE 訓練。
- 訓練過程:需要統計全語料的符號對頻率或採用線上增量訓練。BPE 訓練 I/O 密集,SentencePiece 可即時訓練。
下游:模型與推論
- 預訓練/微調:分詞器與模型權重繫結,任何模型權重分發必須包含對應的分詞器配置(
tokenizer.json或sp.model)。 - 推論服務:使用者 Query 先經 tokenizer 編碼為 IDs,模型推論生成 token IDs,再由 tokenizer 解碼為可讀文本。
- Token 計數與計費:OpenAI、Anthropic 等 API 按 token 總量計費,需用官方提供的分詞器準確計數,一套 prompt+completion 消耗的 token 數直接影響成本。
- 上下文視窗截斷:當輸入 token 數超過模型最大上下文長度時,需按分詞器決定如何截斷(保留最近或最重要的部分)。
關鍵指標
- 詞彙量大小 (V):通常在 3 萬~10 萬。V 越大,每個 token 承載的語義更豐富,但嵌入矩陣引數量
V*d更重。 - 未知詞率(OOV rate):現代位元組級分詞器可做到 0%,不再出現
<UNK>。 - 平均 token 長度(壓縮率):以平均每個單詞被拆成多少個 token 來度量。英文 BPE 詞彙量 50k 時,典型值約為 1.3
1.5 個 token/詞。中文每個漢字可能 12 個 token。壓縮率影響同等文本所需的 token 數,進而影響推論成本和延遲。 - 分詞速度:通常用 token/sec 衡量,Rust 實現的 tokenizer 可達 GB/s 級別,對即時服務影響很小。
- 跨平台一致性:同一模型的 tokenizer 在不同執行環境(Python、Rust、行動端)的解碼結果必須完全一致,否則會導致輸出錯亂。
- 嵌入引數量:
V * d_model,當 V 較大時,這部分引數佔模型總引數的比例在不同規模模型中差異很大:對於BERT-base等中小模型,嵌入引數可能佔20%左右;而對於GPT-3等超大型模型,佔比可低至0.1%以下,直接增加 GPU 視訊記憶體開銷。
供需與市場資料
分詞器本身是軟體庫,不形成獨立市場交易,但其演進受大型模型生態的強烈需求驅動:
- 需求端:所有部署大型模型的企業都需要配套分詞器。高效的多語言分詞器成為模型出海和覆蓋多語種的關鍵,能直接提升非英語使用者的體驗。雲端服務商按 token 計費的模式使得分詞效率(同樣語義消耗更少 token)可轉化為成本優勢。
- 供給端:開源生態高度成熟,HuggingFace tokenizers 庫已被數千個模型採用,月下載量極高。Google 的 SentencePiece 也是 Linux 發行版及眾多深度學習架構的預設組成部分。OpenAI tiktoken 雖然只服務於自家模型,但其設計思路影響了後續閉源模型的分詞器選型。
- 競爭動態:位元組級 BPE + 大規模詞彙量(100k 級)已成為領先模型的標配,新進入者若採用過小詞表或缺乏位元組回退,會在多語言評測中顯著落後。因此,分詞器的選擇和定製逐漸成為大型模型技術棧中不容忽視的一環。
代表公司與資本對映
- OpenAI:開發
tiktoken,內置於 GPT‑3.5、GPT‑4 體系。雖然庫本身開源,但分詞器配置繫結其閉源模型,構築了與 API 計費體系緊密耦合的護城河。 - Meta:LLaMA 系列使用基於 SentencePiece 的 BPE 分詞器,並在開源模型中與權重一併釋出,影響了大量衍生模型的標準。
- Google:研發並開源 SentencePiece,被 T5、PaLM、Gemini 等內部模型及大量外部模型採用,奠定了語言無關子詞分詞的事實標準。
- HuggingFace:通過維護
tokenizers(Rust)與transformers深度整合,成為開源模型分發的預設樞紐。其生態控制力部分體現在幾乎所有社群模型都使用 HF tokenizer 格式。 - 其他大型模型廠商(Anthropic、百度、阿里等):通常基於 BPE 或 Unigram 自研分詞器,與自身訓練資料對齊,建置差異化語言覆蓋能力。
資本對映層面,分詞器並非獨立投資標的,而是評估一家 AI 公司技術自洽性和工程能力的視窗。擁有自研高效分詞器併成功封裝為模型服務能力的企業,在成本控制和多語言拓展上具備潛在優勢。
投資邏輯
- token 經濟模型:API 按 token 計費,分詞器的壓縮率直接影響每一條請求的收費 token 數。若某家廠商的分詞器能使同等語義消耗更少 token,則其 API 定價在同等效果下更具競爭力,或能獲取更高獲利。
- 多語言能力與市場擴張:一個優秀的字元層級或位元組級分詞器能平滑支援上百種語言,無需為每種語言獨立調優。此類技術積累可加速全球化產品落地,影響遊戲、社交、跨境電商等出海賽道。
- 模型分發標準:HuggingFace 生態的分詞器格式已成為事實標準,其背後的商業化路徑(如 Inference Endpoints、AutoTrain)可繫結使用者。投資於平台型工具鏈(雖不一定直接上市)可關注相關開源公司的商業化進展。
- 風險與替代:token‑free 架構或新型分詞範式若在保持效能的同時大幅簡化流水線,可能削弱現有分詞器壁壘。但短期內,子詞分詞器仍為主流,相關投入具備確定性的技術紅利。
常見誤讀糾偏
- “分詞器只是簡單切詞,模型好壞主要看 Transformer 架構” 實際上,分詞器定義了模型最基本的輸入單元,大量下游問題(如程式碼補全、多語言拼寫、數字運算)若在 tokenization 層面被不合理拆分,會導致模型難以學習。錯誤的詞彙表可能直接使模型對某些任務“致盲”。
- “詞表越大越好” 詞表增大會增加嵌入矩陣的引數量和訓練開銷。過大的詞表使每個 token 出現頻率更低,其 token embedding 訓練不充分,反而損害泛化。極端情況下,冗餘 token 浪費視訊記憶體且降低批處理效率。因此必須基於語料統計在粒度與稀疏性之間折中。
- “Unigram 分詞器每次結果固定” 當應用子詞正則化時,Unigram 會從機率分佈中取樣分割方案,相同的輸入可得到不同的 token 序列。這實際上是訓練時的一種資料增強,而非缺陷,但推論時需固定為最佳分割(關閉取樣)。
- “detokenization 完全可逆” 許多分詞器在規範化階段會丟失資訊(如去掉特殊空白字元),導致去分詞後無法保留原始格式。只有嚴格基於位元組級且規範化可逆的方案才能恢復原始位元組流。
學習路徑
- 快速上手:使用 HuggingFace
tokenizers庫,載入bert-base-uncased或gpt2分詞器,觀察編碼輸出、token 到 ID 的對映、attention mask 生成。 - 訓練自定義分詞器:選擇一箇中文或混合語言語料,訓練 BPE tokenizer,調整
vocab_size和min_frequency引數,對比不同詞彙量下編碼長度與罕見字覆蓋率。 - 理解核心論文:
- Sennrich et al. (2016) “Neural Machine Translation of Rare Words with Subword Units” – BPE 在 NLP 的創始論文。
- Kudo (2018) “Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates” – Unigram 及正則化。
- Kudo & Richardson (2018) “SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing” – 架構設計。
- 深入程式碼:閱讀
tokenizers的 Rust 原始碼中 BPE 的Trainer和Model部分,理解優先順序佇列、checkpointing 及並行化實現。 - 排查工程問題:在推論服務中解決 tokenizer 與模型不匹配、版本不一致導致的輸出亂碼;使用
tiktoken準確估算 token 數以最佳化 prompt 設計。
一句話總結
分詞器是大型模型的“文字感知器”,它以無懈可擊的位元組回退和精妙的子詞平衡,將人類語言的流變符號轉化為數學模型可以計算的固定顆粒度訊號,其設計水準直接封印著模型的多語言智慧與成本邊界。
延伸閱讀與來源
- Sennrich, R., Haddow, B., & Birch, A. (2016). Neural Machine Translation of Rare Words with Subword Units. ACL.
- Schuster, M., & Nakajima, K. (2012). Japanese and Korean voice search. ICASSP. (WordPiece 起源)
- Kudo, T. (2018). Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates. EMNLP.
- Kudo, T., & Richardson, J. (2018). SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing. EMNLP.
- Radford, A., et al. (2019). Language Models are Unsupervised Multitask Learners. OpenAI Blog.
- HuggingFace Tokenizers: https://github.com/huggingface/tokenizers
- OpenAI tiktoken: https://github.com/openai/tiktoken