提示缓存是一项强大的功能,它通过允许从提示中的特定前缀恢复来优化您的 API 使用。这种方法显著减少了重复任务或具有一致元素的提示的处理时间和成本。
以下是使用 cache_control 块通过 Messages API 实现提示缓存的示例:
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{
"role": "user",
"content": "Analyze the major themes in Pride and Prejudice."
}
]
}'
# 使用相同的输入直到缓存检查点再次调用模型
curl https://api.anthropic.com/v1/messages # rest of input{"cache_creation_input_tokens":188086,"cache_read_input_tokens":0,"input_tokens":21,"output_tokens":393}
{"cache_creation_input_tokens":0,"cache_read_input_tokens":188086,"input_tokens":21,"output_tokens":393}在此示例中,《傲慢与偏见》的完整文本使用 cache_control 参数进行了缓存。这使得该大型文本可以在多次 API 调用中重复使用,而无需每次都重新处理。仅更改用户消息即可让您在利用缓存内容的同时提出关于该书的各种问题,从而获得更快的响应和更高的效率。
当您发送启用了提示缓存的请求时:
这对以下场景特别有用:
默认情况下,缓存的生命周期为 5 分钟。每次使用缓存内容时,缓存会免费刷新。
如果您觉得 5 分钟太短,Anthropic 还提供 1 小时的缓存持续时间,需额外付费。
有关更多信息,请参阅 1 小时缓存持续时间。
提示缓存会缓存完整前缀
提示缓存引用整个提示——tools、system 和 messages(按此顺序)直到并包括标记了 cache_control 的块。
提示缓存引入了新的定价结构。下表显示了每个支持模型每百万 token 的价格:
| Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
|---|---|---|---|---|---|
| Claude Opus 4.6 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.5 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.1 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Opus 4 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Sonnet 4.5 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 4 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 3.7 (deprecated) | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Haiku 4.5 | $1 / MTok | $1.25 / MTok | $2 / MTok | $0.10 / MTok | $5 / MTok |
| Claude Haiku 3.5 | $0.80 / MTok | $1 / MTok | $1.6 / MTok | $0.08 / MTok | $4 / MTok |
| Claude Opus 3 (deprecated) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Haiku 3 | $0.25 / MTok | $0.30 / MTok | $0.50 / MTok | $0.03 / MTok | $1.25 / MTok |
上表反映了提示缓存的以下定价乘数:
这些乘数与其他定价修饰符叠加,例如 Batch API 折扣、长上下文定价和数据驻留。有关完整详情,请参阅定价。
提示缓存目前支持以下模型:
将静态内容(工具定义、系统指令、上下文、示例)放在提示的开头。使用 cache_control 参数标记可重用内容的结尾以进行缓存。
缓存前缀按以下顺序创建:tools、system,然后是 messages。此顺序形成一个层次结构,其中每个级别都建立在前一个级别之上。
您只需在静态内容的末尾使用一个缓存断点,系统将自动找到最长匹配的缓存块序列。了解其工作原理有助于您优化缓存策略。
三个核心原则:
缓存键是累积的:当您使用 cache_control 显式缓存一个块时,缓存哈希键是通过按顺序哈希对话中所有先前的块来生成的。这意味着每个块的缓存取决于它之前的所有内容。
向后顺序检查:系统通过从您的显式断点向后工作来检查缓存命中,按逆序检查每个先前的块。这确保您获得尽可能长的缓存命中。
20 块回溯窗口:系统仅检查每个显式 cache_control 断点之前最多 20 个块。在检查 20 个块后没有匹配时,它会停止检查并移动到下一个显式断点(如果有的话)。
示例:理解回溯窗口
考虑一个有 30 个内容块的对话,您仅在第 30 块上设置了 cache_control:
如果您发送第 31 块且之前的块没有更改:系统检查第 30 块(匹配!)。您在第 30 块获得缓存命中,只需处理第 31 块。
如果您修改了第 25 块并发送第 31 块:系统从第 30 块向后检查 → 29 → 28... → 25(不匹配)→ 24(匹配!)。由于第 24 块没有更改,您在第 24 块获得缓存命中,只需重新处理第 25-30 块。
如果您修改了第 5 块并发送第 31 块:系统从第 30 块向后检查 → 29 → 28... → 11(第 20 次检查)。在 20 次检查后没有找到匹配,它停止查找。由于第 5 块超出了 20 块窗口,不会发生缓存命中,所有块都需要重新处理。但是,如果您在第 5 块上设置了显式 cache_control 断点,系统将从该断点继续检查:第 5 块(不匹配)→ 第 4 块(匹配!)。这允许在第 4 块获得缓存命中,说明了为什么您应该在可编辑内容之前放置断点。
关键要点:始终在对话末尾设置显式缓存断点,以最大化缓存命中的机会。此外,在可能被编辑的内容块之前设置断点,以确保这些部分可以独立缓存。
如果您想要以下功能,可以定义最多 4 个缓存断点:
重要限制:如果您的提示在缓存断点之前有超过 20 个内容块,并且您修改了这 20 个块之前的内容,除非您在更靠近该内容的位置添加额外的显式断点,否则不会获得缓存命中。
最小可缓存提示长度为:
较短的提示无法被缓存,即使标记了 cache_control。任何缓存少于此 token 数量的请求将在不缓存的情况下处理。要查看提示是否已被缓存,请参阅响应使用字段。
对于并发请求,请注意缓存条目仅在第一个响应开始后才可用。如果您需要并行请求的缓存命中,请在发送后续请求之前等待第一个响应。
目前,"ephemeral" 是唯一支持的缓存类型,默认生命周期为 5 分钟。
缓存断点本身不会增加任何成本。 您只需为以下内容付费:
添加更多 cache_control 断点不会增加您的成本——您仍然根据实际缓存和读取的内容支付相同的金额。断点只是让您控制哪些部分可以独立缓存。
请求中的大多数块都可以使用 cache_control 指定为缓存。这包括:
tools 数组中的工具定义system 数组中的内容块messages.content 数组中的内容块,适用于用户和助手轮次messages.content 数组中的内容块,在用户轮次中messages.content 数组中的内容块,适用于用户和助手轮次这些元素中的每一个都可以标记 cache_control 以启用该请求部分的缓存。
虽然大多数请求块可以被缓存,但有一些例外:
思考块不能直接使用 cache_control 缓存。但是,当思考块出现在之前的助手轮次中时,它们可以与其他内容一起被缓存。以这种方式缓存时,从缓存读取时它们确实计为输入 token。
子内容块(如引用)本身不能直接缓存。相反,应缓存顶级块。
在引用的情况下,作为引用源材料的顶级文档内容块可以被缓存。这使您可以通过缓存引用将引用的文档来有效地使用提示缓存与引用功能。
空文本块不能被缓存。
对缓存内容的修改可能会使部分或全部缓存失效。
如构建您的提示中所述,缓存遵循层次结构:tools → system → messages。每个级别的更改会使该级别及所有后续级别失效。
下表显示了不同类型的更改会使缓存的哪些部分失效。✘ 表示缓存失效,✓ 表示缓存保持有效。
| 更改内容 | 工具缓存 | 系统缓存 | 消息缓存 | 影响 |
|---|---|---|---|---|
| 工具定义 | ✘ | ✘ | ✘ | 修改工具定义(名称、描述、参数)会使整个缓存失效 |
| 网络搜索开关 | ✓ | ✘ | ✘ | 启用/禁用网络搜索会修改系统提示 |
| 引用开关 | ✓ | ✘ | ✘ | 启用/禁用引用会修改系统提示 |
| 工具选择 | ✓ | ✓ | ✘ | 对 tool_choice 参数的更改仅影响消息块 |
| 图片 | ✓ | ✓ | ✘ | 在提示中的任何位置添加/删除图片会影响消息块 |
| 思考参数 | ✓ | ✓ | ✘ | 对扩展思考设置(启用/禁用、预算)的更改会影响消息块 |
| 传递给扩展思考请求的非工具结果 | ✓ | ✓ | ✘ | 当在启用扩展思考的情况下传递非工具结果时,所有先前缓存的思考块将从上下文中剥离,并且跟随这些思考块的上下文中的任何消息都将从缓存中移除。有关更多详情,请参阅使用思考块进行缓存。 |
使用响应中 usage 内的以下 API 响应字段(或如果流式传输则为 message_start 事件)监控缓存性能:
cache_creation_input_tokens:创建新条目时写入缓存的 token 数量。cache_read_input_tokens:此请求从缓存中检索的 token 数量。input_tokens:未从缓存读取或用于创建缓存的输入 token 数量(即最后一个缓存断点之后的 token)。理解 token 分解
input_tokens 字段仅表示请求中最后一个缓存断点之后的 token——而不是您发送的所有输入 token。
要计算总输入 token:
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens空间解释:
cache_read_input_tokens = 断点之前已缓存的 token(读取)cache_creation_input_tokens = 断点之前正在缓存的 token(写入)input_tokens = 最后一个断点之后的 token(不符合缓存条件)示例: 如果您的请求有 100,000 个缓存内容的 token(从缓存读取)、0 个正在缓存的新内容 token,以及用户消息中的 50 个 token(在缓存断点之后):
cache_read_input_tokens:100,000cache_creation_input_tokens:0input_tokens:50这对于理解成本和速率限制都很重要,因为在有效使用缓存时,input_tokens 通常远小于您的总输入。
要优化提示缓存性能:
根据您的场景调整提示缓存策略:
如果遇到意外行为:
tool_choice 和图片使用在各次调用之间保持一致cache_control 参数,以确保所有内容都可以被缓存tool_use 内容块中的键具有稳定的排序,因为某些语言(例如 Swift、Go)在 JSON 转换期间会随机化键的顺序,从而破坏缓存对 tool_choice 的更改或提示中任何位置图片的存在/缺失都会使缓存失效,需要创建新的缓存条目。有关缓存失效的更多详情,请参阅什么会使缓存失效。
当将扩展思考与提示缓存一起使用时,思考块具有特殊行为:
与其他内容一起自动缓存:虽然思考块不能显式标记 cache_control,但当您使用工具结果进行后续 API 调用时,它们会作为请求内容的一部分被缓存。这通常发生在工具使用期间,当您传回思考块以继续对话时。
输入 token 计数:当思考块从缓存中读取时,它们在您的使用指标中计为输入 token。这对于成本计算和 token 预算很重要。
缓存失效模式:
cache_control 标记,这种缓存行为也会发生有关缓存失效的更多详情,请参阅什么会使缓存失效。
工具使用示例:
Request 1: User: "What's the weather in Paris?"
Response: [thinking_block_1] + [tool_use block 1]
Request 2:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True]
Response: [thinking_block_2] + [text block 2]
# Request 2 缓存其请求内容(不是响应)
# 缓存包括:用户消息、thinking_block_1、tool_use block 1 和 tool_result_1
Request 3:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True],
Assistant: [thinking_block_2] + [text block 2],
User: [Text response, cache=True]
# 非工具结果的用户块导致所有思考块被忽略
# 此请求的处理方式就好像思考块从未存在过一样当包含非工具结果的用户块时,它指定了一个新的助手循环,所有先前的思考块都会从上下文中移除。
有关更详细的信息,请参阅扩展思考文档。
从 2026 年 2 月 5 日起,提示缓存将使用工作区级别的隔离,而不是组织级别的隔离。缓存将按工作区隔离,确保同一组织内工作区之间的数据分离。此更改适用于 Claude API 和 Azure;Amazon Bedrock 和 Google Vertex AI 将维持组织级别的缓存隔离。如果您使用多个工作区,请审查您的缓存策略以应对此更改。
组织隔离:缓存在组织之间是隔离的。不同的组织永远不会共享缓存,即使它们使用相同的提示。
精确匹配:缓存命中需要 100% 相同的提示段,包括直到并包括标记了缓存控制的块的所有文本和图片。
输出 Token 生成:提示缓存对输出 token 生成没有影响。您收到的响应将与不使用提示缓存时获得的响应完全相同。
如果您觉得 5 分钟太短,Anthropic 还提供 1 小时的缓存持续时间,需额外付费。
要使用扩展缓存,请在 cache_control 定义中包含 ttl,如下所示:
"cache_control": {
"type": "ephemeral",
"ttl": "5m" | "1h"
}响应将包含详细的缓存信息,如下所示:
{
"usage": {
"input_tokens": ...,
"cache_read_input_tokens": ...,
"cache_creation_input_tokens": ...,
"output_tokens": ...,
"cache_creation": {
"ephemeral_5m_input_tokens": 456,
"ephemeral_1h_input_tokens": 100,
}
}
}请注意,当前的 cache_creation_input_tokens 字段等于 cache_creation 对象中值的总和。
如果您的提示以固定频率使用(即系统提示的使用频率高于每 5 分钟一次),请继续使用 5 分钟缓存,因为它将继续免费刷新。
1 小时缓存最适合以下场景:
5 分钟和 1 小时缓存在延迟方面的行为相同。对于长文档,您通常会看到首个 token 时间的改善。
您可以在同一请求中使用 1 小时和 5 分钟的缓存控制,但有一个重要约束:具有较长 TTL 的缓存条目必须出现在较短 TTL 之前(即 1 小时缓存条目必须出现在任何 5 分钟缓存条目之前)。
混合 TTL 时,我们在您的提示中确定三个计费位置:
A:最高缓存命中处的 token 计数(如果没有命中则为 0)。B:A 之后最高的 1 小时 cache_control 块处的 token 计数(如果不存在则等于 A)。C:最后一个 cache_control 块处的 token 计数。如果 B 和/或 C 大于 A,它们必然是缓存未命中,因为 A 是最高的缓存命中。
您将被收取以下费用:
A 的缓存读取 token。(B - A) 的 1 小时缓存写入 token。(C - B) 的 5 分钟缓存写入 token。以下是 3 个示例。这描述了 3 个请求的输入 token,每个请求具有不同的缓存命中和缓存未命中。每个请求因此具有不同的计算定价,显示在彩色框中。
为了帮助您开始使用提示缓存,我们准备了一个提示缓存 cookbook,其中包含详细的示例和最佳实践。
下面,我们提供了几个代码片段,展示了各种提示缓存模式。这些示例演示了如何在不同场景中实现缓存,帮助您理解此功能的实际应用:
Was this page helpful?