Was this page helpful?
提示词缓存通过允许从提示词中的特定前缀恢复来优化您的 API 使用。这大大减少了重复任务或具有一致元素的提示词的处理时间和成本。
This feature is eligible for Zero Data Retention (ZDR). When your organization has a ZDR arrangement, data sent through this feature is not stored after the API response is returned.
有两种方式启用提示词缓存:
cache_control 字段。系统自动将缓存断点应用于最后一个可缓存块,并随着对话增长而向前移动。最适合多轮对话,其中不断增长的消息历史应该自动缓存。cache_control,以精细控制缓存的内容。最简单的开始方式是使用自动缓存:
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.",
messages=[
{
"role": "user",
"content": "Analyze the major themes in 'Pride and Prejudice'.",
}
],
)
print(response.usage.model_dump_json())使用自动缓存,系统缓存所有内容直到并包括最后一个可缓存块。在后续请求中使用相同前缀时,缓存的内容会自动重用。
当您发送启用了提示词缓存的请求时:
这对以下情况特别有用:
默认情况下,缓存的生命周期为 5 分钟。每次使用缓存的内容时,缓存都会刷新,无需额外成本。
提示词缓存缓存完整前缀
提示词缓存引用整个提示词 - tools、system 和 messages(按该顺序)直到并包括用 cache_control 标记的块。
提示词缓存引入了新的定价结构。下表显示了每个支持的模型的每百万令牌的价格:
| Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
|---|---|---|---|---|---|
| Claude Opus 4.7 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| 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 |
上表反映了提示词缓存的以下定价倍数:
这些倍数与其他定价修饰符(如 Batch API 折扣和数据驻留)叠加。有关完整详情,请参阅 定价。
提示词缓存(自动和显式)在所有 活跃 Claude 模型 上受支持。
自动缓存是启用提示词缓存的最简单方式。与其在单个内容块上放置 cache_control 不同,在请求体的顶级添加单个 cache_control 字段。系统自动将缓存断点应用于最后一个可缓存块。
使用自动缓存,缓存点会随着对话增长而自动向前移动。每个新请求缓存直到最后一个可缓存块的所有内容,而之前的内容从缓存中读取。
| 请求 | 内容 | 缓存行为 |
|---|---|---|
| 请求 1 | 系统 + 用户(1) + 助手(1) + 用户(2) ◀ 缓存 | 所有内容写入缓存 |
| 请求 2 | 系统 + 用户(1) + 助手(1) + 用户(2) + 助手(2) + 用户(3) ◀ 缓存 | 系统到用户(2) 从缓存读取; 助手(2) + 用户(3) 写入缓存 |
| 请求 3 | 系统 + 用户(1) + 助手(1) + 用户(2) + 助手(2) + 用户(3) + 助手(3) + 用户(4) ◀ 缓存 | 系统到用户(3) 从缓存读取; 助手(3) + 用户(4) 写入缓存 |
缓存断点自动移动到每个请求中最后一个可缓存块,因此当对话增长时,您无需更新任何 cache_control 标记。
默认情况下,自动缓存使用 5 分钟 TTL。您可以以 2 倍基础输入令牌价格指定 1 小时 TTL:
{ "cache_control": { "type": "ephemeral", "ttl": "1h" } }自动缓存与 显式缓存断点 兼容。一起使用时,自动缓存断点使用 4 个可用断点槽中的一个。
这让您可以结合两种方法。例如,使用显式断点独立缓存系统提示词和工具,同时自动缓存处理对话:
{
"model": "claude-opus-4-7",
"max_tokens": 1024,
"cache_control": { "type": "ephemeral" },
"system": [
{
"type": "text",
"text": "You are a helpful assistant.",
"cache_control": { "type": "ephemeral" }
}
],
"messages": [{ "role": "user", "content": "What are the key terms?" }]
}自动缓存使用相同的底层缓存基础设施。定价、最小令牌阈值、上下文排序要求和 20 块回溯窗口都与显式断点相同。
cache_control,自动缓存是无操作的。cache_control,API 返回 400 错误。自动缓存在 Claude API 和 Azure AI Foundry(预览版)上可用。Amazon Bedrock 和 Google Vertex AI 的支持即将推出。
为了更好地控制缓存,您可以直接在单个内容块上放置 cache_control。当您需要缓存以不同频率变化的不同部分,或需要精细控制缓存内容时,这很有用。
将静态内容(工具定义、系统指令、上下文、示例)放在提示词的开头。使用 cache_control 参数标记可重用内容的结尾以进行缓存。
缓存前缀按以下顺序创建:tools、system,然后是 messages。此顺序形成一个层次结构,其中每个级别都建立在前一个级别之上。
您可以在静态内容的末尾使用单个缓存断点,系统将自动找到先前请求已写入缓存的最长前缀。理解这如何工作有助于您优化缓存策略。
三个核心原则:
缓存写入仅在您的断点处发生。 用 cache_control 标记块会写入恰好一个缓存条目:在该块处结束的前缀的哈希。系统不会为任何更早的位置写入条目。因为哈希是累积的,覆盖直到并包括断点的所有内容,改变断点处或之前的任何块会在下一个请求中产生不同的哈希。
缓存读取向后查找先前请求写入的条目。 在每个请求上,系统计算您的断点处的前缀哈希,并检查匹配的缓存条目。如果不存在,它一次向后走一个块,检查每个较早位置的前缀哈希是否与已在缓存中的内容匹配。它在寻找先前的写入,而不是稳定的内容。
回溯窗口是 20 个块。 系统每个断点最多检查 20 个位置,将断点本身计为第一个。如果系统在该窗口中找不到匹配的条目,检查停止(或从下一个显式断点恢复,如果有的话)。
示例:在不断增长的对话中回溯
您在每个轮次追加新块,并在每个请求的最后一个块上设置 cache_control:
常见错误:断点在每个请求都变化的内容上
您的提示词有大量静态系统上下文(块 1 到 5),后跟包含时间戳和用户消息的每个请求块(块 6)。您在块 6 上设置 cache_control:
回溯不会找到您的断点后面的稳定内容并缓存它。它找到先前请求已写入的条目,而写入仅在断点处发生。将 cache_control 移到块 5,即跨请求保持相同的最后一个块,每个后续请求都会读取缓存的前缀。自动缓存 陷入同样的陷阱:它将断点放在最后一个可缓存块上,在这个结构中是每个请求都变化的块,所以改为使用块 5 上的显式断点。
关键要点: 在最后一个块上放置 cache_control,其前缀在您想要共享缓存的请求中是相同的。在不断增长的对话中,只要每个轮次添加少于 20 个块,最后一个块就可以工作:较早的内容永远不会改变,所以下一个请求的回溯找到先前的写入。对于具有变化后缀的提示词(时间戳、每个请求的上下文、传入消息),将断点放在静态前缀的末尾,而不是在变化块上。
如果您想要以下情况,可以定义最多 4 个缓存断点:
重要限制: 回溯只能找到较早请求已写入的条目。如果不断增长的对话将您的断点推过最后一次写入 20 个或更多块,回溯窗口会错过它。从一开始就添加第二个更接近该位置的断点,以便在您需要它之前在那里积累写入。
缓存断点本身不增加任何成本。 您仅需为以下内容付费:
添加更多 cache_control 断点不会增加您的成本 - 您仍然根据实际缓存和读取的内容支付相同的金额。断点只是让您控制哪些部分可以独立缓存。
最小可缓存提示词长度为:
较短的提示词无法缓存,即使用 cache_control 标记也是如此。任何缓存少于此令牌数的请求将在没有缓存的情况下处理,不会返回错误。要验证提示词是否被缓存,请检查响应使用 字段:如果 cache_creation_input_tokens 和 cache_read_input_tokens 都为 0,则提示词未被缓存(可能是因为它未满足最小长度要求)。
如果您的提示词略低于您使用的模型的最小值,扩展缓存的内容以达到阈值通常是值得的。缓存读取的成本远低于未缓存的输入令牌,因此达到最小值可以降低频繁重用的提示词的成本。
对于并发请求,请注意缓存条目仅在第一个响应开始后才可用。如果您需要并行请求的缓存命中,请在发送后续请求之前等待第一个响应。
目前,"ephemeral" 是唯一支持的缓存类型,默认生命周期为 5 分钟。
请求中的大多数块都可以缓存。这包括:
tools 数组中的工具定义system 数组中的内容块messages.content 数组中的内容块,用于用户和助手轮次messages.content 数组中的内容块,在用户轮次中messages.content 数组中的内容块,在用户和助手轮次中这些元素中的每一个都可以被缓存,可以自动缓存或通过用 cache_control 标记。
虽然大多数请求块都可以缓存,但有一些例外:
思考块无法直接用 cache_control 缓存。但是,当思考块出现在先前的助手轮次中时,它们可以与其他内容一起缓存。以这种方式缓存时,它们在从缓存读取时确实计为输入令牌。
子内容块(如 引用)本身无法直接缓存。相反,缓存顶级块。
在引用的情况下,作为引用源材料的顶级文档内容块可以被缓存。这允许您通过缓存引用将引用的文档来有效地使用带有引用的提示词缓存。
空文本块无法缓存。
对缓存内容的修改可能使部分或全部缓存失效。
如 构建您的提示词 中所述,缓存遵循层次结构:tools → system → messages。每个级别的更改会使该级别及所有后续级别失效。
下表显示了不同类型的更改使缓存的哪些部分失效。✘ 表示缓存失效,✓ 表示缓存保持有效。
| 什么改变 | 工具缓存 | 系统缓存 | 消息缓存 | 影响 |
|---|---|---|---|---|
| 工具定义 | ✘ | ✘ | ✘ | 修改工具定义(名称、描述、参数)会使整个缓存失效 |
| 网络搜索切换 | ✓ | ✘ | ✘ | 启用/禁用网络搜索会修改系统提示词 |
| 引用切换 | ✓ | ✘ | ✘ | 启用/禁用引用会修改系统提示词 |
| 速度设置 | ✓ | ✘ | ✘ | 在 speed: "fast" 和标准速度 之间切换会使系统和消息缓存失效 |
| 工具选择 | ✓ | ✓ | ✘ |
使用这些 API 响应字段监控缓存性能,在响应中的 usage 内(或如果 流式传输,则在 message_start 事件中):
cache_creation_input_tokens:创建新条目时写入缓存的令牌数。cache_read_input_tokens:为此请求从缓存检索的令牌数。input_tokens:未从缓存读取或用于创建缓存的输入令牌数(即最后一个缓存断点之后的令牌)。理解令牌分解
input_tokens 字段仅代表您请求中最后一个缓存断点之后的令牌 - 不是您发送的所有输入令牌。
要计算总输入令牌:
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens空间解释:
cache_read_input_tokens = 断点前已缓存的令牌(读取)cache_creation_input_tokens = 断点前现在被缓存的令牌(写入)input_tokens = 您最后一个断点之后的令牌(不符合缓存条件)示例: 如果您有一个请求,其中 100,000 个令牌的缓存内容(从缓存读取),0 个令牌的新内容被缓存,以及您的用户消息中 50 个令牌(在缓存断点之后):
cache_read_input_tokens:100,000cache_creation_input_tokens:0当使用扩展思考与提示缓存时,思考块具有特殊行为:
与其他内容自动缓存:虽然思考块不能用 cache_control 显式标记,但当您在后续 API 调用中传递工具结果时,它们会作为请求内容的一部分被缓存。这通常发生在工具使用期间,当您将思考块传回以继续对话时。
输入令牌计数:当思考块从缓存中读取时,它们在您的使用指标中计为输入令牌。这对于成本计算和令牌预算很重要。
缓存失效模式:
cache_control 标记,也会发生此缓存行为有关缓存失效的更多详情,请参阅什么会使缓存失效。
工具使用示例:
请求 1:用户:"巴黎的天气如何?"
响应:[thinking_block_1] + [tool_use block 1]
请求 2:
用户:["巴黎的天气如何?"],
助手:[thinking_block_1] + [tool_use block 1],
用户:[tool_result_1, cache=True]
响应:[thinking_block_2] + [text block 2]
# 请求 2 缓存其请求内容(不是响应)
# 缓存包括:用户消息、thinking_block_1、tool_use block 1 和 tool_result_1
请求 3:
用户:["巴黎的天气如何?"],
助手:[thinking_block_1] + [tool_use block 1],
用户:[tool_result_1, cache=True],
助手:[thinking_block_2] + [text block 2],
用户:[文本响应, cache=True]
# 非工具结果用户块导致所有思考块被忽略
# 此请求的处理方式就像思考块从未存在过一样当包含非工具结果用户块时,它指定了一个新的助手循环,所有先前的思考块都从上下文中删除。
有关更详细的信息,请参阅扩展思考文档。
从 2026 年 2 月 5 日开始,提示缓存将使用工作区级隔离而不是组织级隔离。缓存将按工作区隔离,确保同一组织内工作区之间的数据分离。此更改适用于 Claude API 和 Azure AI Foundry(预览版);Amazon Bedrock 和 Google Vertex AI 将保持组织级缓存隔离。如果您使用多个工作区,请审查您的缓存策略以考虑此更改。
组织隔离:缓存在组织之间隔离。不同的组织永远不会共享缓存,即使他们使用相同的提示。
精确匹配:缓存命中需要 100% 相同的提示段,包括所有文本和图像,直到并包括用缓存控制标记的块。
输出令牌生成:提示缓存对输出令牌生成没有影响。您收到的响应将与不使用提示缓存时收到的响应相同。
为了优化提示缓存性能:
根据您的场景定制您的提示缓存策略:
如果遇到意外行为:
cache_control 标记位于相同位置tool_choice 和图像使用在调用之间保持一致cache_creation_input_tokens 和 cache_read_input_tokens 都将为 0tool_use 内容块中的键具有稳定的排序,因为某些语言(例如 Swift、Go)在 JSON 转换期间随机化键顺序,破坏缓存对 tool_choice 的更改或提示中任何位置的图像的存在/不存在将使缓存失效,需要创建新的缓存条目。有关缓存失效的更多详情,请参阅什么会使缓存失效。
如果您发现 5 分钟太短,Anthropic 还提供 1 小时缓存持续时间以额外成本。
要使用扩展缓存,请在 cache_control 定义中包含 ttl,如下所示:
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}响应将包含详细的缓存信息,如下所示:
{
"usage": {
"input_tokens": 2048,
"cache_read_input_tokens": 1800,
"cache_creation_input_tokens": 248,
"output_tokens": 503,
"cache_creation": {
"ephemeral_5m_input_tokens": 456,
"ephemeral_1h_input_tokens": 100
}
}
}请注意,当前的 cache_creation_input_tokens 字段等于 cache_creation 对象中值的总和。
如果您有定期使用的提示(即每 5 分钟以上使用一次的系统提示),请继续使用 5 分钟缓存,因为这将继续以无额外费用的方式刷新。
1 小时缓存最适合用于以下场景:
5 分钟和 1 小时缓存在延迟方面的行为相同。对于长文档,您通常会看到首令牌时间改进。
您可以在同一请求中使用 1 小时和 5 分钟缓存控制,但有一个重要的限制:具有较长 TTL 的缓存条目必须出现在较短 TTL 之前(即 1 小时缓存条目必须出现在任何 5 分钟缓存条目之前)。
混合 TTL 时,API 在您的提示中确定三个计费位置:
A:最高缓存命中处的令牌计数(如果没有命中则为 0)。B:A 之后最高的 1 小时 cache_control 块处的令牌计数(如果不存在则等于 A)。C:最后一个 cache_control 块处的令牌计数。如果 B 和/或 C 大于 A,它们必然是缓存未命中,因为 A 是最高缓存命中。
您将被收费:
A 的缓存读取令牌。(B - A) 的 1 小时缓存写入令牌。(C - B) 的 5 分钟缓存写入令牌。这里有 3 个示例。这描绘了 3 个请求的输入令牌,每个请求都有不同的缓存命中和缓存未命中。每个都有不同的计算定价,如彩色框所示。
为了帮助您开始使用提示词缓存,提示词缓存食谱提供了详细的示例和最佳实践。
以下代码片段展示了各种提示词缓存模式。这些示例演示了如何在不同场景中实现缓存,帮助您理解此功能的实际应用:
提示词缓存(自动和显式)符合 ZDR 资格。Anthropic 不存储您的提示词或 Claude 响应的原始文本。
KV(键值)缓存表示和缓存内容的加密哈希仅保存在内存中,不存储在磁盘上。缓存条目的最短生命周期为 5 分钟(标准)或 60 分钟(扩展),之后它们会被迅速(但不是立即)删除。缓存条目在组织之间是隔离的。
有关所有功能的 ZDR 资格,请参阅 API 和数据保留。
| $15 / MTok |
| $18.75 / MTok |
| $30 / MTok |
| $1.50 / MTok |
| $75 / MTok |
| Claude Sonnet 4.6 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / 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 |
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
cache_control={"type": "ephemeral"},
system="You are a helpful assistant that remembers our conversation.",
messages=[
{"role": "user", "content": "My name is Alex. I work on machine learning."},
{
"role": "assistant",
"content": "Nice to meet you, Alex! How can I help with your ML work today?",
},
{"role": "user", "content": "What did I say I work on?"},
],
)
print(response.usage.model_dump_json())对 tool_choice 参数的更改仅影响消息块 |
| 图像 | ✓ | ✓ | ✘ | 在提示词中的任何位置添加/删除图像会影响消息块 |
| 思考参数 | ✓ | ✓ | ✘ | 对扩展思考设置的更改(启用/禁用、预算)会影响消息块 |
| 传递给扩展思考请求的非工具结果 | ✓ | ✓ | ✘ | 当在启用扩展思考的请求中传递非工具结果时,所有先前缓存的思考块都会从上下文中删除,任何跟随这些思考块的上下文中的消息都会从缓存中删除。有关更多详情,请参阅 使用思考块缓存。 |
input_tokens这对于理解成本和速率限制都很重要,因为在有效使用缓存时,input_tokens 通常会比您的总输入小得多。