Token(令牌)
大模型处理文本的最小单位。一个 Token 约等于 0.75 个英文单词或 1-2 个汉字。Token 数量决定 API 费用和上下文窗口占用。
什么是 Token
Token 是大语言模型处理文本的基本单位。模型不是逐字符或逐词处理文本,而是把文本切分成一个个 token。
对于英文:1 个 token ≈ 0.75 个单词(4 个字符) 对于中文:1 个 token ≈ 1-2 个汉字
英文: "Hello world" → ["Hello", " world"] → 2 tokens
中文: "你好世界" → ["你好", "世界"] → 2-4 tokens
代码: "function add(a,b)" → ["function", " add", "(", "a", ",", "b", ")"] → 7 tokens
为什么 Token 重要
1. 决定 API 费用
所有 LLM API 都按 token 计费。Token 越多,费用越高。
100 万 token ≈ 75 万英文单词 ≈ 50-100 万汉字
2. 决定上下文窗口
模型能处理的上下文长度以 token 为单位:
| 模型 | 上下文窗口 | 约等于 |
|---|---|---|
| GPT-4o | 128K | 一本中篇小说 |
| Claude Sonnet 4 | 200K | 一本长篇小说 |
| GPT-5 | 400K | 两部长篇小说 |
| Gemini 2.5 Pro | 1M | 一套百科全书 |
3. 决定速度
Token 越多,推理时间越长。生成 1000 token 大约需要 3-10 秒(取决于模型)。
Input / Output / Cache 三种价格
API 计费早就不是"按 token 一口价"了,常见至少分三档:
| 类别 | 含义 | 相对价格(粗略) |
|---|---|---|
| Input | 你发送给模型的 prompt(含 system + history + query) | 1x |
| Output | 模型生成的内容 | 3-5x Input |
| Cached Input | 命中 prompt cache 的输入部分 | 0.1-0.5x Input |
举例:Claude Sonnet 4(数量级,会变动):
Input: $3 / M token
Output: $15 / M token
Cache write: $3.75 / M(写一次缓存,5 分钟有效,可续)
Cache read: $0.30 / M(命中后 -90%)
设计应用时三句话原则:
- 能少 output 就少 output——Output 比 Input 贵 3-5 倍。让模型只返回必要内容、不要重复用户的话。
- 能复用 input 就开缓存——长 system prompt、tool definitions、知识库文档放最前面,缓存一次反复用。
- 能批量就批量——OpenAI / Anthropic 都有 Batch API,24h 内出结果,价格 -50%。
Prompt Cache 计费机制
各家细节不同,但模式接近:
| 平台 | 触发方式 | TTL | 折扣 |
|---|---|---|---|
| Anthropic | 显式 cache_control 标记 | 5 分钟(可续到 1 小时) | Read -90% |
| OpenAI | 自动缓存 ≥1024 token 的前缀 | ~10 分钟 | Read -50% |
| Gemini | 显式 cachedContent API | 默认 1 小时(可设) | Read -75% + 按存储时长收费 |
| DeepSeek | 自动缓存 | ~ 数小时 | Read -90% |
生效条件:必须前缀完全一致。哪怕在 system prompt 开头加一个时间戳,整个缓存就废了。所以动态内容要严格放在 prompt 末尾。
Token 计数工具
在线工具
- OpenAI Tokenizer — GPT 系列分词器
- Tiktokenizer — 支持 GPT / Claude / Llama / DeepSeek 等多家分词器对比
代码计数
# OpenAI 的 tiktoken 库
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4o")
tokens = enc.encode("你好世界,Hello world")
print(len(tokens)) # 输出 token 数
# Anthropic:通过 SDK 直接调
from anthropic import Anthropic
client = Anthropic()
count = client.messages.count_tokens(
model="claude-sonnet-4",
messages=[{"role": "user", "content": "你好世界"}]
)
print(count.input_tokens)
// 浏览器端
import { encode } from 'gpt-tokenizer'
const tokens = encode('你好世界,Hello world')
console.log(tokens.length)
不同模型的分词差异
不同模型使用不同的分词器,同样的文本 token 数可能差异巨大:
| 文本 | GPT-4o | Claude | Gemini | DeepSeek |
|---|---|---|---|---|
| "Hello world" | 2 | 2 | 2 | 2 |
| "你好世界" | 4 | 2 | 4 | 2 |
| 1000 行 Python 代码 | ~8000 | ~7500 | ~9000 | ~7500 |
| 1000 字中文文档 | ~1700 | ~1200 | ~1700 | ~1100 |
结论:中文场景下 Claude / DeepSeek / Qwen 这类有中文优化的 tokenizer 比 GPT 省 30-50% token。同样的对话,GPT 跑下来可能比 Claude 贵不少——尤其是中文 input 多的场景。
实用估算
快速估算 token 数量的经验法则:
| 文本类型 | 1K token ≈ |
|---|---|
| 英文文本 | 750 单词 |
| 中文文本 | 500-700 汉字 |
| 代码 | 30-50 行 |
| JSON | 100-200 行 |
| Markdown | 500-700 字 |
上下文压缩策略
长对话 / Agent 长任务里 token 涨得最快。常见压缩手段:
| 策略 | 适用 | 副作用 |
|---|---|---|
| 滑动窗口 | 多轮对话保留最近 N 轮 | 早期上下文丢失 |
| 历史总结 | 把旧对话用 LLM 总结成几百 token | 多一次 LLM 调用、细节丢失 |
| 工具输出截断 | Agent 调工具返回大量数据时只保留摘要 + 引用 ID | 模型可能再次请求完整数据 |
| 检索式压缩 | 旧消息存向量库,按需检索 | 工程复杂度高 |
| Map-Reduce | 长文档先并行小段总结、再合并 | 跨段语义可能被切断 |
Claude Code / Cursor 长会话时都内置了自动总结——当上下文超过阈值,会把前面对话压缩成几百 token 的摘要保留。
省 Token 技巧
- 精简 prompt — 删除冗余措辞,用简洁的指令
- 压缩历史 — 长对话用摘要替代完整历史
- 缓存重复内容 — 使用 prompt caching(Anthropic / OpenAI / Gemini / DeepSeek 都支持)
- 选对模型 — 简单任务用 Haiku / Flash / Mini 而非 Sonnet / Pro / GPT-5
- 控制输出长度 — 明确要求"用 100 字以内回答"或设
max_tokens - 少用 Few-shot — 推理模型不需要太多示例
- 批量化 — 同一类请求合并到 Batch API,价格直接 -50%
- 结构化输出 — 让模型只输出 JSON 而不是"自然语言 + JSON",Output 少一半
常见误区
误区 1: "我用 GPT 比 Claude 便宜,因为单价低"
不一定。GPT tokenizer 在中文场景下 token 数显著更多,单价低但总账不一定低。算账要按"完成同样任务的总成本",不是单 token 价。
误区 2: "200K 上下文我就尽量塞满"
参考 Context Engineering——超过 80% 上下文窗口后模型质量明显下降。塞满还多花了钱,得不偿失。
误区 3: "Output 反正不多没必要省"
Output 单价是 Input 的 3-5 倍。让模型回答"以下是详细分析:..."这类填充话,每次都在烧钱。
延伸阅读
- 上下文窗口管理:Context Engineering
- 采样参数(影响 Output 长度):Temperature 与 Top-P
- 输出结构化(省 token):Function Calling