你每次调用 AI 都在花 Token,但你真的知道 Token 是什么吗?为什么同一段话中文比英文贵?为什么有时候模型会"截断"你的内容?这篇文章彻底讲清楚。
先从一个账单问题开始
你用 GPT-4 或 Claude API,账单是按什么算的?
答案是 Token。不是按字数,不是按请求次数,是 Token。
那 Token 是什么?很多人的理解停留在"大概就是字"------但这个模糊的认知,会让你在写 Prompt、算成本、管 Context 的时候踩一堆坑。
Token 的本质:亚词级别的文本单元
Token 是大模型处理文本的最小基本单位,由分词器(Tokenizer)切分产生。
关键点 :Token 既不等于字,也不等于词,而是介于两者之间的亚词(subword)单元。
英文的分词规律
arduino
"Hello, World!" → ["Hello", ",", " World", "!"]
→ 4 个 Token
"unbelievable" → ["un", "believ", "able"]
→ 3 个 Token(常见词是整词,罕见词被拆分)
常见英文单词通常是一个 Token,长词或罕见词会被拆成多个。
中文的分词规律
css
"人工智能" → ["人工", "智能"] 或 ["▁人工", "▁智能"]
→ 通常 2-4 个 Token
"中国" → ["中国"]
→ 1 个 Token(高频词)
"瞻前顾后" → ["瞻", "前顾", "后"] 或类似拆分
→ 2-3 个 Token(低频词组被拆)
经验换算比:
| 语言 | 换算比 |
|---|---|
| 英文 | 1 字符 ≈ 0.3 Token |
| 中文 | 1 汉字 ≈ 0.6 Token |
| 代码 | 1 字符 ≈ 0.25 Token |
所以,同样表达一个意思,中文比英文更"贵"(每个汉字对应更多 Token)。
为什么要用 Token 而不是字符?
这是个好问题。答案在于训练效率和语义密度的平衡。
纯字符级别的问题:
- 序列太长,计算量爆炸(一篇文章 = 数万个字符)
- 字符本身没有语义,模型需要更长的序列才能"学会"语言
纯词汇级别的问题:
- 词表爆炸(中文、多语言词汇量巨大)
- 新词、专业术语、代码变量无法处理
BPE(字节对编码)这类亚词分词方案的优势:
- 词表大小可控(通常 3-10 万个 Token)
- 能处理任意文本,包括新词和代码
- 高频词完整保留,低频词被拆分,兼顾效率和覆盖率
markdown
BPE 简化原理:
1. 初始词表 = 所有字符
2. 统计相邻字符对出现频次
3. 合并最高频的字符对为新 Token
4. 重复直到词表大小达到目标
Token 影响的三件大事
一、API 计费
大模型 API 通常分别计算输入 Token 和输出 Token,输出通常更贵。
ini
以 Claude 3.5 Sonnet 为例(参考价格):
输入:$3 / 百万 Token
输出:$15 / 百万 Token
一次对话如果输入 1000 Token、输出 500 Token:
成本 = (1000 × 3 + 500 × 15) / 1,000,000
= 0.003 + 0.0075
= $0.0105 ≈ 0.08 元
看起来很便宜?Agent 任务通常需要几十轮甚至上百轮调用,成本会快速累积。这就是为什么 OpenClaw 这类 Agent 工具一个月能烧掉 10.2 万亿 Token。
二、Context Window 的边界
模型的 Context Window 就是它一次能"看到"的最大 Token 数量。
diff
典型 Context Window:
- Claude 3.5 Sonnet:200K Token ≈ 10 万汉字
- GPT-4o:128K Token ≈ 6.5 万汉字
- Gemini 1.5 Pro:1M Token ≈ 50 万汉字
超出 Context Window 会怎样?
早期模型会直接截断,丢弃超出部分。现代模型通常会用"滑动窗口"或压缩策略处理,但准确度会有损失。
在 Agent 场景下,随着任务执行,Context 中会积累:
- System Prompt(固定占用)
- 历史对话(随轮数增加)
- 工具调用结果(可能很大)
- 文件内容(如果有读文件操作)
Context 管理是 Agent 工程的核心难题之一。
三、模型的推理速度
Token 数量直接影响推理延迟。
diff
输出速度大约:
- GPT-4o:约 50-100 Token/秒
- Claude 3.5 Sonnet:约 80-120 Token/秒
- 本地 Llama(8B):约 20-40 Token/秒(M1 Mac)
生成一篇 1000 字的文章(约 600 Token),需要约 5-30 秒,取决于模型和硬件。
Token 计数的实用工具
OpenAI Tokenizer(在线工具):
arduino
https://platform.openai.com/tokenizer
粘贴任意文本,实时显示 Token 数和分词结果,直观感受分词粒度。
Python 代码估算:
python
import tiktoken
# 用于 GPT-4 和 Claude 的近似计算
enc = tiktoken.get_encoding("cl100k_base")
text = "帮我写一段 Python 代码,实现冒泡排序算法"
tokens = enc.encode(text)
print(f"Token 数量:{len(tokens)}")
print(f"Token 列表:{[enc.decode([t]) for t in tokens]}")
经验估算规则(不想写代码时):
- 中文文本:字数 × 0.6 ≈ Token 数
- 英文文本:单词数 × 1.3 ≈ Token 数
- 代码:字符数 × 0.25 ≈ Token 数
Token 与 Prompt 工程的关联
理解 Token 之后,Prompt 工程中有几个之前看不懂的现象就说得通了:
现象一:为什么"简洁的 Prompt"往往效果更好?
不是因为模型"偏爱"简洁,而是简洁的 Prompt 占用的 Context 更少,模型能把更多注意力集中在关键信息上。
现象二:为什么要把关键信息放在 Prompt 的开头或结尾?
研究表明,模型对上下文开头和结尾的注意力更强("Lost in the Middle"效应)。关键指令放在中间容易被"淡化"。
现象三:为什么 System Prompt 不能太长?
System Prompt 每次都要占用固定的 Token,长度越大,留给对话和工具结果的空间越小。
不同模型的分词差异
不同模型用不同的 Tokenizer,同一段文本的 Token 数量可能不同:
arduino
"Model Context Protocol":
- GPT-4:4 Token("Model", " Context", " Protocol"可能合并)
- Claude:可能 3-5 Token
- 中文模型(Qwen等):对中文有更好的分词优化,中文 Token 效率更高
这意味着跨模型的成本估算不能直接对比 Token 数,还要考虑 Token 价格和分词效率的差异。
总结:Token 的五个关键认知
- Token ≠ 字:是亚词单元,中文约 0.6 Token/字,英文约 0.3 Token/字符
- Token 是计费单位:输入+输出分别计费,输出通常更贵
- Token 决定 Context 边界:超出 Context Window,模型"看不到"
- Token 影响速度:生成的 Token 越多,等待时间越长
- Prompt 优化本质上是 Token 优化:用更少的 Token 传递更多有效信息
理解了 Token,你就理解了和 AI 交互的"货币单位"和"能源系统"。所有关于成本、速度、上下文长度的问题,都能从 Token 角度得到解答。