<!-- title: 每次重发整本文档：原生缓存命中只收一折 -->
<!-- domain: cost-hacks -->

## 导语：你那段 RAG 代码，正在按"全价"重复计费

如果你写过一个会反复调用大模型的 Agent——比如带工具定义、带检索文档、带系统提示词的客服机器人或代码助手——你大概率踩过这个坑：**每一次调用，都把 5 万到 10 万 token 的固定前缀原封不动重新发给模型，然后按全价计费。**

而模型供应商其实早就给你留了一个折扣口子：**只要这段前缀一字不差，命中后读取只收一折（90% off）**。这个机制叫原生提示词缓存（prompt caching / context caching），它和你可能听过的"语义缓存"是两码事——后者是应用层模糊匹配、还会返回旧答案，前者是供应商 KV 缓存层级的硬折扣、质量零损耗。

今天这轮情报，就把这套"原生折扣体系"完整拆给你：Anthropic、OpenAI、Gemini 三家的缓存机制，叠加 Batch API 的五折异步通道，再配上国内 DeepSeek/GLM 的白嫖玩法，算一笔实打实的账。

---

## 一、先看反模式：每天都在白烧的那段代码

下面这段伪代码，是九成 RAG/Agent 项目的真实长相：

```python
for msg in conversation:
    response = client.messages.create(
        model="claude-sonnet-4-6",
        system=[{"type": "text", "text": SYSTEM_PROMPT}],      # 固定，2万 token
        messages=[
            {"role": "user", "content": retrieved_docs},        # 固定，4万 token
            {"role": "user", "content": msg}                    # 变化，500 token
        ]
    )
```

注意到了吗？**真正每次变化的只有最后那条用户消息**，前面 6 万 token 的前缀（系统提示 + 工具定义 + 检索文档）每次都一模一样。但 API 照样按 6 万 token 的全价计费。

以 Claude Sonnet 4.6 输入价 $3/百万 token 算，一天 1000 次调用：

- 固定前缀成本：60,000 × 1000 = 6000 万 token × $3 = **$180/天**
- 实际只有变化的查询值钱：500 × 1000 = 50 万 token × $3 = **$1.5/天**

**那 $178.5 的差价，就是因为你没开原生缓存。**

---

## 二、关键认知差：原生缓存 ≠ 语义缓存

这是国内开发者最大的误区。很多人听说过"缓存能省钱"，第一反应是搭个 Redis 做语义缓存（把相似问题的答案存起来）。但这两者完全不在一个层级：

| 维度 | 原生缓存（Prompt/Context Caching） | 语义缓存（Semantic Cache） |
|------|-----------------------------------|---------------------------|
| 工作层级 | 供应商 KV 缓存层 | 你自己的应用层 |
| 命中条件 | **前缀逐字节完全相同** | 查询语义相似（向量距离阈值） |
| 命中后行为 | 只跳过前缀计算，**照常重新生成**答案 | **直接返回缓存的旧答案** |
| 质量风险 | **零**（每次都是新输出） | 高（可能返回过时/错误答案） |
| 折扣力度 | 命中读取 **90% off** | 100% off（但命中率通常 20%-40%） |
| 搭建成本 | 加一行参数 | 自己维护向量库 + 阈值调优 |

一句话总结：**语义缓存赌的是"问题相似"，原生缓存赌的是"前缀相同"。前者省的是整次调用，后者省的是重复计算——而且不牺牲任何回答质量。**

实战中两者可以叠加：固定前缀走原生缓存打一折，相似查询再走语义缓存。但绝大多数人连第一层都没开。

---

## 三、三大家 + 国产：原生缓存机制全对比

### 1. Anthropic：手动开关，力度最大

Claude 系列的缓存需要你**显式声明缓存断点**，但折扣力度是全场最猛的：

- **缓存读取（Cache Read）**：0.1× 标准输入价 = **90% off**
- **缓存写入（5 分钟 TTL）**：1.25× 标准输入价（写一次有 25% 溢价）
- **缓存写入（1 小时 TTL）**：2× 标准输入价（长缓存，写一次贵一倍）
- **最小可缓存长度**：1024 token（Sonnet/Haiku）、2048 token（Opus）
- **断点数量**：单次请求最多 4 个

开启方式只需在对应内容块加一个字段：

```json
{
  "role": "user",
  "content": [
    {
      "type": "text",
      "text": "...这段固定的长文档...",
      "cache_control": {"type": "ephemeral"}          // 5分钟缓存
      // 想要1小时：{"type": "ephemeral", "ttl": "1h"}
    }
  ]
}
```

**谁该用**：系统提示长、工具定义多、RAG 文档固定的 Agent。Claude Code、Cursor 这类工具内部早已大量使用，所以你能感觉它们又快又省。

### 2. OpenAI：全自动，门槛最低

OpenAI 的缓存是**零配置自动开启**的：

- **缓存命中**：输入价 **50% off**（0.5×）
- **触发条件**：提示词超过 1024 token，且前缀与近期请求匹配
- **写入成本**：无溢价（系统自动缓存，不额外收费）

缺点是折扣只有五折（不如 Claude 的一折猛），且你无法手动控制断点位置，完全交给系统。但胜在"什么都不用做就生效"。

### 3. Gemini：显式缓存对象 + 按时存储费

Google 的玩法最灵活也最复杂：

- 你**主动创建一个缓存对象**（Cache），把大文档塞进去
- 后续请求引用这个 Cache ID，命中部分按折扣价计费（不同模型约 25%–50% off）
- **但要按小时付存储费**——缓存存活期间持续计费（每小时固定费用，跟模型挂钩）
- TTL 可配置，默认 1 小时，可延长到数天

**适用判断**：文档会在较长时间窗口内被高频复用（比如一个知识库被连续查询几小时），存储费才划算；如果只是几分钟内复用几次，存储费会吃掉折扣。

### 4. 国产白嫖：DeepSeek 的磁盘缓存

国内玩家更幸福，因为 **DeepSeek 的上下文缓存是自动的、免费的、力度更狠**：

- **缓存命中**：$0.014/百万 token（DeepSeek-V3）
- **未命中**：$0.27/百万 token
- 折算下来 **命中只要未命中的 1/19，约 95% off**
- **写入零溢价**：系统自动把高频前缀落到磁盘缓存，不需要你声明任何参数

GLM（智谱）同样在 API 层提供上下文缓存支持，对国内出海项目和成本敏感的本地部署极其友好。

---

## 四、缓存命中只收一折：实战 ROI 账本

回到第一节的例子，我们把那段 6 万 token 的固定前缀接上 Anthropic 缓存，重算一遍（假设缓存 5 分钟内持续命中，首次写入后基本不掉）：

| 项目 | 无缓存 | 开缓存（5分钟TTL） |
|------|--------|---------------------|
| 前缀写入（首条） | — | 60K × $3.75/M ≈ $0.225 |
| 前缀读取（999条） | 60K×999×$3/M = **$179.8** | 60K×999×$0.30/M ≈ **$18.0** |
| 用户查询（变化部分） | $1.5 | $1.5 |
| **单日合计** | **≈ $181** | **≈ $19.7** |
| **单月（30天）** | **≈ $5,430** | **≈ $591** |

**单月省下约 $4,800，降幅 89%。** 而且这条收益是**纯利润**——回答质量零下降，因为模型每次都重新生成，只是省了前缀的重复计算。

如果再用 1 小时 TTL（写溢价 2×）应对低频但跨度大的场景，写入成本翻倍但能撑住更长间隔，跨小时复用同样划算。

```mermaid
flowchart TD
    A[收到一次模型请求] --> B{前缀是否超过1024 token?}
    B -- 否 --> Z[直接全价调用<br/>不值得缓存]
    B -- 是 --> C{前缀是否每次相同?}
    C -- 否, 动态拼接 --> D[改造为固定前缀+可变后缀]
    D --> C
    C -- 是 --> E{5分钟内会被复用吗?}
    E -- 是 --> F[开 5分钟TTL 缓存<br/>写入1.25x 读取0.1x]
    E -- 否 --> G{1小时内会被复用吗?}
    G -- 是 --> H[开 1小时TTL 缓存<br/>写入2x 读取0.1x]
    G -- 否 --> I{需要实时响应吗?}
    I -- 否, 可等数小时 --> J[改走 Batch API<br/>全单五折 50% off]
    I -- 是 --> Z
    F --> K[缓存命中只收一折 ✅]
    H --> K
    J --> L[异步批处理打五折 ✅]
```

---

## 五、还能再砍一刀：Batch API 的五折异步通道

如果你的任务**不需要实时返回**——批量打标签、文档摘要、数据集清洗、内容审核——三大供应商都提供一个被严重低估的接口：**Batch API**。

- **OpenAI / Anthropic / Gemini 的 Batch API**：异步提交一批请求，**24 小时内返回结果，全部按 50% off 计费**
- 用法：把请求写成一个 JSONL 文件上传，几小时后下载结果文件
- **关键**：Anthropic 的 Batch API **本身也支持缓存读取**——也就是说固定前缀那一折的折扣，和批量五折，理论上可以叠加享受

| 任务类型 | 实时 API 单价 | Batch API 单价 | 折扣 |
|----------|---------------|----------------|------|
| Sonnet 实时调用 | $3/M 输入 | — | 基准 |
| Sonnet 批量调用 | — | $1.5/M 输入 | **50% off** |
| Sonnet 批量+缓存读 | — | $0.30/M 输入（命中部分） | **90% off** |

**实战节奏**：白天实时业务走原生缓存（用户不能等），晚上把当天积压的非紧急任务（日志分析、用户反馈分类）打包丢进 Batch API 过夜跑。同一份账单，两个折扣各管一摊。

---

## 六、踩坑清单：缓存为什么"开了没省钱"

很多人兴冲冲开了缓存，账单却没降，基本都是这几个原因：

1. **前缀不是真·固定**：你在前缀里塞了时间戳、用户 ID、随机数，导致每次前缀都变，永远 miss。**正确做法**：把可变部分挪到请求末尾，前缀保持纯静态。

2. **TTL 过期**：5 分钟缓存，结果你的请求间隔超过 5 分钟，缓存早被清了。低频场景换 1 小时 TTL，或干脆用 DeepSeek 这种自动长缓存。

3. **没到最低长度**：前缀不足 1024 token，缓存根本不会触发。把系统提示+工具定义+文档拼到一起才够格。

4. **断点放错位置**：Anthropic 最多 4 个断点，要放在"固定边界"上（比如系统提示结束处、文档结束处），而不是随手加。

5. **Gemini 存储费吃掉收益**：缓存对象存太久、调用太少，小时存储费反而比折扣高。算清楚"调用频率 × 折扣节省 > 存储费"再开。

6. **以为自动缓存万事大吉**：OpenAI 虽然自动缓存，但如果你用 SDK 时把固定内容放在了 `messages` 中间、前面还夹了可变历史，前缀匹配照样失败。

---

## 七、信息差总结：你知道的 vs 别人不知道的

| 认知层级 | 大众认知 | 信息差认知 |
|----------|----------|------------|
| 缓存省钱 | = 自己搭 Redis 语义缓存 | 原生缓存是供应商硬折扣，零质量风险 |
| Anthropic 缓存 | 没听说过 | 命中读取 90% off，加一行 cache_control |
| 缓存写入 | 以为免费 | 5分钟 TTL 写溢价 25%，1小时溢价 100% |
| OpenAI 缓存 | 以为要配置 | 全自动 50% off，但前缀必须真固定 |
| Batch API | 没用过 | 非实时任务一律走异步，24h 内 50% off |
| 折扣叠加 | 单独用 | 缓存读 + Batch 可叠加，理论 90% off × 50% |
| 国产方案 | 只知道便宜 | DeepSeek 缓存命中 95% off，写入零溢价且自动 |

---

## 八、行动指南：今晚就能落地的四步

1. **审计前缀**：把你最高频的那个 API 调用拎出来，看 `system` + 工具定义 + 文档占多少 token。超过 1024 token？就是省钱的肥肉。

2. **拆分固定/可变**：把请求重构成"纯静态前缀 + 动态后缀"。任何会变的东西（时间、ID、用户输入）一律放到最后。

3. **按供应商打折扣开关**：
   - 用 Claude？给固定前缀加 `cache_control`，高频用 5 分钟 TTL，跨小时用 1 小时 TTL
   - 用 OpenAI？确认前缀真固定，自动缓存自动生效
   - 用 Gemini？算清存储费再创建 Cache 对象
   - 用 DeepSeek/GLM？什么都不用做，确认调用集中在高峰期更容易命中磁盘缓存

4. **回收非实时任务**：把日志分析、批量标注、内容审核这类"等得起"的任务，从实时调用迁到 Batch API，单子直接打五折。

一周后回看账单，你会看到那条"固定前缀"的成本线几乎被削平——这就是原生缓存给你留的、却一直没人告诉你的折扣口子。

---

## 参考来源

- [Anthropic Prompt Caching 官方文档](https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching)
- [Anthropic Batch Processing 官方文档](https://docs.anthropic.com/en/docs/build-with-claude/batch-processing)
- [OpenAI Prompt Caching 指南](https://platform.openai.com/docs/guides/prompt-caching)
- [OpenAI Batch API 指南](https://platform.openai.com/docs/guides/batch)
- [Gemini Context Caching 文档](https://ai.google.dev/gemini-api/docs/caching)
- [DeepSeek API 定价与缓存说明](https://api-docs.deepseek.com/zh-cn/quick_start/pricing)

---
> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**（微信ID: gprshome201101）维护。
> 聚焦5G/6G核心网、3GPP标准、AI工具实战。知识星球「51学通信」提供深度技术答疑和行业洞察。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
