缓存的钱:同样的活,账单省 56.8%
一个调整消息顺序的动作,值一半的账单
AI 产品最贵的部分往往不是"生成",是每次都重发的那一大坨上下文:系统提示、知识库片段、长规范、对话历史。它们每次都被完整计费——但明明一个字都没变。
服务商为此提供了上下文缓存:同样的前缀,第二次起按极低价计费。这一节实测给你看:同一份长文档连问三次,总账单从 0.77 分降到 0.33 分,省了 56.8%——代价是调整一下消息顺序。
去复印店:每次都把整本书重印一遍,还是把书留在店里、每次只印新的那几页?缓存就是"把不变的部分留在店里"。你要做的只有一件事:把不变的放前面,变的放后面——这样店家才认得出"这本书我这儿有"。
实测:三次提问的账单
一份约 3600 字的"报销规定"当固定前缀,三个不同问题连续问:
第1次:输入 2514 tok = 命中缓存 0 + 未命中 2514 | 输出 44
本次成本:0.2602 分(若无缓存也是 0.2602 分) ← 第一次总要付全价
第2次:输入 2512 tok = 命中缓存 2432 + 未命中 80 | 输出 25
本次成本:0.0373 分(若无缓存则 0.2562 分) ← 掉到 1/7
第3次:输入 2513 tok = 命中缓存 2432 + 未命中 81 | 输出 12
本次成本:0.0348 分(若无缓存则 0.2537 分)
总计:实际 0.3323 分 vs 无缓存 0.7701 分 → 省了 56.8%
看第 2 次那行:2512 个输入 token 里,2432 个命中了缓存——只有你新问的那 80 个 token 按原价算。命中部分的单价大约是未命中的十分之一(具体倍率以服务商价格页为准)。
而且不止省钱:命中缓存的部分不用重新计算,延迟也更低(实测 1.04s → 0.89s)。
怎么让缓存命中:一条规矩
不变的放前面,变的放后面。
具体到消息结构:
messages = [
{"role": "system", "content": 长期不变的系统提示}, # ← 缓存友好
{"role": "user", "content": 知识库片段 + "\n\n问题:" + 用户这次的问题},
]
三个亲手废掉缓存的常见写法(踩了就一分不省):
| 反面写法 | 为什么废 |
|---|---|
| 系统提示里塞当前时间戳 | 每次前缀都不同,永不命中 |
| 每次请求把用户 id / 随机 id 放最前面 | 同上 |
| 知识库片段每次顺序不同(比如按相关度重排后拼接) | 前缀变了 |
RAG 场景(AP4)要特别注意第三条:检索结果每次不同是正常的,但把"稳定的部分"(系统提示、固定的格式要求)提到最前面,至少能让那一段命中。
什么时候缓存最值钱
| 场景 | 收益 |
|---|---|
| 长系统提示 + 大量短问题(客服、助手) | ⭐⭐⭐ 最典型,省一半起 |
| 同一文档多轮问答(本节实验) | ⭐⭐⭐ |
| 多轮对话(历史越来越长) | ⭐⭐ 前面的历史可命中 |
| 每次内容都完全不同(批量处理不同文本) | ❌ 基本无收益,别指望 |
🔧 动手做:算清你自己产品的缓存账(12 分钟)
- 跑本节代码
cache_money.py,看你自己的命中数字(可能和我的略有差异,缓存策略会调整)。 - 亲手废掉它:在 system 消息最前面加一句
f"当前时间:{time.time()}",再跑——命中数应该变成 0,成本回到全价。这是最直观的"反面教材"。 - 改回来,再跑一次确认命中恢复。
- 算你的账:按你毕业方向估算——系统提示多少 token?每天多少次调用?用「未命中价 × 全量」和「首次全价 + 后续命中价」各算一遍月账单,差多少?
- 把结论写进笔记:我的产品里,哪一段是"不变的前缀"?我把它放最前面了吗?
✅ 做到这里你应该有:你自己的命中数据 + 一次亲手废掉缓存的实验 + 一份月账单对比。
为什么:成本优化里,缓存是投入产出比最高的一项——不改逻辑、不降质量,只调消息顺序,账单直接减半。而且这个习惯要在第一天就养成:等你的产品跑起来了、提示词写得到处都是时间戳时,再回头改就是重构。
两个边界要知道:① 有有效期——前缀缓存通常只保留一段时间(分钟级到小时级,以服务商说明为准),太久没用会失效,下次又是全价;② 不保证命中——服务商侧的缓存是"尽力而为"的优化,不是承诺,你的成本模型不能建立在"必然命中"上。正确姿势:按未命中价格做预算,把命中当作省下来的意外之喜。
这是我产品的消息结构:【贴出你的 system/user 消息构造代码】。请帮我:1) 找出哪些内容是「每次不变」的,应该提到最前面;2) 指出有没有「亲手废掉缓存」的写法(时间戳/随机 id/顺序不稳定);3) 重排后给出新的构造代码;4) 估算命中缓存后能省多少。
缓存三句话:不变的放前面(省 56.8%)、时间戳和随机 id 是缓存杀手、按未命中价做预算;它同时还降延迟。
下一节讲一个"不省钱但能救命"的话题:密钥——写进代码推上 GitHub 的那一刻,你的余额就是全世界的了。
🔎 来源与核验· 2 条,点开核对
