OpenAI Token 限制与计算

OpenAI 各模型有不同的 Token 限制和计算方式。本文全面介绍各模型的上下文窗口、Token 计算工具和优化技巧,帮你高效使用 API 配额。

各模型 Token 限制

GPT-4o 系列

GPT-4 Turbo

推理模型

Embedding 模型

什么是 Token?

Token 是 GPT 模型处理文本的最小单位。英文中一个单词通常被分割为 1-3 个 token,中文一个汉字通常占 1-2 个 token。

粗略估算规则:

使用 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. 使用更高效的模型

4. 利用 Prompt 缓存

重复的长输入会自动被缓存,缓存 token 费用减半。适合 RAG 场景中的固定文档上下文。

提示:通过 claude4u.com 轻舟 AI 中转服务,管理后台可视化展示每次调用的 Token 消耗明细,支持按模型和时间维度统计,帮你精准定位高消耗的调用场景并进行优化。
注意:当输入 token + max_tokens 超过模型上下文窗口时,API 会返回错误。建议在发送前使用 tiktoken 预估总 token 数,确保不超过限制。同时注意 max_tokens 设置过大并不会增加费用,只有实际生成的 token 才计费。

Start Using 轻舟 AI

Stable, fast AI API relay — supports Claude, OpenAI, Gemini and more

Sign Up Now