STUDY · LLM 深潜
LLM 深潜 · 一次看懂

Token:大模型世界的原子单位

模型读不懂字,也读不懂词——它只认 token。这篇文章把 token 的一切讲清楚:它是什么、为什么存在、怎么切出来的、怎么数、怎么计费、为什么会闹出「strawberry 有几个 r」的笑话,以及怎么用 prompt caching 把账单砍掉 90%。

分词原理 计费 · 上下文窗口 Prompt Caching 资料核实于 2026-06
01

Token 是什么

Token 是大模型读写文本的最小单位——既不是字符,也不是单词,而是介于两者之间的「子词片段」。

当你把一句话发给 GPT 或 Claude,模型并不会看到字母和汉字。文本先经过一个叫 tokenizer(分词器)的组件,被切成一串 token,每个 token 对应词表里的一个整数编号;模型内部拿这个编号去查一张巨大的向量表(embedding),之后所有计算都发生在向量上。生成回答时方向相反:模型每一步输出一个 token 编号,再拼回文字。

输入
原始文本
"Tokens are fun!"
Tokenizer
切成 token
["Tok","ens"," are"," fun","!"]
词表查找
整数 ID 序列
[19137, 729, 553, 2523, 0]
Embedding
向量序列
[0.12, -0.83, …] × 5 → Transformer

一个 token 可能是一个完整的常用词(" are")、一个词的片段("Tok" + "ens")、一个汉字或一个常用中文词、一个标点,甚至一个字节。高频的内容会被合成更长的 token,罕见的内容被拆得更碎——这是后面要讲的 BPE 算法决定的。

交互演示 · 文本是怎么被切成 token 的
记住模型的一切输入输出、一切计费、一切长度限制,单位都是 token。看不见 token,就看不懂账单和很多「模型犯傻」的现象。
02

为什么偏偏是 token

字符太碎,单词太多——subword token 是工程上的最优折中。

理论上模型可以直接处理字符或单词,为什么所有主流模型都选了中间路线?因为两个极端各有致命伤:

方案 A · 按单词切词表爆炸
每个单词一个编号
新词、错拼、变形(run/runs/running/runner…)无穷无尽,词表要几百万项还是兜不住;没见过的词只能变成 [UNK](未知),信息直接丢失。
方案 B · 按字符切序列爆炸
每个字母/汉字一个编号
词表是小了,但同样一段话的序列长度翻 4~5 倍。Transformer 注意力计算量随长度平方增长(O(n²)),同样的上下文窗口能装的内容骤减,模型还得从零学会「字母拼成单词」这件事。
方案 C · 子词 Subword✓ 业界标准
高频内容合并成长 token,罕见内容拆碎
词表固定在 10 万~20 万的可控规模;常用词一个 token 搞定,生词拆成有意义的片段(如 tokenization → token + ization);配合字节级回退,任何文本都能编码,没有 [UNK]。

子词方案同时解决了三件事:开放词表(任何字符串都能表示)、序列效率(常用内容压得很短)、泛化(词缀、词根等结构暴露给模型,unhappiness 拆成 un + happiness 自带构词信息)。

本质token 化是一种压缩:用固定大小的词表,把任意文本编码成尽量短的整数序列。压得越好,同样的钱和窗口就能装下越多内容。
03
BPE · WordPiece · Unigram

Token 是怎么切出来的

几乎所有现代大模型都用 BPE(Byte-Pair Encoding)的变体:从字节出发,不断把语料里「最常相邻出现的一对」合并成新 token。

亲手看一遍 BPE 训练

假设训练语料里只有 5 个词(及出现次数):hug ×10pug ×5pun ×12bun ×4hugs ×5。初始词表只有单个字符。每一步,找出出现频率最高的相邻字符对,合并成一个新 token 加入词表:

交互演示 · BPE 合并过程(HuggingFace 课程经典示例)
语料切分状态
词表
点「下一步合并」开始。

训练就这样迭代下去,直到词表达到目标大小(比如 20 万)。编码新文本时,按学到的合并规则依序应用即可。「高频 → 合并 → 变成一个 token」这一条规则,解释了 token 世界的绝大多数现象:为什么常用英文词是 1 个 token、为什么生僻字会被拆成多个字节、为什么中文比英文「贵」。

算法家族一览

算法核心思路代表模型
BPE贪心合并最高频相邻对,确定性强GPT 系、Llama 3、Qwen、DeepSeek、Gemma
Byte-level BPE基础字母表换成 256 个字节——任何文本都能编码,彻底消灭 [UNK](GPT-2 引入)GPT-2 之后所有 OpenAI 模型、Llama 3、DeepSeek-V3
WordPiece合并时不选最高频,而选「最能提升训练数据似然」的对BERT 家族
Unigram LM反向操作:先建超大候选词表,再迭代删掉对似然损失最小的 tokenT5、ALBERT、XLNet
SentencePiece不是算法而是框架(内置 BPE/Unigram):把空格当普通字符(▁),语言无关,适合中日文T5、Llama 1/2、Gemma

主流模型的 tokenizer 与词表大小

模型Tokenizer词表大小备注
GPT-4 / 3.5tiktoken · cl100k_base≈100K开源库,可本地精确计数
GPT-4o / o系 / GPT-5tiktoken · o200k_base≈200K对非英语大幅优化(中文省 ~1.4×)
Llama 3tiktoken 式 BPE128,256从 Llama 2 的 32K SentencePiece 升级,同文本省 ~15% token
Qwenbyte-level BPE≈151,643基于 cl100k 扩展,中文友好
DeepSeek-V3/R1byte-level BPE128K预分词器对「标点+换行」做了特殊处理
Claude 3+未公开未公开无本地分词库;官方提供免费 count_tokens API。Opus 4.7 起换了新 tokenizer,同样文本最多多 ~35% token
前沿「不要 tokenizer」也是研究方向:Meta 的 BLT(Byte Latent Transformer)直接处理字节流,按信息熵动态分组,8B 规模上已能匹敌 Llama 3,且对拼写噪声鲁棒得多。但截至 2026 年中,所有主流商用模型仍然基于 BPE 类 tokenizer。
04

一个 token 有多大:换算与「中文税」

英文经验值:1 token ≈ 4 个字符 ≈ 0.75 个单词。中文:1 个汉字 ≈ 1~1.5 个 token,取决于 tokenizer。

因为 BPE 按「语料里的出现频率」造词表,而训练语料以英文为主,所以英文的压缩率最高。常用换算(OpenAI 官方口径):

交互演示 · token 用量估算器(启发式,非精确值)
字符数
0
估算 token
0
其中中文字符
0
每 token 字符数
估算规则:CJK 字符 ≈ 1.2 token/字,其他字符 ≈ 1 token/4 字符。要精确值请用 tiktoken 或各家 count_tokens API(见第 06 节)。
提醒不同模型的 token 数不可互相套用:同一段中文,GPT-4(cl100k)、GPT-5(o200k)、Claude、Qwen 数出来都不一样。估算预算时,一定用目标模型自己的计数方式
05
Tokenization 的代价

那些著名的 Token 怪象

很多「大模型连小学题都不会」的笑话,根源不在智力,而在它看世界的方式——它看到的是 token 块,不是字符。

strawberry 里有几个 r?

模型经常答错成 2 个。原因:strawberry 在 cl100k 里被切成 str + aw + berry 三块,模型从头到尾没见过单个字母,要数 r 只能靠「记忆中这个词的拼写知识」间接推理。这类字符级任务(数字母、倒序拼写、藏头诗)天然是 token 化模型的盲区。

9.11 > 9.9?

数字被切分的方式和人类的数感不对齐:9.11 可能切成 9/./11,模型容易滑向「版本号比较」的模式(9.11 版确实新于 9.9 版)。研究表明这不全是 tokenizer 的锅——逐位分词的模型也会犯错——但 token 切分确实放大了它。

数字切分与算术

GPT 系把数字按 1~3 位一组从左往右切,而加法进位是从右往左的——两者错位。有研究发现:把数字用逗号强制三位分组(如 1,234,567)对齐 token 边界后,GPT-3.5 的多位数加法准确率从 75.6% 跳到 97.8%。

SolidGoldMagikarp:幽灵 token

GPT-2/3 的词表是从未过滤的网络数据上训练的,一些奇怪字符串(Reddit 用户名、电商后台残留)成了 token;但模型的训练语料过滤掉了这些内容——于是这些 token 有编号、没语义,embedding 几乎没被训练过。让早期 GPT 复述 "SolidGoldMagikarp",它会答非所问,甚至说出 "distribute"。这类「glitch token」是词表训练与模型训练数据不一致的活化石。

空格和大小写敏感

在 BPE 词表里,hello hello(带前导空格)、HelloHELLO四个不同的 token(序列)。前导空格通常归属后面的词,所以同一个词在句首和句中是不同 token。这就是为什么 prompt 末尾多一个空格,输出有时会明显变差。

透镜遇到模型在拼写、计数、对齐、算术上犯低级错误时,先问一句:「它看到的 token 序列长什么样?」——多数怪象当场破案。
06
tiktoken · count_tokens · usage

怎么数 token,怎么算钱

API 按 token 双向计费:输入(prompt)一个价,输出(生成)一个价,输出通常贵 3~6 倍。

数 token 的三种姿势

① OpenAI 系:tiktoken 本地精确计数。开源、离线、和线上完全一致:

count_tokens.pyPython
import tiktoken

enc = tiktoken.encoding_for_model("gpt-5.4")   # 自动选 o200k_base
tokens = enc.encode("Token 是大模型的原子单位")
print(len(tokens))          # token 数
print(enc.decode(tokens))   # 无损还原(BPE 可逆)

② Claude:count_tokens API。Claude 3 之后 tokenizer 不公开,没有本地库,但官方提供免费的计数端点(独立限额,不占消息额度),接受和正式请求完全相同的 body——system、tools、图片、PDF 都算进去:

POST /v1/messages/count_tokenscurl
curl https://api.anthropic.com/v1/messages/count_tokens \
  -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-sonnet-4-6",
    "system": "你是一个翻译助手",
    "messages": [{"role": "user", "content": "把这句话翻成英文…"}]
  }'
# → {"input_tokens": 31}

③ 在线工具。OpenAI 的 platform.openai.com/tokenizer 可以可视化任意文本的切分,适合直觉训练。

哪些东西在烧你的 token

账单上的 input token 远不止「用户那句话」。每次请求,下面这些全部按输入计费:

thinking / reasoning token 按输出计费——推理模型「想」得越久越贵,即使思考过程不展示给你。用量都写在响应的 usage 字段里:

响应里的 usage 字段(Claude API)JSON
{
  "usage": {
    "input_tokens": 412,                  // 未命中缓存的输入
    "cache_creation_input_tokens": 8214,   // 本次写入缓存(1.25x 计价)
    "cache_read_input_tokens": 11037,      // 从缓存读出(0.1x 计价)
    "output_tokens": 1582                  // 输出(含 thinking)
  }
}

图片怎么折算成 token

提供商折算规则例子
Claude28×28 像素一个 patch:⌈宽/28⌉ × ⌈高/28⌉,多数模型 1568 token 封顶(长边 1568px)1000×1000 ≈ 1296 token
OpenAI新模型按 32px patch(⌈宽/32⌉×⌈高/32⌉ 再乘模型系数);GPT-4o 老规则按 512px tile:85 + 170/tile
Gemini小图(双边 ≤384px)固定 258 token;大图按 768×768 tile,每 tile 258。视频 263 token/秒,音频 32 token/秒1 分钟视频 ≈ 15,780 token

为什么输出比输入贵 3~6 倍

这不是定价策略的任性,而是 GPU 的物理现实。处理输入(prefill)时,整个 prompt 可以一次前向传播并行算完,GPU 算力打满;生成输出(decode)是自回归的,每个 token 都要完整跑一遍模型,每步都要搬运全部权重和不断增长的 KV cache——瓶颈在显存带宽,GPU 大部分时间在等数据:

交互演示 · prefill 并行 vs decode 逐个
输入 prefill32 个 token 一次并行处理
输出 decode每个 token 都要完整跑一遍模型

2026 年 6 月主流模型价目(每百万 token,USD)

模型输入输出缓存读说明
Claude Fable 5$10$50$1新旗舰,1M 窗口全价无加价
Claude Opus 4.8$5$25$0.501M 窗口
Claude Sonnet 4.6$3$15$0.301M 窗口
Claude Haiku 4.5$1$5$0.10200K 窗口
GPT-5.5$5$30$0.50超 272K 输入后整单输入×2、输出×1.5
GPT-5.4$2.50$15$0.25同上加价规则
GPT-5.4-mini$0.75$4.50$0.075
Gemini 3.1 Pro$2$12>200K 部分输入 $4 / 输出 $18
Gemini 3.5 Flash$1.50$9
DeepSeek V4-Flash$0.14$0.28$0.0028缓存命中价是未命中的 2%
省钱通道三大家都有 Batch API:异步提交、24h 内返回、输入输出一律五折,且可与 prompt caching 叠加。能等的离线任务(批量打标、评测、数据清洗)没有理由走实时接口。
07

上下文窗口:模型的工作记忆

Context window = 一次请求里模型能「看见」的 token 总量上限,输入、已生成的输出、thinking 共享同一个窗口。

窗口之内是模型的全部世界:装不下的内容它不知道,超了就报错或被截断。max output tokens 是窗口内的子限制——单次响应最多能生成多少。2026 年中,1M(约 75 万英文词,一整套《指环王》)已是旗舰标配:

模型上下文窗口最大输出
Claude Fable 5 / Opus 4.81M128K
Claude Sonnet 4.61M64K
Claude Haiku 4.5200K64K
GPT-5.5 / 5.41,050,000128K
Gemini 3.1 Pro / 3.5 Flash1,048,57665,536
DeepSeek V4 系列1M384K(业界最大)

但「窗口大」不等于「随便塞」:

类比把窗口当工作台而不是仓库:东西摊得越多,找到关键工具越慢、租金越贵。长文档场景优先考虑检索(RAG)+ 缓存,而不是无脑全量塞入。
08
省钱 90% 的核心机制

Prompt Caching:缓存怎么设

缓存的不是文本,而是模型处理前缀后的内部计算状态(KV cache)。前缀相同的请求可以「从断点续算」——跳过的部分按 1/10 价格计费,首 token 延迟最多降 80%。

回忆第 06 节:输入是 prefill 一次算完的。模型处理 prompt 时,每个 token 都会产生注意力的 Key/Value 张量。如果这次请求的前缀和上次完全一致,这些张量根本不用重算——服务商把它们留在显存/磁盘里,下次直接接上。这就是 prompt caching。

Claude:显式断点,控制最精细

在内容块上加 cache_control 标记断点,断点之前的全部前缀进入缓存:

带缓存断点的请求(Claude API)JSON
{
  "model": "claude-sonnet-4-6",
  "system": [{
    "type": "text",
    "text": "你是法务助手。以下是 10 万 token 的合同全文……",
    "cache_control": {"type": "ephemeral"}          // ← 断点:到这里为止全部缓存
  }],
  "messages": [{"role": "user", "content": "第 12 条违约金怎么算?"}]
}
// 想缓存活 1 小时:"cache_control": {"type": "ephemeral", "ttl": "1h"}

关键规则:

第 1 层 · tools几乎永不变
工具定义(名称 / 描述 / Schema)
放最前面。一旦改动,全部三层缓存报废——agent 运行中途严禁增删改工具。
第 2 层 · system很少变
系统提示 + 长文档 + few-shot 示例
稳定的大块内容都堆在这里,在末尾打断点。改动只殃及自己和 messages 层。
第 3 层 · messages每轮都变
对话历史(持续增长)
把断点推进到最新一条消息:旧历史以 0.1x 读出,本轮只为新增的 token 付 1.25x 写入。时间戳、user id 这类易变内容绝不能混进上面两层。

四家机制对比

提供商触发方式最小长度读取价写入价存活时间
Claude显式 cache_control(亦有自动模式)512~4096 按模型0.1×1.25×(5m)/ 2×(1h)5 分钟滑动 / 1 小时
OpenAI全自动,无需标记1024(之后按 128 递增)0.1×免费5~10 分钟,最长 1h;GPT-5 系可延至 24h
Gemini隐式自动 + 显式可选2048~409610%~25% 原价显式另收 $1/M·小时存储费显式默认 1 小时
DeepSeek全自动(落盘)未命中价的 2%免费数小时~几天

缓存为什么是 agent 的成本命门

Agent 每一步工具调用,都要把「system + 全部工具定义 + 越滚越长的完整历史」重发一遍。一个任务几十次请求,输入 token 是输出的几十倍——全部命中时输入按 0.1x 计,全不命中按 1x~1.25x 计,相差 10 倍以上。亲手感受一下:

交互演示 · 多轮 agent 会话的缓存账单(Sonnet 4.6 价格)

设定:system + 工具定义 + 文档共 8,000 token,每轮新增对话约 1,000 token。条形图显示每轮输入 token 的计费构成:

缓存读取(0.1×) 缓存写入(1.25×) 无缓存输入(1×)
开缓存 · 累计输入成本
$0
0 token
不开缓存 · 累计输入成本
$0
0 token
节省
输入部分

最佳实践与常见误区

一句话把 prompt 想象成一摞从下往上越来越易变的积木:越往后越多变,越往前越稳定,然后让缓存吃掉稳定的部分。Agent 时代,缓存命中率就是毛利率。
09

实战速查:场景 → 动作

把前面八节压缩成一张决策表。

想精确知道一段文本在 GPT 下多少 token
tiktoken 本地数
想知道 Claude 请求(含图片/工具)多少 token
count_tokens API(免费)
同一份长文档 / 同一套 system 反复问
打缓存断点,1h TTL
做 agent,几十轮工具调用
tools/system 绝不中途改 + 断点随对话推进
离线批量任务(打标 / 评测 / 清洗)
Batch API 五折 + 缓存叠加
模型数不对字母 / 比错小数 / 算错加法
token 切分问题:换工具(代码执行)或改表示
中文内容预算评估
按 1 字 ≈ 1.2 token 估,再用目标模型实测
超长资料问答
RAG 检索 + 缓存 > 无脑塞满 1M 窗口
成本异常排查
看 usage 四件套:input / output / cache_read / cache_creation
··

参考资料

技术事实与价格均核实于 2026 年 6 月 11 日;价格可能变动,以官方价目页为准。