建構分詞器詞彙表最常用的演算法。BPE 從單個位元組或字元開始,反覆合併最頻繁的相鄰對成為新的 token。經過數千次合併後,常見的單詞會變成單一 token(如「the」、「function」),而罕見的單詞會被分割成子詞片段(如「un」+「common」)。GPT、Claude、Llama 及大多數現代 LLM 都使用 BPE。
BPE 正是你的分詞器以特定方式運作的原因。它解釋了為什麼常見單詞很「便宜」(一個 token)、為什麼罕見單詞很「昂貴」(多個 token),以及為什麼非英語文本成本更高(分配給非英語字元對的合併較少)。理解 BPE 有助於你預測 token 數量、最佳化提示詞,以及理解為什麼不同的分詞器對相同文本會產生不同的結果。
演算法步驟:(1) 從一組單個位元組(256 個項目)或字元的基礎詞彙表開始,(2) 掃描訓練語料庫並計算每個相鄰的 token 對的出現次數,(3) 將最頻繁的一對合併為新的 token 並加入詞彙表,(4) 重複步驟 2–3,直到詞彙表達到目標大小(通常為 32K–128K)。合併順序定義了優先級:「th」可能是第 50 次合併,而「ing」是第 200 次合併,這意味著「th」在此分詞器中是更基本的單位。
SentencePiece(Google)是一個流行的 BPE 實作,它將輸入視為原始位元組而非預先分詞的單詞。這意味著它可以處理任何語言,無需語言特定的預處理 — 無需中文分詞或土耳其語的語態分析。大多數現代 LLM 使用 SentencePiece 或類似的位元組級 BPE 變體。替代方案 WordPiece(BERT 使用)類似,但使用略有不同的合併準則。
BPE 的合併反映了訓練語料庫的統計特性。在英語程式碼上訓練的分詞器會對「function」、「return」和「const」獲得高效的合併,但會將印地語或阿拉伯語文本分割成碎片。這就是為什麼多語言分詞器需要平衡的訓練語料庫 — 合併表必須為每種語言的常見模式分配足夠的合併次數。Llama 3 的分詞器明確地在更平衡的多語言資料上進行訓練,相比 Llama 2 將非英語 token 效率提升了 2–3 倍。