提示缓存详解:缓存命中价格如何降低你的大模型账单
发布于 · 更新于
Agent 和对话应用会一遍又一遍地发送同一段很长的开头:系统提示词、工具定义、参考文档、到目前为止的对话。厂商识别出这段前缀后,会复用之前的计算,并把这部分 token 按更低的**缓存读取**价格计费,而不是普通的输入价格。
在哪里看缓存价格
我们目录里的每个模型,都把缓存读取价格列在输入价格旁边。这两个价格的比例决定了缓存值多少钱,而且不同模型系列之间差别很大。
| 模型 | 输入 | 输出 | 缓存命中 | 上下文 |
|---|---|---|---|---|
| DeepSeek V4.1 Flash 1017 | $0.128 | $0.51 | $0.00255 | 1M |
| Qwen3.8-Max | $1.697 | $5.089 | $0.213 | 1M |
| MiniMax-M3 | $0.266 | $1.063 | $0.054 | 1M |
| GLM-5.3-Flash | $0.072 | $0.25 | $0.021 | 1M |
| GLM-5.3 | $0.715 | $2.50 | $0.179 | 1M |
命中缓存能省多少
下面的表按同样的价格实时计算。它给出 1,000 次请求的输入费用,每次请求的提示词是 100,000 token,分别算“完全没有缓存命中”和“提示词中 90% 命中缓存”两种情况。输出 token 不计入,因为缓存只影响输入这一侧。
| 模型 | 缓存读价 / 输入价 | 无缓存命中 | 90% 命中缓存 | 输入费用节省 |
|---|---|---|---|---|
| DeepSeek V4.1 Flash 1017 | 2.0% | $12.8 | $1.5095 | 88.2% |
| Qwen3.8-Max | 13% | $169.7 | $36.14 | 78.7% |
| MiniMax-M3 | 20% | $26.6 | $7.52 | 71.7% |
| GLM-5.3-Flash | 29% | $7.2 | $2.61 | 63.7% |
| GLM-5.3 | 25% | $71.5 | $23.26 | 67.5% |
要对比的是第一列。缓存读取价只有输入价几个百分点的模型,对稳定前缀的回报远高于缓存价是输入价四分之一的模型,所以要看这个比例,而不是只看输入价的标价。
怎样提高缓存命中率
- 不变的内容放最前面:系统提示词、工具定义和参考资料,放在任何会变化的内容之前。
- 会变的内容放最后面:最新的用户消息、时间戳、请求 ID 放在末尾。把时间戳放在提示词靠前的位置,会让每次调用的整个前缀都不一样。
- 保持调用之间前缀完全一致:文字相同、顺序相同、工具相同。厂商通常按完全相同的前缀匹配,所以哪怕只是调换工具列表的顺序,也可能导致不命中。
- 后续请求尽快发出。缓存会过期,保留多久取决于厂商。
- 一次对话尽量用同一个模型。缓存是属于单个模型的。
怎样确认缓存在起作用
看响应里的用量。OpenAI 格式中,命中缓存的部分是 usage.prompt_tokens_details.cached_tokens;Anthropic 格式中是 usage.cache_read_input_tokens。有些厂商会加上自己的字段,这些字段会原样透传(例如 DeepSeek 的 prompt_cache_hit_tokens)。如果在你反复发送的长提示词上,这个数一直是 0,说明前缀在调用之间变了。
resp = client.chat.completions.create(model="deepseek-v4.1-flash-1017", messages=messages)
usage = resp.usage
details = usage.prompt_tokens_details
cached = details.cached_tokens if details else 0
print(f"{cached} of {usage.prompt_tokens} prompt tokens came from cache")需要留意的地方
- 命中缓存的 token 按缓存读取价计费,替代输入价,而不是在输入价之外再加一次。
- 不是每个模型都会报告缓存命中,少数模型的缓存写入另有单独的价格。模型详情页有完整的价格明细。
- 价格和时段折扣会变化,本页的表格读取的是实时目录。