「上个月 API 账单 $1,200,这个月怎么 $3,600 了?」
这是 AI 应用开发者最常见的噩梦。LLM API 成本的增长往往不是线性的——一次未优化的循环调用、一个缺失的缓存策略、一个选错的模型,就能让你的账单翻几倍。
本文从账单构成开始讲起,逐步深入到每一个成本控制策略,并提供可操作的方案和工具推荐。
LLM API 账单构成
要控制成本,首先要理解钱花在了哪里。LLM API 的成本主要由以下几个部分构成:
1. Token 成本
这是最核心的部分,包括:
- 输入 Token: 你发给 API 的 prompt 内容
- 输出 Token: API 返回的响应内容
- 缓存读取 Token: 命中了缓存,只需要支付缓存价格(通常为全价的 10%)
2. 请求数量
即使每个请求的 token 量不大,但请求数量本身也会显著影响总成本。特别是在 Agent 工作流中,一个任务可能涉及数十次 API 调用。
3. 模型选择
不同的模型价格差异巨大:
| 模型 | 输入价格/1M | 输出价格/1M | 相对成本 |
|---|---|---|---|
| Claude Haiku 4.5 | $0.80 | $4.00 | 1x |
| Claude Sonnet 4.7 | $3.00 | $15.00 | ~3.8x |
| Claude Opus 4.8 | $15.00 | $75.00 | ~18.8x |
4. 失败重试
API 调用失败后的重试会产生额外的成本。如果重试逻辑不合理,一次失败可能导致多次重试,成倍增加成本。
成本爆炸的 5 个常见原因
1. 循环调用无缓存
场景: Agent 在循环中反复发送相同的上下文,每次都是全价支付。 影响: 额外消耗 5-10 倍 token。 解决方案: 使用带缓存的网关(如 TeamoRouter)。
2. 简单任务用了大模型
场景: 简单的文本分类、数据提取等任务也用了 Opus。 影响: 成本为使用 Haiku 的 10-20 倍。 解决方案: 基于任务复杂度自动路由。
3. 过度重试
场景: API 调用失败后,未经指数退避直接重试 5 次。 影响: 在系统不稳定时,成本暴增 5 倍。 解决方案: 合理设置重试策略(指数退避 + 最大重试次数)。
4. 缺乏监控告警
场景: 没有设置预算告警,等到月底收到账单才发现超支。 影响: 无法及时干预异常消耗。 解决方案: 设置多级预算告警(50%、80%、100%)。
5. 未优化 prompt 长度
场景: prompt 中包含大量无用信息、历史记录、系统提示。 影响: 每请求 ta 多消耗 2-10 倍输入 token。 解决方案: 优化 prompt 长度,精简上下文。
缓存策略实战
缓存是降低 LLM API 成本最有效的手段之一。
Semantic Cache vs Exact Match Cache
| 缓存类型 | 工作原理 | 适用场景 | TeamoRouter 实现 |
|---|---|---|---|
| Exact Match | 请求完全一致时返回缓存 | 固定 prompt 模板 | 基础层缓存 |
| Semantic(语义) | 语义相似的请求返回缓存 | Agent 工作流(同内容不同表达) | 核心能力,99.3% 命中率 |
为什么语义缓存对 Agent 场景特别有效
Agent 工作流的特点是:
- 同一上下文中,80%+ 的内容是重复的(系统提示、对话历史等)
- 虽然是重复的内容,但每次请求的格式可能略有不同(追加了新的轮次)
语义缓存能识别出这些「实质相同、格式略异」的请求,大幅提高缓存命中率。
TeamoRouter 如何做到 99.3% 缓存命中率
TeamoRouter 的缓存技术针对 Agent 场景做了以下优化:
- 智能分段缓存: 将 prompt 分为动态和静态部分,只缓存静态部分
- 语义相似度匹配: 不要求请求完全一致,语义相似即可命中
- 预热机制: 对常见请求模式进行预缓存
- 缓存隔离: 不同用户的缓存隔离,避免缓存污染
模型路由策略
不是所有任务都需要最强模型。基于任务复杂度自动路由到合适的模型可以显著降低成本。
路由策略示例
| 任务类型 | 推荐模型 | 价格相对 Opus | 节省比例 |
|---|---|---|---|
| 简单问答、数据提取 | Claude Haiku | ~5% | 95% |
| 代码生成、调试 | Claude Sonnet | ~20% | 80% |
| 复杂推理、长文写作 | Claude Opus | 100% | 0% |
TeamoRouter 的自动路由
TeamoRouter 支持基于任务特征自动选择模型,无需手动配置。
请求优化
Batch 请求
将多个独立请求合并为 batch 一次性发送,可以降低总请求数,且部分模型/提供商对 batch 请求有折扣。
Streaming
启用 streaming 可以降低首字延迟,虽然对总 token 成本没有直接影响,但能提升用户体验,减少因等待超时导致的重试。
压缩 Prompt
- 缩短历史记录:只保留最近几轮的上下文
- 精简系统提示:去除不必要的指令
- 结构化 prompt:使用结构化模板替代自然语言描述
成本监控与预警
设置预算告警
| 级别 | 告警阈值 | 动作 |
|---|---|---|
| 提醒 | 预算 50% | 邮件/消息通知 |
| 警告 | 预算 80% | 通知 + 限制非关键请求 |
| 上限 | 预算 100% | 暂停 API 访问 |
用量报表分析
定期查看以下指标:
- 每日/每周 Token 消耗趋势
- 缓存命中率变化
- Top 模型消耗分布
- 单用户/单 Key 消耗排行
真实案例:月账单从 $1,200 降至 $180
背景
某 indie hacker 的 AI 写作助手使用了 Claude API,月均 $1,200-1,500。
优化措施
- 改用 TeamoRouter 网关(缓存 + 路由)
- 配置语义缓存(80% 以上的重复请求命中缓存)
- 设置模型路由(简单任务走 Sonnet,复杂任务走 Opus)
- 优化 prompt(精简系统提示 + 压缩历史记录)
优化结果
| 指标 | 优化前 | 优化后 | 降幅 |
|---|---|---|---|
| 月 API 成本 | $1,200 | $180 | -85% |
| 缓存命中率 | 0%(无缓存) | 85% | - |
| 平均每次请求成本 | $0.12 | $0.018 | -85% |
| 用户响应时间 | 1.2s | 0.8s | -33% |
常见问题(FAQ)
缓存会过期吗?
TeamoRouter 的缓存有合理的 TTL(生存时间)设置。对于频繁请求的缓存项,TTL 会自动延长;不常请求的缓存项会被定期清理。
缓存会导致响应内容过时吗?
API 的响应内容在短时间内不会变化。TeamoRouter 的缓存有基于模型版本的版本控制,模型更新后缓存自动失效。
我需要修改代码才能使用网关缓存吗?
不需要。TeamoRouter 的缓存对调用方完全透明,你只需要将 API URL 指向 TeamoRouter,缓存自动生效。