共计 1579 个字符,预计需要花费 4 分钟才能阅读完成。
背景解析:为什么 token 消耗会烧钱
Claude API 按照输入和输出 token 总数计费,1k tokens≈1 美分看起来不贵,但实际开发中容易掉进这些坑:

- 对话历史重复 :每次请求都附带完整对话上下文,造成 token 重复计算
- 冗余格式标记 :JSON payload 中包含不必要的空格、换行和说明文字
- 过度输出 :未限制 max_tokens 导致返回内容远超实际需求
举个真实案例:一个包含 10 轮对话的聊天机器人,如果不做优化每月 API 费用可能高达 $300+。
核心优化策略
1. 请求结构精简技巧
优化前(含冗余格式):
{
"prompt": "请解释量子计算",
"model": "claude-2.1",
"max_tokens": 500 # 默认值过高
}
优化后:
{"prompt":"解释量子计算","model":"claude-2.1","max_tokens":150}
效果对比 :
– 输入 token 减少 40%
– 输出限制避免无效消耗
2. 响应截断参数实战
import anthropic
client = anthropic.Client(api_key="YOUR_KEY")
response = client.completion(prompt="总结这篇文章:" + article_text[:2000], # 先截断长输入
stop_sequences=["\n\n"], # 遇到双换行停止
max_tokens_to_sample=100 # 严格限制输出
)
关键参数说明:
– stop_sequences:设置停止词可提前终止生成
– truncate 参数:直接截断超长输入(v2.1+ 版本支持)
3. 对话历史缓存方案
# 使用 LRU 缓存最近 3 轮对话
from functools import lru_cache
@lru_cache(maxsize=3)
def get_dialog_history(user_id):
return [] # 实际从数据库读取
# 每次只附加最新交互
def build_prompt(user_input):
history = get_dialog_history(user_id)
return "\n".join(history[-3:] + [user_input]) # 限制上下文长度
性能测试数据
| 优化方法 | token 节省率 | 实施难度 |
|---|---|---|
| 精简 JSON 结构 | 15-25% | ★☆☆☆☆ |
| 设置 max_tokens | 30-50% | ★★☆☆☆ |
| 对话历史管理 | 40-60% | ★★★☆☆ |
| 响应截断 | 20-35% | ★★☆☆☆ |
避坑指南
- 上下文重复问题
- 错误做法:每次发送完整对话历史
-
正确方案:只传递最近 2 - 3 轮关键对话
-
max_tokens 黄金值
# 根据场景动态设置 max_tokens = min(len(input_text)//2, 300) # 输出不超过输入的一半 -
长文本处理策略
- 先本地用 NLTK 分句
- 分批发送并汇总结果
进阶监控方案
用装饰器实现用量统计:
def token_counter(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
tokens = estimate_tokens(result) # 估算函数
log_usage(tokens, kwargs['model'])
return result
return wrapper
@token_counter
def call_claude(prompt):
return client.completion(prompt=prompt)
实践任务
- 改造你的 API 调用代码,实现 JSON 压缩(目标:减少 20% 输入 token)
- 为现有项目添加对话缓存,限制历史记录不超过 3 轮
- 编写 token 消耗监控脚本,统计每日各端点的用量分布
优化后你会发现:同样的功能,费用可能降低 60% 以上。关键在于持续监控和迭代改进,就像优化数据库查询一样对待 API 调用。
正文完
发表至: 技术分享
近三天内
