首页 › cost-hacks › API定价暗战:五个被低估的省钱入口

API定价暗战:五个被低估的省钱入口

你以为比完单价就完了?API厂商的定价体系里藏着至少五个"暗门"——Prompt Caching、Batch API、Tiered Pricing、推测解码、以及Google的Context Caching。大多数人只盯着"$X/百万token",却不知道同一笔钱可以多换3-5倍的推理量。本文逐个拆解这些被低估的省钱入口,附带实际计算和可复制的配置代码。


一、暗门#1:Prompt Caching——你每天在重复付钱

问题有多严重?

以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%。


二、暗门#2:Batch API——不急的任务半价处理

OpenAI和Anthropic的Batch API

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定价对比

厂商 Batch折扣 延迟上限 支持模型 单文件上限
OpenAI 50% off 24小时 GPT-4o, GPT-4o-mini, o1等 200MB
Anthropic 50% off 24小时 Claude全系列 按请求计
Google 50% off 24小时 Gemini全系列 按请求计

实操:用Anthropic Message Batches API

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%。


三、暗门#3:Model Router——不是所有问题都需要GPT-4

核心思想

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完全够用)。


四、暗门#4:Structured Output的省钱效应——你可能没想到

为什么结构化输出能省钱?

大多数人只关注输入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% 一次请求处理多个输入

五、暗门#5:Embedding+向量数据库替代长上下文

算一笔账

很多人不知道,把大量文本塞进上下文窗口是最贵的用法。

方案 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模型价格对比(2026年)

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 良好

实操:从零搭建省钱RAG

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

极限省钱案例:一个月$50的AI SaaS后端

假设你正在做一个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 等场景全覆盖。

51学通信知识星球海报-扫码加入