提示缓存省钱实战:同样效果,账单砍掉70%
当你的系统提示、知识库前缀、few-shot示例每次都在重复付费时,提示缓存是立竿见影的降本手段。本文讲原理、适用条件与工程改造。
做 AI 应用的团队常有个隐形浪费:每次调用都在为同样的内容重复付费。 你的系统提示词有两千字,知识库前缀有一千 token,few-shot 示例又是几百 token——这些内容每次请求都一样,却被反复计费。提示缓存(Prompt Caching)就是来解决这个问题的。
一、提示缓存的原理
大模型推理时,处理输入是分阶段的。缓存机制的核心思想是:把不变的输入前缀的结果缓存起来,下次请求如果前缀完全相同,就直接复用,只对新增的部分做计算。
效果体现在两块:
- 成本:缓存命中的 token 通常按原价的 10%~25% 计费,甚至更低。
- 延迟:跳过前缀计算,首 token 响应时间显著缩短。
二、什么样的内容适合缓存
判断标准只有一条:在多轮或多次请求中稳定复现,且足够长。
典型的可缓存内容:
- 冗长的系统指令(角色设定、输出规范、安全规则);
- 固定的知识库或文档前缀;
- 多轮对话里不变的 few-shot 示例;
- RAG 场景中作为公共前缀的模板与指令。
不适合缓存:每次都变的用户输入、动态拼接的中间结果。
三、关键约束:前缀必须逐字节一致
这是最容易翻车的地方。缓存命中要求从开头到缓存点完全一致——哪怕多一个空格、改一个标点,都会导致未命中。因此工程上要注意:
- 把可变内容放在最后,不变内容放在最前;
- 不要在系统提示里塞入带时间戳、随机数、会话 ID 的内容;
- 拼接提示时用统一的模板函数,避免各处手写导致格式漂移。
四、改造示例
改造前(每次全量重复计费):
prompt = (
"你是客服助手,规则如下……(2000字)…\n"
"知识库:" + full_kb + "(3000字)\n" # full_kb 很长
"用户问题:" + question
)
改造后(不变部分置前,显式标记缓存点):
messages = [
{"role": "system", "content": SYSTEM_RULES}, # 稳定,可缓存
{"role": "system", "content": KB_PREFIX, # 稳定,可缓存
"cache_control": {"type": "ephemeral"}},
{"role": "user", "content": question}, # 动态,放最后
]
多数主流 API 通过在内容的最后一个块上打 cache_control 标记来指定缓存边界。标记点之后的内容才会逐次计费。
五、算一笔账
假设每次请求固定前缀 4000 token,动态部分 500 token,每天 2 万次调用:
- 无缓存:4500 × 20000 = 9000 万 token/天
- 有缓存(前缀按 10% 计费):(4000×0.1 + 500) × 20000 = 1800 万 token/天
成本直接降到原来的 20%。 对固定场景的应用,账单砍掉 70%~80% 是常态。
六、三个实施建议
1. 监控命中率。 缓存的价值全在命中率。上线后必须埋点统计,命中率低于 60% 说明前缀不够稳定,要回头查拼接逻辑。
2. 注意缓存有效期。 缓存通常有 TTL(几分钟到几小时),低频调用可能每次都失效。高频场景收益最大。
3. 和安全策略协同。 不要把敏感数据放进可缓存前缀——需确认厂商的隔离机制。
结语
提示缓存是 AI 成本优化里投入产出比最高、改造量最小的一招:不用换模型、不用重训,只需把提示词结构重排一下、加个标记。如果你还没做,今天就该去查你的账单里有多少是”重复前缀税”。