程式設計基礎篇 · 大模型肚子裡的資料結構

詞表與 Trie:Tokenizer 的切詞秘密

還記得大模型原理篇那個細節嗎——分詞器把「五花肉」切成一整塊詞元,而不是三個字。當時我們說「常見組合當一個整體」,這次揭底層:分詞器是怎麼在幾萬個詞裡面,瞬間認出「五花肉」該整塊拿走的?答案是一種叫 Trie(前綴樹)的收納方式——把詞表按「共享開頭」掛成一棵樹。

先看收納 · 詞表怎麼掛成一棵樹

假設詞表裡有這些詞:五月五花肉今天天氣。按第一個字、第二個字……一層層掛起來,共享開頭的詞就共享樹枝——「五月」和「五花肉」擠同一根「五」枝。帶綠色 ✓ 的節點表示「走到這裡是一個完整的詞」;注意「五→花」那個節點沒有 ✓:它只是路過的中轉站(「五花」不是詞)。

選一句話:
點「開始分詞」,游標會逐字沿著樹往下走。留意兩件事:走到 ✓ 時它不急著切(貪心,先試試能不能更長);走不通時它回退到最近的 ✓ 才切刀
分詞結果:
全程約 15 秒,每一步有旁白
這套走法叫「貪婪最長匹配」:能走多深走多深,走不通就回退到最近的詞尾切刀。為什麼要貪?因為「五花肉」整塊切下來,比「五 / 花 / 肉」三塊更省 token、也更保住語義。而 Trie 的妙處在於:每一步只看「現在這個節點有沒有這個字的樹枝」,不用回頭把詞表翻一遍——幾萬個詞的詞表,判斷一步只要一次查詢。這又是「收納得好,找起來快」。
揭底 · 真實大模型用的是 BPE,思想同源

🧩 BPE:把「最常一起出現的字元對」反覆合併成塊

真實的 Tokenizer(GPT、DeepSeek 都在用的 BPE)建詞表的方式更野:先把所有文字拆成最小碎片,然後數一數哪兩個碎片最常挨在一起,把它們粘成一塊收進詞表;再數、再粘,重複幾萬次。常見組合就這樣一層層「長」成了大塊詞元——和 Trie「常見的詞整塊收納」是同一個思想。

五花肉 → 高頻,各自一整塊
「饕餮」 饕(碎塊1) 饕(碎塊2) 餮(碎塊1) 餮(碎塊2) → 生僻,被拆成位元組碎塊

所以你見過的現象都有了解釋:「的」「,」永遠只佔一個 token;生僻字反而被拆成好幾塊。這也是中文普遍比英文費 token 的原因——大多數詞表以英文語料為主訓練,英文常見詞都攢出了整塊詞元,中文攢得少,只好多切幾刀。同一句話,中文版帳單往往更貴,根子就在詞表這本「字典」收納了誰。

✅ 這一課想和你分享的