跳转至

Prompt Caching 工程实践 — Anthropic Claude Code 经验总结

📊 Level ⭐⭐⭐ | 10.2KB

本页原内容在 2026-09-07 质量闭环中判定为 dup-0.8,已按导航页(MOC)重建; 原文备份见 _archive/hub-rewrite-2026-09-07/anthropic-prompt-caching-claude-code.md,一手来源仍见下方 sources。

机制与论文

工程实践

深度分析

前缀匹配是唯一的第一性原理

这篇博客最有价值的地方,是把散落的工程经验还原成一个单一原理:Prompt Caching 本质上是前缀匹配——API 缓存从请求开头到每个 cache_control 断点之间的所有内容,只要下次请求的前缀与上次一致,就能复用计算结果。九条经验(缓存即基建、排好队形、别动 Prompt、别换模型、别碰工具、Plan Mode、延迟加载、Cache-Safe Forking、前缀匹配)没有一条是独立技巧,全部可以从前缀不变性推导出来。这与 CPU 缓存类比下的 Agent 上下文管理 的 L1/L2/L3 层级视角互为印证:缓存层级越稳定,命中越可预期。

命中率是基础设施指标,不是优化指标

Anthropic 把 Prompt Cache 命中率当作与服务器 uptime 同级的基础设施指标来监控:命中率下降会触发 oncall 告警,工程师要像处理线上事故一样排查。这个定位转换的依据是 Agent 产品的长对话特性——一个 session 聊几十轮,每轮都要携带全部历史上下文重发,若每轮从头计算,延迟和成本都会爆炸。缓存因此不是「做完顺便加个优化」,而是系统能跑起来的前提;这也是原文标题「Prompt Caching 就是一切」的字面含义。

不可变前缀 + 流动消息层的分层设计

Anthropic 的内容排序遵循「越不容易变的越往前放」:静态系统 prompt 与工具定义(全局缓存)→ CLAUDE.md(项目级)→ Session 上下文(会话级)→ 对话消息(逐轮只新增最后一条)。信息过时(时间戳、文件变更状态)时不改 prompt,而是用 <system-reminder> 标签把更新塞进下一轮 user message 或 tool result——prompt 是不可变的基础设施,消息才是流动的信息层。三个经典失效模式都源自破坏前缀:静态 prompt 里嵌每秒变化的时间戳、用 dict/set 导致工具定义顺序不确定、只改一个字段也让整个前缀缓存作废。

约束优先的设计哲学与三个反直觉决策

博客的深层结论是一种系统设计哲学:先确定约束,再围绕约束做设计。三个决策最能体现「约束倒逼架构」:

  • 不动态切换模型:缓存与模型绑定,切到 Haiku 省的钱抵不上重建全部缓存的成本;主对话自始至终用同一模型,小模型任务交给拥有独立上下文和缓存链的子 Agent,只回传结果。
  • Plan Mode 不增删工具:直觉做法是规划时移走执行类工具,但 Anthropic 保留全部工具,用 EnterPlanMode/ExitPlanMode 两个特殊工具加 system message 约束来表达「只规划不执行」——副产品是模型可自主决定何时进入规划。
  • 延迟加载 MCP 工具:几十个 MCP 工具的完整 schema 太贵,按需加减又断缓存;折中是只放 defer_loading: true 的轻量 stub,模型经 Tool Search 拉取完整 schema,前缀始终保持轻量不变。

同理,Cache-Safe Forking 解决压缩问题:压缩请求必须复用与主对话完全一致的 system prompt、user context 和工具定义,把主对话消息作为历史带上,只在末尾追加一条压缩指令,从而共享同一条缓存链;Compaction 已内置于 API。

两个容易被忽略的运营细节

  • 缓存按账号隔离:账号池混用会导致命中率过低——多租户部署 Agent 时这是隐性的成本杀手。
  • session 期间工具集冻结:看似「移除用不到的工具」是精简优化,实际每加减一个工具就断一次前缀,整个对话缓存重建的代价远超保留冗余工具定义的 token 开销——看似优化,实为添乱。

实践启示

  1. 把缓存命中率当 SLO 监控并接告警,而不是当性能调优项——命中率下跌按线上事故响应。
  2. Prompt 内容按可变性升序排列:全局静态(系统 prompt、工具定义)在最前,逐轮增长的消息在最后;任何新需求优先考虑追加消息而非修改前缀。
  3. 时间戳、文件状态等易变信息一律放进 <system-reminder> 类的消息层注入,严禁写入静态 prompt;工具定义避免依赖 dict/set 等无序结构。
  4. 主对话锁死单一模型;需要小模型时用独立缓存的子 Agent 承接,只回传结果。多账号部署时不要混用账号池。
  5. Session 期间冻结工具集;模式切换(如 Plan Mode)用特殊工具 + system message 表达,而不是增删工具。
  6. 大量 MCP 工具场景采用 stub + defer_loading: true + Tool Search 的延迟加载模式;长对话压缩必须走 Cache-Safe Forking,与主对话共享同一条缓存链。

延伸导航