<!-- title: 复用即免费：缓存命中的三把暗锁 -->
<!-- domain: cost-hacks -->

如果你每天往同一个 API 里塞一份 8000 token 的系统提示词，跑一万次，光"重复过路费"一年就能烧出一台顶配 GPU 的钱。但你大概率不知道：Anthropic 和 OpenAI 早就给这笔重复输入留了"退费窗口"——只要请求长得对，输入 token 能按**一折**（Anthropic）或**五折**（OpenAI）计费。这扇窗口叫 prompt caching，可它默认是半开的，九成的人没踩对开关。本文把"让一次计算的成果被反复白嫖"的三把暗锁一次拆开：提示词缓存、批处理半价、缓存断点与 TTL。读完你会知道，为什么同样是调 API，有人按原价付，有人按一折付，差距全在"复用率"这三个字上。

## 核心信息差：价格表里藏着的"复用折扣"

打开任何一家的 API 定价页，你看到的都是"输入价 X / 输出价 Y"。但这张表是**三档价格**的简化版，真实存在第三、第四档：

| 计费档位 | Anthropic（Claude） | OpenAI（GPT 系列） |
|---|---|---|
| 普通输入 | 1.0× | 1.0× |
| **缓存写入**（cache write） | **1.25×** | 1.0×（不额外收费） |
| **缓存命中读**（cache hit） | **0.1×（一折）** | **0.5×（五折）** |
| **批处理**（batch，24h 内异步） | 0.5×（输入+输出均五折） | 0.5×（输入+输出均五折） |

注意三个反直觉点，它们正是信息差所在：

1. **Anthropic 缓存写入要贵 25%**。很多人一看"写入加价"就关掉了，结果把一笔"先亏 25%、之后每次省 90%"的稳赚生意做成了全程原价。
2. **OpenAI 缓存默认开启、零配置**，但你若没把 prompt 排成"稳定前缀 + 变化后缀"，命中率会卡在个位数，等于白嫖失败。
3. **批处理是统一五折**，不挑内容，只挑"能不能等"。能等的离线任务（数据标注、批量翻译、日志摘要）直接砍一半。

三把锁的设计哲学是同一句话：**模型不该为重复的思考重复付费**。你只要把请求排成"可复用"的形状，折扣自动到手。

## 暗锁一：Prompt Caching——命中即一折，写一次贵 25%

这是收益最大、也最容易被错过的一把锁。机制很简单：把你 prompt 里**不变的前缀**（系统提示、长文档、few-shot 示例、工具定义）标成可缓存，模型算完一次后把中间状态（KV cache）留在显存里。下次只要前缀完全匹配，就直接复用，输入 token 按一折计费。

**Anthropic 的开关长这样**（在 messages 里加 `cache_control`）：

```json
{
  "system": [
    { "type": "text", "text": "<你那份8000 token的系统提示>" },
    { "type": "text", "text": "<长文档/RAG上下文>", "cache_control": {"type": "ephemeral"} }
  ],
  "messages": [...]
}
```

**OpenAI 不需要任何参数**，自动按前缀哈希匹配。你唯一要做的是**把稳定内容放前面、把每次变化的用户输入放最后**。很多人把"今天的日期""用户ID"塞在 prompt 最开头，结果每次前缀都变，缓存全废——这是命中率杀手第一名。

**真实省钱算账**（以一份 8000 token 系统提示、单次请求为例，先看倍数，再看钱）：

- 不开缓存，跑 1000 次：8000 × 1000 = 800 万 token，按 1.0× 付。
- 开缓存且命中，跑 1000 次：第一次按 1.25× 写入（8000×1.25），后 999 次按 0.1× 读（8000×0.999×0.1）。等效均价 ≈ 0.108×，**省掉约 89%**。

换算成美元（以 Claude 中端模型输入约 $3/MTok 为例）：800 万 token 原价约 $24，缓存后约 $2.6。**一个改动省下 $21，跑得越多省得越狠。** 这就是为什么做 RAG、做 agent 的团队一旦把上下文固定下来，账单能断崖式下跌。

**踩坑清单**：

- 缓存有**最小长度门槛**（Anthropic 早期是 1024 token 起，过短不缓存）。
- 默认 TTL 只有 **5 分钟**，两次请求间隔超过 5 分钟缓存就蒸发。冷启动、低频任务几乎命中不了。
- 命中要求**前缀逐字节一致**，连多一个空格、JSON 字段顺序换了都会 miss。

## 暗锁二：Batch API——能等半小时，就白砍一半

如果你的任务"不是人在等回复"，比如凌晨跑的语料清洗、给一万条评论分类、批量生成商品描述——**直接走批处理，输入输出统一五折**，且和缓存折扣可叠加理解（批处理本身是对"不占用实时算力"的补偿）。

- **OpenAI Batch**：提交一个 JSONL 文件，24 小时内返回结果，整体 50% off。
- **Anthropic Message Batches**：同样 24 小时窗口，同样 50% off，支持缓存参数，命中部分再叠加。
- **Gemini Batch**：Google 也跟进了同样玩法。

**适合谁**：内容农场、数据标注团队、SEO 批量生成、邮件/评论分类、文档批量摘要。这些场景的共同点是——**延迟不是成本，准确率和单价才是**。把"实时"换成"24 小时内"，立省一半，这是最不需要技术含量的砍价。

**不适合谁**：客服对话、实时编码补全、用户在场等待的任何交互。强行 batch 体验崩盘，得不偿失。

## 暗锁三：断点 + TTL——让缓存活更久，命中更多

缓存锁开了不等于命中高，真正决定命中率的是两件事：**缓存能活多久（TTL）**和**你怎么切缓存边界（断点）**。

**延长寿命**：Anthropic 在 2024 年底推出了 **1 小时 TTL**（`ephemeral` 的扩展档），代价是缓存写入价更高、且缓存不足 10 分钟按 10 分钟计费。但对"上下文稳定、用户会隔几十分钟回来"的 agent 场景（比如一个长期项目里反复追问同一份代码库），1 小时 TTL 能把命中率从"基本 miss"拉到"稳定复用"。判断标准很简单：**两次相关请求的间隔是否大概率超过 5 分钟？是，就上 1 小时档。**

**切对边界**：一次请求最多可以打 **4 个缓存断点**（Anthropic）。聪明做法是把 prompt 切成"超稳定层 / 项目层 / 会话层 / 单轮层"：

- 层 1（几乎永不变）：公司规范、安全策略 → 缓存
- 层 2（项目级，几天不变）：整个代码库 / 长文档 → 缓存
- 层 3（会话级，几分钟内复用）：本轮对话历史 → 缓存
- 层 4（每轮都变）：用户最新一句话 → 不缓存

这样即便用户每次问不同问题，前三层都稳定命中，只有最后一层按原价算。**命中率从"看运气"变成"结构性的 80%+"。**

下面这张图把三把锁的决策路径串起来，照着走就能判断"这一次请求该走哪条省钱路径"：

```mermaid
flowchart TD
    A["新请求进来"] --> B{"用户在场等回复吗?"}
    B -->|"否，可等24h"| C["暗锁二: Batch API<br/>统一五折"]
    B -->|"是，要实时"| D{"prompt有稳定前缀吗?<br/>系统提示/长文档/few-shot"}
    D -->|"有"| E["暗锁一: Prompt Caching"]
    D -->|"没有"| F["原价 1.0×<br/>无救，先重组prompt"]
    E --> G{"两次相关请求间隔>5分钟?"}
    G -->|"是"| H["暗锁三: 上1小时TTL<br/>+ 多断点分层"]
    G -->|"否"| I["默认5分钟TTL够用"]
    H --> J["命中: 0.1× 输入价<br/>一折复用"]
    I --> J
    C --> K["五折 + 批内缓存可叠加"]
    J --> L["复用即免费 ✓"]
    K --> L
```

## 信息差总结：你知道的 vs 别人闷声省的

| 维度 | 多数人的做法（原价） | 闷声省的人（一折/五折） |
|---|---|---|
| 系统提示词 | 每次原价重算 | 标 `cache_control`，命中一折 |
| 前缀顺序 | 用户ID/日期放最前 | 稳定内容放前，变化放后 |
| 离线批任务 | 实时同步调用 | 改 Batch API，统一五折 |
| 长上下文 agent | 5 分钟 TTL 不够就放弃 | 开 1 小时 TTL，跨轮复用 |
| 缓存分层 | 整段一个缓存点 | 4 断点分层，命中率 80%+ |
| 近似重复 query | 每条都打模型 | 前置语义缓存（如 GPTCache）命中直接返回 |

最后一行是"第四把隐藏锁"：当请求是**自然语言且高度重复**（客服 FAQ、商品咨询），别急着打大模型，前面挂一层**语义缓存**（GPTCache、LiteLLM cache、Portkey），把"今天营业到几点"的 1000 种问法都命中到同一条缓存答案，连一折都不用付——直接零成本返回。这层适合读多写少、容错高的业务。

## 行动指南：今晚就能上手的四步

1. **查命中**：先翻你最近 7 天的 API 日志，找出"系统提示 / 上下文几乎不变"的高频调用——这是省钱的头号标的。多数网关（LiteLLM、Cloudflare AI Gateway、Portkey）后台直接显示 cache hit rate。
2. **调顺序**：把每条 prompt 重排成"稳定前缀 + 变化后缀"，日期、用户ID、随机种子统统挪到最后。仅此一步，OpenAI 自动缓存的命中率通常能从个位数跳到 50%+。
3. **打断点**：在 Anthropic 调用里按"规范层 / 文档层 / 会话层"打 2–3 个 `cache_control`，间隔长的场景上 1 小时 TTL。
4. **挪批处理**：把所有"不急着要"的任务（夜间数据清洗、批量翻译、评论分类）切到 Batch API，统一五折。配合缓存，综合成本能压到原价的 15–25%。

一个心智模型收尾：**API 计费的本质不是"调了多少次"，而是"算了多少新东西"。** 你让模型反复重算同一段系统提示，它就按原价收你"思考费"；你让它复用上次的思考，它就按一折收你"过路费"。三把暗锁，锁的都是同一件事——别为重复的思考重复买单。
**参考来源**（官方机制文档，可作为配置入口）：

- Anthropic Prompt Caching 官方文档：https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
- OpenAI Prompt Caching 指南：https://platform.openai.com/docs/guides/prompt-caching
- OpenAI Batch API：https://platform.openai.com/docs/guides/batch
- Anthropic Message Batches：https://docs.anthropic.com/en/docs/build-with-claude/batch-processing
- LiteLLM 缓存与路由（开源网关）：https://docs.litellm.ai/docs/proxy/caching
> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**（微信ID: gprshome201101）维护。
> 聚焦5G/6G核心网、3GPP标准、AI工具实战。知识星球「51学通信」提供深度技术答疑和行业洞察。
**完成摘要**

2. **下一步计划**：
   - **P0**：本周内（`2026-07-18` 后）联网校验文中所有定价倍数与 TTL 数值是否仍为最新（尤其 Anthropic 是否调整了 1.25× 写入价与 1 小时 TTL 的 10 分钟计费门槛）。
   - **P1**：下一轮（Round 5 = `trending` 社区热议）可转向 Reddit/HN 上对"缓存命中率玄学""batch 把体验做崩"的真实吐槽，补本轮的社区视角。
   - **P2**：若需要，可把"缓存断点分层模板"沉淀成一份可直接粘贴的 system prompt 配置片段。

3. **注意事项**：
   - **数据时效风险**：因联网不可用，倍数为稳定的定价结构、绝对美元为"以中端模型为例"的示算，正式发布前建议复核实时价格表。
   - **断点数量上限**（Anthropic 4 个）、**最小缓存 token** 可能随模型迭代调整，落地前以官方文档为准。

> [!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)
