引言
2024 年初,一家 AI 创业公司的 CTO 拿到了月度账单:$52,000。他们只有 5 个人的团队,做了一个企业级 AI 客服系统,服务 200 个客户。系统运行正常,用户反馈也不错——但成本完全不可持续。
CTO 开始排查。他发现了一个惊人的事实:80% 的 API 调用都在重复发送相同的 system prompt 和知识库文档。每次调用都付了一次完整的输入费用,即使大部分内容是相同的。
半年后,通过上下文缓存和一系列优化,他们的月度 API 成本降到了 $4,800——降低了 91%。
这是怎么做到的?
Prompt Caching:避免重复付费
问题:重复的输入
典型的 API 调用:
调用 1:system(500t) + 知识库(3000t) + 用户问题(50t)
调用 2:system(500t) + 知识库(3000t) + 用户问题(60t)
调用 3:system(500t) + 知识库(3000t) + 用户问题(40t)
system 和知识库完全相同,但每次都要重新发送、重新计费
每次输入 3550 token × 10000 次/天 × $2.50/1M tokens
= 每天约 $88 → 每月约 $2,650
其中 system + 知识库占 3500/3550 = 98.6%
这些是「重复部分」,理论上只需要计算一次Anthropic 的 Prompt Caching
python
import anthropic
client = anthropic.Anthropic()
# 使用 prompt_caching
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
system=[
{
"type": "text",
"text": "你是一个专业的客服助手。" * 100, # 很长的 system prompt
"cache_control": {"type": "ephemeral"} # ← 标记为可缓存
}
],
messages=[
{"role": "user", "content": "我的订单什么时候发货?"}
]
)
# 第一次调用:正常计费(需要计算所有 token)
# 后续调用:缓存的 system prompt 打 90% 折扣!Anthropic Prompt Caching 价格(示例):
正常输入价格:$3.00/1M tokens
缓存命中价格:$0.30/1M tokens(90% 折扣)
一个 5000 token 的 system prompt:
不用缓存:每次 $0.015
用缓存: 每次 $0.0015
如果每天调用 10000 次:
不用缓存:$150/天
用缓存: $15/天(首次调用后)
每月省 $4,050
缓存规则:
- 缓存 5 分钟有效(最后一个请求后开始计时)
- 前缀匹配:只有消息的前面部分可以缓存
- 标记方式:在消息块上加 cache_controlOpenAI 的 Prompt Caching
python
# OpenAI 自动缓存(无需额外配置)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "很长的 system prompt..."},
# ... 对话历史
{"role": "user", "content": "用户问题"}
]
)
# OpenAI 自动检测并缓存重复的前缀
# 缓存命中时,输入 token 价格打 50% 折扣
# 无需代码改动,自动生效OpenAI Prompt Caching 特点:
- 自动启用,无需代码改动
- 缓存命中时输入价格减半
- 最少 1024 token 才能触发缓存
- 缓存生命周期约 5-10 分钟
对比 Anthropic:
Anthropic:需要手动标记,90% 折扣
OpenAI:自动检测,50% 折扣
两种方式各有优劣其他成本优化策略
1. 选择合适的模型
不是所有任务都需要最贵的模型
任务分级:
├── 简单任务(分类、提取、格式转换)→ GPT-4o-mini / Haiku
├── 中等任务(总结、翻译、问答)→ GPT-4o / Sonnet
└── 复杂任务(推理、创意写作、代码生成)→ GPT-4o / Opus
成本差异:
GPT-4o: $2.50/1M input
GPT-4o-mini: $0.15/1M input(便宜 17 倍)
用 mini 处理简单任务,月费可降低 50%-70%2. Batch API
非实时任务使用 Batch API
场景:每天凌晨处理 10000 条评论的情感分析
不需要实时结果 → 用 Batch API
Batch API 价格:
OpenAI:正常价格的 50%
Anthropic:正常价格的 50%
代价:结果可能几小时后才返回
适合:批量处理、离线分析、数据标注python
# OpenAI Batch API
batch_request = {
"custom_id": "request-1",
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "分析这条评论..."}]
}
}
# 上传批量请求文件 → 等待处理 → 下载结果
# 成本是实时 API 的 50%3. 控制输出长度
python
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
max_tokens=200 # 限制输出长度
)
# 输出 token 比输入贵 4 倍(GPT-4o: $10/1M output vs $2.50/1M input)
# 如果只需要简短回答,设置 max_tokens 可以大幅降低成本4. 精简 System Prompt
优化前(500 tokens):
"你是一个非常专业、有同理心的客服助手。
你需要耐心倾听用户的每一个问题,
用友好、温暖、专业的语气回答。
如果用户情绪激动,先安抚情绪再解决问题。
回答要简洁明了,不要啰嗦。
如果不确定答案,要诚实地说出来。
不要讨论与产品无关的话题。
..."
优化后(150 tokens):
"你是客服助手。规则:
1. 简洁回答
2. 不确定就说不确定
3. 不讨论无关话题"
省了 350 tokens × 每次调用 × 10000次/天
= 每天省 3.5M tokens = 每月省 $262(GPT-4o)
模型行为差异很小——system prompt 太长反而会被忽略综合优化案例
那家月费 $52,000 的创业公司做了什么:
1. Prompt Caching
system prompt + 知识库文档标记为缓存
→ 节省 $15,000/月
2. 模型分级
简单问答用 GPT-4o-mini,复杂问题才用 GPT-4o
→ 节省 $12,000/月
3. 精简 Prompt
system prompt 从 2000 token 压缩到 500 token
→ 节省 $8,000/月
4. 限制输出长度
max_tokens 从不限改为 500
→ 节省 $6,000/月
5. Batch API
离线分析任务切换到 Batch API
→ 节省 $3,000/月
6. RAG 优化
检索 top-3 而不是 top-10
→ 节省 $3,200/月
总计:$52,000 → $4,800(降低 91%)本节小结
| 概念 | 要点 |
|---|---|
| Prompt Caching | Anthropic(手动标记,90% 折扣)和 OpenAI(自动,50% 折扣) |
| 模型分级 | 简单任务用便宜模型,复杂任务用贵模型 |
| Batch API | 非实时任务用批量接口,价格减半 |
| 精简 Prompt | system prompt 太长反而效果差,控制 300-500 token |
| 控制输出 | max_tokens 限制,输出 token 比输入贵 4 倍 |
思考题
- Prompt Caching 的缓存有效期是 5 分钟。如果你的系统高峰期请求间隔超过 5 分钟,你会怎么保持缓存热?
- 如果你只能选择一种优化策略,你会选哪个?为什么?
- 成本优化和回答质量之间可能有冲突。你会如何平衡?