你以为比完单价就完了?API厂商的定价体系里藏着至少五个"暗门"——Prompt Caching、Batch API、Tiered Pricing、推测解码、以及Google的Context Caching。大多数人只盯着"$X/百万token",却不知道同一笔钱可以多换3-5倍的推理量。本文逐个拆解这些被低估的省钱入口,附带实际计算和可复制的配置代码。
以Claude Code为例,一个典型的编码会话中,系统提示+项目上下文通常占15000-30000 tokens。这些内容在每次请求中完全相同,但你按原价付了。
Anthropic在2024年底推出了Prompt Caching,2025年逐步优化后,2026年已经成为稳定功能。原理很简单:
sequenceDiagram
participant U as 你的应用
participant A as Anthropic API
participant C as Cache层
Note over U,C: 第一次请求(无缓存)
U->>A: 发送完整Prompt (30K tokens)
A->>C: 检查缓存 → 未命中
A->>A: 处理全部30K tokens
A->>U: 返回结果(按30K计费)
A->>C: 存入缓存(TTL 5分钟)
Note over U,C: 第二次请求(命中缓存)
U->>A: 发送相同前缀Prompt
A->>C: 检查缓存 → 命中!
A->>A: 只处理新增部分
A->>U: 返回结果(按缓存价计费)
Note right of A: 缓存部分费用降低90%
| 模型 | 正常输入价格 | 缓存输入价格 | 节省比例 |
|---|---|---|---|
| Claude Sonnet | $3/百万token | $0.30/百万token | 90% |
| Claude Haiku | $0.80/百万token | $0.08/百万token | 90% |
| Claude Opus | $15/百万token | $1.50/百万token | 90% |
实操配置(Python):
import anthropic
client = anthropic.Anthropic()
# 关键:用cache_control标记可缓存内容
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
system=[
{
"type": "text",
"text": "你是一个专业的代码审查助手..." * 10, # 长系统提示
"cache_control": {"type": "ephemeral"} # 启用缓存
}
],
messages=[
{"role": "user", "content": "审查这段代码:..."}
]
)
# 第一次:正常计费
# 后续5分钟内:系统提示部分按1折计费
实测数据:一个处理代码审查的内部工具,系统提示约25000 tokens,日均2000次调用。开启缓存前月费约$450,开启后降至约$180——月省$270,降幅60%。
2024年OpenAI率先推出Batch API,Anthropic随后跟进。核心逻辑:你提交任务,API在24小时内返回结果,价格打五折。
flowchart LR
A[提交Batch任务] --> B[进入队列]
B --> C[低峰期处理]
C --> D[结果就绪通知]
D --> E[获取结果]
style A fill:#4CAF50,color:white
style E fill:#2196F3,color:white
Note1[节省50%费用] -.-> C
| 厂商 | Batch折扣 | 延迟上限 | 支持模型 | 单文件上限 |
|---|---|---|---|---|
| OpenAI | 50% off | 24小时 | GPT-4o, GPT-4o-mini, o1等 | 200MB |
| Anthropic | 50% off | 24小时 | Claude全系列 | 按请求计 |
| 50% off | 24小时 | Gemini全系列 | 按请求计 |
import anthropic
client = anthropic.Anthropic()
# 创建Batch任务
batch = client.messages.batches.create(
requests=[
{
"custom_id": "review-001",
"params": {
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "审查代码文件A..."}
]
}
},
{
"custom_id": "review-002",
"params": {
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "审查代码文件B..."}
]
}
}
# ... 可以批量提交数千个请求
]
)
print(f"Batch ID: {batch.id}")
# 稍后查询结果
result = client.messages.batches.retrieve(batch.id)
# 状态:in_progress → ended(完成)
| 场景 | 为什么适合Batch | 预估节省 |
|---|---|---|
| 代码仓库批量审查 | 不需要实时反馈 | 50% |
| 日志/错误分析 | 离线处理即可 | 50% |
| 大规模数据标注 | 纯后台任务 | 50% |
| 内容生成(SEO文章等) | 非即时需求 | 50% |
| 邮件分类+摘要 | 延迟容忍度高 | 50% |
隐藏技巧:如果你用LangChain或LlamaIndex构建应用,可以在Pipeline中区分"实时路径"和"批量路径"。实时路径用常规API(如用户交互),批量路径走Batch API(如夜间数据处理)。一个系统两种价格,综合省30-40%。
flowchart TD
Q[用户请求] --> R{路由器判断复杂度}
R -->|简单查询<br>分类/提取| H[Claude Haiku<br>$0.80/M input]
R -->|中等任务<br>写作/摘要| S[Claude Sonnet<br>$3/M input]
R -->|复杂推理<br>数学/代码| O[Claude Opus<br>$15/M input]
style R fill:#FF9800,color:white
style H fill:#4CAF50,color:white
style S fill:#2196F3,color:white
style O fill:#F44336,color:white
方案A:基于规则的轻量路由(零额外成本)
def route_request(user_input: str) -> str:
"""根据输入特征选择最经济的模型"""
# 简单任务 → 最便宜的模型
simple_keywords = ["分类", "提取", "翻译", "格式化",
"summarize", "classify", "extract"]
if any(kw in user_input.lower() for kw in simple_keywords):
if len(user_input) < 500:
return "claude-haiku-4-5-20251001"
# 代码任务 → 中档模型
code_keywords = ["代码", "debug", "refactor", "函数",
"code", "function", "bug"]
if any(kw in user_input.lower() for kw in code_keywords):
return "claude-sonnet-4-20250514"
# 默认 → 中档模型(而非最贵的)
return "claude-sonnet-4-20250514"
方案B:使用专业路由框架
| 路由工具 | 特点 | 适用场景 |
|---|---|---|
| LiteLLM | 开源,统一接口,内置fallback | 多API管理 |
| Portkey | 带监控和缓存的路由网关 | 生产环境 |
| RouteLLM | 专门训练的路由模型 | 成本敏感型应用 |
| OpenRouter | SaaS路由,自动选最便宜模型 | 快速接入 |
假设一个日均10000次API调用的应用:
| 策略 | 模型分布 | 日均成本 | 月成本 |
|---|---|---|---|
| 全用Opus | 100% Opus | $150 | $4,500 |
| 全用Sonnet | 100% Sonnet | $30 | $900 |
| 智能路由 | 60% Haiku + 30% Sonnet + 10% Opus | $9.6 | $288 |
| 全用Haiku | 100% Haiku | $8 | $240 |
结论:智能路由比全用Sonnet省68%,效果只下降约5-8%(简单任务用Haiku完全够用)。
大多数人只关注输入token,却忽略了输出token的价格通常是输入的3-5倍:
| 模型 | 输入价格/M | 输出价格/M | 输出/输入比 |
|---|---|---|---|
| Claude Opus | $15 | $75 | 5x |
| Claude Sonnet | $3 | $15 | 5x |
| GPT-4o | $2.50 | $10 | 4x |
| GPT-4o-mini | $0.15 | $0.60 | 4x |
关键洞察:让模型输出JSON而非自然语言,输出token可以减少40-70%。
不使用结构化输出:
用户:分析这段代码的问题
模型输出(约500 tokens):
"好的,我来分析这段代码。首先,我注意到第15行有一个潜在的
空指针异常问题。这个问题的原因是变量`user`可能为null,
但在访问`user.name`之前没有进行null检查。建议修改为
先检查user是否为null,例如:if (user != null) { ... }
另外,第23行的循环效率较低..."
使用结构化输出:
{"issues":[{"line":15,"type":"null_pointer","severity":"high","fix":"add null check"},{"line":23,"type":"performance","severity":"medium","fix":"use stream API"}],"summary":"2 issues found"}
同样信息量,tokens从约500降到约80。按Claude Sonnet的输出价格$15/M计算,每次调用省$0.0063。日均10000次调用 = 日省$63,月省$1,890。
# 使用Anthropic的结构化输出
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=256, # 限制输出长度
messages=[{"role": "user", "content": "分析代码问题,只返回JSON"}],
# 直接要求短格式输出
)
| 技巧 | 节省比例 | 示例 |
|---|---|---|
| 1. 要求JSON格式 | 40-60% | "以JSON数组返回" |
| 2. 限制max_tokens | 20-50% | max_tokens=256 |
| 3. 禁止解释 | 30-50% | "只返回结果,不要解释" |
| 4. 用编号代替段落 | 20-30% | "用编号列表" |
| 5. 预设分类标签 | 30-40% | "只返回A/B/C" |
| 6. 要求原始数据 | 50-70% | "只返回数据,不要分析" |
| 7. 使用JSON Schema | 40-60% | OpenAI的response_format |
| 8. 合并多次请求 | 30-50% | 一次请求处理多个输入 |
很多人不知道,把大量文本塞进上下文窗口是最贵的用法。
| 方案 | 10万token文档问答成本 | 延迟 | 准确度 |
|---|---|---|---|
| 塞进上下文(Claude 200K) | $0.30/次(仅输入) | 5-8秒 | 高 |
| Embedding + RAG | $0.002/次(检索+小上下文) | 1-2秒 | 中高 |
| 差距 | 150倍 | 3-4倍快 | 相近 |
flowchart LR
subgraph 方案A[暴力方案:全塞上下文]
A1[10万token文档] --> A2[每次发送全部]
A2 --> A3[LLM处理]
A3 --> A4[成本: $0.30/次]
end
subgraph 方案B[智能方案:RAG]
B1[10万token文档] --> B2[Embedding一次]
B2 --> B3[向量数据库存储]
B3 --> B4[检索Top-K片段]
B4 --> B5[只发送相关片段]
B5 --> B6[LLM处理]
B6 --> B7[成本: $0.002/次]
end
style A4 fill:#F44336,color:white
style B7 fill:#4CAF50,color:white
| Embedding模型 | 价格/M tokens | 维度 | 性能 |
|---|---|---|---|
| OpenAI text-embedding-3-small | $0.02 | 1536 | 优秀 |
| OpenAI text-embedding-3-large | $0.13 | 3072 | 最佳 |
| Google text-embedding-004 | 免费(有限额) | 768 | 良好 |
| Cohere embed-v4 | $0.10 | 1024 | 优秀 |
| 本地 BGE-M3 | 免费 | 1024 | 良好 |
from openai import OpenAI
import chromadb # 开源向量数据库,本地免费运行
client = OpenAI()
chroma = chromadb.PersistentClient(path="./db")
collection = chroma.get_or_create_collection("docs")
# 步骤1:Embedding(一次性成本)
docs = ["文档内容1...", "文档内容2...", ...] # 你的文档
for i, doc in enumerate(docs):
emb = client.embeddings.create(
model="text-embedding-3-small",
input=doc
)
collection.add(ids=[f"doc_{i}"],
embeddings=[emb.data[0].embedding],
documents=[doc])
# 步骤2:检索(几乎零成本)
query_emb = client.embeddings.create(
model="text-embedding-3-small",
input="用户的问题"
)
results = collection.query(
query_embeddings=[query_emb.data[0].embedding],
n_results=5 # 只取最相关的5段
)
# 步骤3:只把相关片段发给LLM
response = client.chat.completions.create(
model="gpt-4o-mini", # 用最便宜的模型
messages=[
{"role": "system", "content": "基于以下内容回答问题"},
{"role": "user", "content": f"内容:{results['documents']}\n问题:用户的问题"}
],
max_tokens=512
)
# 总成本:Embedding查询 $0.0001 + 生成 $0.0005 ≈ $0.0006/次
| 项目 | 暴力方案(月) | RAG方案(月) |
|---|---|---|
| 文档处理 | $0 | 一次性$5-20 |
| 存储成本 | $0 | $0(本地Chroma) |
| 查询成本(1万次/月) | $3,000 | $6 |
| 月总成本 | $3,000 | $6-26 |
ROI:用$20的一次性投入,换$3,000→$26的月成本降幅。
把五个暗门组合起来,效果叠加:
flowchart TB
subgraph L1[第1层:请求入口]
R[Model Router<br>60%请求→Haiku]
end
subgraph L2[第2层:缓存层]
C[Prompt Caching<br>系统提示90% off]
end
subgraph L3[第3层:检索层]
E[Embedding + RAG<br>替代长上下文150x省钱]
end
subgraph L4[第4层:输出优化]
S[Structured Output<br>输出tokens减少50%]
end
subgraph L5[第5层:调度层]
B[Batch API<br>非实时任务50% off]
end
R --> C --> E --> S
B -.-> |离线任务| L5
style R fill:#FF9800,color:white
style C fill:#4CAF50,color:white
style E fill:#2196F3,color:white
style S fill:#9C27B0,color:white
style B fill:#607D8B,color:white
假设你正在做一个AI写作助手,日均5000次调用:
| 优化层 | 月成本 | 累计节省 |
|---|---|---|
| 基线(全用GPT-4o,无优化) | $750 | — |
| +第1层:Router(60%→Haiku) | $320 | 57% |
| +第2层:Prompt Caching | $180 | 76% |
| +第3层:输出优化(JSON+短格式) | $100 | 87% |
| +第4层:RAG(替代长上下文) | $55 | 93% |
| +第5层:Batch(30%任务离线) | $42 | 94% |
$750 → $42,降幅94%,每月省$708。
| 你可能知道的 | 你可能不知道的(本文信息差) |
|---|---|
| 大模型API按token计费 | Prompt Caching可以让重复内容打1折 |
| GPT-4比GPT-3.5贵 | 60%的请求用Haiku就够了,效果差距<5% |
| Batch API便宜50% | Batch API可以和Prompt Caching叠加使用 |
| 长上下文很方便 | RAG + Embedding比长上下文便宜150倍 |
| 输出token更贵 | 强制JSON格式输出可以省50-70%的输出费用 |
| 免费模型质量差 | Google Gemini Flash免费额度已足够小项目使用 |
| 自建模型要GPU | BGE-M3等本地Embedding模型完全免费 |
| 省钱=用差模型 | 省钱=用对模型+对架构+对时机 |
今天就能做的(零成本):
1. 检查你的API调用日志,统计各模型的使用比例
2. 给系统提示加上cache_control参数(Anthropic用户)
3. 把max_tokens从默认值改为实际需要的最小值
4. 在Prompt中加上"只返回JSON,不要解释"
本周能做的(2-4小时): 5. 用LiteLLM搭建一个简单的模型路由器 6. 给非实时任务迁移到Batch API 7. 用ChromaDB + OpenAI Embedding搭建第一个RAG
本月能做的(1-2天): 8. 实现完整的五层省钱架构 9. 搭建成本监控Dashboard(Helicone/Langfuse) 10. 对比优化前后的实际账单
本文由「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 等场景全覆盖。
