JOTO
Contact us
← AI 智库
Prompt

Prompt缓存:文档写了什么

2026 年 10 月 11 日

本文系统梳理 Anthropic Prompt Caching 的核心机制与生产陷阱:前缀哈希依赖严格顺序、write/read 成本差达12.5倍、1024–4096 token 缓存下限、lookback window 仅20块、breakpoint 位置与 TTL 顺序约束。强调缓存与 token budgeting 需实时查文档,而非依赖认证考试或静态记忆。

到底什么会被缓存,什么不会

Prompt caching 作用的是前缀(prefix),不是请求里随便一段区间。缓存引用的是请求中直到指定 breakpoint 为止的全部内容,而且顺序是固定的:先是 tools,然后是 system prompt,最后是 messages。这个顺序不是摆设。如果两个本来完全相同的请求之间,你的 tool 定义变了,那么排在它后面的 system prompt 和 message 历史也都没法从缓存里取了,因为 prefix 的哈希已经对不上了。Anthropic 自己的失效表把这点写得很明确:tool 定义的改动会同时让 tools、system 和 messages 一起失效,而像切换 web search 这种更小范围的改动,只会让 tools 块失效。

标记 cache breakpoint 有两种方式:一个顶层 cache_control 字段用于自动缓存,或者在各个内容块上显式写 cache_control 来做更细的控制。大多数团队都是先在多轮对话上开自动缓存,等到 prompt 里出现了变化频率明显不同的区块——比如静态的 system prompt 和不断变长的 tool 结果历史——才去做显式 breakpoint。

决定 prompt caching 是帮你省钱还是悄悄让你多花钱的两个数字
决定 prompt caching 是帮你省钱还是悄悄让你多花钱的两个数字

乘数:write 的成本对比 read 的成本

这就是那些和认证沾边的讨论最容易含糊、而真实定价页一点也不含糊的地方。5 分钟的 cache write,成本是基础输入价的 1.25 倍。1 小时的 cache write,成本是基础输入价的 2 倍。而 cache read,不管这个缓存当初是用哪个 TTL 写进去的,在当前大多数模型上都是基础输入价的 0.1 倍[1][2]。在 Claude Sonnet 5 上,2 美元的基础输入价会变成 2.50 美元的 write 和 0.20 美元的 read[2]。在 Haiku 4.5 上,1 美元的基础输入则对应 1.25 美元的 write 和 0.10 美元的 read[2]。

当前三档模型的 base input、5 分钟 write、1 小时 write 与 cache read 价格
当前三档模型的 base input、5 分钟 write、1 小时 write 与 cache read 价格

这笔账只有在复用的情况下才划算。一次写完却从来没被读过的缓存,比压根不缓存还贵,因为你白付了那 1.25 倍或 2 倍的溢价。盈亏平衡点取决于你预计在 TTL 窗口内会重读这个前缀多少次,这也正是 1 小时选项存在的原因:对于 agentic 任务或者节奏很慢的对话,5 分钟窗口会在两次读取之间就过期,这时候 write 付双倍仍然比每次重读都吃满输入价便宜。

那个没人检查、直到缓存悄悄失效才知道的 token 下限

存在一个下限。Claude Sonnet 5 和 Claude Opus 4.8 要求可缓存块里至少有 1,024 个 tokens 才会真正触发缓存;Claude Haiku 4.5 则要求 4,096 个。如果你的 prompt 短于这个下限,cache_control 不会报错。它只是安安静静什么都不做,而你还继续按全价付输入费用,心里却以为自己在打折。唯一能发现这件事的办法,就是自己去检查响应对象里的 cache_creation_input_tokens 和 cache_read_input_tokens。这种细节,在教程里很容易跳过,在生产环境里跳过的代价却很高,因为一段简短、静态的 system prompt,恰恰是团队最容易默认它是个安全缓存目标的东西。

lookback window 也有类似的锋利边缘。系统在每个 breakpoint 上向后回溯找上一次 cache write 时,最多只检查 20 个块位置。在一段不断增长的对话里只在末尾放一个 breakpoint,一旦对话超出你上一次 cache write 大约 20 个块,你就掉出了 lookback window,缓存会悄悄不再命中,你的节省直接归零,而且没有任何可见的报错。Anthropic 给出的解法是在长对话里布置多个 breakpoint,而不是只在尾部放一个,这也解释了为什么对于任何长时间运行的东西,光靠自动缓存并不算一套完整策略。

一个块换个顺序,整个缓存就凉了

缓存失效会沿着 tools → system → messages 这个层级向下级联,而 breakpoint 该放在哪里,规则比听起来要严格:把 cache_control 放在前缀在所有请求间逐字节相同的那最后一个块上,绝不要放在会变化的块上。一个时间戳、一个每请求都不同的 user ID,或者任何一小段动态内容,只要你把它放在 breakpoint 前面,哈希就永远匹配不上之前的写入,于是你又回到每个请求都付全价的境地,同时还以为自己开着缓存。

这里就牵扯到一个我以前写过的老问题:那些把长上下文检索跑通、以为可靠性问题已经解决的团队,会撞上同一类静默失效——和 context drift、以及 lost-in-the-middle 问题属于同一家族,只不过发生在成本层而不是准确率层。没有任何东西报错。系统只是悄悄不再做你当初搭它的那件事。

单个尾部 breakpoint 一开始能命中,等对话超出 lookback window 后就悄悄不再命中
单个尾部 breakpoint 一开始能命中,等对话超出 lookback window 后就悄悄不再命中

混用 TTL 还有一个在生产上撞到之前值得先知道的约束:同一个请求里,1 小时的缓存块必须出现在任何 5 分钟缓存块之前,绝不能放在后面。混合请求的计费按三个位置来算:缓存读取算到已有命中的最高点,从那一点到 1 小时 breakpoint 之间的新内容按 1 小时写入计费,更新的部分按 5 分钟写入计费[1]。对于"很少变化的超长 system prompt + 每轮都在变的 tool 结果历史"这种组合,它确实是个很好用的模式,但第一次上手也很容易把顺序搞反。

顺序弄反了,两个缓存块都不会按你预期的方式工作
顺序弄反了,两个缓存块都不会按你预期的方式工作
system=[
  {"text": "long static instructions...",
   "cache_control": {"type": "ephemeral", "ttl": "1h"}},
  {"text": "recent tool context...",
   "cache_control": {"type": "ephemeral"}}  # 5-minute, must come after
]

缓存之外的 token budgeting:context window、task budget,以及为什么备考会跳过这些

缓存只是其中一根杠杆。另一根是搞清楚到底什么才算占用你的 context window,而答案比大多数人以为的要宽:input、output 和 thinking tokens 全都算,三种缓存 token 也全都算——input_tokens、cache_read_input_tokens 和 cache_creation_input_tokens——每一项都会计入总量,尽管其中只有一部分会体现在表面价格上[3][4]。Anthropic 专门做了 token 计数端点,就是为了让你在发真实请求之前先查清楚,而且它跑在和实际 message 创建分开的速率限制上,所以查它并不消耗你的请求额度[3]。

当前一代模型还加了一层东西,只逛一眼定价页的话很容易漏掉:部分模型会自动获得 context awareness,API 会把一个实时的预算标记直接注入上下文,比如 <budget:token_budget>200000</budget:token_budget>,之后再来一条提示,显示已用和剩余的 tokens[4]。对于没有自动获得这一能力的模型,Anthropic 提供了一个显式的 beta 版 task-budget 功能,让你手动设置同类的上限[4]。这两者都不是缓存。它们都是"token budgeting"的另一半——而一个像本文这样的标题本来就会让人联想到这些——而且如果你只研究缓存价格表,它们一个都不会出现。

据我所知,这也合理地解释了为什么这件事没进我参加并写在《Back to Writing: My Claude Certification Week》里的那个认证轨道:实现层面的成本机制变得太快,是那种每出一档新模型考纲就得跟着改一遍的东西,而且恰恰是那种"每次现去文档里查比背下来更有用"的知识。我在比较 Opus、Sonnet 和 Haiku 成本时的思路也是同样的逻辑:框架是耐用的,具体乘数不是,而定价页更新的节奏没人能替备考的人控制。

如果说这里有什么实用结论,那就是:缓存和预算这两件事,都该在构建时对着实时文档去核实,而不是一次性背下来的事实。同样的纪律适用于任何你从 API 里想拿结构化保证的东西——这也正是为什么该去用 schema 强约束的 structured outputs,而不是指望一段 prompt 每次都表现得一模一样。

参考资料 平台:Medium / Level Up Coding 原文链接:https://levelup.gitconnected.com/prompt-caching-whats-documented-not-exam-tested-b5bc330002e2[1]

JOTO 企业落地观察

  • 企业部署 prompt caching 时,必须将缓存前缀的哈希稳定性纳入工程设计闭环:tools、system、messages 的顺序与内容一致性不再是开发便利性问题,而是直接影响成本复用率的核心契约。任何动态字段(如时间戳、session ID)若误入 breakpoint 前置区域,将导致缓存完全失效且无报错,这要求团队在 prompt 工程阶段即建立严格的 token 流水线审计机制。
  • 这类系统的取舍在于:是否为 long-running agent 对话启用多 breakpoint 策略。单 breakpoint 在对话超过 20 块后即退出 lookback window,而 Anthropic 明确建议在长对话中分散布置 breakpoint——这对企业智能体工程意味着需将缓存策略与对话状态机深度耦合,而非作为独立配置项处理。
  • RAG 知识工程中常假设静态 system prompt 是天然缓存目标,但本文揭示其可能因低于 1024/4096 token 下限而静默失败。这意味着知识注入模块必须前置 token 计数校验,且不能仅依赖 prompt 文本长度估算,而需调用 Anthropic 的 token 计数端点实测——这对 RAG pipeline 的可靠性验证提出了新环节。
  • AI 安全治理需关注缓存机制引入的隐性风险:缓存失效无日志、无错误码,仅表现为成本异常升高;而混用 TTL 时的顺序约束若违反,会导致计费逻辑偏离预期。企业需将缓存行为纳入可观测性体系,对 cache_creation_input_tokens 和 cache_read_input_tokens 字段做持续监控,而非仅依赖表面 API 成本报表。

立即咨询 JOTO

JOTO 提供覆盖企业智能体规划与搭建、AI 平台私有化部署、RAG 知识工程、AI 安全治理、FDE 驻场共创及持续运营优化的全周期 AI 落地服务,帮助企业把验证中的 AI 能力转化为安全、可控、可持续迭代的生产力。 联系 JOTO 获取 AI 落地咨询

想把这些做法用到你的业务里?

留下你的场景和痛点,我们帮你判断从哪一步开始。

联系我们
Contact Us

Start your enterprise AI rollout

Tell us your industry, team, and current pain points. We'll get back to you within one business day to help you decide what to tackle first, what data to prepare, and which platform fits.

WeChat
Scan to add us for a 1:1 chat
JOTO WeChat consultation QR code

Tell us what you need

Once we receive your details, we'll be in touch within one business day.