从 LLM 到 Agent Skill,龙虾的技术基础 · ② Token
本系列共 8 篇。总览:从 LLM 到 Agent Skill:我理解的 AI 应用进化路线
这篇写给谁
你可能已经知道:调用大模型要按 token 计费,对话太长会被截断。但 token 到底是什么、怎么从一句话变出来、为什么中英文「同样意思」token 数差很多,很多人仍只有模糊印象。
这篇尽量把 Token 这一条知识线写全:从直觉到常见算法,再到计费、窗口、延迟和工程习惯。读完你可以做到:
- 向别人讲清楚 token ≠ 字 ≠ 词;
- 理解 子词分词 在解决什么问题;
- 知道 BPE / WordPiece / SentencePiece 各自大概在干什么;
- 会 估算与统计 token,并在产品里做 预算与截断。
一、Token 到底是什么
Token 是模型真正「吃进肚子里」的最小处理单位 (再往下就是整数 ID 和向量了)。
人写的是字符串,模型内部要先做一件事:分词(tokenization) ------把文本切成一串 token,每个 token 对应词表里的一个 ID ,再查 嵌入表 变成向量。
所以有三层别混在一块:
| 层级 | 是什么 |
|---|---|
| 人看到的 | 字符、单词、标点、空格 |
| Token | 模型词表里的一个符号(可能是半个英文词、两个汉字、一个片段) |
| 向量 | 模型内部用来计算的连续向量 |
关键点:token 不是「一个字」或「一个英文单词」。
同样一句话,用不同模型、不同分词器,切出来的段数可以差很多。
二、为什么说 Token 像「文字压缩」
网上有一种很贴切的说法:分词是在做一种「压缩」 ------把千变万化的句子压进一个大小有限的词表里,每个 token 是表里的一项。词表太大,嵌入层和存储都吃不消;词表太小,同样的句子就要切成更多段,序列变长,计算量也涨。
三、从「整词」到「子词」:历史包袱与 OOV
早期 NLP 常按 空格切英文单词 ,中文按 字 或 词(要额外分词)。问题很快来了:
- 词表爆炸:真实语言里词无穷多,不可能每个词一个 ID。
- OOV(Out-of-Vocabulary) :训练时没见过的词,旧系统只能打成
UNK,信息直接丢。 - 形态变化:英文同一个词根加前后缀,若整词枚举,词表大量重复。
- 专有名词、新词、拼写变体:层出不穷。
子词(subword) 的思路是:别强行「一词一号」,而是让高频片段(包括前缀、后缀、词根、常见汉字组合)共享 ID。这样:
- 生僻词往往还能被拆成几段见过的子词拼起来;
- 词表规模可控,OOV 大幅缓解。
你现在在 LLM 里见到的 token,绝大多数都是 子词级 的。
四、常见分词算法(知道原理即可,不必背实现)
不同模型用不同 Tokenizer ,背后可能是 BPE、WordPiece、SentencePiece 等。你要掌握的是它们在解决什么问题、有什么取舍。
4.1 BPE(Byte Pair Encoding,字节对编码)
直觉: 从最小单位开始,统计语料里相邻片段谁最常一起出现,反复把「最常的一对」合并成新符号,直到词表达到目标大小。
- 很多 GPT 系 tokenizer 基于 BPE 或其变体。
- 优点:实现相对简单,英文等语言效果好。
- 「字节级 BPE」下面单独说------现代模型里很常见。
4.2 WordPiece
与 BPE 很像 ,但合并时往往用似然/概率 等准则(而不是单纯频率),BERT 系 常用。
你可以记:BERT 那套常叫 WordPiece;GPT 那套常叫 BPE------对初学者够用了,细节不必抠死。
4.3 SentencePiece
特点: 把原始字符串 当输入,不依赖 预先按空格切词;空格也可以当成普通符号处理,对 多语言、中日韩、无空格语言 很友好。
Llama 等很多开源模型用 SentencePiece(内部可选 unigram 或 BPE 等算法)。
4.4 字节级 BPE(Byte-level BPE)
动机: 若词表以「Unicode 字符」为底,语言一多字符集巨大;若以 字节 (共 256 种)为底,则任意文本 都能被拆开,不会出现「字符不在词表里」 这种尴尬。
做法是:先在 UTF-8 字节 上建一个小字母表,再学 BPE 合并规则。
GPT-2 等采用这类思想(具体实现里往往还有 正则预分词 、字节到可见字符的映射 ,避免某些控制字符干扰合并)。你只需记住:字节级让「任意文本可编码」更稳。
更多算法对比可看 Hugging Face 文档:Tokenization algorithms。
五、特殊 Token:模型里的「控制符」
词表里除了「内容片段」,还有一批 特殊 token,例如(名字因模型而异):
| 用途 | 常见含义 |
|---|---|
| 句首 / 句末 | 标记序列开始、结束 |
| 填充 PAD | 把批内句子对齐到同一长度(训练常见) |
| 未知 UNK | 旧系统多见;子词强了以后相对少见 |
| 掩码 MASK | 如 BERT 预训练里遮罩预测 |
| 对话模板 | 如区分 user / assistant / system 的标记 |
推理时你有时会在接口里看到「模板自动加了好多 token」------那就是特殊符号和对话格式占用的量,也算在上下文长度里。
六、Tokenizer 必须和模型「成套」
同一段文字,用 A 模型的 tokenizer 和 B 模型的 tokenizer,token 数和内容都对不上。
词表、合并规则、特殊符号全是训练时定死的。
工程上铁律:用什么模型推理,就用官方配套的 tokenizer / encoding_for_model。混用会导致 ID 错位,输出乱套或完全不可用。
七、和工程强相关的:计费、窗口、速度、显存
7.1 计费
云端 API 普遍按 输入 token + 输出 token 计费(具体是否合并计价看厂商)。
所以:prompt 越长、模型回答越长,钱越多 ------不是按「字数」公平折算,而是按 各自 tokenizer 切出来的 token 数。
7.2 上下文窗口(Context window)
模型有一个 最大上下文长度(按 token 计)。超过就要:
- 截断(丢头、丢尾、或只保留中间);
- 摘要压缩;
- 分块 + 多轮(RAG 常见)。
Token 直接决定「还能塞多少记忆」。
7.3 延迟与计算量
序列越长,自注意力 等操作的代价通常随长度至少线性、常见近似二次 增长(和实现有关)。
所以 token 多 = 往往更慢、更贵、更吃显存------不是玄学,是结构决定的。
7.4 中英文谁更「费 token」
一般经验:同样信息量,中文有时比英文更「省 token」、有时更「费」 ,取决于训练语料与分词器;不能死记比例。
唯一能做的是:对你用的模型,用真实 tokenizer 数一遍,别凭感觉估。
八、怎么数 Token(开发必备)
推理前用官方方式 先数再发,避免超长报错或费用失控。
OpenAI 系 常用 tiktoken (与模型所用编码一致)。例如 GPT-4、GPT-3.5-turbo 常用 cl100k_base;较新的 GPT-4o 等可能用 o200k_base 等更新编码------以 OpenAI 文档 / tiktoken 说明 与 encoding_for_model 为准。
示例(需安装 pip install tiktoken):
python
import tiktoken
# 按模型名自动选编码(推荐)
enc = tiktoken.encoding_for_model("gpt-4")
text = "你好,这是一段用来估算 token 数量的示例文本。"
ids = enc.encode(text)
print("token 数:", len(ids))
print("前 20 个 id:", ids[:20])
其他模型多用 Hugging Face Transformers 的 AutoTokenizer.from_pretrained(...),对 tokenizer(text) 返回的 input_ids 长度即 token 数。
官方 Cookbook:How to count tokens with tiktoken。
九、实践习惯(省钱又稳)
- 先数后发 :长文、批量任务先本地
encode看长度。 - 输入结构化:列表、键值、删废话;重复的系统提示不要每轮全文复制,可模板化或摘要。
- 输出约束:限制最大长度、指定 JSON/表格,减少模型「发挥」。
- 多轮对话 :只带最近 N 轮 + 历史摘要,别把整段聊天无限拼接。
- 监控 usage :接口返回的
usage/ 日志里常有 prompt_tokens、completion_tokens,用来做统计与告警。
十、常见误区(FAQ)
Q:一个字就是一个 token 吗?
不一定。可能是 1 个或多个 token,也可能是半个词加前后片段。
Q:英文一个词就是一个 token 吗?
不一定。常见词往往一个词一个或更少;长词、少见词会被拆成多段。
Q:token 数少就一定更好吗?
不一定。分词是压缩与表达的折中;对你的任务 ,用配套 tokenizer 实测最重要。
Q:为什么接口「字数不多」却超长了?
可能含隐藏模板、特殊 token、重复系统提示,或该语言对当前分词器特别「碎」。
小结
- Token 是模型处理文本的基本单位 ;来自 Tokenizer ,再变成 ID → 向量。
- 子词 解决词表、OOV、多语言等问题;常见路线有 BPE、WordPiece、SentencePiece ,以及 字节级 BPE。
- Tokenizer 与模型绑定,不能混用。
- 计费、窗口、速度、显存 都和 token 强相关------要学会 先数 token、再设计 prompt。
- 用 tiktoken / AutoTokenizer 做真实统计,别凭感觉。
下一篇:《③ Context》------上下文怎么设计,才不浪费窗口、不把指令冲掉。
延伸阅读
- OpenAI:tiktoken 仓库 · 用 tiktoken 数 token
系列:龙虾的技术基础 ②/8