01 / 直觉
像压缩字典,又像乐高
如果直接给每个汉字一个编号,词表太大,生僻组合也学不好。
现代分词(常见是 BPE 一族)的做法是:
- 先按字符起步,再把高频子串合并成更大的块。
- 常见英文词常是 1 个 token(如
hello);生僻长词会被拆开(如 tokenization 可能拆成 2–3 块)。
- 中文:常用字/词往往是 1 个 token;生僻字有时要 2 个。
- 空格、换行、emoji、代码缩进,也都会被切进去。
程序员类比:
这有点像「把长字符串用字典里的短码表示」——只不过码表是训出来的,
目标是:既覆盖常见模式,又不把词表撑到爆炸。
02 / 动手
点一个样本,看它被切成几块
下面是教学示意的分词器(启发式规则,不是某家厂商的真实词表)。
颜色块 = 一个 token。可改输入,或点预设。
怎么看色块?
块越碎,说明这段文本对词表来说「不够常见」。
生僻人名、URL、代码标识符,往往碎成一串。
03 / 设计动机
为什么不直接按「字」或「词」?
按字
词表小,但每个词都要拼,序列变长。
英文 unbelievable 若按字母会占 12 个位置,注意力要算更久。
按词
序列短,但词表爆炸,新词/OOV 处理麻烦。
昨天的新梗、新 API 名,词表里没有就卡住。
子词 BPE(主流)
高频整词,低频拆开。词表可控,新词也能拼。
GPT-4o-mini-2024 这类标识符也能表达。
和你写代码的关系:
上下文窗口按 token 计,不按字符计。
同样 8k 窗口,塞英文文档比塞同信息量的中文更「省」——这就是为什么中文场景 token 消耗更快。
04 / 预算
上下文窗口还剩多少?
把序列长度、输出预留、对话历史拖一拖,看 128K 窗口下还能塞多少文档。
05 / 小结
四句话带走
- 模型读的是 token 编号,不是你看到的字。分词在进模型之前就发生了。
- BPE:常见整块,生僻拆开。兼顾词表大小和表达力。
- 中文常常更费 token,同样内容可能比英文占更多窗口。
- 上下文预算要留出输出——只算「塞进去多少」会翻车。