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 编号的
读法:左边人看的是文字,右边模型看的是一串数字编号。中间的分词器就是翻译官——它先把文本切成 token 片段,再去一张固定的"词表"里查每个片段对应的编号。模型从头到尾只跟数字打交道,它根本不知道"今天"这两个字长什么样。
③ 本质直觉:分词器就是"拼音表 + 字典"
一句话定义:分词器(Tokenizer)是把原始文本切成 token 片段、再映射成整数编号的工具。模型本身只能处理数字,所以在文字"进模型"之前,必须先过这道翻译。
类比一:拼音表。小学生不认识汉字没关系,先学拼音——每个字都能拼成几个拼音字母。分词器干的事类似:它把任意文字切成它"认识"的最小片段,每个片段在词表里有个固定编号。
类比二:字典查字。词表(Vocabulary)就是一本固定的字典,里面收录了几万个常用"字块"。文本来了,分词器从字典里挑出最合理的切法,把每个字块替换成字典里的编号。
关键:token 不是字,也不是词。它是"半个词""一个常见词""一个偏旁""一个标点"都有可能。英文里 unbelievable 可能被切成 un+believ+able;中文里 今天 可能是一个 token,而 龘 可能被拆成好几个。
为什么不干脆一个字一个 token?因为如果一个字一个 token,词表就要装几十万个常用字,而且模型学不到"组合规律"。BPE 的聪明之处在于:高频组合拼成大块,低频拆成小块,用有限的词表覆盖无限的文本。
双向翻译分词器是双向的:输入时把文字编码成 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-3 | BPE(字节级) | 50,257 | 字节级兜底,任何文字都能切 |
| Llama 2 / 3 | BPE | 32,000 / 128,256 | Llama 3 扩到 128k,中文更省 |
| Qwen 通义千问 | BPE | 151,643 | 中文友好,常用汉字直接成词 |
| DeepSeek | BPE | 102,400 | 中英混合优化 |
| T5 / ALBERT | SentencePiece(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 天 | 合上书口述三句口诀 | 不看资料全说对 |
📌 知识链路
本节位置
本页站在大模型流水线的最前端——任何文字进模型前,都必须先被分词器切成 token、换成编号。它是"人能读懂的文字"和"模型能算的数字"之间的唯一桥梁。