← 返回博客
· 渡 AI 团队 成本优化ClaudeOpenAI实战
Prompt Cache 实战:把 Claude/OpenAI 调用成本砍到 1/5
Claude Prompt Cache 与 OpenAI Cached Tokens 的实战指南,附 Python/Node 代码示例,立省 60-90% 成本。
一句话:把你的 system prompt + few-shot + 知识库前缀显式标记为 cache,平均省 60-90% 成本。
为什么你的账单这么贵
我们看过太多用户的调用日志,最常见的浪费:
- 每次请求都把 5K token 的系统提示词重发一遍
- RAG 把 10K token 的知识库切片每次都重新塞
- 多轮对话每一轮都把前 N 轮历史完整重发
这些内容根本不变,却按”原价”计费。Claude 和 OpenAI 都有 prompt cache,命中后费率分别是原价的 10% 和 50%。但你得显式启用。
Claude 的玩法:cache_control
Claude 的缓存最激进 —— 命中费率是原价的 1/10。但需要你手动标记缓存断点。
from anthropic import Anthropic
client = Anthropic(
api_key="sk-xxxxxxxx",
base_url="https://api.tathr.com/anthropic",
)
SYSTEM = """你是一个资深 Python 工程师助手……""" # 假设 5K tokens
KB = open("knowledge_base.txt").read() # 假设 20K tokens
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": SYSTEM,
"cache_control": {"type": "ephemeral"}, # ← 关键
},
{
"type": "text",
"text": KB,
"cache_control": {"type": "ephemeral"}, # ← 关键
},
],
messages=[{"role": "user", "content": "如何写一个 LRU 缓存?"}],
)
print(resp.usage)
# 第一次:cache_creation_input_tokens=25000, input_tokens=10
# 第二次(5 分钟内):cache_read_input_tokens=25000, input_tokens=10
计费拆解(Sonnet 4.6 为例):
- 不开缓存:25000 × ¥22/1M = ¥0.55 每次
- 开缓存(第一次):25000 × ¥27.5/1M(写入价 1.25x) = ¥0.69 一次性
- 开缓存(命中后):25000 × ¥2.2/1M = ¥0.055 每次
一万次调用,从 ¥5500 砍到 ¥550 + ¥0.69 ≈ 省 90%。
注意事项
- 缓存有效期 5 分钟(每次命中续期)
- 最少缓存长度 1024 token(更短的不让缓存)
- 最多 4 个 cache_control 断点
- 缓存是前缀匹配:只要前缀一致就命中,所以放前面的内容越长越值
OpenAI 的玩法:自动命中
OpenAI 不用你做任何标记,输入超过 1024 token 自动缓存。但折扣只有 50%(命中部分按 0.5x 计费)。
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxx",
base_url="https://api.tathr.com/v1",
)
resp = client.chat.completions.create(
model="gpt-5",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "..."},
],
)
# 看 resp.usage.prompt_tokens_details.cached_tokens
所以使用 OpenAI 的关键不是”启用缓存”,而是”让前缀稳定”:
- 不变内容(system、few-shot、KB)放前面
- 变动内容(用户输入)放后面
- 不要在每次请求里调整 system prompt 的措辞
如果你违反这条,缓存命中率会从 90% 掉到 0%,账单立刻翻倍。
实测对比
我们做了一个真实场景:客服 chatbot,系统提示词 6K + 知识库 15K + 用户问题平均 100 token + 回答 500 token。
| 配置 | 单次成本 | 1 万次 |
|---|---|---|
| Claude Sonnet 4.6,不开 cache | ¥0.51 | ¥5,116 |
| Claude Sonnet 4.6,开 cache | ¥0.10 | ¥1,007 |
| GPT-5,无前缀稳定 | ¥1.96 | ¥19,620 |
| GPT-5,前缀稳定 | ¥1.04 | ¥10,440 |
| GPT-5 mini,前缀稳定 | ¥0.21 | ¥2,082 |
结论:
- 中型生产应用,Claude Sonnet 4.6 + cache 是性价比之王
- 用 GPT 系列,一定要把 prompt 结构定下来不变
- 别傻乎乎用 GPT-5 跑客服,mini 完全够用
常见误区
- 「我把 prompt 拼接成一个 string 就行」 —— Claude 必须用结构化 system 数组才能用 cache_control。
- 「每次请求都 append 当前时间戳」 —— 直接把缓存击穿。时间戳放消息体最后。
- 「KB 我每次重新检索 top-5 注入」 —— 检索结果在变,缓存命中率为 0。改成全量 KB 进缓存 + 让模型自己引用,或者分组缓存(按主题预先切好)。
- 「我两个模型混用」 —— 缓存按模型隔离。Sonnet 缓存的,Opus 用不了。
在 渡 AI 怎么看缓存效果
我们的控制台在调用日志里展示每次请求的 cached_input_tokens 和 cache_creation_tokens。目标命中率 > 70%,低于这个数字说明 prompt 结构需要重构。