Claude Code 构建经验:Prompt Caching 才是关键

Anthropic 在复盘 Claude Code 的构建经验时,把 prompt caching 放到了非常核心的位置。对代码 Agent 来说,系统提示词、工具定义、项目上下文和历史对话会快速膨胀,如果每一轮都完整重算,不仅慢,而且贵。本文用中文重新梳理 Claude Code 的实践:如何组织稳定前缀、如何处理工具定义、如何配合上下文压缩,以及普通 AI 应用开发者可以直接借鉴的提示词架构。

阅读时长: 5 分钟
共 2297字
作者: longlikun

很多人理解 AI 编程工具时,第一反应是模型能力、工具调用、代码搜索、终端执行和编辑体验。但 Anthropic 在复盘 Claude Code 的经验时,给出的重点反而更底层:prompt caching 是一切的基础

这并不难理解。一个代码 Agent 和普通聊天机器人不同,它每一轮都可能带上大量重复内容:系统提示词、工具定义、项目结构、用户偏好、历史操作、文件片段、错误日志、计划和中间结论。如果这些内容每次都从零处理,成本会很高,延迟也会被拉长。

Prompt caching 要解决的就是这个问题:让模型复用前面已经处理过的稳定上下文,只为新增加的部分付出主要计算成本。

为什么 Claude Code 特别依赖缓存

Claude Code 的典型工作流是多轮、长上下文、工具密集型的。用户不是简单问一句“这段代码什么意思”,而是会让它浏览项目、修改文件、运行测试、分析报错,然后继续根据结果调整。

这类任务有三个特点:

  1. 上下文越来越长。
  2. 大量前缀内容在多轮之间保持不变。
  3. 每一轮真正新增的信息通常只占一小部分。

如果没有缓存,每次调用模型都要重新处理完整上下文。哪怕只是新增一条测试报错,也要重新读一遍系统提示词、工具 schema、之前的执行记录和项目背景。对于一个需要连续工作十几轮的 Agent 来说,这会直接影响产品体验。

Prompt caching 的价值就在这里:它不是一个锦上添花的优化,而是长上下文 Agent 能不能跑得顺的前提。

核心原则:稳定内容放前面,变化内容放后面

最值得记住的一条经验是:缓存依赖稳定前缀

也就是说,提示词越前面的部分越应该稳定。系统提示词、工具定义、长期规则、固定格式要求,这些内容适合放在最前面;用户本轮输入、工具返回结果、临时状态、最新错误日志,则应该放在后面。

可以把一次 Agent 调用理解成这样的结构:

稳定系统提示词
稳定工具定义
稳定开发规则
较稳定的项目背景
较新的对话摘要
最近几轮消息
本轮用户输入
本轮工具结果

前面的内容越稳定,缓存命中率越高。反过来,如果你把一个每轮都会变化的时间戳、随机 ID、临时状态塞到系统提示词前部,就等于主动破坏缓存。

工具定义也要当成缓存资产

AI Agent 往往有很多工具:读取文件、搜索代码、编辑文件、运行命令、提交 patch、打开网页等。每个工具都有名称、描述、参数 schema 和使用约束,这些定义本身就会占用不少 token。

Claude Code 的经验是,工具定义不只是“告诉模型有哪些能力”,它们也是需要精心管理的缓存资产。

实践上可以注意几件事:

  • 工具名称和参数结构尽量稳定,不要频繁动态生成。
  • 工具描述不要混入每轮都会变化的运行状态。
  • 工具列表要有确定顺序,避免同一组工具每次排列都不同。
  • 把用户本轮意图和工具定义分开,不要为了“更智能”而在工具 schema 里塞临时上下文。

很多 Agent 应用慢,并不是模型真的慢,而是提示词组织方式导致缓存持续失效。

缓存边界其实是架构边界

做普通 Web 应用时,我们会区分静态资源、接口数据、会话状态和临时 UI 状态。做 LLM 应用时也一样,只是边界变成了 prompt 的组织方式。

一个健康的上下文结构,通常应该能回答这几个问题:

  • 哪些 token 在很多轮里都不会变?
  • 哪些 token 只在当前任务里相对稳定?
  • 哪些 token 每一轮都会变化?
  • 哪些内容值得进入长期上下文,哪些应该只作为短期工具结果?
  • 压缩后的摘要应该放在哪个层级,避免每轮重写导致缓存失效?

Prompt caching 逼着开发者把这些问题想清楚。它看起来是性能优化,实际上会反过来塑造 Agent 的架构。

上下文压缩不能替代缓存

长任务一定会遇到上下文膨胀,所以很多 Agent 会引入 compaction,也就是把前面的对话和操作压缩成摘要。

但压缩不是缓存的替代品。压缩解决的是“上下文太长”的问题,缓存解决的是“重复上下文太贵”的问题。两者应该配合使用。

更合理的做法是分层:

  • 系统提示词和工具定义保持高度稳定。
  • 项目背景、开发约定等内容尽量少变。
  • 压缩摘要只在必要时更新。
  • 最近几轮原始消息保留在尾部。
  • 本轮输入和工具结果永远放在最后。

如果每一轮都重写摘要,并且把摘要放在很靠前的位置,就会把后面的缓存也一起打碎。看似上下文变短了,实际延迟和成本未必更好。

给普通 AI 应用开发者的启发

即使你不做 Claude Code 这种复杂代码 Agent,prompt caching 的思路也很值得借鉴。

第一,把 prompt 当成数据结构,而不是一段字符串。
不要把所有东西拼成一大坨文本。系统规则、工具定义、业务背景、用户输入、检索结果、临时状态,应该分层组织。

第二,避免无意义的变化。
时间戳、随机排序、每轮变化的说明文字、动态生成但内容等价的 schema,都会影响缓存命中。能稳定就稳定。

第三,先优化前缀,再优化局部。
很多人一上来就压缩用户输入或减少工具返回,当然这也有用。但对长任务来说,更关键的是让大块稳定前缀可复用。

第四,把缓存指标纳入调试。
只看总 token 数是不够的,还要看缓存创建和缓存读取的比例。一个 8 万 token 的调用,如果 7 万 token 都能从缓存读,体验可能比一个反复失效的 2 万 token 调用更好。

一个可套用的提示词结构

如果你正在做 Agent,可以先从这个结构开始:

[System]
- 产品身份
- 行为边界
- 输出规范
- 安全规则

[Tools]
- 稳定的工具列表
- 稳定的参数 schema
- 稳定的工具使用约束

[Project Context]
- 项目结构
- 代码规范
- 用户长期偏好

[Task Memory]
- 当前任务目标
- 已完成步骤
- 重要中间结论

[Recent Messages]
- 最近几轮用户和助手消息

[Current Turn]
- 本轮用户请求
- 本轮检索结果
- 本轮工具输出

这里的顺序很重要。越靠前,越要稳定;越靠后,越可以变化。

总结

Claude Code 的经验说明,Agent 产品的关键不只是“接入一个更强的模型”,而是要认真设计上下文的生命周期。

Prompt caching 能降低延迟和成本,但它不会自动发生在混乱的 prompt 结构上。你需要主动把稳定内容放到前面,把变化内容放到后面,让工具定义保持确定性,并让压缩摘要和最近消息各司其职。

对于正在构建 AI 编程助手、客服 Agent、数据分析 Agent 或内部自动化 Agent 的团队来说,这可能是最值得优先打磨的一层基础设施。

关于

关注我获取更多资讯

月球基地博客公众号二维码,扫码关注获取更多 AI 与编程资讯
📢 公众号
月球基地博客作者个人微信二维码,扫码交流 AI 与编程话题
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计