你有没有发现,同样的代码库,第二次问Claude Code问题,响应更快、更便宜?

这不是错觉,是提示词缓存(Prompt Caching)在起作用。就像餐厅的预制菜——把常用的汤底提前准备好,客人点了直接加热,又快又省钱。

今天咱们就揭开这个"省钱秘籍"的面纱。

*图:提示词缓存像餐厅预制菜,提前准备好常用的"

为什么需要缓存

先算一笔账。

Claude API按token收费:输入token(发送给模型的)+ 输出token(模型返回的)。其中,系统提示词和工具定义每次都要发,这是"固定开销"。

假设:

  • 系统提示词:5K token
  • 工具定义:15K token
  • 历史对话:10K token
  • 单次请求总共:30K token

如果不用缓存,每次请求都要付30K的钱。但如果你在一个代码库里连续提问10次,系统提示词和工具定义其实是一样的——重复付费很浪费。

提示词缓存就是解决这个问题:把不变的"前缀"缓存起来,只付一次钱,后续请求复用。

缓存断点:从哪里切开

缓存不是整个提示词都缓存,而是有"断点"(breakpoint)的。

想象一下快递打包:不是整箱都贴标签,而是在特定位置贴标签,方便分拣。

Claude Code的缓存断点设计:

系统提示词:从开头到工具列表之前。这是最不常变的部分。

工具列表:按名称排序后的工具定义。这是相对稳定的。

动态内容:用户输入、历史消息、工具结果——这部分不缓存。

[系统提示词] ← 缓存断点1
[工具列表]   ← 缓存断点2
[历史消息]
[用户输入]

图:缓存断点设计,把提示词分成可缓存和不可缓存部分

当模型API收到请求时,会检查缓存断点之前的部分是否已经缓存。如果是,直接复用,只计费断点之后的部分。

工具排序:为什么顺序很重要

工具列表的排序直接影响缓存命中率。

假设你有这些工具:FileRead、FileEdit、Bash、Grep、Glob。如果顺序变来变去:

请求1: [Bash, FileRead, FileEdit, Glob, Grep]
请求2: [Bash, FileEdit, FileRead, Grep, Glob]  ← 顺序变了!缓存失效

只要有一个工具的位置变了,整个缓存键就变了,之前的缓存全部失效。

Claude Code的解决方案:稳定排序

  • 内置工具按固定顺序(如字母顺序)
  • MCP工具也按字母顺序
  • 内置工具在前,MCP工具在后

这样,只要工具集合不变,顺序就不变,缓存就能命中。

请求1: [Bash, FileEdit, FileRead, Glob, Grep] + [MCP-A, MCP-B]
请求2: [Bash, FileEdit, FileRead, Glob, Grep] + [MCP-A, MCP-B]  ← 缓存命中!

缓存中断:什么情况下会失效

缓存不是永久的,有些情况下会"中断":

工具增减:如果新增了MCP工具,或者禁用了某个工具,工具列表变了,缓存失效。

系统提示词更新:如果Claude Code版本更新,系统提示词变了,缓存失效。

模型切换:不同模型的系统提示词不同,切换模型缓存失效。

会话超时:缓存有过期时间,长时间不用会失效。

显式刷新:某些操作会触发缓存刷新。

理解这些中断场景,能帮你优化使用:

  • 不要频繁增减MCP工具
  • 在同一个会话中连续提问,命中率更高
  • 避免频繁切换模型

图:缓存中断的常见原因

实战:如何最大化缓存收益

如果你想最大化提示词缓存的收益,可以试试:

保持会话连续性:在同一个代码库里连续提问,不要频繁开启新会话。

稳定工具配置:确定好要用的MCP工具,不要频繁增减。

利用CLAUDE.md:项目级的配置放在CLAUDE.md,它会被包含在缓存前缀中,保持稳定性。

监控缓存命中率:Claude Code的状态输出会显示缓存命中情况。

理解成本结构:缓存命中时,只需要付用户输入+输出的token费用,系统部分免费。

成本对比:缓存能省多少钱

实际能省多少?举个例子:

场景:在一个大型代码库中连续提问10次

无缓存

  • 每次请求:30K token × 10次 = 300K token

有缓存(假设80%命中)

  • 第一次:30K token(建立缓存)
  • 后续9次:5K token(用户输入)× 9 = 45K token
  • 总计:75K token

节省:(300K - 75K) / 300K = 75%

实际节省比例取决于使用模式,但通常能达到50-80%。

这对构建AI Agent的启示

如果你想在自己的AI应用中实现提示词缓存:

识别不变的前缀:系统提示词、工具定义是相对稳定的,适合缓存。

设计稳定的排序:确保工具列表的顺序在请求之间保持一致。

设置合理的断点:在"稳定部分"和"动态部分"之间设置断点。

处理缓存失效:当缓存失效时,优雅地回退到非缓存模式。

监控和优化:提供缓存命中率的可见性,帮助用户优化。

总结

提示词缓存是Claude Code的"省钱秘籍",通过缓存不变的系统提示词和工具定义,大幅降低API调用成本。

关键设计:

  • 缓存断点:把提示词分成可缓存和不可缓存部分
  • 稳定排序:工具列表保持固定顺序,确保缓存命中
  • 中断处理:识别缓存失效场景,优雅处理

理解这一点,能让你:

  • 更有效地使用Claude Code(保持会话连续性)
  • 理解成本结构(知道钱花在哪儿)
  • 在自己的AI应用中实现类似的优化

下一篇,咱们聊聊当AI的"脑子"不够用时——压缩与微压缩。


文章写到这儿,希望对你理解提示词缓存有所帮助。觉得有收获的话,欢迎点赞转发。关注梦兽编程,咱们下篇见。