Loading...
    • 开发者指南
    • API 参考
    • MCP
    • 资源
    • 更新日志
    Search...
    ⌘K
    入门
    Claude 简介快速开始
    模型与定价
    模型概览选择模型Claude 4.6 新特性迁移指南模型弃用定价
    使用 Claude 构建
    功能概览使用 Messages API处理停止原因提示词最佳实践
    上下文管理
    上下文窗口压缩上下文编辑
    能力
    提示缓存扩展思考自适应思考推理力度流式消息批量处理引用多语言支持Token 计数嵌入视觉PDF 支持Files API搜索结果结构化输出
    工具
    概览如何实现工具使用细粒度工具流式传输Bash 工具代码执行工具程序化工具调用计算机使用工具文本编辑器工具网页抓取工具网页搜索工具记忆工具工具搜索工具
    Agent Skills
    概览快速开始最佳实践企业级 Skills通过 API 使用 Skills
    Agent SDK
    概览快速开始TypeScript SDKTypeScript V2(预览版)Python SDK迁移指南
    API 中的 MCP
    MCP 连接器远程 MCP 服务器
    第三方平台上的 Claude
    Amazon BedrockMicrosoft FoundryVertex AI
    提示工程
    概览提示词生成器使用提示词模板提示词优化器清晰直接使用示例(多样本提示)让 Claude 思考(思维链)使用 XML 标签赋予 Claude 角色(系统提示词)链式复杂提示长上下文技巧扩展思考技巧
    测试与评估
    定义成功标准开发测试用例使用评估工具降低延迟
    加强安全护栏
    减少幻觉提高输出一致性防范越狱攻击流式拒绝减少提示词泄露保持 Claude 角色设定
    管理与监控
    Admin API 概览数据驻留工作空间用量与成本 APIClaude Code Analytics API零数据留存
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    能力

    提示缓存

    提示缓存是一项强大的功能,它通过允许从提示中的特定前缀恢复来优化您的 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
    JSON
    {"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 调用中重复使用,而无需每次都重新处理。仅更改用户消息即可让您在利用缓存内容的同时提出关于该书的各种问题,从而获得更快的响应和更高的效率。


    提示缓存的工作原理

    当您发送启用了提示缓存的请求时:

    1. 系统会检查提示前缀(直到指定的缓存断点)是否已从最近的查询中缓存。
    2. 如果找到,则使用缓存版本,减少处理时间和成本。
    3. 否则,处理完整提示并在响应开始后缓存该前缀。

    这对以下场景特别有用:

    • 包含大量示例的提示
    • 大量上下文或背景信息
    • 具有一致指令的重复任务
    • 长时间的多轮对话

    默认情况下,缓存的生命周期为 5 分钟。每次使用缓存内容时,缓存会免费刷新。

    如果您觉得 5 分钟太短,Anthropic 还提供 1 小时的缓存持续时间,需额外付费。

    有关更多信息,请参阅 1 小时缓存持续时间。

    提示缓存会缓存完整前缀

    提示缓存引用整个提示——tools、system 和 messages(按此顺序)直到并包括标记了 cache_control 的块。


    定价

    提示缓存引入了新的定价结构。下表显示了每个支持模型每百万 token 的价格:

    ModelBase Input Tokens5m Cache Writes1h Cache WritesCache Hits & RefreshesOutput 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

    上表反映了提示缓存的以下定价乘数:

    • 5 分钟缓存写入 token 为基础输入 token 价格的 1.25 倍
    • 1 小时缓存写入 token 为基础输入 token 价格的 2 倍
    • 缓存读取 token 为基础输入 token 价格的 0.1 倍

    这些乘数与其他定价修饰符叠加,例如 Batch API 折扣、长上下文定价和数据驻留。有关完整详情,请参阅定价。


    如何实现提示缓存

    支持的模型

    提示缓存目前支持以下模型:

    • Claude Opus 4.6
    • Claude Opus 4.5
    • Claude Opus 4.1
    • Claude Opus 4
    • Claude Sonnet 4.5
    • Claude Sonnet 4
    • Claude Sonnet 3.7(已弃用)
    • Claude Haiku 4.5
    • Claude Haiku 3.5(已弃用)
    • Claude Haiku 3

    构建您的提示

    将静态内容(工具定义、系统指令、上下文、示例)放在提示的开头。使用 cache_control 参数标记可重用内容的结尾以进行缓存。

    缓存前缀按以下顺序创建:tools、system,然后是 messages。此顺序形成一个层次结构,其中每个级别都建立在前一个级别之上。

    自动前缀检查的工作原理

    您只需在静态内容的末尾使用一个缓存断点,系统将自动找到最长匹配的缓存块序列。了解其工作原理有助于您优化缓存策略。

    三个核心原则:

    1. 缓存键是累积的:当您使用 cache_control 显式缓存一个块时,缓存哈希键是通过按顺序哈希对话中所有先前的块来生成的。这意味着每个块的缓存取决于它之前的所有内容。

    2. 向后顺序检查:系统通过从您的显式断点向后工作来检查缓存命中,按逆序检查每个先前的块。这确保您获得尽可能长的缓存命中。

    3. 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 块窗口之外发生更改时也能获得缓存命中

    重要限制:如果您的提示在缓存断点之前有超过 20 个内容块,并且您修改了这 20 个块之前的内容,除非您在更靠近该内容的位置添加额外的显式断点,否则不会获得缓存命中。

    缓存限制

    最小可缓存提示长度为:

    • Claude Opus 4.6、Claude Opus 4.5 为 4096 个 token
    • Claude Sonnet 4.5、Claude Opus 4.1、Claude Opus 4、Claude Sonnet 4 和 Claude Sonnet 3.7(已弃用)为 1024 个 token
    • Claude Haiku 4.5 为 4096 个 token
    • Claude Haiku 3.5(已弃用)和 Claude Haiku 3 为 2048 个 token

    较短的提示无法被缓存,即使标记了 cache_control。任何缓存少于此 token 数量的请求将在不缓存的情况下处理。要查看提示是否已被缓存,请参阅响应使用字段。

    对于并发请求,请注意缓存条目仅在第一个响应开始后才可用。如果您需要并行请求的缓存命中,请在发送后续请求之前等待第一个响应。

    目前,"ephemeral" 是唯一支持的缓存类型,默认生命周期为 5 分钟。

    理解缓存断点成本

    缓存断点本身不会增加任何成本。 您只需为以下内容付费:

    • 缓存写入:当新内容写入缓存时(5 分钟 TTL 比基础输入 token 多 25%)
    • 缓存读取:当使用缓存内容时(基础输入 token 价格的 10%)
    • 常规输入 token:用于任何未缓存的内容

    添加更多 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,000
    • cache_creation_input_tokens:0
    • input_tokens:50
    • 处理的总输入 token:100,050 个 token

    这对于理解成本和速率限制都很重要,因为在有效使用缓存时,input_tokens 通常远小于您的总输入。

    有效缓存的最佳实践

    要优化提示缓存性能:

    • 缓存稳定的、可重用的内容,如系统指令、背景信息、大型上下文或常用工具定义。
    • 将缓存内容放在提示的开头以获得最佳性能。
    • 策略性地使用缓存断点来分隔不同的可缓存前缀部分。
    • 在对话末尾和可编辑内容之前设置缓存断点,以最大化缓存命中率,特别是在处理超过 20 个内容块的提示时。
    • 定期分析缓存命中率并根据需要调整策略。

    针对不同用例的优化

    根据您的场景调整提示缓存策略:

    • 对话代理:降低长时间对话的成本和延迟,特别是那些包含长指令或上传文档的对话。
    • 编码助手:通过在提示中保留相关部分或代码库的摘要版本来改善自动补全和代码库问答。
    • 大型文档处理:在提示中包含完整的长篇材料(包括图片),而不增加响应延迟。
    • 详细指令集:共享广泛的指令列表、程序和示例,以微调 Claude 的响应。开发者通常在提示中包含一两个示例,但使用提示缓存,您可以通过包含 20 个以上高质量答案的多样化示例来获得更好的性能。
    • 代理工具使用:增强涉及多次工具调用和迭代代码更改的场景的性能,其中每个步骤通常需要一次新的 API 调用。
    • 与书籍、论文、文档、播客转录和其他长篇内容对话:通过将整个文档嵌入提示中,让任何知识库活起来,并让用户向其提问。

    常见问题排查

    如果遇到意外行为:

    • 确保缓存部分在各次调用中完全相同,并在相同位置标记了 cache_control
    • 检查调用是否在缓存生命周期内进行(默认为 5 分钟)
    • 验证 tool_choice 和图片使用在各次调用之间保持一致
    • 验证您缓存了至少最小数量的 token
    • 系统会自动在之前的内容块边界检查缓存命中(在您的断点之前最多约 20 个块)。对于超过 20 个内容块的提示,您可能需要在提示的更早位置添加额外的 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 生成没有影响。您收到的响应将与不使用提示缓存时获得的响应完全相同。


    1 小时缓存持续时间

    如果您觉得 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 对象中值的总和。

    何时使用 1 小时缓存

    如果您的提示以固定频率使用(即系统提示的使用频率高于每 5 分钟一次),请继续使用 5 分钟缓存,因为它将继续免费刷新。

    1 小时缓存最适合以下场景:

    • 当您的提示使用频率可能低于每 5 分钟一次,但高于每小时一次时。例如,当代理子代理需要超过 5 分钟时,或者当存储与用户的长聊天对话且您通常预期该用户可能在接下来的 5 分钟内不会回复时。
    • 当延迟很重要且您的后续提示可能在 5 分钟之后发送时。
    • 当您想提高速率限制利用率时,因为缓存命中不会从您的速率限制中扣除。

    5 分钟和 1 小时缓存在延迟方面的行为相同。对于长文档,您通常会看到首个 token 时间的改善。

    混合不同的 TTL

    您可以在同一请求中使用 1 小时和 5 分钟的缓存控制,但有一个重要约束:具有较长 TTL 的缓存条目必须出现在较短 TTL 之前(即 1 小时缓存条目必须出现在任何 5 分钟缓存条目之前)。

    混合 TTL 时,我们在您的提示中确定三个计费位置:

    1. 位置 A:最高缓存命中处的 token 计数(如果没有命中则为 0)。
    2. 位置 B:A 之后最高的 1 小时 cache_control 块处的 token 计数(如果不存在则等于 A)。
    3. 位置 C:最后一个 cache_control 块处的 token 计数。

    如果 B 和/或 C 大于 A,它们必然是缓存未命中,因为 A 是最高的缓存命中。

    您将被收取以下费用:

    1. A 的缓存读取 token。
    2. (B - A) 的 1 小时缓存写入 token。
    3. (C - B) 的 5 分钟缓存写入 token。

    以下是 3 个示例。这描述了 3 个请求的输入 token,每个请求具有不同的缓存命中和缓存未命中。每个请求因此具有不同的计算定价,显示在彩色框中。 混合 TTL 图表


    提示缓存示例

    为了帮助您开始使用提示缓存,我们准备了一个提示缓存 cookbook,其中包含详细的示例和最佳实践。

    下面,我们提供了几个代码片段,展示了各种提示缓存模式。这些示例演示了如何在不同场景中实现缓存,帮助您理解此功能的实际应用:


    常见问题

    Was this page helpful?

    • 1 小时缓存持续时间
    • 何时使用 1 小时缓存
    • 混合不同的 TTL