Claude API 提示词缓存高命中配置指南
通过 UniGateway 使用 Claude Messages API 时,将稳定内容放在前面、动态内容放在后面,并保持缓存断点之前的前缀不变,可以提高提示词缓存的复用率。
缓存命中取决于实际请求结构、模型的最小可缓存长度、请求间隔和前缀复用程度。本文提供最大化复用的配置方式,不承诺所有工作负载都能达到固定命中率。
前置条件
- 已获取 UniGateway API Key,并将其保存为
UNIGATEWAY_API_KEY - 已通过
GET /v1/models确认目标 Claude 模型在当前账号中可用 - 使用
POST /v1/messages发送 Anthropic Messages API 请求
追加式多轮对话
当会话历史只会在末尾追加新消息时,在请求顶层添加标准 cache_control 对象:
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"cache_control": {
"type": "ephemeral"
},
"system": "长期稳定的系统指令",
"messages": [
{"role": "user", "content": "第一轮问题"},
{"role": "assistant", "content": "第一轮回答"},
{"role": "user", "content": "本轮新增问题"}
]
}
自动缓存会在最近的可缓存内容处建立断点,并随对话增长向前推进。它适合历史消息只追加、不重写的聊天场景。
固定前缀与动态问题
当系统指令、工具定义或参考资料长期不变,而每次问题不同,请将断点放在最后一个稳定内容块上:
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "长期稳定的系统指令和参考资料",
"cache_control": {
"type": "ephemeral"
}
}
],
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "本次动态问题"}
]
}
]
}
不要将断点放在时间戳、实时检索结果或本轮用户问题之后。这样每次请求都会建立新的缓存,而不是读取已有缓存。
保持前缀可复用
Claude 按 tools、system、messages 的顺序形成缓存前缀。断点覆盖其之前的全部内容,应按以下顺序组织请求:
- 固定的工具定义及其 schema。
- 固定的系统指令、规则和长期参考资料。
- 可追加的对话历史或版本固定的上下文。
- 本次用户问题、时间戳、实时检索结果等动态内容。
命中要求断点之前的文本和图片完全一致。请保持以下内容不变:
- 同一复用流量使用同一模型。
- 工具数组、工具定义和 schema 的内容及顺序。
- 系统提示词、参考资料和图片的内容及顺序。
- 历史消息的既有部分;历史应追加而不是重写、重排或重新序列化。
cache_control的位置,以及会影响消息内容的请求配置。
断点与 TTL
- 每个
cache_control都应填写"type": "ephemeral"。 - 单个请求最多可使用 4 个缓存断点;顶层自动缓存也计入此上限。无必要时,不要混用自动缓存和多个显式断点。
- 默认 TTL 为 5 分钟。每次读取会刷新该 TTL。
- 预计下一次复用会超过 5 分钟但不超过 1 小时时,可在断点上配置 1 小时 TTL:
{
"cache_control": {
"type": "ephemeral",
"ttl": "1h"
}
}
1 小时缓存写入成本高于 5 分钟缓存,应只用于会在该时间窗口内再次使用的长稳定前缀。一个请求混用两种 TTL 时,所有 1h 断点必须出现在所有 5m 断点之前。
缓存前缀还必须达到所选模型的最小可缓存 token 长度。该阈值因模型而异;低于阈值的请求会正常执行,但不会建立缓存。上线前请依据 Anthropic 最新文档核对所用模型的阈值。
验证缓存命中
先发送一次请求建立缓存。收到该请求的首个响应后,再发送一个缓存前缀完全相同的请求。并发的首次请求不能共享尚未就绪的缓存。
检查响应中的 usage:
| 字段 | 含义 |
|---|---|
cache_creation_input_tokens | 本次新建或重建缓存的 token 数。 |
cache_read_input_tokens | 本次从缓存读取的 token 数;大于 0 表示实际命中。 |
input_tokens | 未作为缓存读写处理的输入 token 数。 |
cache_creation.ephemeral_5m_input_tokens / cache_creation.ephemeral_1h_input_tokens | 可用时,分别显示按 TTL 新建的缓存 token 数。 |
按 token 而不是按请求数量计算缓存复用率:
cache_read_input_tokens
-----------------------------------------------
input_tokens + cache_creation_input_tokens + cache_read_input_tokens
对一组重复请求汇总上式中的字段。首次创建缓存的请求不应被当作命中;后续请求的 cache_read_input_tokens 才是实际复用证据。
预热热点前缀
对于首轮延迟敏感且会被频繁复用的长稳定前缀,可使用 max_tokens: 0 配合显式断点预热。预热请求仍会产生缓存写入成本,且断点必须位于未来真实请求也会保持相同的稳定前缀末尾。不要将占位的动态用户消息作为预热断点的一部分。
发布前检查
- 所有缓存标记都包含
"type": "ephemeral"。 - 断点位于稳定内容的末尾,动态内容位于断点之后。
- 同一复用流量的模型、工具、系统提示词、图片和既有历史完全一致。
- 缓存前缀满足所选模型当前的最小可缓存长度。
- 首次创建后,第二次相同前缀请求的
cache_read_input_tokens大于 0。 - 缓存命中率按 token 汇总,不将首次写缓存请求当作命中。