← 算法与AI总览 首页 / 算法与AI / AI 基础入门 / 第11课 · 分词器
AI 基础入门 · 第11课

分词器:BPE 原理、词表与 token——模型看世界的最小单位

大模型不是"认字"的,它根本不懂汉字和英文字母。你输入一句"今天天气真好",模型看到的其实是一串数字编号——这中间的翻译官就是分词器(Tokenizer)。这一课讲透三件事:BPE 怎么把文字切成 token、token 数怎么决定你的账单和上下文窗口、为什么中文一个字常常被切成两三个 token。学完你再看 API 报价里的"每千 token 多少钱",就再也不会懵了。

① 小白第一课怎么学(4 步走,约 50 分钟)

分词器是大模型流水线的第一道工序,理解它,后面学上下文窗口、采样、计费都会顺。

1建立直觉(10 分钟)
读②③:模型只认数字,token 就是"字→数字"的翻译。
2搞懂 BPE(15 分钟)
读④:高频组合拼成大词块,低频拆成小碎块。
3会算 token 账(15 分钟)
读⑤⑨:中文 1 字≈1~2 token,英文 1 词≈1~1.3 token。
4刷题自测(10 分钟)
做⑦⑩,错题回⑥看易错点。
本课小目标学完你要能:① 说清 BPE 是怎么从字母/字节一路合并出词表的;② 估算一段中文/英文大概多少 token;③ 解释为什么中文比英文"费 token";④ 说出上下文窗口和计费都按 token 算。

② 一图看懂:一句话是怎么变成 token 编号的

原始文本 "playing dogs" BPE 分词器切分 play + ing + Ġ + dog + s (5 个 token 片段) 查词表 每个片段对应 一个整数编号 模型看到的 [2493, 421] [434, 567, 8] 中文例子:"今天天气真好"(GPT 类 BPE 词表) 今天天气真好 今天 + 天气 + 真 + 好 4 个 token(常见词拼成大块) [3456, 2341] [789, 123] ⚠ 但生僻字/繁体字常被拆成 2~3 个字节 token,例如"龘"可能变成 3 个 token。 ✓ 英文常见词如"playing"可能是 1 个 token,但"unbelievable"这种长词常被切成 un+believ+able 3 段。 规律:越常见的序列,BPE 越倾向拼成一个大块;越罕见,切得越碎。
读法:左边人看的是文字,右边模型看的是一串数字编号。中间的分词器就是翻译官——它先把文本切成 token 片段,再去一张固定的"词表"里查每个片段对应的编号。模型从头到尾只跟数字打交道,它根本不知道"今天"这两个字长什么样。

③ 本质直觉:分词器就是"拼音表 + 字典"

一句话定义:分词器(Tokenizer)是把原始文本切成 token 片段、再映射成整数编号的工具。模型本身只能处理数字,所以在文字"进模型"之前,必须先过这道翻译。

类比一:拼音表。小学生不认识汉字没关系,先学拼音——每个字都能拼成几个拼音字母。分词器干的事类似:它把任意文字切成它"认识"的最小片段,每个片段在词表里有个固定编号。

类比二:字典查字。词表(Vocabulary)就是一本固定的字典,里面收录了几万个常用"字块"。文本来了,分词器从字典里挑出最合理的切法,把每个字块替换成字典里的编号。

关键:token 不是字,也不是词。它是"半个词""一个常见词""一个偏旁""一个标点"都有可能。英文里 unbelievable 可能被切成 un+believ+able;中文里 今天 可能是一个 token,而 龘 可能被拆成好几个。

为什么不干脆一个字一个 token?因为如果一个字一个 token,词表就要装几十万个常用字,而且模型学不到"组合规律"。BPE 的聪明之处在于:高频组合拼成大块,低频拆成小块,用有限的词表覆盖无限的文本。

人:读的是"文字" 分词器:切成 token 片段 查词表 → 换成数字编号 模型:只认一串数字 [12, 456, 7890, ...] 输出时再反向:数字 → token → 文字
双向翻译分词器是双向的:输入时把文字编码成 token id(encode),生成时把模型吐出来的 token id 再解码回文字(decode)。同一个模型的编码和解码必须用同一套词表,否则就"鸡同鸭讲"。

④ 完整体系:BPE 原理、词表大小与主流分词器

BPE 是怎么训练出来的(4 步)

步骤做什么举例
1. 起点先把所有文本拆成最小单位(字节或字母)"low" → l o w
2. 统计数哪两个相邻片段共现次数最多"l"+"o" 出现了 1000 次
3. 合并把这对合并成一个新 token,加入词表"lo" 成为新 token
4. 重复反复统计合并,直到词表达到目标大小lo→low→lower→...直到 32k/128k
BPE 核心思想高频相邻片段合并成大 token,低频保留小片段 → 用有限词表覆盖无限文本

主流词表大小对比

模型分词算法词表大小特点
GPT-2 / GPT-3BPE(字节级)50,257字节级兜底,任何文字都能切
Llama 2 / 3BPE32,000 / 128,256Llama 3 扩到 128k,中文更省
Qwen 通义千问BPE151,643中文友好,常用汉字直接成词
DeepSeekBPE102,400中英混合优化
T5 / ALBERTSentencePiece(unigram)32,000不依赖空格,直接在原始文本上训练

BPE vs SentencePiece 一句话区别

方案怎么做优点缺点
BPE先按空格预分词,再合并子词英文效果好,实现简单对中文(无空格)不友好,要预处理
SentencePiece直接在原始字符串上训练,不依赖空格中文、日文等无空格语言友好略复杂,需自己处理空格
Unigram先建大词表,再逐步删除贡献小的可做多候选切分概率训练稍慢
词表大小不是越大越好词表越大,常用词越省 token,但 embedding 层参数也越多(词表×隐藏维度),显存占用上升。32k~128k 是当前主流折中。

⑤ 用法场景与典型例题:token 数怎么算、怎么花

场景 1:API 计费怎么算
OpenAI / 豆包 API 都按 token 收费,不是按字数。
你发一段提示词 + 模型回一段答案,两边都算 token。提示词 1000 token、回答 500 token,这次调用就消耗 1500 token。输入和输出单价还不一样,通常输出更贵。
场景 2:上下文窗口怎么算
第8课讲的"上下文窗口 128k",单位就是 token。
窗口大小 = 你能塞进去的 token 总数(提示词 + 历史对话 + 生成内容)。塞不下就要截断或总结。所以写中文长文前先估 token,不然说着说着就"忘了"前面。
场景 3:粗估 token 数
不用跑分词器,心里有个谱就行。
经验值:英文 1 token ≈ 0.75 个单词(约 4 个字母);中文 1 个汉字 ≈ 1~2 token(常见字 1 个,生僻字 2~3 个);1 个标点/空格通常算 1 token。
场景 4:为什么中文"费 token"
同样一段话,中文比英文耗更多 token。
早期 BPE 词表主要用英文训练,中文常用字虽然在词表里,但很多字组合只占 1~2 token;而英文一个常见词往往就是 1 个 token。所以同一段意思,中文可能要 2 倍 token——这也是为什么国产模型(Qwen/DeepSeek)专门扩中文词表。
实用工具OpenAI 官方有 tiktoken 库可以精确算 token 数;本地跑 llama.cpp 时,启动日志里会打印 prompt 被切成了多少 token。写代码时先 len(tokenizer.encode(text)) 一下,比拍脑袋准。

⑥ 高频错误诊断(4 条)

错误 1:以为 1 个汉字 = 1 个 token常见字在 GPT 类模型里大约 1 字 1~2 token,生僻字、繁体字可能 2~3 个。别拿"字数"直接当 token 数。
错误 2:以为模型"认识字"模型只认 token id,它没有"字形"概念。同一个字换个字体、写成艺术字,对人有差别,对模型毫无意义——它根本不看像素。
错误 3:以为分词器是模型的一部分、会跟着训练变分词器是独立组件,训练前就固定好了。训练只更新模型权重,不动词表。换了分词器,原来的权重就作废,必须重训。
错误 4:以为上下文窗口按"字数"算窗口按 token 算,不按字数。一篇 3000 字的中文可能是 5000~6000 token,别以为"我才写了 3000 字"就离 128k 很远。

⑦ 考点真题演练(4 题)

考点分布

考法出题形式应对
token 是什么问模型处理的最小单位不是字不是词,是 BPE 切出的片段
BPE 原理问高频片段怎么处理合并成大块
中文 token问为什么中文费 token早期词表英文为主
计费/窗口问按什么算都按 token

真题基础1. 大模型处理文本的最小单位是什么?

真题中档2. BPE 分词器训练时,面对高频相邻片段会怎么做?

真题中档3. 关于中文和英文的 token 消耗,下面哪个说法正确?

真题拔高4. 调用大模型 API 时,费用和上下文窗口分别按什么计量?

⑧ 必背知识点卡

Token 定义:模型处理文本的最小单位,不是字也不是词 是 BPE 切出的子词片段
BPE 核心:高频合并成大块,低频保留小块 有限词表覆盖无限文本
词表大小:常见 32k ~ 128k,Qwen 151k 不是越大越好
英文估算:1 token ≈ 0.75 个单词 ≈ 4 个字母 粗算用
中文估算:1 个汉字 ≈ 1~2 token,生僻字更多 别拿字数当 token 数
计费/窗口:都按 token 算,输入输出分别计费 输出通常更贵
SentencePiece:不依赖空格,对中文友好 BPE 英文强、中文弱

⑨ 应用输出:动手用 tiktoken 数 token

实战场景:写代码前先算一下这段提示词会不会爆上下文窗口。
① 装库:pip install tiktoken。
② 选编码器:用对应模型的编码,比如 GPT-4 系列用 o200k_base。
③ 编码数一下:
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
text = "今天天气真好,适合出门散步。"
tokens = enc.encode(text)
print(len(tokens))   # 大概 8~10 个 token
print(tokens)        # 看每个片段对应的编号
④ 反向解码:enc.decode(tokens) 能把编号还原回文字,验证分词没切错。
口述全链路"文字进来 → 分词器按 BPE 切成 token 片段 → 查词表换成数字编号 → 模型在数字序列上预测下一个 token → 生成时再把编号 decode 回文字。token 数决定了我花多少钱、窗口还剩多少。"

⑩ 分层练习 16 题(基础 6 + 中档 5 + 拔高 5)

▍基础 6 题

基础1分词器在大模型流水线里起什么作用?
把原始文本切成 token 片段,并映射成整数编号,是文字进模型前的"翻译官"。
基础2token 是字还是词?
都不是。它是 BPE 切出的子词片段,可能是半个词、一个常见词、一个偏旁或一个标点。
基础3BPE 两个字怎么读?
Byte Pair Encoding,字节对编码。
基础4API 费用按什么算?
按 token 数算,输入和输出分别计费,通常输出更贵。
基础5上下文窗口的单位是什么?
是 token 数,不是字数。128k 窗口 = 最多塞 12.8 万个 token。
基础6英文 1 token 大约对应几个单词?
大约 0.75 个单词(约 4 个字母)。

▍中档 5 题

中档7BPE 训练的核心循环是什么?
统计文本中相邻片段共现频率 → 把最高频的一对合并成新 token → 加入词表 → 重复直到词表达到目标大小。
中档8为什么中文一个字常被切成多个 token?
早期 BPE 词表主要用英文训练,中文生僻字、繁体字在词表里没有整块条目,只能退到字节级切分,一个字被拆成 2~3 个字节 token。国产模型扩中文词表后会好很多。
中档9词表越大越好吗?
不是。词表大 → 常用词省 token,但 embedding 层参数 = 词表×隐藏维度,显存占用上升。32k~128k 是主流折中。
中档10SentencePiece 和 BPE 的关键区别?
BPE 通常先按空格预分词,对中文(无空格)不友好;SentencePiece 直接在原始字符串上训练,不依赖空格,对中日文更友好。
中档11encode 和 decode 分别是什么?
encode = 文字 → token id 列表(输入用);decode = token id 列表 → 文字(生成输出用)。两者必须用同一套词表。

▍拔高 5 题

拔高12为什么不能"一个字一个 token"?
常用汉字就几万个,加上罕见字和符号词表会爆炸;更重要的是单字 token 让模型学不到词的组合规律,表达能力和泛化都变差。BPE 在词表大小和表达力之间取平衡。
拔高13换了分词器,原来训练好的权重还能用吗?
不能。embedding 层是按旧词表大小建的,换词表等于输入维度全变了,必须重新训练或重新对齐。分词器和模型权重是绑定的。
拔高14为什么 llama.cpp 启动时要打印 prompt token 数?
因为上下文窗口(-c 参数)要装下 prompt + 生成内容。prompt 太长超过 -c 设置,就会报错或截断。启动日志让你知道这次输入吃了多少 token、还剩多少可生成。
拔高15同样写"苹果",在 BPE 里可能是 1 个 token,也可能是 2 个,为什么?
取决于这个词在训练语料里出现的频率。如果"苹果"在语料里高频共现,BPE 会把它合并成一个大块;如果低频,就拆成"苹"+"果"两个 token。不同模型词表不同,切法也不同。
拔高16字节级 BPE(byte-level)为什么能处理任意字符?
它的最小单位不是字母而是字节,任何 Unicode 字符最终都能拆成 UTF-8 字节序列,哪怕词表里没有这个字,也能退到字节级别切出来,不会 OOV(未登录词)。

⑪ 记忆口诀 + 7 天复习计划

三句口诀 ① 模型不认字,只认编号;分词器是翻译官。
② BPE 高频拼大块、低频切小块,词表 32k~128k。
③ 中文一字约 1~2 token,英文一词约 1.3 token;计费和窗口都按 token。
天任务自检
第 1 天读②③,画"文字→token→编号"流程图说清分词器作用
第 2 天背知识点卡 + 基础 1-6基础全对
第 3 天读④ BPE 步骤表,做中档 7-11能讲 BPE 循环
第 4 天做拔高 12-16理解词表绑定权重
第 5 天做⑦真题 4 题 + 跑一遍 tiktoken实测数字对得上
第 6-7 天合上书口述三句口诀不看资料全说对

📌 知识链路

前置知识(先学) · 第1课 · AI 是什么:先搞懂大模型在"预测下一个 token",才明白分词器为什么存在。
· 第2课 · 模型类型:知道生成式模型是在 token 序列上做概率预测。
本节位置 本页站在大模型流水线的最前端——任何文字进模型前,都必须先被分词器切成 token、换成编号。它是"人能读懂的文字"和"模型能算的数字"之间的唯一桥梁。
下一步(学完去) · 第8课 · 上下文窗口:窗口大小装的就是 token 数,学完这课再回去看 -c 参数就懂了。
· 第12课 · 采样与生成参数:模型是在 token 序列上一个个采样出下一个 token 的,下一课讲怎么调它。
← 第10课 · Agent 算法与AI总览