更新于

团队 LLM 预算分配实战


“上个月 OpenAI 账单怎么比上上个月多了两倍?“——这是很多技术 Leader 在快速扩张 AI 功能时会遇到的场景。根源通常不是某个功能用量暴涨,而是没有建立合理的预算分配和监控体系,等到账单来了才开始追查。

本文聚焦”团队怎么管 LLM 的钱”,从预算规划、费用归因、实时监控到超支响应,给出一套可落地的实战方案。

一、为什么 LLM 预算管理比其他 SaaS 更难

大多数 SaaS 订阅费用是固定的或者按席位计费,月底不会有惊喜。LLM API 是按用量计费,且用量受到多重不确定因素影响:

  1. 用户行为不可预测:用户发来的消息长短差异可达 10 倍,处理同一批任务的 token 消耗会随着 prompt 优化改变
  2. 模型价格波动:新模型上线往往伴随价格调整,同样的调用量费用可能变化 30%+
  3. 功能叠加效应:新功能上线、并发量增加、上下文窗口变长,几个因素同时叠加会导致费用非线性增长
  4. 各团队共享同一 API Key:没有隔离,谁在烧钱不清楚

一个很多团队会犯的错误是把 LLM 预算当成固定成本处理,结果在快速增长期频繁超支;另一个常见错误是过于保守地限制用量,结果核心产品功能体验受损,用户流失。

二、预算分配框架:三层结构

推荐用”三层预算”结构管理团队 LLM 费用:

总预算(月度 / 季度)
├── 产品功能层(60–70%)
│   ├── 核心功能 A(如:智能助手对话)  → 30%
│   ├── 核心功能 B(如:文档分析)      → 20%
│   └── 辅助功能 C(如:智能搜索)      → 10%
├── 开发测试层(15–20%)
│   ├── 开发环境调试                   → 8%
│   └── 自动化测试 / Eval              → 12%
└── 弹性储备层(10–20%)
    └── 处理流量峰值 / 新功能试验

关键原则

  • 弹性储备不低于 10%,避免流量峰值时没有余量
  • 开发测试层单独隔离,防止开发调试”吃掉”生产预算
  • 每层设置独立的 API Key 或子账户(如果供应商支持)

三、按项目隔离 API Key

费用归因的前提是隔离。最直接的方式是不同项目/环境使用不同的 API Key,然后按 Key 统计费用。

大多数主流 LLM 供应商都支持创建多个 API Key,可以按如下维度划分:

Key 命名用途预算
prod-chat-assistant生产环境:对话功能¥3000/月
prod-doc-analysis生产环境:文档分析¥2000/月
staging-all预发布环境¥500/月
dev-team-a开发环境 A 团队¥200/月
dev-team-b开发环境 B 团队¥200/月
eval-pipeline自动评测流水线¥300/月

这样做之后,OpenAI / Anthropic 后台的 Usage 页面就能按 Key 看费用分布。如果用 YoTradeApi 这类中转服务,还能在中转层加一层更细粒度的用量统计。

四、实时监控仪表盘搭建

原生的供应商后台通常只有按天的统计粒度,无法满足”发现今天下午费用异常增长”的需求。需要在应用层记录每次 API 调用的 token 用量,汇聚到自己的监控系统。

埋点方案(Python 示例):

import time
import openai
from dataclasses import dataclass
from typing import Optional

@dataclass
class LLMCallRecord:
    project: str
    feature: str
    model: str
    prompt_tokens: int
    completion_tokens: int
    total_tokens: int
    latency_ms: float
    cost_usd: float
    user_id: Optional[str] = None

# 各模型每 1K token 的价格(估算,定期更新)
MODEL_PRICING = {
    "gpt-4o": {"input": 0.0025, "output": 0.01},
    "gpt-4o-mini": {"input": 0.00015, "output": 0.0006},
    "claude-3-5-sonnet-20241022": {"input": 0.003, "output": 0.015},
}

def tracked_chat_call(
    messages: list,
    model: str,
    project: str,
    feature: str,
    user_id: str = None,
    **kwargs
) -> tuple:
    start = time.time()
    
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        **kwargs
    )
    
    latency = (time.time() - start) * 1000
    usage = response.usage
    
    pricing = MODEL_PRICING.get(model, {"input": 0, "output": 0})
    cost = (usage.prompt_tokens / 1000 * pricing["input"] + 
            usage.completion_tokens / 1000 * pricing["output"])
    
    record = LLMCallRecord(
        project=project,
        feature=feature,
        model=model,
        prompt_tokens=usage.prompt_tokens,
        completion_tokens=usage.completion_tokens,
        total_tokens=usage.total_tokens,
        latency_ms=latency,
        cost_usd=cost,
        user_id=user_id
    )
    
    # 发送到监控系统(如 InfluxDB、ClickHouse 或简单的 Postgres)
    send_to_metrics(record)
    
    return response, record

监控指标建议(按优先级排序):

  1. 每小时/每天费用趋势(按项目、功能维度)
  2. P95 延迟(识别性能问题)
  3. 平均 token 用量(输入 vs 输出比,优化 prompt 的依据)
  4. 错误率(429/500 等错误,有时是费用超限触发的)
  5. 每用户费用(识别异常高消耗用户)

五、预算上限与超支预警

仅有监控还不够,需要设置自动的软性预警硬性限制

软性预警:当某个 Key 或项目的当月累计费用达到预算的 70%、90% 时,发送 Slack/钉钉通知给负责人。

def check_budget_alert(project: str, current_spend: float, budget: float):
    ratio = current_spend / budget
    if ratio >= 0.9:
        send_alert(
            level="critical",
            message=f"⚠️ 项目 {project} 已消耗预算的 {ratio:.0%}{current_spend:.2f} / {budget:.2f} USD)"
        )
    elif ratio >= 0.7:
        send_alert(
            level="warning", 
            message=f"⚡ 项目 {project} 已消耗预算的 {ratio:.0%},请关注消耗速度"
        )

硬性限制:对于开发环境,可以在应用层加每日 token 配额,超过后拒绝请求并返回友好提示。生产环境不建议硬性截断,避免影响用户体验。

# 简单的内存计数器(生产环境建议用 Redis)
from collections import defaultdict
from datetime import date

daily_token_count = defaultdict(int)

def check_daily_quota(api_key_alias: str, estimated_tokens: int, limit: int) -> bool:
    today = str(date.today())
    key = f"{api_key_alias}:{today}"
    
    if daily_token_count[key] + estimated_tokens > limit:
        return False  # 超限,拒绝请求
    
    daily_token_count[key] += estimated_tokens
    return True

更完整的 API 预算上限设计,参见 AI API 预算上限设计方案

六、月度预算复盘流程

每月月底(或月初复盘上月)做一次预算复盘,重点关注以下问题:

1. 超支分析

实际支出 vs 预算:哪个项目/功能超了?超了多少?
超支原因:流量增长?prompt 变长?新功能上线?价格上涨?

2. 成本效率分析

平均每次调用 token 数(是否在合理范围?)
平均每次调用成本(和上月比是否有优化空间?)
哪个模型 / 功能的 cost per 有效 output 最高?

3. 下月预算调整

基于增长率和优化措施,调整各项目预算。增长超过 20% 需要专项审查,确认是合理的业务增长还是存在浪费。

实用小技巧

  • 把 LLM 费用纳入产品单位经济核算(例如”每个用户每月 LLM 成本是多少”),与 ARPU 对比,直观判断是否可持续
  • 对开发人员设置个人配额(如每人每天 $2 的开发环境用量),超出需申请,能有效遏制随意测试带来的浪费

七、常见节省机会清单

在预算紧张时,可以系统排查以下节省点:

优化方向预期节省实施难度
Prompt Caching(固定 system prompt)30–50%
批量任务转 Batch API50%
降级模型(低优先级任务用 mini)40–80%
压缩 prompt(移除冗余说明)10–30%
截断过长的上下文历史20–40%
输出长度限制(max_tokens)5–20%极低

关于 prompt token 压缩的具体方法,参见 LLM Prompt Token 压缩实用技巧

八、中转 API 的预算优势

如果团队使用中转 API(如 YoTradeApi),有一些额外的预算管理便利:

  1. 统一账单:不同供应商(OpenAI + Anthropic + Gemini)的费用在一个后台看,不用在多个平台之间切换
  2. 人民币计费:对国内团队友好,避免汇率波动影响预算估算
  3. 按量充值:不需要绑定信用卡,预充值模式天然防超支
  4. 细粒度统计:支持按 Key 或自定义标签统计用量,满足项目级核算需求

九、相关阅读

想把多个模型的 API 费用统一在一处管理?YoTradeApi 支持 OpenAI、Claude、Gemini 全系模型的人民币统一计费,适合有精细化成本管理需求的团队。