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_version | Prompt 版本 |
input_tokens | 输入 token |
output_tokens | 输出 token |
cached_tokens | 缓存 token |
retry_count | 重试次数 |
fallback_used | 是否 fallback |
estimated_cost | 预估成本 |
created_at | 时间 |
3. 成本异常排查
成本突然上涨时,按这个顺序排查:
- 哪个功能上涨。
- 哪个租户或用户上涨。
- input tokens 还是 output tokens 上涨。
- Prompt 是否变长。
- RAG top_k 是否变大。
- 是否新增长历史上下文。
- retry / fallback 是否异常。
- Agent 平均步数是否增加。
- 是否出现循环调用或批任务重复提交。
常见根因:
- 多轮历史没有裁剪。
- 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_version | Prompt 版本 |
| model | 模型 |
| estimated_cost | 预估成本 |
| max_budget | 预算上限 |
| retry_policy | 失败重试 |
| output_schema | 输出格式 |
| audit_owner | 负责人 |
8. 成本优化顺序
不要一开始就盲目换便宜模型。
推荐顺序:
- 删除无效上下文。
- 控制历史消息长度。
- 优化 RAG top_k 和 chunk。
- 结构化输出减少废话。
- 精确缓存高频低风险请求。
- 对离线任务使用 Batch。
- 用小模型做前置分类或路由。
- 对低风险任务使用低成本模型。
- 对高风险任务保留强模型和人工确认。
核心原则:省钱不能破坏安全和质量门槛。
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. 验收题
- 为什么供应商总账单不足以做成本治理?
- RAG 缓存 key 为什么必须包含权限和索引版本?
- 语义缓存适合哪些任务,不适合哪些任务?
- Batch 任务为什么需要 job 级预算?
- 成本优化为什么不应从“换便宜模型”开始?
- Agent 成本失控通常有哪些根因?