共计 2693 个字符,预计需要花费 7 分钟才能阅读完成。
技术背景:Token 在 API 调用中的意义
Token 是自然语言处理中的基本计算单位,通常对应约 4 个英文字符或 0.75 个单词。API 服务商通过 token 配额限制使用量,主要基于:

- 模型复杂度:更大模型需要更多计算资源
- 输入输出长度:请求和响应内容都计入 token 消耗
- 频次控制:防止系统过载的流量管理机制
官方通常提供计算工具(如 OpenAI 的tiktoken),建议在开发阶段就集成到监控流程中。
问题诊断:计算 token 消耗
精确计算需要三个要素:
- 模型类型 :不同模型的分词器(tokenizer) 不同
- 输入文本:包括 prompt 和附加参数
- 预期输出:最大长度设置直接影响 token 预算
使用 Python 快速计算的示例:
import tiktoken
def count_tokens(text, model_name="gpt-3.5-turbo"):
encoding = tiktoken.encoding_for_model(model_name)
return len(encoding.encode(text))
# 示例:计算 1500 字报告的 token 消耗
report = "你的长文本内容..."
print(f"Token 用量: {count_tokens(report)}")
优化方案:三大实用技巧
方法 1:请求批处理
将多个独立请求合并为单个 batch 请求,减少 API 调用开销:
import openai
from concurrent.futures import ThreadPoolExecutor
inputs = ["问题 1", "问题 2", "问题 3"] # 待处理的多个输入
def batch_process(prompts, model="gpt-3.5-turbo"):
responses = []
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [
executor.submit(
openai.ChatCompletion.create,
model=model,
messages=[{"role": "user", "content": p}]
) for p in prompts
]
for future in futures:
try:
responses.append(future.result())
except Exception as e:
print(f"请求失败: {e}")
return responses
适用场景:处理大量独立短文本时效率提升显著
方法 2:结果缓存
对重复性查询实施缓存机制:
from functools import lru_cache
import hashlib
@lru_cache(maxsize=1000)
def cached_query(prompt, model="gpt-3.5-turbo"):
cache_key = hashlib.md5((prompt+model).encode()).hexdigest()
# 先检查本地缓存
if cache_key in local_cache:
return local_cache[cache_key]
# 无缓存则调用 API
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
local_cache[cache_key] = response # 存储结果
return response
适用场景:FAQ 类、配置查询等重复性高的请求
方法 3:精简输入输出
通过预处理减少无效 token 消耗:
def optimize_input(text):
# 移除多余空格和换行
text = ' '.join(text.split())
# 过滤停用词(需自定义列表)stop_words = {"的", "是", "在"}
words = [w for w in text.split() if w not in stop_words]
return ' '.join(words)
# 使用优化后的输入调用 API
clean_prompt = optimize_input("请详细说明...")
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": clean_prompt}],
max_tokens=150 # 明确限制输出长度
)
适用场景 :用户生成内容(UGC) 等可能存在冗余的输入
模型选择指南
| 模型类型 | 每千 token 成本 | 适合场景 | 长度限制 |
|---|---|---|---|
| gpt-3.5-turbo | $0.002 | 常规对话、基础任务 | 4096 tokens |
| text-davinci-003 | $0.02 | 复杂逻辑处理 | 4097 tokens |
| gpt-4 | $0.03~0.06 | 高精度需求 | 8192~32768 tokens |
选择原则:
1. 先用小模型验证流程可行性
2. 根据输出质量需求逐步升级
3. 长文本优先考虑上下文窗口大的模型
避坑建议
错误 1:忽略系统消息计入 token
现象:实际消耗比预期多 20%-30%
解决:将固定指令移出 API 调用,改为本地预处理
错误 2:未处理长文本自动截断
现象:返回结果不完整无警告
解决 :主动检查finish_reason 字段:
if response['choices'][0]['finish_reason'] == 'length':
print('输出因长度限制被截断')
错误 3:并发请求导致配额超限
现象 :突发性429 Too Many Requests 错误
解决:实现指数退避重试机制:
import time
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_api_call(prompt):
return openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
实践挑战
尝试选取你最近的一个 API 调用案例:
1. 使用 tiktoken 计算实际 token 消耗
2. 应用至少一种优化方法重构代码
3. 比较优化前后的 token 使用效率差异
将你的实践结果通过 max_tokens 参数显式设置,观察质量与消耗的平衡点。记住:最佳优化往往是多次迭代的结果。
正文完
