AB
AiBoss
Wiki

什么是提示词缓存(Prompt Caching)?

提示词缓存(Prompt Caching)是大型语言模型 API 中的一种优化机制:把请求中重复出现的前缀内容对应的中间状态保存下来,后续请求命中时直接复用,从而减少重复计算、降低输入成本并缩短响应前的处理时间。Claude 与 OpenAI 的官方文档分别给出了各自的启用方式、缓存生命周期与计费规则。

提示词缓存(Prompt Caching)是大型语言模型 API 提供的一种请求优化机制:当多个请求共享同一段提示词前缀时,服务端把这段前缀已经计算出的中间状态保存下来,后续请求命中缓存后直接复用,而不必从头重新处理。它要解决的是重复性输入带来的三重浪费——重复的算力、重复计费的输入 token,以及响应开始前的额外等待时间。

为什么重要

在提示词缓存出现之前,调用模型 API 的典型方式是每次请求都把完整上下文重新发一遍:一段很长的系统指令、若干示例、一份背景文档,再加上本轮的新问题。模型对输入 token 的处理需要计算中间状态,OpenAI 官方文档把这种中间状态称为键值状态(key-value states,KV states),模型依靠它在新输入和新输出时回看更早的 token。如果每次请求都重算整段前缀,那么同一份背景材料被反复处理多少次,就要付出多少次算力与费用。

这种浪费在几类场景中尤其明显。Claude 官方文档列举的适用情形包括:包含大量示例的提示词、大段上下文或背景信息、指令固定不变的重复性任务,以及较长的多轮对话。OpenAI 官方文档则把提示词缓存的价值归纳为三点:计算高效,避免重新计算模型已经处理过的前缀;输入 token 更便宜,被复用的 token 按更低的缓存输入费率计费,折扣最高可达 95%;更快,减少响应开始前处理输入所花的时间。需要说明的是,这些收益表述来自两家厂商各自的官方文档,属于其产品说明,而非独立评测结论。

工作机制

两家厂商的实现细节不同,但核心思路一致:以「前缀」为单位做缓存,命中即复用,未命中则重新计算并写入。

Claude 的启用方式与命中逻辑

据 Claude 官方文档,提示词缓存有两种启用方式。其一是自动缓存(automatic caching):在请求顶层加一个 cache_control 字段,系统自动把缓存断点应用到最后一个可缓存的内容块,并随着对话增长把断点向前移动,适合消息历史不断累积的多轮对话。其二是显式缓存断点(explicit cache breakpoints):把 cache_control 直接放在单个内容块上,从而精确控制哪些内容被缓存。

命中流程是:系统检查某个提示词前缀(截至指定缓存断点)是否已在近期查询中被缓存;若命中,则使用缓存版本,减少处理时间与成本;若未命中,则处理完整提示词,并在响应开始后缓存该前缀。文档给出的默认缓存生存期为 5 分钟,每次使用缓存内容都会免费刷新。生存期从写入或读取该缓存条目的请求开始时刻计算,而不是从响应结束时刻计算;生成响应所花的时间也计入生存期——文档举例说,如果一个响应流式输出耗时 4 分钟,那么复用同一缓存前缀的后续请求必须在响应完成后约 1 分钟内发起。

OpenAI 的断点、最小长度与匹配规则

据 OpenAI 官方文档,提示词缓存对受支持的模型默认启用,可通过 Prompt Caching Dashboard 监控缓存读取命中率,并用 Prompt Cache Diagnostics 工具诊断未命中原因。缓存断点(cache breakpoint)标记一段可被保存并复用的前缀的结尾:首个请求把符合条件的前缀写入缓存,后续请求从符合条件的断点向前回溯,寻找最长的匹配缓存前缀。

前缀必须达到模型的最小可缓存 token 长度才能被缓存。文档写明,GPT-5.6 及之后版本的最小可缓存提示词长度为 1,024 token,更早的模型则随请求设置而变化;OpenAI 提供的隐藏系统内容中的 token 不计入该最小值。缓存保存的是键值张量,而不是 token 本身。OpenAI 缓存的是模型完整的渲染后上下文,包括 OpenAI 提供的指令、开发者消息、工具定义,以及包含文本、图像、文档和受支持音频的对话历史;复用要求整个渲染后前缀完全匹配。

文档还列出了会影响前缀匹配的主要设置:模型(不同模型权重与缓存行为不同)、工具(名称、描述、schema、顺序或工具专属指令的变化)、parallel_tool_calls、text.format(结构化输出会追加输出格式指令与 schema)、reasoning.effort、text.verbosity,以及 context_management(压缩会用紧凑上下文替换较早的对话内容,从第一个被改动的 token 起就无法复用)。修改请求并不必然丢弃已有缓存条目,关键在于后续请求是否具有相同前缀并能找到可用的匹配断点。

典型例子

Claude 官方文档给出的入门示例是:使用 Python 客户端创建消息请求,在请求顶层设置 cache_control 为 {"type": "ephemeral"},系统指令设定为分析文学作品,用户消息要求分析《傲慢与偏见》的主要主题,并打印 response.usage 以查看用量。在自动缓存模式下,系统会缓存截至最后一个可缓存块的全部内容,后续具有相同前缀的请求自动复用。

OpenAI 官方文档提到的使用场景包括:Agents API 的模型调用与 Responses API 采用相同的提示词缓存行为;在会话内复用上下文有助于保持共享的提示词前缀,但文档明确指出,维持会话并不保证缓存命中。文档还提示缓存写入定价不是叠加费用:输入 token 按未缓存输入、缓存输入或缓存写入三者之一的费率计费,具体费率随模型而异。

Claude 官方文档另附按模型分列的价格表,区分基础输入输出价格与 5 分钟写入、1 小时写入、命中与刷新三类缓存价格,例如表中 Claude Sonnet 5.5 的基础输入为每百万 token 2 美元、输出 10 美元,5 分钟写入 2.50 美元、1 小时写入 4 美元、命中与刷新 0.10 美元。这些数字属于该文档发布时的定价,会随产品调整而变化,引用时应以官方最新页面为准。

边界与常见误解

第一,缓存不是「记住对话」。它保存的是可复用前缀对应的中间状态,模型仍需处理任何新输入才能生成新响应;OpenAI 文档明确说明,维持会话不保证缓存命中。

第二,前缀必须严格一致。任何位于断点之前的内容或相关设置发生变化,改动点之后的前缀就无法匹配已有缓存条目。工具定义顺序、结构化输出 schema、推理强度等看似与「文本」无关的设置,同样会破坏匹配。

第三,存在最小长度门槛。OpenAI 文档规定前缀须达到模型的最小可缓存 token 长度,GPT-5.6 及之后为 1,024 token,过短的提示词无法享受缓存。

第四,缓存有生存期且计时方式容易被误读。Claude 文档的默认 5 分钟从请求开始时刻计算,生成响应的时间也计入其中,因此长响应会压缩后续请求的可用窗口。

第五,价格结构变化不等于总成本必然下降。缓存写入本身有单独费率,OpenAI 文档强调写入费率不是叠加费用而是三选一;是否划算取决于前缀被复用的次数与频率。两家文档给出的折扣幅度、最小长度、生存期等参数各不相同,不能互相套用,也不应把某一家的说法当作行业通用标准。

参考资料