Skip to content

引言

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_control

OpenAI 的 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 CachingAnthropic(手动标记,90% 折扣)和 OpenAI(自动,50% 折扣)
模型分级简单任务用便宜模型,复杂任务用贵模型
Batch API非实时任务用批量接口,价格减半
精简 Promptsystem prompt 太长反而效果差,控制 300-500 token
控制输出max_tokens 限制,输出 token 比输入贵 4 倍

思考题

  1. Prompt Caching 的缓存有效期是 5 分钟。如果你的系统高峰期请求间隔超过 5 分钟,你会怎么保持缓存热?
  2. 如果你只能选择一种优化策略,你会选哪个?为什么?
  3. 成本优化和回答质量之间可能有冲突。你会如何平衡?