
AI Agent 上下文缓存系列第三篇。逐家扒官方 API 文档:机制、代码、坑,以及大家最关心的——命中价格对比表。所有数字截至 2026-07-13,来源全部为官方文档,文末附链接。
系列前两篇讲的是"你这一侧"的功课:把 prompt 前缀做稳、让工具集只增不减。这一篇换到桌子对面——服务商那一侧的缓存规则到底长什么样。
规则值得逐家精读,因为三家的设计哲学完全不同:DeepSeek 走"全自动、不给你任何开关",Qwen 走"隐式保底 + 显式精控双轨",豆包走"缓存即资源、按小时收存储费"。同一套 Agent 代码换个供应商,缓存行为和账单结构都会变。
先给赶时间的人上结论:
| DeepSeek | Qwen(百炼) | 豆包(火山方舟) | |
|---|---|---|---|
| 隐式缓存 | ✅ 默认开、不可关 | ✅ 默认开、不可关 | ✅ 默认开、不可关(seed-2.0 起) |
| 显式缓存 | ❌ 无(仅支持自动缓存) | ✅ cache_control 标记 |
✅ Session 缓存 + 前缀缓存 |
| 隐式命中价 | 输入价的 ≈0.8%-2%(flash:0.02 vs 1 元/M;pro:0.025 vs 3 元/M,官方 2026-04 已将命中价降至首发价 1/10) | 输入价的 20% | 输入价的 20%(旗舰档) |
| 显式命中价 | — | 输入价的 10%(创建 125%) | 同隐式,另收存储费 |
| 缓存存储费 | 无 | 无 | 0.017 元/百万 token/小时 |
| 最小缓存长度 | 未公开(按单元落盘) | 隐式 256 / 显式 1024 | 1024 |
| 缓存寿命 | 几小时到几天 | 显式 5 分钟(命中重置) | 显式 TTL 可配,最长 7 天 |
| 命中字段 | prompt_cache_hit_tokens |
prompt_tokens_details.cached_tokens |
prompt_tokens_details.cached_tokens |
下面逐家拆。
DeepSeek:全自动派,便宜到不像话
DeepSeek 的哲学最极端:上下文硬盘缓存对所有用户默认开启,没有开关、没有标记、不需要改一行代码。 官方文档里连"如何开启"这一节都不存在。
机制:缓存前缀单元
值得注意的是,DeepSeek 现在的命中规则不是朴素的"逐字节最长前缀匹配"。受 Sliding Window Attention 影响,每条缓存前缀是一个独立的完整单元,后续请求必须完整匹配某个缓存前缀单元才能命中。落盘时机有三个:
- 请求结束位置落盘:每次请求的用户输入结束位置和模型输出结束位置,各产生一个缓存前缀单元;
- 公共前缀检测落盘:系统发现多次请求存在公共前缀时,把公共前缀单独落盘成一个单元;
- 固定 token 间隔落盘:长输入/长输出按固定 token 间隔切单元,避免超长前缀迟迟等不到"结束位置"而完全无法缓存。
这带来一个和直觉不同的行为:第一轮发 A+B、第二轮发 A+C,第二轮不命中(A+C 无法完整匹配单元 A+B)——但系统此时会检测到公共前缀 A 并落盘,第三轮发 A+D 就能命中 A 了。也就是说,"改了中段"的第一次请求是教学成本,同样的分叉点出现第二次才开始省钱。 对多分支 Agent(同一个长文档、不同任务分叉)这是个值得知道的细节。

代码:零配置,只需要读账单
from openai import OpenAI
client = OpenAI(api_key="sk-xxx", base_url="https://api.deepseek.com")
resp = client.chat.completions.create(
model="deepseek-v4-flash",
messages=[
{"role": "system", "content": "你是一位资深财报分析师……"},
{"role": "user", "content": f"{report_text}\
\
请总结这份财报的关键信息。"},
],
)
# DeepSeek 特有的两个 usage 字段
print(resp.usage.prompt_cache_hit_tokens) # 命中缓存的输入 token
print(resp.usage.prompt_cache_miss_tokens) # 未命中的输入 token价格:命中价是全价的 1/50 甚至更低
| 模型 | 输入(未命中) | 输入(命中) | 命中/未命中 | 输出 |
|---|---|---|---|---|
| deepseek-v4-flash | 1 元/M | 0.02 元/M | 2% | 2 元/M |
| deepseek-v4-pro | 3 元/M | 0.025 元/M | ≈0.8% | 6 元/M |
官方在 2026 年 4 月把全系命中价降到了首发价的 1/10,才有了这个夸张的折扣率。在 DeepSeek 上,缓存命中的部分约等于免费——这也意味着前缀稳定性优化在 DeepSeek 上的杠杆是三家里最大的:命中与不命中之间差着 50 倍价差。
两个注意点:缓存是"尽力而为",官方明确不保证 100% 命中;缓存寿命为几小时到几天,自动清理,无法手动管理。
Qwen(阿里云百炼):双轨制,隐式保底、显式精控
Qwen 提供两种模式,单次请求二选一、互斥:
- 隐式缓存:自动开启不可关,前缀匹配,命中价 = 输入价 20%,最少 256 token(qwen3.7-max 系列约 1000);
- 显式缓存:在 message content 上打
cache_control标记,命中价 = 输入价 10%,但创建缓存按 125% 计费,最少 1024 token,TTL 5 分钟(每次命中重置)。
显式缓存是 Anthropic 风格的断点式设计,几条硬规则:
- 单次请求最多 4 个缓存标记,多打了只有最后 4 个生效;
- 命中采用"从标记位置向前回溯"的匹配,待匹配内容与标记之间间隔超过 20 个 content 块就无法命中——长对话里标记要跟着往后挪;
- 增量友好:已有 1200 token 缓存 A,新请求缓存 1500 token 的 AB,前 1200 按命中(10%)、只有新增 300 按创建(125%)计费。

代码:cache_control 标记
from openai import OpenAI
import os
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
)
def ask(question: str):
return client.chat.completions.create(
model="qwen3.7-max",
messages=[
{
"role": "system",
"content": [{
"type": "text",
"text": long_code_repo, # 超过 1024 token 的稳定大块
# 从 messages 开头到此处的内容将创建为缓存块,TTL 5 分钟
"cache_control": {"type": "ephemeral"},
}],
},
{"role": "user", "content": question},
],
)
first = ask("这段代码的内容是什么")
print(first.usage.prompt_tokens_details.cache_creation_input_tokens) # 创建:1605
print(first.usage.prompt_tokens_details.cached_tokens) # 命中:0
second = ask("这段代码可以怎么优化")
print(second.usage.prompt_tokens_details.cache_creation_input_tokens) # 创建:0
print(second.usage.prompt_tokens_details.cached_tokens) # 命中:1605Agent 开发者最该划线的一段
官方文档里藏着一条对 Agent 至关重要的说明:Function Calling 场景下,tools 参数会被序列化为 JSON 作为 system 消息的一部分参与缓存计算,且工具定义不支持独立打标记。官方给出的三条纪律——工具列表顺序一致、字段顺序一致、字段结构一致——和本系列第二篇"工具集只增不减 + 排序冻结"的结论完全同源。厂商文档亲自确认:tools 就是前缀,抖一下就整条失效。
价格(qwen3.7-max,2026-07 挂牌价 12 元/M 输入、36 元/M 输出,限时 5 折中)
| 场景 | 单价系数 | 按原价折算 |
|---|---|---|
| 输入(无缓存) | 100% | 12 元/M |
| 隐式命中 | 20% | 2.4 元/M |
| 显式命中 | 10% | 1.2 元/M |
| 显式创建 | 125% | 15 元/M |
显式比隐式便宜一半,代价是 125% 的创建溢价和 5 分钟 TTL。官方经济账很清楚:同一块前缀 5 分钟内复用 ≥2 次才回本,高频复用越多越赚;低频、间隔长的场景老实用隐式。
豆包(火山方舟):缓存即资源,按小时收租
豆包的体系最复杂,也最"云厂商":缓存不是计费折扣,而是一种你显式持有的资源——有 ID、有 TTL、有存储费。
三种缓存:
- 隐式缓存:doubao-seed-2.0 及之后系列 + seed-code 支持,自动开启不可关,1024 token 起,命中按缓存价计费,存储不计费。官方特别提示:不保证命中,也不保证命中的是最长前缀(系统会权衡资源和收益选一段命中)。
- 显式·前缀缓存:把静态内容(系统提示词、规则模板、超长文档)创建成一个缓存对象,拿到
ctx-开头的 ID,后续请求引用 ID,这块内容根本不再随请求发送。支持并发,TTL 1 小时~7 天。 - 显式·Session 缓存:会话级缓存,每轮对话自动把新内容更新进去——相当于平台替你托管了对话历史,每轮只发新消息。不支持对同一 Session 并发请求,有
last_history_tokens(滚动窗口,FIFO 淘汰旧消息)和rolling_tokens(触顶删一段重算)两种截断策略。
如果你读过本系列第一篇会心一笑:豆包的前缀缓存就是"把稳定前缀搬出请求体"的平台级实现——我们在应用层手工做的事,它做成了 API。

代码:Context API 两步走
# 第 1 步:创建前缀缓存(mode 换成 "session" 即 Session 缓存)
curl https://ark.cn-beijing.volces.com/api/v3/context/create \
-H "Authorization: Bearer $ARK_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "<YOUR_ENDPOINT_ID>",
"messages": [
{"role": "system", "content": "<超长的系统提示词/规则模板/文档>"}
],
"ttl": 3600,
"mode": "common_prefix"
}'
# 返回 {"id": "ctx-****", ...} ← 缓存 ID
# 第 2 步:带 context_id 对话,缓存内容不再出现在请求里
curl https://ark.cn-beijing.volces.com/api/v3/context/chat/completions \
-H "Authorization: Bearer $ARK_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"context_id": "ctx-****",
"model": "<YOUR_ENDPOINT_ID>",
"messages": [{"role": "user", "content": "你好"}]
}'
# usage.prompt_tokens_details.cached_tokens 即命中量新一代的 Responses API 也支持同一套能力("caching": {"type": "enabled"} + previous_response_id),且支持缓存多模态内容和工具调用信息,官方现在更推荐那条路。
价格:命中 20% + 存储费
| 模型 | 输入 | 命中 | 命中/输入 | 存储 | 输出 |
|---|---|---|---|---|---|
| doubao-seed-2.1-pro | 6 元/M | 1.2 元/M | 20% | 0.017 元/M/时 | 30 元/M |
| doubao-seed-2.1-turbo | 3 元/M | 0.6 元/M | 20% | 0.017 元/M/时 | 15 元/M |
| doubao-seed-1.8(32K 档) | 0.8 元/M | 0.16 元/M | 20% | 0.017 元/M/时 | 2-8 元/M |
有意思的细节:seed-1.8 的命中价在各输入长度分段里恒定 0.16 元/M,而输入价随分段涨到 1.2、2.4 元——长上下文档位里命中折扣实际达到 13%、6.7%,上下文越长,缓存越划算。
存储费怎么算:按每自然小时内缓存的最大 token 量 × 0.017 元/M 累加。挂一个 100K token 的前缀缓存,一天成本约 0.04 元——对高频复用微不足道,但低频场景下"挂着不用"的缓存是纯赔钱,TTL 要按业务节奏设。
算一笔账:同一个 Agent 负载,三家各花多少钱
设一个典型 Agent 请求:输入 50K token,其中 40K 是稳定前缀(system + 工具 + 文档)且命中缓存,10K 是新内容。各家旗舰对比(不计输出、不计创建/存储等一次性小头):
| 无缓存 | 有缓存 | 输入成本降幅 | |
|---|---|---|---|
| deepseek-v4-pro | 0.150 元 | 0.031 元 | -79% |
| qwen3.7-max(隐式,按原价) | 0.600 元 | 0.216 元 | -64% |
| qwen3.7-max(显式,按原价) | 0.600 元 | 0.168 元 | -72% |
| doubao-seed-2.1-pro | 0.300 元 | 0.108 元 | -64% |
两个观察:
① 折扣率的天花板差异巨大。 20% 命中价(Qwen 隐式/豆包)意味着理论极限省 80%;DeepSeek 的 1%-2% 命中价意味着理论极限省 98%——你在 prompt 工程上抠出的每一个百分点命中率,在 DeepSeek 上值 5 倍的钱。

② 基础单价和缓存机制要一起看。 豆包 2.1-pro 输入价是 qwen3.7-max 原价的一半,加上同样 20% 的命中系数,绝对成本占优;但 Qwen 显式缓存 10% 的命中价 + 增量创建计费,在"超长稳定前缀 + 高频复用"场景能反超。没有全场最优,只有匹配你负载形状的最优。
选型小抄
- 前缀高度稳定、复用频繁、预算敏感 → DeepSeek 全自动 + 命中价近乎免费,但没有显式控制,命中"尽力而为",波动要靠监控兜底。
- 需要确定性命中、5 分钟内高频复用(客服、代码问答、批量评审) → Qwen 显式缓存,10% 命中价三家最低比例;记得管好 4 个标记的位置和 20 content 块的回溯窗口。
- 多轮对话极长、想把历史托管出去 → 豆包 Session 缓存独一份,每轮只发增量;前缀缓存 TTL 最长 7 天也是三家里最持久的显式缓存。
- 不管选哪家:把
cached_tokens(或 DeepSeek 的prompt_cache_hit_tokens)接进监控。本系列第一篇说过:没有这个数字,一切缓存优化都是盲人摸象。
最后回到系列主线。三家的机制细节各不相同,但有一条铁律完全一致,三家官方文档甚至用了几乎相同的措辞:"把重复内容放在提示词开头,把差异内容放在末尾。" 厂商的缓存规则决定了折扣的深度,而你的前缀稳定性决定了折扣的广度——前两篇的功课,在哪家都不白做。
AI Agent 上下文缓存系列: ① 缓存命中率只有一半?你的 Agent 可能正在为一个时间戳买单 ② 给 Agent"卸载"技能,是一次昂贵的洁癖 ③ 同样的缓存,三家三种玩法(本篇)
如果这篇对你有用,欢迎关注 / 在看,系列还会继续。
参考资料(价格截至 2026-07-13,以官方页面实时为准)
- DeepSeek 上下文硬盘缓存:https://api-docs.deepseek.com/zh-cn/guides/kv_cache
- DeepSeek 模型与价格:https://api-docs.deepseek.com/zh-cn/quick_start/pricing
- 阿里云百炼 上下文缓存(Context Cache):https://help.aliyun.com/zh/model-studio/context-cache
- 阿里云百炼 模型价格:https://help.aliyun.com/zh/model-studio/model-pricing
- 火山方舟 上下文缓存·原理及选型:https://www.volcengine.com/docs/82379/1398933
- 火山方舟 上下文缓存(Context API):https://www.volcengine.com/docs/82379/1396491
- 火山方舟 模型价格:https://www.volcengine.com/docs/82379/1544106