跳到主要内容

03-成本预算与缓存

核对日期:2026-05-13。

不稳定项:模型定价、缓存计费、Batch 折扣、上下文缓存能力、供应商 usage 字段和企业账单口径变化较快;所有成本估算都必须以上线时官方账单和实际 trace 为准。

1. 学习目标

本专题关注 LLMOps 的经济性:如何知道钱花在哪里,如何控制异常成本,如何用缓存、Batch 和预算机制减少浪费。

学完后你应该能做到:

  • 设计 token、成本、租户、功能、模型和版本维度的成本账本。
  • 判断哪些请求适合缓存,哪些请求不应该缓存。
  • 设计权限感知、版本感知的缓存 key。
  • 区分精确缓存、语义缓存、检索缓存、工具缓存和 prefix cache。
  • 设计免费用户、团队用户和企业租户的预算策略。

2. 成本账本

只看供应商月账单没有意义,生产系统需要能定位到:

  • 哪个租户。
  • 哪个功能。
  • 哪个用户群。
  • 哪个模型。
  • 哪个 Prompt 版本。
  • 哪个 RAG 索引版本。
  • 哪类任务。
  • 哪次 fallback 或 retry。

推荐字段:

字段说明
trace_id对应一次请求
tenant_id租户或团队
feature功能
task_type任务类型
model模型
provider供应商
prompt_versionPrompt 版本
input_tokens输入 token
output_tokens输出 token
cached_tokens缓存 token
retry_count重试次数
fallback_used是否 fallback
estimated_cost预估成本
created_at时间

3. 成本异常排查

成本突然上涨时,按这个顺序排查:

  1. 哪个功能上涨。
  2. 哪个租户或用户上涨。
  3. input tokens 还是 output tokens 上涨。
  4. Prompt 是否变长。
  5. RAG top_k 是否变大。
  6. 是否新增长历史上下文。
  7. retry / fallback 是否异常。
  8. Agent 平均步数是否增加。
  9. 是否出现循环调用或批任务重复提交。

常见根因:

  • 多轮历史没有裁剪。
  • Prompt 模板重复拼接。
  • 文档 chunk 太大。
  • RAG 召回过多。
  • 结构化输出失败导致多次重试。
  • 评测任务误跑到实时高价模型。

4. 缓存类型

缓存类型适用风险
精确缓存同输入、同版本、同权限key 不完整导致旧答案或越权
Prefix cache长系统提示和长上下文依赖 provider 能力和计费规则
语义缓存FAQ、低风险相似问题相似但不等价导致错误
Retrieval cache热点检索结果权限和索引版本必须入 key
Tool cache外部只读工具结果数据过期
Eval cache评测重复调用不能掩盖模型变化

高风险任务慎用语义缓存,例如合同审查、医疗建议、权限判断、生产变更。

5. 缓存 key 设计

缓存 key 必须包含影响输出的全部关键因素。

推荐组成:

tenant_id
user_scope
feature
task_type
model
prompt_version
input_hash
output_schema_version
rag_index_version
policy_version
tool_version

如果是 RAG,还要包含:

  • 文档权限范围。
  • 文档版本。
  • chunk 策略版本。
  • rerank 模型版本。

反例:

cache_key = hash(user_question)

这个 key 会导致不同权限用户拿到同一答案,也会让旧索引答案在文档更新后继续命中。

6. 预算维度

预算不只是总额度。

维度示例
用户级单用户每天最多调用次数和 token
租户级企业租户月预算
功能级客服草稿、RAG 问答、Agent 工具规划
模型级强模型调用额度
风险级高风险任务单独预算
时间窗口每分钟、每日、每月

预算超限处理:

  • 提示缩短输入。
  • 排队。
  • 降低输出长度。
  • 切低成本模式。
  • 请求管理员审批。
  • 保存任务状态并停止。

7. Batch 和异步成本

Batch 适合:

  • 离线摘要。
  • 大量分类。
  • 评测运行。
  • 数据清洗。
  • 周期性报告。

不适合:

  • 实时用户交互。
  • 高风险逐条审批。
  • 需要 streaming 的体验。

Batch 设计字段:

字段说明
job_id批任务 ID
input_file_version输入版本
prompt_versionPrompt 版本
model模型
estimated_cost预估成本
max_budget预算上限
retry_policy失败重试
output_schema输出格式
audit_owner负责人

8. 成本优化顺序

不要一开始就盲目换便宜模型。

推荐顺序:

  1. 删除无效上下文。
  2. 控制历史消息长度。
  3. 优化 RAG top_k 和 chunk。
  4. 结构化输出减少废话。
  5. 精确缓存高频低风险请求。
  6. 对离线任务使用 Batch。
  7. 用小模型做前置分类或路由。
  8. 对低风险任务使用低成本模型。
  9. 对高风险任务保留强模型和人工确认。

核心原则:省钱不能破坏安全和质量门槛。

9. 工程案例

9.1 RAG 问答成本上涨

现象:RAG 问答成本一周内上涨 60%。

排查:

  • 平均 input_tokens 从 2500 增至 6000。
  • 最近把 top_k 从 5 调到 12。
  • Prompt 新增了完整聊天历史。

修复:

  • top_k 回到 6。
  • 对历史做摘要和截断。
  • 引入证据去重。
  • 对 FAQ 做权限感知精确缓存。

9.2 Agent 成本失控

现象:Agent 平均成本翻倍。

根因:

  • 工具失败后反复规划。
  • 没有最大步数。
  • retry 后重复读取大文件。

修复:

  • 最大步数限制。
  • 工具失败分类。
  • 文件读取缓存。
  • 轨迹 eval 加入循环样例。

10. 常见反模式

反模式表现风险修正
只看总账单不知道谁花钱无法治理成本账本分维度
cache key 只含问题越权和旧答案安全事故权限和版本入 key
语义缓存用在高风险任务相似问题误命中质量事故仅低风险使用
为省钱换弱模型高风险漏判业务事故eval + 风险分级
Batch 无预算上限离线任务烧钱成本爆炸job 级预算
日志不记录 retry看不出重复扣费排查困难记录 retry/fallback

11. 练习

为“企业知识库问答系统”设计成本治理方案:

  • 成本账本字段。
  • 缓存 key。
  • 哪些问题允许缓存。
  • 哪些问题禁止缓存。
  • 免费用户、团队用户、企业租户预算。
  • 成本异常告警。

12. 验收题

  1. 为什么供应商总账单不足以做成本治理?
  2. RAG 缓存 key 为什么必须包含权限和索引版本?
  3. 语义缓存适合哪些任务,不适合哪些任务?
  4. Batch 任务为什么需要 job 级预算?
  5. 成本优化为什么不应从“换便宜模型”开始?
  6. Agent 成本失控通常有哪些根因?