跳转到内容

05 提示缓存优化策略

05 提示缓存优化策略

学习目标

  • 理解 claude-api 技能中对提示缓存的具体指导
  • 掌握静默失效审计的诊断方法
  • 学习 Anthropic 定义的缓存断点放置策略
  • 分析 Opus 4.7 上缓存与 effort/adaptive thinking 的交互

前置知识

本章涉及提示缓存的通用原理,建议先阅读:

下文假设你已理解上述概念,直接聚焦 claude-api 技能的具体实现。


项目实践

claude-api 技能中的缓存指导

claude-api/SKILL.md 中有两段关键的缓存指导:

1. 默认值部分

For the Claude model version, please use Claude Opus 4.7… Please default to using adaptive thinking (thinking: {type: "adaptive"}) for anything remotely complicated… And finally, please default to streaming for any request that may involve long input, long output, or high max_tokens — it prevents hitting request timeouts.

这里将 streaming 作为默认策略,不仅仅是为了避免超时——streaming 也防止缓存命中前的请求超时

2. 快速参考部分

Prefix match. Any byte change anywhere in the prefix invalidates everything after it. Render order is toolssystemmessages. Keep stable content first (frozen system prompt, deterministic tool list), put volatile content (timestamps, per-request IDs, varying questions) after the last cache_control breakpoint.

3. 验证指令

Verify with usage.cache_read_input_tokens — if it’s zero across repeated requests, a silent invalidator is at work (datetime.now() in system prompt, unsorted JSON, varying tool set).

静默失效审计检查清单

claude-api 技能明确列出了三个常见的静默失效原因:

原因检测方式修复
datetime.now() 在系统提示中每次请求 token 计数为零将时间戳移到消息部分
未排序的 JSON序列化不一致使用排序后的 key
变化的工具集每次请求工具不同固定工具集或放在最后断点后

Opus 4.7 特有的缓存交互

在 Opus 4.7 上,缓存与以下特性有交互:

  1. Adaptive Thinking:思考块的渲染可能改变前缀。如果 thinking 内容变化,之后的缓存会失效。
  2. Effort 参数:不同的 effort 值(low / high / xhigh / max)会改变模型输出长度,但不影响输入缓存
  3. Compaction:服务端压缩会在上下文超过阈值时自动总结早期内容。compaction blocks 必须保留——只提取文本字符串会静默丢失压缩状态。

问题与规避

最大 max_tokens 需要 streaming

问题:Opus 4.6/4.7 支持 128K max_tokens,但 SDK 需要 streaming 才能避免 HTTP 超时。

规避策略:对大输出请求使用 .stream() + .get_final_message() / .finalMessage()

Compaction 状态丢失

问题:追加消息时只提取文本字符串(response.content[0].text),而非完整的 response.content(包含 compaction blocks)。

规避策略:始终追加 response.content(不仅仅是文本)。Compaction blocks 是 API 用来替换压缩历史的标记。


设计取舍

为什么推荐 Opus 4.7 + adaptive thinking 作为默认?

优势:adaptive thinking 让模型自己决定何时思考、思考多少,无需手动调 budget_tokens代价:比固定 thinking budget 消耗更多 token(模型可能在简单任务上也思考)。 Anthropic 的立场:这是”non-negotiable”的默认选择——不应为 4.7 代码使用 budget_tokens


参考来源