OpenAI Token 限制与计算
OpenAI 各模型有不同的 Token 限制和计算方式。本文全面介绍各模型的上下文窗口、Token 计算工具和优化技巧,帮你高效使用 API 配额。
各模型 Token 限制
GPT-4o 系列
- GPT-4o:上下文 128K token,最大输出 16,384 token
- GPT-4o mini:上下文 128K token,最大输出 16,384 token
GPT-4 Turbo
- GPT-4 Turbo:上下文 128K token,最大输出 4,096 token
推理模型
- o1:上下文 200K token,最大输出 100,000 token
- o3-mini:上下文 200K token,最大输出 100,000 token
Embedding 模型
- text-embedding-3-small/large:最大输入 8,191 token
什么是 Token?
Token 是 GPT 模型处理文本的最小单位。英文中一个单词通常被分割为 1-3 个 token,中文一个汉字通常占 1-2 个 token。
粗略估算规则:
- 英文:1 token 约 4 个字符,或约 0.75 个单词
- 中文:1 个汉字约 1-2 个 token
- 代码:1 行代码约 5-15 个 token
- 1000 token 约等于 750 个英文单词或 500 个中文字
使用 tiktoken 精确计算
OpenAI 提供了 tiktoken 库来精确计算 token 数量:
import tiktoken
# GPT-4o 使用 o200k_base 编码
enc = tiktoken.encoding_for_model("gpt-4o")
text = "OpenAI 的 GPT-4o 是一个强大的多模态模型"
tokens = enc.encode(text)
print(f"文本: {text}")
print(f"Token 数量: {len(tokens)}")
print(f"Token 列表: {tokens}")
# 查看每个 token 对应的文本
for token in tokens:
print(f" {token} => '{enc.decode([token])}'")
# 批量计算
texts = [
"Hello, world!",
"你好,世界!",
"def fibonacci(n): return n if n < 2 else fibonacci(n-1) + fibonacci(n-2)"
]
for t in texts:
count = len(enc.encode(t))
print(f"{count:4d} tokens: {t}")
安装 tiktoken
pip install tiktoken
计算完整请求的 Token
API 请求的总 token 包含多个部分:
import tiktoken
def count_message_tokens(messages, model="gpt-4o"):
"""计算消息列表的总 token 数"""
enc = tiktoken.encoding_for_model(model)
tokens_per_message = 3 # 每条消息的固定开销
tokens_per_name = 1
total = 0
for message in messages:
total += tokens_per_message
for key, value in message.items():
total += len(enc.encode(value))
if key == "name":
total += tokens_per_name
total += 3 # 回复的固定开销
return total
messages = [
{"role": "system", "content": "你是一个编程助手"},
{"role": "user", "content": "用 Python 写一个快速排序算法"},
{"role": "assistant", "content": "以下是快速排序的实现..."},
{"role": "user", "content": "能加上注释吗?"}
]
total = count_message_tokens(messages)
print(f"总输入 Token: {total}")
print(f"预估费用(GPT-4o): ${total / 1_000_000 * 2.50:.6f}")
Node.js Token 计算
// 使用 js-tiktoken 库
import { encodingForModel } from 'js-tiktoken';
const enc = encodingForModel('gpt-4o');
const text = '你好,我想了解 OpenAI API 的使用方法';
const tokens = enc.encode(text);
console.log(`Token 数量: ${tokens.length}`);
// 或使用 tiktoken 的 npm 包
// npm install tiktoken
import { encoding_for_model } from 'tiktoken';
const encoder = encoding_for_model('gpt-4o');
const encoded = encoder.encode('Hello, world!');
console.log(`Token count: ${encoded.length}`);
encoder.free(); // 释放 WASM 内存
Token 优化策略
1. 压缩 System Prompt
# 优化前(约 150 token)
system = """你是一个非常专业的人工智能助手。你需要用中文回答用户的所有问题。
你的回答应该准确、有帮助、并且尽可能详细。如果你不确定答案,
请诚实地告诉用户你不确定。你应该避免生成有害的内容。"""
# 优化后(约 30 token)
system = "中文回答。准确、详细。不确定时明说。"
2. 管理对话历史
def trim_messages(messages, max_tokens=4000, model="gpt-4o"):
"""保持消息在 token 限制内"""
enc = tiktoken.encoding_for_model(model)
# 始终保留 system message 和最新用户消息
system_msg = [m for m in messages if m["role"] == "system"]
latest_msg = messages[-1]
trimmed = system_msg.copy()
remaining = max_tokens - count_message_tokens(trimmed + [latest_msg])
# 从最新的消息开始添加历史
history = [m for m in messages if m["role"] != "system"][:-1]
for msg in reversed(history):
msg_tokens = len(enc.encode(msg["content"])) + 4
if remaining >= msg_tokens:
trimmed.insert(len(system_msg), msg)
remaining -= msg_tokens
else:
break
trimmed.append(latest_msg)
return trimmed
3. 使用更高效的模型
- 简单任务用 GPT-4o mini(Token 单价低 16 倍)
- 只需要 Embedding 时用 text-embedding-3-small
- 复杂推理用 o3-mini 而非 o1(性价比更高)
4. 利用 Prompt 缓存
重复的长输入会自动被缓存,缓存 token 费用减半。适合 RAG 场景中的固定文档上下文。
提示:通过 claude4u.com 轻舟 AI 中转服务,管理后台可视化展示每次调用的 Token 消耗明细,支持按模型和时间维度统计,帮你精准定位高消耗的调用场景并进行优化。
注意:当输入 token + max_tokens 超过模型上下文窗口时,API 会返回错误。建议在发送前使用 tiktoken 预估总 token 数,确保不超过限制。同时注意 max_tokens 设置过大并不会增加费用,只有实际生成的 token 才计费。
轻舟 AI