提示词缓存与性能 实用技巧
所属主题:Claude 提示词缓存与性能优化
本文围绕「提示词缓存与性能 实用技巧」整理操作要点、适用场景和常见问题,帮助你先判断是否适合继续操作,再按步骤完成配置。
提示词缓存与性能:实用技巧
提示词缓存(Prompt Caching)是大型语言模型 API 的核心优化功能,它允许系统识别并重复使用已处理的前缀 token——包括系统指令、长上下文、工具描述或对话历史——从而在后续请求中显著降低延迟和成本。本质上,它在你的输入中划定一道“缓存断点”,让相同的起始部分只需计算一次。
这项能力对频繁使用固定系统提示、处理超长文档或执行异步批处理任务的用户尤为关键。正确启用后,首 token 耗时(TTFT)可降低约 85%,同时输入 token 成本最多减少 50%。然而,其生效条件相当严格——若使用不当,你可能根本看不到任何性能提升,甚至反而增加延迟。
开始之前
确认你的模型支持缓存
并非所有模型或 API 端点都开放提示词缓存。截至 2025 年中,主要平台的情况如下:
| 平台 | 支持缓存的模型 | 缓存条件 | 费用折扣 |
|---|---|---|---|
| Claude (Anthropic) | Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku | 前缀连续 ≥1024 token | 输入 token 成本 -50% |
| OpenAI | GPT-4o, GPT-4 Turbo | 前缀连续 ≥1024 token(部分需经由特定端点) | 输入 token 成本 -50% |
| Gemini(Google) | Gemini 1.5 Pro, 1.5 Flash | 上下文 ≥32768 token 时自动触发 | 上下文 token 成本 -64%~75% |
| Mistral | Mistral Large (24.11) | 需在请求中显式标记 cache:true |
待确认 |
关键检查点:如果你使用的是不支持缓存的旧模型(如 GPT-3.5-turbo),或通过第三方代理调用 API,提示词缓存不会生效;即使包含了缓存参数也会被忽略(API 也不报错)。
理解缓存的工作边界
- 位置决定一切:只有从输入开头开始的连续 token 序列才会被缓存。任何插入、替换或顺序调整都会使缓存失效。
- 缓存有生存期:多数平台在缓存未被命中的 5–60 分钟后将其自动丢弃(Claude 约 5 分钟,Gemini 更长)。
- 缓存命中的证据:API 响应中
usage.cache_creation_input_tokens和usage.cache_read_input_tokens字段的数值从 0 变为正数,是缓存生效的唯一可靠标志。如果不显示这些字段,说明未命中缓存。
实操步骤
以下是一个真实场景:你正在使用 Claude API 构建一个合同审查助手,每次请求都需要带上 3000 token 的法律条款知识库(系统提示),然后传入不同的待审查合同(用户内容)。
第 1 步:设计可缓存的提示结构
把提示词拆成三个明确部分:
[system]
你是专业的合同审查助手...(知识库正文,约 3000 token)
--- 缓存断点 ---
[user]
请审查以下合同条款:{user_contract_text}
关键:让系统提示以完全相同的内容出现在每一次请求的最前端。不要在知识库前插入时间戳、随机 ID 或用户特定的问候语。
第 2 步:在 API 请求中标记缓存断点
以 Anthropic Messages API 为例:
{
"model": "claude-3-5-sonnet-20241022",
"system": [
{
"type": "text",
"text": "你是专业的合同审查助手...\n(知识库正文,约 3000 token)",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{"role": "user", "content": "请审查以下合同条款:\nXXXXX"}
],
"max_tokens": 4096
}
在 system 参数的文本块上添加 cache_control: {type: "ephemeral"} 来指示 API 创建缓存断点。OpenAI 的 API 则需要在 messages 数组中相同位置添加该参数。
新手最容易忽略的一点:system 参数本身不从 0 token 开始算——它自带约 4 token 的隐式开销。如果知识库恰好只有 1020 token,加上这 4 token 后 1024 阈值达标,缓存才会创建。
第 3 步:验证缓存是否命中
发送第一次请求后,检查 API 响应中的 usage 对象。
| 字段 | 首次请求(创建缓存) | 后续请求(命中缓存) | 含义 |
|---|---|---|---|
cache_creation_input_tokens |
3004 | 0 | 本次创建了缓存的 token 数 |
cache_read_input_tokens |
0 | 3004 | 本次命中了缓存的 token 数 |
input_tokens |
3010 | 6 | 实际计费的输入 token(不含缓存命中部分) |
注意:如果多次请求后 cache_read_input_tokens 始终为 0,说明缓存未生效。最常见的原因是前缀长度未达到 1024 token 或每次请求的前缀不完全一致。
第 4 步:优化缓存利用率
- 批量处理:连续发送对同一知识库的不同查询,在缓存失效前尽可能多次命中。理想节奏是每 2–3 分钟发送一批。
- 合并系统提示:如果多个模型共享同一套指令,将该指令段落放在最前面统一缓存,而不要在每个模型各自重复。
- 避免日期间隔:不要在缓存前缀中嵌入今天的日期或用户名称,除非这些信息在每个请求中完全相同。只需把有差异的部分放到用户消息中。
核查清单
首次配置缓存时,请逐项核验:
- 使用的模型是否在官方文档中明确支持提示词缓存
- 最新 SDK 版本是否包含缓存参数的支持(
anthropicPython SDK ≥0.39.0,openaiPython SDK ≥1.43.0) - 缓存前缀长度是否严格超过 1024 token(Claude/OpenAI)或 32768 token(Gemini)
- 所有请求的前缀(从开头到缓存断点)是否完全一致——包括空格、换行、标点
- API 响应中是否包含
cache_*计数字段 - 连续发送两个相同的请求后,第二个请求的
cache_read_input_tokens是否 > 0 - 客户端所用的 API 密钥是否具有访问缓存功能的权限(部分平台需单独启用)
排错指南
| 现象 | 可能的原因与解决方案 |
|---|---|
响应中无 cache_* 字段 |
模型不支持缓存或 SDK 版本过旧。升级 SDK 或更换模型。 |
始终只有 cache_creation,没有 cache_read |
两次请求的前缀不完全一致。用精确字符串比较工具检查两端。常见陷阱:末尾多了一个空格或不同的 Unicode 引号。 |
| 缓存偶尔命中、偶尔丢失 | 可能是缓存因不活跃被自动清除(间隔超过 5 分钟)。缩短单次任务的请求间隔,或在缓存失效前批量发出。 |
带了 cache_control 后请求反而变慢 |
创建缓存的首批请求本身不会有加速效果——缓存是在处理时才写入的。只有后续请求才会受益。 |
| Gemini 显示缓存已激活但费用未下降 | Google 的缓存计费方式与 Claude/OpenAI 不同:缓存命中时仅收取命中的处理费,但存储缓存本身按 token 时长计费。长空闲期可能抵消节省。 |
何时应该停止当前操作:如果你检查 API 文档后发现自己的场景中根本无法满足连续一致前缀长度 ≥1024 token 的条件(例如系统提示只有 200 token 且你无法添加内容),那么提示词缓存不适合你。与其强行填充无用 token 凑数(会导致实际输入成本增加),不如考虑其他优化手段:例如减少每轮携带的历史消息、使用批量 API 或异步流式调用。
常见问题
提示词缓存与性能:实用技巧是什么?
提示词缓存是一项 API 层级的性能优化功能,允许服务商识别并复用输入序列中从开头算起的相同前缀部分。它适用于任何需要重复使用大量固定上下文(系统提示、知识库、对话背景、工具描述)的工作流。正确配置后,可以同时降低每次请求的延迟和成本,是真正的“降本增效”手段。
提示词缓存与性能:实用技巧怎么操作?
操作流程分为四步:(1)将提示词中固定不变的部分提到最前端并确保长度超过缓存阈值(通常 1024 token);(2)在 SDK 或 API 请求体中对这部分内容标记 cache_control;(3)连续发出 2 次请求并观察响应中 cache_read_input_tokens 是否为正数;(4)根据业务节奏微调批次大小和请求间隔,充分利用缓存生存窗口。详细代码示例见本文“实操步骤”章节。
提示词缓存与性能:实用技巧常见错误有哪些?
最常见的三个错误