Token 计算详解
什么是 Token
Token 是大语言模型处理文本的最小基本单位。模型不直接处理原始文本,而是将文本转换为 token 序列进行处理。
Tokenizer(分词器)
Tokenizer 负责将文本转换为 token 序列:
输入文本 → Tokenizer → Token 序列
"今天天气很好" → [192, 3847, 2093, 3847, 452, 2398]Detokenizer(反分词器)
Detokenizer 负责将 token 序列转换回文本:
Token 序列 → Detokenizer → 输出文本
[192, 3847, 2093, 3847, 452, 2398] → "今天天气很好"Token 计算规则
中英文差异
| 文本类型 | 平均 Token 数 | 示例 |
|---|---|---|
| 英文单词 | 1 Token ≈ 0.75 单词 | "hello" → 1 token |
| 中文汉字 | 1 Token ≈ 1-2 字符 | "今天" → 2 tokens |
| 标点符号 | 1 个 ≈ 1 Token | "。" → 1 token |
| 空格 | 英文空格计入 | "hello world" → 2 tokens |
实际计算示例
英文: "hello world"
Tokens: [15339, 1917]
数量: 2 tokens
中文: "今天天气很好"
Tokens: [192, 3847, 2093, 3847, 452, 2398]
数量: 6 tokens常见 Token 计算工具
平台内置计算
在 ai.TokenHub 平台的 API 响应中,会返回实际消耗的 token 数量:
json
{
"id": "chatcmpl-xxx",
"model": "gpt-4o",
"usage": {
"prompt_tokens": 28, // 输入消耗
"completion_tokens": 45, // 输出消耗
"total_tokens": 73 // 总消耗
}
}常用 Token 计算公式
英文文本
Token数量 ≈ 字符数 ÷ 4
Token数量 ≈ 单词数 × 1.33中文文本
Token数量 ≈ 字符数 × 1.3 ~ 1.5在线计算工具
| 工具 | 网址 | 说明 |
|---|---|---|
| OpenAI Tokenizer | platform.openai.com/tokenizer | 官方工具 |
| AiToken | aitoken.fly.dev | 在线计算 |
ai.TokenHub 平台 Token 计费
计费组成
| 类型 | 说明 | 计费 |
|---|---|---|
| Prompt Tokens | 输入文本消耗 | ✅ 计费 |
| Completion Tokens | 输出文本消耗 | ✅ 计费 |
| Total Tokens | 总消耗 | ✅ 计费 |
计费示例
python
# 用户输入
user_input = "请写一首关于春天的诗"
# 假设转换为 14 个 tokens
# 模型输出
model_output = "春风拂面,万物复苏。\n花开遍地,绿意盎然。"
# 假设输出转换为 28 个 tokens
# 总计: 14 + 28 = 42 tokens平台 Token 计算页面
在 ai.TokenHub 后台的「用量统计」页面,可以查看:
- 每日/每周/每月 Token 消耗明细
- 各模型的 Token 消耗占比
- Token 消耗趋势图表
如何节省 Token
1. 精简 Prompt
python
# ❌ 不推荐 - 冗余描述
messages = [
{"role": "user", "content": "请你作为一个非常专业的、经验丰富的程序员来帮我写一段代码,这段代码的功能是计算两个数的和,请写得详细一些,包括注释和错误处理"}
]
# ✅ 推荐 - 简洁明确
messages = [
{"role": "user", "content": "写一个Python加法函数,包含错误处理"}
]2. 使用系统消息
将固定的角色设定放在系统消息中:
python
messages = [
{"role": "system", "content": "你是一个专业的Python程序员"},
{"role": "user", "content": "写一个排序算法"}
]3. 控制回复长度
明确指定回复格式和长度:
python
{"role": "user", "content": "用一句话解释量子计算"}4. 多轮对话优化
python
# ❌ 每次重复上下文
messages = [
{"role": "user", "content": "解释什么是机器学习,包括定义、原理、应用场景"},
{"role": "assistant", "content": "机器学习是..."},
{"role": "user", "content": "请再详细解释一下机器学习的定义、原理、应用场景"}
]
# ✅ 利用历史上下文
messages = [
{"role": "user", "content": "解释什么是机器学习,包括定义、原理、应用场景"},
{"role": "assistant", "content": "机器学习是..."},
{"role": "user", "content": "举一个具体的例子"} # 自动理解上下文
]Token 与上下文窗口
Token 数量影响上下文
上下文窗口: 4096 tokens
输入: 3000 tokens
可用输出: 4096 - 3000 = 1096 tokens
输入: 4000 tokens
可用输出: 4096 - 4000 = 96 tokens ⚠️ 几乎无法输出平台上下文窗口
| 模型 | 上下文窗口 | 说明 |
|---|---|---|
| GPT-4o | 128K Tokens | 128,000 |
| Claude 3.5 Sonnet | 200K Tokens | 200,000 |
| Gemini 3 Pro | 1M Tokens | 1,000,000 |
常见问题
Q: 为什么我的输入很短但 Token 很多?
可能原因:
- 包含特殊字符或代码
- 中文标点符号较多
- 包含 URL 或邮箱地址
Q: Token 计算有误差吗?
不同模型使用不同的 Tokenizer,计算结果可能略有差异。建议以 API 响应返回的 usage 字段为准。
Q: 如何准确计算 Token?
最准确的方式是通过 API 响应获取:
python
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "你好"}]
)
# 从响应中获取准确数量
print(f"Total Tokens: {response.usage.total_tokens}")