成本核算与优化:上下文/缓存/Batching/路由
目标是“把钱花在刀刃上”,用路由与缓存撑住规模。 注:本文为“1 月份重点篇”,给出成本计算方式与优化抓手。
🎯 文章目标
- 建立 token 成本与上下文长度的量化认知
- 用缓存/路由/批处理降低单位请求成本
- 给出可复用的成本看板指标
📚 背景/前置
- 成本构成:输入 token + 输出 token + 附加能力(长上下文/多模态)
- 变量:模型单价、平均输入/输出长度、命中率、缓存复用率
🔧 核心内容
1) 成本量化公式
- 单次成本 ≈ Cin × Pin + Cout × Pout
- Cin = 平均输入 token;Cout = 平均输出 token
- Pin/Pout = 输入/输出单价(按模型供应商定价)
- 月成本 ≈ 单次成本 × QPS × 秒/请求 × 30 天
2) 优化抓手
- 上下文瘦身:模板去冗余、片段裁剪、滑动窗口
- 缓存:前缀缓存/KV 缓存(prompt 不变的场景收益大)
- 路由:简单任务小模型、复杂任务大模型兜底;支持回退与熔断
- Batching:后台任务合并请求,提升吞吐并摊薄成本
3) 成本看板指标
- 每请求 token 数(in/out)、平均成本、命中率、缓存复用率
- 模型分布:各模型调用占比、失败率、平均延迟
- 预算消耗:按产品/任务/用户维度切片
💡 实战示例:简单成本估算脚本
python
# pip install pandas
import pandas as pd
pricing = {
'qwen2.5-7b-instruct': { 'in': 1.0, 'out': 3.0 }, # 元/百万 token,示例
'qwen2.5-32b-instruct': { 'in': 4.0, 'out': 12.0 },
}
sample = pd.DataFrame({
'model': ['qwen2.5-7b-instruct']*3 + ['qwen2.5-32b-instruct']*3,
'Cin': [800, 1200, 600, 800, 1200, 600],
'Cout': [200, 300, 150, 200, 300, 150],
})
sample['cost'] = sample.apply(lambda r: (r['Cin']*pricing[r['model']]['in'] + r['Cout']*pricing[r['model']]['out'])/1e6, axis=1)
print(sample.groupby('model')['cost'].mean())
📊 对比/取舍(速查)
- 路由优先:按任务选择模型,避免“大材小用”
- 缓存优先:命中率是成本的第一决定因素
- 窗口控制:长上下文的代价往往超出直觉
🧪 踩坑与经验
- 成本黑箱:不记录 token 用量,无法优化
- 缓存误用:prompt 变化导致缓存失效;要有命中率看板
- 路由绕行:前端直连模型绕过网关,成本失控
📎 参考与延伸
- 各家模型定价页(注意单位与版本)
- 路由策略与熔断实践
- KV/Prefix Cache 最佳实践
💭 总结
- 用“上下文瘦身 + 缓存 + 路由 + 批处理”四件套控制成本
- 以成本看板驱动优化,形成闭环