从 LLM 到 Agent Skill,龙虾的技术基础 · ② Token

从 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 常按 空格切英文单词 ,中文按 (要额外分词)。问题很快来了:

  1. 词表爆炸:真实语言里词无穷多,不可能每个词一个 ID。
  2. OOV(Out-of-Vocabulary) :训练时没见过的词,旧系统只能打成 UNK,信息直接丢。
  3. 形态变化:英文同一个词根加前后缀,若整词枚举,词表大量重复。
  4. 专有名词、新词、拼写变体:层出不穷。

子词(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 TransformersAutoTokenizer.from_pretrained(...),对 tokenizer(text) 返回的 input_ids 长度即 token 数。

官方 Cookbook:How to count tokens with tiktoken


九、实践习惯(省钱又稳)

  1. 先数后发 :长文、批量任务先本地 encode 看长度。
  2. 输入结构化:列表、键值、删废话;重复的系统提示不要每轮全文复制,可模板化或摘要。
  3. 输出约束:限制最大长度、指定 JSON/表格,减少模型「发挥」。
  4. 多轮对话 :只带最近 N 轮 + 历史摘要,别把整段聊天无限拼接。
  5. 监控 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》------上下文怎么设计,才不浪费窗口、不把指令冲掉。


延伸阅读


系列:龙虾的技术基础 ②/8

相关推荐
悦来客栈的老板5 小时前
AI逆向|猿人学逆向反混淆练习平台第七题加密分析
人工智能
KOYUELEC光与电子努力加油5 小时前
JAE日本航空端子推出支持自走式机器人的自主充电功能浮动式连接器“DW15系列“方案与应用
服务器·人工智能·机器人·无人机
萤火阳光5 小时前
13|自定义 Skill 创作:打造专属自动化利器
人工智能
我哪会这个啊5 小时前
SpringAlibaba Ai基础入门
人工智能
tianbaolc6 小时前
Claude Code 源码剖析 模块一 · 第六节:autoDream 自动记忆整合
人工智能·ai·架构·claude code
tq10866 小时前
AI时代的价值冲击——共识瓦解与转型阵痛
人工智能
Flying pigs~~6 小时前
Prompt 工程实战总结:文本分类、信息抽取、语义匹配
人工智能·自然语言处理·prompt·文本分类·大模型应用
专业发呆业余科研6 小时前
深度学习的隐形支架:对称性与不变性的架构统一论
人工智能·深度学习·神经网络·机器学习
海边的Kurisu6 小时前
Amadeus的知识库 | OpenAI的API规范是啥来头?—— 集成大模型到项目中的必备通行证
java·开发语言·人工智能