程式設計基礎篇 · 大模型肚子裡的資料結構
詞表與 Trie:Tokenizer 的切詞秘密
還記得大模型原理篇那個細節嗎——分詞器把「五花肉」切成一整塊詞元,而不是三個字。當時我們說「常見組合當一個整體」,這次揭底層:分詞器是怎麼在幾萬個詞裡面,瞬間認出「五花肉」該整塊拿走的?答案是一種叫 Trie(前綴樹)的收納方式——把詞表按「共享開頭」掛成一棵樹。
先看收納 · 詞表怎麼掛成一棵樹
假設詞表裡有這些詞:五、五月、五花肉、今天、天、天氣、吃、花、好。按第一個字、第二個字……一層層掛起來,共享開頭的詞就共享樹枝——「五月」和「五花肉」擠同一根「五」枝。帶綠色 ✓ 的節點表示「走到這裡是一個完整的詞」;注意「五→花」那個節點沒有 ✓:它只是路過的中轉站(「五花」不是詞)。
選一句話:
點「開始分詞」,游標會逐字沿著樹往下走。留意兩件事:走到 ✓ 時它不急著切(貪心,先試試能不能更長);走不通時它回退到最近的 ✓ 才切刀。
分詞結果:
全程約 15 秒,每一步有旁白
這套走法叫「貪婪最長匹配」:能走多深走多深,走不通就回退到最近的詞尾切刀。為什麼要貪?因為「五花肉」整塊切下來,比「五 / 花 / 肉」三塊更省 token、也更保住語義。而 Trie 的妙處在於:每一步只看「現在這個節點有沒有這個字的樹枝」,不用回頭把詞表翻一遍——幾萬個詞的詞表,判斷一步只要一次查詢。這又是「收納得好,找起來快」。
揭底 · 真實大模型用的是 BPE,思想同源
🧩 BPE:把「最常一起出現的字元對」反覆合併成塊
真實的 Tokenizer(GPT、DeepSeek 都在用的 BPE)建詞表的方式更野:先把所有文字拆成最小碎片,然後數一數哪兩個碎片最常挨在一起,把它們粘成一塊收進詞表;再數、再粘,重複幾萬次。常見組合就這樣一層層「長」成了大塊詞元——和 Trie「常見的詞整塊收納」是同一個思想。
的
,
五花肉
→ 高頻,各自一整塊
「饕餮」
→
饕(碎塊1)
饕(碎塊2)
餮(碎塊1)
餮(碎塊2)
→ 生僻,被拆成位元組碎塊
所以你見過的現象都有了解釋:「的」「,」永遠只佔一個 token;生僻字反而被拆成好幾塊。這也是中文普遍比英文費 token 的原因——大多數詞表以英文語料為主訓練,英文常見詞都攢出了整塊詞元,中文攢得少,只好多切幾刀。同一句話,中文版帳單往往更貴,根子就在詞表這本「字典」收納了誰。
✅ 這一課想和你分享的
- 詞表是一本字典:收納所有詞元;分詞就是「查著字典把句子切成塊」
- Trie 按共享開頭收納:讓「最長匹配」一步一查、不用回頭路
- 貪婪最長匹配:能走多深走多深,走不通回退到最近的詞尾切刀
- BPE 思想同源:最常一起出現的組合反覆合併成整塊——常見的省,生僻的碎
- 中文費 token 的根子:詞表偏英文,中文整塊詞元少,只好多切幾刀