在模型處理文字之前,將原始文字轉換為 tokens 的演算法。分詞器維護一個固定的詞元類型詞彙表,並將任何輸入文字拆分為這些詞元的序列。不同的模型使用不同的分詞器 — 同一個句子在 Claude、GPT 和 Llama 中的分詞結果不同,這會影響上下文使用量和成本。
大多數現代分詞器使用位元組對編碼(Byte Pair Encoding,BPE)或其變體 SentencePiece。BPE 從單個位元組或字元開始,反覆合併最頻繁的相鄰字元對為新的詞元。經過數千次合併後,像 "the" 這樣的常見單字會成為單個詞元,而罕見的單字則會被拆分為子詞片段。
分詞器的詞彙表大小是一個真正的工程權衡。較大的詞彙表(100K+ 詞元)能更有效地壓縮文字 — 常見的單字和短語會有專屬的詞元,因此消耗的上下文更少。但較大的詞彙表也意味著模型輸入和輸出層的嵌入表更大。
分詞器是在語料庫上訓練的,而該語料庫的語言分布決定了效率。英文文字通常以大約每個單字 1 個詞元的速率進行分詞。但像中文、日文、韓文、阿拉伯文和印地文這樣的語言,表達相同意思可能需要 2–4 倍的詞元。
分詞中的怪異現象解釋了人們覺得困惑的幾種 LLM 行為。模型難以處理字元層級的任務(例如數「strawberry」裡有幾個字母),因為它們看到的是詞元而非字元。它們處理某些變數名稱比其他的好,因為常見名稱是單一詞元,而不常見的則會被拆分。