如何验证 Claude Prompt Caching 是否真正命中

Claude API 请求可能反复携带相同的系统提示词、工具定义和长文档,但“添加了缓存字段”不能证明服务端创建或读取了缓存。前缀中的时间戳、字段顺序或个性化内容发生变化,也可能让后续请求无法复用。本文只解决缓存验收问题:构造稳定前缀,连续发送仅用户问题不同的请求,比较 usage 中的缓存创建与读取字段,再主动修改前缀做对照。最终结果是一份能区分创建、命中和失效的测试记录。

重复输入通常来自:

固定系统提示词。
固定工具定义。
固定产品手册。
同一段长对话历史。

Prompt Caching 面向可复用的请求前缀。具体支持模型、缓存方式、有效期、最低长度和价格都可能变化,测试前必须核对 Claude Prompt Caching 官方文档

“加一个 cache_control”不等于已经命中。

如果前缀经常变化、请求频率低或网关没有正确转发,缓存可能一直在写,从来没有命中。

1. Prompt Caching 缓存的是什么

它缓存的是提示词前缀,不是最终答案。

适合缓存:

固定系统提示词。
固定 few-shot 示例。
工具定义。
长文档和知识库材料。
多轮对话中不变的历史前缀。

不适合缓存:

每次都完全不同的短请求。
低频、一天只调用一次的上下文。
持续插入时间戳或随机 ID 的前缀。
包含每次变化字段的大段 system 内容。

关键不是“内容很长”。

而是:

内容很长,并且会在缓存有效期内重复出现。

2. 为什么明明配置了却没有命中

缓存按前缀匹配。

前面的内容发生变化,后面的缓存就可能失效。

常见破坏命中的内容:

每次把当前时间写进 system 开头。
动态调整工具顺序。
随机生成请求 ID 并放进缓存前缀。
文档空格或格式每次重新序列化。
把用户个性化字段放在固定知识库之前。
不同服务生成的 JSON 字段顺序不一致。

推荐顺序:

稳定且较长的内容放前面。
经常变化的内容放后面。

例如:

工具定义
  ↓
系统提示词
  ↓
固定知识库文档
  ↓
会话历史
  ↓
当前用户问题

具体的缓存顺序和可缓存块类型以官方文档为准。

3. 怎么看是否命中

不要通过“感觉响应变快了”判断。

查看响应 usage 中与缓存相关的字段,例如:

cache_creation_input_tokens
cache_read_input_tokens
input_tokens
output_tokens

将第一次请求的缓存创建字段和后续请求的缓存读取字段分别保存,不要只保留总 token。

验收步骤:

1. 固定同一模型、system、工具和文档。
2. 发送第一个问题,记录 usage。
3. 在当前文档规定的有效期内只修改最后的用户问题。
4. 再发送一次,记录 usage。
5. 检查 `cache_read_input_tokens` 是否出现有效读数。
6. 修改缓存前缀,确认命中下降,用作对照。

4. 多租户怎么防止串用

Prompt Caching 不等于应用层数据隔离。

企业系统仍然要确保:

租户 A 的文档不会出现在租户 B 的请求前缀。
缓存构造函数包含正确的租户边界。
日志不记录完整敏感提示词。
文档更新后生成新版本标识。
权限撤销后旧工作流停止复用相关上下文。

推荐把缓存前缀构造逻辑集中管理:

tenant_id
knowledge_version
prompt_version
tool_version
model_id

这些字段用于你自己的日志和缓存版本判断,不要随意插入会导致前缀每次变化的位置。

5. 通过兼容接口接入前要验收什么

兼容接口要真正支持 Prompt Caching,不能只做到普通文本请求兼容。

至少验证:

1. 是否支持 Anthropic 原生 Messages 格式,或明确支持缓存字段。
2. cache_control 是否被原样转发。
3. 目标模型是否支持当前缓存方式。
4. usage 是否返回缓存创建与读取 token。

但 Prompt Caching 属于供应商特定能力,不能假设 /v1/chat/completions 会自动理解 Anthropic 的 cache_control

以接口服务当前技术文档为准。先用测试凭据发送对照请求并检查 usage,再决定是否采用。

6. 保存可复核的测试记录

只记录输入输出 token 不足以复核缓存测试。保留:

prompt_version。
knowledge_version。
cache_creation_input_tokens。
cache_read_input_tokens。
model_id。
测试时间。
完整请求结构或受控哈希。

请求经过兼容层时,还要记录上游模型和原始 usage,避免接口转换后的汇总字段掩盖创建与读取差异。

7. 常见错误

错误一:每次都把时间戳放在 system 开头

前缀持续变化,缓存无法复用。

错误二:只保留总 token

总数无法区分普通输入、缓存创建和缓存读取。

错误三:没有检查 usage

配置字段存在不代表上游实际创建了缓存。

错误四:有效期与调用间隔不匹配

下一次请求到来前缓存可能已经过期。

错误五:把缓存当知识库

Prompt Caching 只优化重复处理,不负责检索、权限和文档更新。

错误六:中转接口能聊天,就认为能缓存

供应商特定字段需要单独验证。

8. 验收检查清单

[ ] 已确认目标模型支持 Prompt Caching
[ ] 固定前缀达到当前模型最低缓存长度
[ ] 稳定内容在前,动态内容在后
[ ] 已根据当前文档和请求间隔选择有效期
[ ] 已用连续两次请求验证 cache_read_input_tokens
[ ] 文档与提示词有版本号
[ ] 多租户数据构造遵循权限边界
[ ] 网关正确转发 cache_control
[ ] 兼容接口能返回缓存读写 usage
[ ] 测试记录包含当前模型、请求结构和原始 usage

9. 结论与限制

Prompt Caching 最适合这类 API 工作流:

前缀长。
前缀稳定。
短时间内重复调用。
工具和文档会被多次复用。

是否有收益取决于当前定价、首次写入、读取次数、有效期和前缀稳定性,必须使用同期价格与实测 usage 单独计算。本文只给出命中验收顺序:

选一个高重复任务。
固定 system、工具和文档顺序。
按当前文档启用缓存。
连续发送对照请求。
检查 usage。
记录创建、读取与普通输入字段。
再决定是否扩大使用范围。

结论只适用于被测模型、请求结构和接口链路。模型支持、字段、有效期、最低长度与价格均可能变化;上线前应重新查阅官方文档并保留原始请求、响应 usage 和测试时间,不能把一次命中泛化为长期成本结论。