大多数团队在 AI API 调用上花费了冤枉钱。这并不是因为他们选错了模型,而是因为他们忽略了三个仅需少量代码改动即可实现的优化方案:Prompt 缓存 (Prompt Caching)、智能模型路由 (Smart Model Routing) 和批处理 (Batch Processing)。
以下是每种技术的详细分析以及真实的数据对比。
如果你仍在纠结当前的供应商组合是否是问题所在,请先阅读 价格对比。如果你的主要痛点是重试风暴或供应商限流而非原始支出,请将本文与 速率限制指南 结合阅读。
1. Prompt 缓存:最显著的收益
如果你的应用程序在每次请求时都发送相同的系统 Prompt,那么你正在为供应商已经处理过的 token 支付全额费用。
工作原理
对于超过 1,024 个 token 的输入,OpenAI 会自动缓存 Prompt。缓存的 token 费用仅为标准输入价格的 50%。你不需要更改代码中的任何内容。
Anthropic 通过 cache_control 设置显式缓存点。写入成本比标准输入高 25%,但读取成本降低了 90%。缓存的 TTL 为 5 分钟,每次命中都会延长。
在 OpenAI 的最新定价中,实际折扣可能比团队预期的还要高。GPT-4.1 的缓存输入价格仅为标准输入的四分之一,这意味着保持前缀一致所带来的节省远比旧有的“锦上添花”说法要大得多。
成本计算
以一个典型的客户服务机器人为例:
- 系统 Prompt:2,000 tokens
- 用户消息:平均 200 tokens
- 使用 Claude Sonnet 4.6,每天 5,000 次请求
不使用缓存:
每日输入成本 = 5,000 × 2,200 tokens × $3.00/1M = $33.00
使用 Anthropic Prompt 缓存(假设 95% 的缓存命中率):
缓存写入:250 × 2,200 × $3.75/1M = $2.06
缓存读取:4,750 × 2,200 × $0.30/1M = $3.14
用户 tokens:5,000 × 200 × $3.00/1M = $3.00
每日总计 = $8.20 (输入成本节省 75%)
实现方式
from anthropic import Anthropic
client = Anthropic(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc"
)
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{
"type": "text",
"text": "You are a customer support agent for Acme Corp...",
"cache_control": {"type": "ephemeral"} # 启用缓存
}
],
messages=[{"role": "user", "content": user_message}]
)
# 在响应头中检查缓存性能
# cache_creation_input_tokens vs cache_read_input_tokens
对于 OpenAI 模型,缓存是自动的。只需确保你的 Prompt 超过 1,024 个 token,并保持静态前缀在不同请求之间的一致性。
团队常犯的错误:
- 在每个 Prompt 的顶部放置时间戳或请求 ID
- 在每次调用时重新排列系统指令
- 在稳定前缀之前嵌入变量化的用户上下文
如果前缀每次都改变,缓存就无法发挥作用。应将 Prompt 结构视为一种成本原语,而不仅仅是 Prompt 工程的细节。
2. 智能模型路由:为每个任务选择合适的模型
并非每个请求都需要最昂贵的模型。GPT-4.1 处理输入 token 的价格为 $2.00/1M,而同样的分类任务使用 GPT-4.1-mini 仅需 $0.40/1M,效果一样好,成本却降低了 5 倍。
路由策略
| 任务类型 | 推荐模型 | 输入成本/1M |
|---|---|---|
| 复杂推理 | Claude Opus 4.6 / GPT-4.1 | $5.00 / $2.00 |
| 通用对话 | Claude Sonnet 4.6 / GPT-4.1 | $3.00 / $2.00 |
| 分类、提取 | GPT-4.1-mini / Claude Haiku 4.5 | $0.40 / $1.00 |
| Embeddings | text-embedding-3-small | $0.02 |
| 简单格式化 | DeepSeek V3 | $0.28 |
实现方式
from openai import OpenAI
client = OpenAI(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
def route_request(task_type: str, messages: list) -> str:
"""选择能胜任该任务的最便宜模型。"""
model_map = {
"classification": "gpt-4.1-mini",
"extraction": "gpt-4.1-mini",
"summarization": "gpt-4.1-mini",
"complex_reasoning": "gpt-4.1",
"creative_writing": "claude-sonnet-4-6",
"code_generation": "claude-sonnet-4-6",
}
model = model_map.get(task_type, "gpt-4.1-mini")
response = client.chat.completions.create(
model=model,
messages=messages
)
return response.choices[0].message.content
实际节省
一个代码助手将 60% 的请求(Linting、格式化、简单补全)路由到 GPT-4.1-mini,将 40% 的请求(架构、调试)路由到 Claude Sonnet 4.6:
优化前(全部使用 Claude Sonnet 4.6):
1,000 req/day × 3K input × $3.00/1M = $9.00/day
优化后(60/40 分流):
600 req × 3K × $0.40/1M = $0.72/day (mini)
400 req × 3K × $3.00/1M = $3.60/day (sonnet)
总计 = $4.32/day (节省 52%)
3. 批处理:降低非紧急任务的价格
OpenAI 提供 Batch API,对输入和输出 token 提供 50% 的折扣。权衡之处在于:结果在 24 小时内交付,而非实时交付。
Anthropic 也对支持的模型提供 50% 的批处理折扣。如果你的工作负载是隔夜运行、异步或面向审核的,几乎没有理由支付实时价格。
适合批处理的场景:
- 每日内容生成
- 大批量文档分类
- 数据集标注
- 定期报告生成
# 创建批处理文件 (JSONL 格式)
import json
requests = []
for i, doc in enumerate(documents):
requests.append({
"custom_id": f"doc-{i}",
"method": "POST",
"url": "/v1/chat/completions",
"body": {
"model": "gpt-4.1-mini",
"messages": [
{"role": "system", "content": "Classify this document..."},
{"role": "user", "content": doc}
]
}
})
# 写入 JSONL 文件
with open("batch_input.jsonl", "w") as f:
for req in requests:
f.write(json.dumps(req) + "\n")
# 提交批处理
batch_file = client.files.create(file=open("batch_input.jsonl", "rb"), purpose="batch")
batch = client.batches.create(input_file_id=batch_file.id, endpoint="/v1/chat/completions", completion_window="24h")
真实产品中适合批处理的场景:
- 隔夜内容刷新任务
- 支持工单摘要
- Embeddings 回填
- 大型代码库或文档审查
- 低优先级用户通知
不适合的场景:
- 聊天回复
- 交互式编程辅助
- 下一步操作立即取决于答案的工作流
4. 额外建议:减少 Token 数量
在进行 API 级别的优化之前,请检查你是否发送了不必要的 token。
常见的浪费:
- 冗长的系统 Prompt,重复模型已经遵循的指令
- 包含完整的对话历史,而实际上只有最后 3-5 轮对话重要
- 在纯文本即可满足需求时发送原始 HTML/Markdown
- 未使用
max_tokens限制输出长度
Prompt 长度减少 30% 直接意味着输入成本降低 30%。
发现浪费最简单的方法是按路由或功能记录 Prompt 长度。大多数团队面临的不是模型定价问题,而是“同一个臃肿的 Prompt 每天被发送 100,000 次”的问题。
5. 在盲目优化前增加成本可见性
如果团队凭直觉进行优化,成本优化往往会失败。
在更改路由规则之前,请记录:
- 路由或功能名称
- 模型
- 输入 tokens
- 输出 tokens
- 缓存命中或未命中
- 重试次数
- 用户可见的延迟
这能让你回答关键问题:
- 哪个路由昂贵是因为它确实有用?
- 哪个路由昂贵是因为 Prompt 浪费?
- 哪个路由应该转为批处理?
- 哪个路由应该迁移到更便宜的模型层级?
如果你无法回答这四个问题,你的“成本优化”只会是成本的转移。
6. 实际的优化顺序
最有效的顺序通常是:
- 消除明显的 token 浪费。
- 开启或修复缓存。
- 将廉价任务与昂贵任务分离。
- 将任何非紧急任务进行批处理。
- 最后才重新协商供应商组合。
这个顺序很重要,因为最大的节省往往在切换供应商之前就已经实现了。如果你在不修复 Prompt 结构的情况下更换供应商,你仍将为同样的低效支付费用。
7. 具体的实施前后对比
以一个目前的客服工作流为例,它在每个请求中都执行以下操作:
- 发送一个 2,000 token 的系统 Prompt
- 对所有请求调用同一个高级模型
- 在发生临时故障时重试相同的请求结构
- 同步运行隔夜摘要,而非批处理
第一个版本通常感觉很“简单”,因为它只有一条代码路径。但在财务上,它同时在做四件昂贵的事情。
更高效的实施方案如下:
- 将稳定的策略文本移至 Prompt 前部,以便缓存能够真正命中。
- 将分类、提取和短摘要路由到更便宜的模型层级。
- 将高级模型保留用于人工介入、复杂推理或最终答案合成。
- 将隔夜摘要和回填任务推送到批处理。
- 每周审查日志,找出 Prompt 结构发生偏移并破坏缓存效率的路由。
这种实施方案不需要重写代码。它需要一周的工具化准备,以及将 Prompt 和路由视为生产环节的意愿。
8. 避坑指南
浪费成本优化努力最快的方法就是优化了错误的东西。
避免这些陷阱:
- 在衡量 Prompt 浪费之前更换供应商
- 在未验证输出质量的情况下将廉价任务路由到廉价模型
- 在每次请求前缀都会改变的 Prompt 上启用缓存
- 将真正需要实时响应的面向用户的任务进行批处理
- 只看 token 价格而忽略重试、延迟和备用方案的开销
只有当节省成本后产品表现依然良好时,成本工作才算成功。如果用户体验变差,报表上的胜利就是虚假的。
总结
| 技术 | 难度 | 典型节省 |
|---|---|---|
| Prompt 缓存 | 低 (添加 cache_control) | 输入成本 40-75% |
| 模型路由 | 中 (任务分类) | 整体成本 30-50% |
| 批处理 | 中 (异步工作流) | 批处理任务 50% |
| Token 削减 | 低 (精简 Prompt) | 输入成本 10-30% |
这些技术具有叠加效应。一个实施了这四项技术的团队,可以现实地将每月 API 账单从 $3,000 削减到 $1,000 以下,且输出质量没有任何下降。
核心洞察:AI API 的成本优化不在于寻找更便宜的供应商,而在于针对每个特定任务,以合适的价格层级和缓存策略使用合适的模型。
如果你已经在使用多个供应商,运营方面也至关重要。迁移指南 和 OpenRouter 对比 可以帮助你决定何时应该集中路由,而不是继续修补独立的集成。
今天就开始优化:LemonData 让你通过一个 API key 访问 300 多个模型,支持 OpenAI 和 Anthropic 模型家族的 Prompt 缓存,并提供统一的用量对比平台。
