跳转到内容

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 tools → system → messages. 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。


参考来源