编程基础篇 · AI 背后的数据结构

词表与 Trie:Tokenizer 的切词秘密

大模型原理篇见过分词,这次看底层:一棵前缀树怎么把「五花肉」整块认出来。亲手沿着 Trie 走一次分词

本页解决的问题

先给结论

「词表与 Trie:Tokenizer 的切词秘密」要解决的关键问题是什么?

大模型原理篇见过分词,这次看底层:一棵前缀树怎么把「五花肉」整块认出来。亲手沿着 Trie 走一次分词

判断标准

让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。

下一步

写下一个问题:试完这个方法后,你能用什么证据回答它?

常见误区

结论听起来很完整,却没有检查最关键的假设。

先看收纳 · 词表怎么挂成一棵树

假设词表里有这些词:五月五花肉今天天气。按第一个字、第二个字……一层层挂起来,共享开头的词就共享树枝——「五月」和「五花肉」挤同一根「五」枝。带绿色 ✓ 的节点表示「走到这里是一个完整的词」;注意「五→花」那个节点没有 ✓:它只是路过的中转站(「五花」不是词)。

选一句话:
点「开始分词」,光标会逐字沿着树往下走。留意两件事:走到 ✓ 时它不急着切(贪心,先试试能不能更长);走不通时它回退到最近的 ✓ 才切刀
分词结果:
全程约 15 秒,每一步有旁白
这套走法叫「贪婪最长匹配」:能走多深走多深,走不通就回退到最近的词尾切刀。为什么要贪?因为「五花肉」整块切,比「五 / 花 / 肉」三块更省 token、也更保住语义。而 Trie 的妙处在于:每一步只看「当前节点有没有这个字的树枝」,不用回头把词表翻一遍——几万个词的词表,判断一步只要一次查找。这又是「收纳得好,找起来快」。
揭底 · 真实大模型用的是 BPE,思想同源

🧩 BPE:把「最常一起出现的字符对」反复合并成块

真实的 Tokenizer(GPT、DeepSeek 都在用的 BPE)建词表的方式更野:先把所有文字拆成最小碎片,然后数一数哪两个碎片最常挨在一起,把它们粘成一块收进词表;再数、再粘,重复几万次。常见组合就这样一层层「长」成了大块词元——和 Trie「常见的词整块收纳」是同一个思想。

五花肉 → 高频,各自一整块
「饕餮」 饕(碎块1) 饕(碎块2) 餮(碎块1) 餮(碎块2) → 生僻,被拆成字节碎块

所以你见过的现象都有了解释:「的」「,」永远只占一个 token;生僻字反而被拆成好几块。这也是中文普遍比英文费 token 的原因——大多数词表以英文语料为主训练,英文常见词都攒出了整块词元,中文攒得少,只好多切几刀。同一句话,中文版账单往往更贵,根子就在词表这本「字典」收纳了谁。

「先看收纳 · 词表怎么挂成一棵树」如何改变一次回答

「假设词表里有这些词: 五 、 五月 、 五花肉 、 今天 、 天 、 天气 、 吃 、 花 、 好 。按第一个字、第二个字……一层层挂起来,共享开头的词就共享树枝——「五月」和「五花肉」挤同一根「五」枝。」说明,模型处理的不是我们眼中的“字数”,而是一段段 Token。Token 的切分方式会影响输入长度、上下文能放下多少内容,以及一次请求要花多少计算。

长度、信息量和上下文不是一回事

当「真实的 Tokenizer(GPT、DeepSeek 都在用的 BPE )建词表的方式更野:先把所有文字拆成最小碎片,然后数一数 哪两个碎片最常挨在一起 ,把它们粘成一块收进词表;再数、再粘,重复几万次。常见组合就这样一层层「长」成了大块词元——和 Trie「常见的词整块收纳」是同一个思想」变长时,先要分清三件事:文字被切成多少 Token、哪些内容真正参与当前判断、以及旧内容是否已经超出上下文窗口。删掉重复说明通常比单纯把窗口开得更大更有效。

  • 词表是一本字典 :收纳所有词元;分词就是「查着字典把句子切成块」
  • Trie 按共享开头收纳 :让「最长匹配」一步一查、不用回头路
  • 贪婪最长匹配 :能走多深走多深,走不通回退到最近的词尾切刀

先保留会改变判断的内容

可以用「所以你见过的现象都有了解释:「的」「,」永远只占一个 token;生僻字反而被拆成好几块。这也是 中文普遍比英文费 token 的原因——大多数词表以英文语料为主训练,英文常见词都攒出了整块词元,中文攒得少,只好多切几刀。同一句话,中文版账单往往更贵,根子就在词表这本「字典」收纳了谁」做一次对照:保留同样的问题,分别删掉重复背景、压缩格式和移除无关历史,比较答案质量、延迟与 Token 数量。

从「先看收纳 · 词表怎么挂成一棵树」走到「揭底 · 真实大模型用的是 BPE,思想同源」

「先看收纳 · 词表怎么挂成一棵树」先把问题落在「假设词表里有这些词: 五 、 五月 、 五花肉 、 今天 、 天 、 天气 、 吃 、 花 、 好 。按第一个字、第二个字……一层层挂起来,共享开头的词就共享树枝——「五月」和「五花肉」挤同一根「五」枝。 带绿色 ✓ 的节点表示「走到这里是一个完整的词」 ;注意「五→花」那个节点没有 ✓:它只是路过的中转站(「五花」不是词)」上;到了「揭底 · 真实大模型用的是 BPE,思想同源」,讨论继续推进到「真实的 Tokenizer(GPT、DeepSeek 都在用的 BPE )建词表的方式更野:先把所有文字拆成最小碎片,然后数一数 哪两个碎片最常挨在一起 ,把它们粘成一块收进词表;再数、再粘,重复几万次。常见组合就这样一层层「长」成了大块词元——和 Trie「常见的词整块收纳」是同一个思想」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

处理长文本时,先保留会改变结论的内容,再决定如何压缩格式和历史;上下文更长只有在新增信息真正有用时才值得付出代价。

  • 「先看收纳 · 词表怎么挂成一棵树」:假设词表里有这些词: 五 、 五月 、 五花肉 、 今天 、 天 、 天气 、 吃 、 花 、 好 。按第一个字、第二个字……一层层挂起来,共享开头的词就共享树枝——「五月」和「五花肉」挤同一根「五」枝。 带绿色 ✓ 的节点表示「走到这里是一个完整的词」 ;注意「五→花」那个节点没有 ✓:它只是路过的中转站(「五花」不是词)
  • 「揭底 · 真实大模型用的是 BPE,思想同源」:真实的 Tokenizer(GPT、DeepSeek 都在用的 BPE )建词表的方式更野:先把所有文字拆成最小碎片,然后数一数 哪两个碎片最常挨在一起 ,把它们粘成一块收进词表;再数、再粘,重复几万次。常见组合就这样一层层「长」成了大块词元——和 Trie「常见的词整块收纳」是同一个思想
  • 「最后的要点」:中文费 token 的根子 :词表偏英文,中文整块词元少,只好多切几刀

最后的「最后的要点」把讨论落到「中文费 token 的根子 :词表偏英文,中文整块词元少,只好多切几刀」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

✅ 这一课想和你分享的

  • 词表是一本字典:收纳所有词元;分词就是「查着字典把句子切成块」
  • Trie 按共享开头收纳:让「最长匹配」一步一查、不用回头路
  • 贪婪最长匹配:能走多深走多深,走不通回退到最近的词尾切刀
  • BPE 思想同源:最常一起出现的组合反复合并成整块——常见的省,生僻的碎
  • 中文费 token 的根子:词表偏英文,中文整块词元少,只好多切几刀
标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 词表与 Trie:Tokenizer 的切词秘密 AI 背后的数据结构
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助