Administrator
Published on 2026-09-23 / 13 Visits
0
0

GPT-6 Prompt 缓存审计:九类失效原因

GPT-6 的 Prompt 缓存已经成为可控制、可诊断的 API 合同。应用可以选择隐式或显式断点,提前预热稳定前缀,用诊断接口比较两次请求,并把写入与读取成本分开核算。真正的工程任务,是证明某组真实请求复用了预期前缀、降低了总成本,同时在冷缓存下仍然保持正确。

阅读时间:约 9 分钟 · 约 3200 字

TL;DR

  • GPT-5.6 及后续模型,包括 GPT-6,要求可复用前缀至少包含 1024 个可见输入 Token。
  • 缓存写入按普通输入费率的 1.25 倍计费,读取按 0.1 倍计费。
  • Explicit-only 模式缺少显式 breakpoint 时,既不读缓存,也不写缓存。
  • 稳定内容放在断点前,用户特定、时间敏感和频繁变化的内容放在断点后。
  • Model、service tier、tools、Schema、输出格式、request-level reasoning effort、verbosity 和早期输入都要保持稳定。
  • Diagnostics 只返回第一个可分类原因。修复后继续比较,直到 Usage 证据与设计一致。
  • 缓存属于性能与计价优化。每个请求都要在冷缓存下正常完成。

先分清三种不同的缓存问题

OpenAI 的 Prompt Caching 官方文档描述的是跨请求复用相同 Prompt 前缀。服务为符合条件的前缀保存 Key-Value Tensor,后续请求可以复用这部分计算。

它与站内已经讨论过的两个问题处于不同层级:

GPT-6 Prompt 缓存面向 API 请求合同:哪个渲染后前缀符合条件、可以在哪里查找、发生了什么变化,以及 Usage 怎样计费。它不承担应用记忆,也不应成为正确性的前提。

写入计费改变了回本点

对于 GPT-5.6 及后续模型,OpenAI 官方文档给出的缓存写入价格是普通未缓存输入的 1.25 倍,缓存读取价格是 0.1 倍。一次完整写入加一次完整复用共需 1.35 份普通输入成本,低于两次冷请求的 2 份成本。一次写入加九次读取共需 2.15 份,冷请求则需要 10 份。

若某段前缀的普通输入成本为 C,可以用下面的简化模型估算:

缓存方案 = 1.25C × 写入次数 + 0.10C × 读取次数 + miss 成本
冷处理   = 1.00C × 请求次数

复用频率因此成为设计变量。写入一次且从未复用的前缀,比直接冷处理更贵。被大量请求共享的稳定政策,通常可以很快覆盖写入成本。

最低可缓存前缀为 1024 个可见输入 Token,OpenAI 提供的隐藏 System 内容不计入该阈值。GPT-5.6 及后续模型当前使用 30m 设置,条目在最近一次写入或复用后至少可用 30 分钟。这个数字代表最低可用窗口,不应被理解为精确的强制清除时刻。

有意识地选择 implicit 或 explicit-only

Implicit 模式由 OpenAI 在最新的合格消息结尾设置断点,适合保留历史并持续追加新轮次的对话。

Explicit-only 模式由应用明确标记可复用边界:

response = client.responses.create(
    model="gpt-6-sol",
    prompt_cache_options={"mode": "explicit"},
    input=[
        {
            "role": "developer",
            "content": [{
                "type": "input_text",
                "text": stable_policy,
                "prompt_cache_breakpoint": {"mode": "explicit"},
            }],
        },
        {"role": "user", "content": changing_request},
    ],
)

Explicit-only 模式在请求中没有显式断点时,不会读取或写入 Prompt 缓存。最后一个断点后的内容按普通输入费率处理,也不会产生缓存写入费。这很适合前半段是长而稳定的政策,后半段是快速变化的用户数据。

每个请求最多产生四次缓存写入。查找也有明确边界:Explicit-only 会检查最前两个与最新 50 个显式断点。Implicit 还会检查自身隐式断点、最多 20 个较早的合格消息结尾,以及初始连续 Developer Message 块的结尾。

断点数量应对应真实变化频率。例如在版本化全局政策后设置一个断点,在客户专属知识包后设置另一个。继续增加标记会扩大调试面,并不保证获得有效复用。

九类失效原因构成审计矩阵

Prompt Cache Diagnostics可以把当前请求与同一 Organization 近期完成的 Response 对比。将基线 Response ID 写入 prompt_cache_options.comparison_response_id,再检查 prompt_cache_diagnostics 和本次 Usage。

诊断原因 合同发生的变化 优先修复方式
model_changed 实际处理请求的模型变化 为同一请求族固定模型
prompt_cache_key_changed 分账或隔离 Key 变化 在预期分组内保持稳定 Key
service_tier_changed 处理层级变化 比较请求保持相同 Tier
tools_changed 工具名称、顺序、说明或 Schema 变化 保持 Tools 数组稳定,单独控制可用范围
text_format_changed Structured Output 指令或 Schema 变化 对格式做版本管理,并按 Schema 分组
reasoning_effort_changed 顶层 effort 改写隐藏指令 GPT-6 对话中使用 configuration_update
verbosity_changed 响应详略指令变化 同一请求族保持 verbosity 稳定
context_compacted 更早历史被压缩内容替换 Compaction 后建立新的比较基线
input_changed 早期消息、指令、ID 或时间戳变化 把动态内容移到断点后,并持续追加轮次

Diagnostics 每次只报告第一个可分类原因,一次请求可能同时发生多处漂移。修复当前原因,使用同一基线继续测试,再处理下一项。unavailable 无法证明命中,诊断记录过期后则可能返回 comparison_response_not_found。

Usage 字段才是复用和计费证据。应检查 usage.input_tokens_details.cached_tokens 和 cache-write tokens,避免把诊断标签直接当成账单。

让工具与推理配置保持追加式变化

工具定义位于渲染后的前缀内。函数改名、工具换序、修改描述或调整 JSON Schema,都可能让复用失效。

应用需要改变工具可用范围时,可以保留完整 Tools 数组,再通过 tool_choice: "none" 暂停工具调用,或通过 allowed_tools 限制可调用集合。Deferred tool search 和 additional_tools 可以把新发现的工具追加到已有上下文之后,保留前面的稳定前缀。

GPT-6 还支持在对话中追加 configuration_update 修改推理强度:

{
  "type": "configuration_update",
  "reasoning": { "effort": "high" }
}

Request-level reasoning.effort 保持原值。直接改写顶层设置可能改变更早的隐藏指令,降低缓存复用。

只有预期复用能回本时才预热

prompt_cache_options.prewarm: true 可以提前准备符合条件的前缀,同时不生成输出。它适合已知即将到来的工作负载,例如在定时评测批次开始前装载共享政策。

预热产生的写入按正常缓存写入费率计费。因此触发器至少要包含四项:

  1. 预计请求数量;
  2. 距离第一次使用的最长时间;
  3. 前缀版本;
  4. 工作负载取消后的处理方式。

为不确定的一次性请求预热,相当于用确定成本购买可能出现的延迟收益。

一套可重复的上线审计

为某个请求族启用缓存前,冻结 10 到 50 个代表性请求,执行下面的测试:

  1. 冷基线:记录输入、输出 Token,TTFT 的 p50 与 p95,总延迟和任务成功率。
  2. 写入:使用设计好的 implicit 或 explicit breakpoint,记录 cache-write tokens。
  3. 复用:只改变预定后缀,记录 cached-token ratio 和成本。
  4. 变异测试:依次改变 Model、Tier、工具顺序、Schema、verbosity、effort、早期指令和 compaction 状态。
  5. 诊断:逐项与基线比较,保存返回原因。
  6. 冷缓存正确性:主动制造 miss,并用同一任务验收标准检查结果。
  7. 生产门禁:监控 cached-token ratio 下降、异常写入、延迟回归和单个合格任务成本上升。

OpenAI Platform 中的 Prompt Caching Dashboard 适合观察整体行为。根因分析仍需要请求级 Trace,因为全局命中率可能掩盖某个客户或 Prompt 版本持续重写前缀。

FAQ

GPT-6 Prompt 缓存是自动的吗?

Implicit 模式会自动放置合格断点。Explicit-only 至少需要一个显式断点;缺少断点时,请求不会读写 Prompt 缓存。

Breakpoint 前必须有 1024 个 Token 吗?

GPT-5.6 及后续模型的可复用可见前缀需要达到 1024 Token。OpenAI 隐藏 System 内容不计入阈值。

GPT-6 还必须使用 prompt_cache_key 吗?

不需要。GPT-5.6 及后续模型会自动处理缓存路由。该 Key 主要用于按客户、用户或 Workspace 做独立分账与隔离。

工具内容相同,仅调整顺序为什么也会 miss?

OpenAI 缓存的是包含工具定义及顺序在内的渲染前缀。断点前结构变化会改变前缀。

应用可以手动清空 Prompt 缓存吗?

当前官方文档没有提供手动清除接口。需要逻辑隔离时可以调整前缀版本或分账 Key,同时保证每次请求都能在冷缓存下工作。

Diagnostics 是否单独收费?

诊断功能本身没有额外费用,也不单独占用 Rate Limit。为了建立基线或复测而增加的 Responses API 请求会正常计费。

让缓存可观测,同时保持可选

选择一个高频请求族,写清稳定前缀、动态后缀、断点、预期复用次数、隔离 Key 和冷缓存验收标准。完成七步审计后再上线。有效缓存会降低实测延迟和总成本,可靠应用则在缓存缺席时依然正确。

参考资料


Comment