Skip to content

成本核算与优化:上下文/缓存/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 最佳实践

💭 总结

  • 用“上下文瘦身 + 缓存 + 路由 + 批处理”四件套控制成本
  • 以成本看板驱动优化,形成闭环