
LLM 调用的成本监控与预警从账单追踪到异常波动的自动发现一、生活化 AI 产品的隐性成本膨胀AI 生活助手的日均 LLM 调用次数从上线初期的 200 次增长到 3000 次。单次调用成本约 0.02 元GPT-4o-mini日均成本从 4 元涨到 60 元。成本膨胀不明显因为单次调用便宜但累积效应惊人月成本从 120 元涨到 1800 元半年内翻了 15 倍。更隐蔽的是异常波动某天情绪分析模块的 prompt 意外增长了 500 token单日成本飙升到 180 元但账单页面只显示总金额不展示构成明细。成本监控的目标不是压缩预算而是及时发现异常波动并定位到具体模块。通过实测发现接入成本监控后异常波动发现时间从 3 天缩短到 2 小时prompt 长度异常在 30 分钟内被定位。二、成本监控的数据维度与异常检测流程成本监控覆盖三个维度调用次数、token 消耗、单次成本。异常检测基于滑动窗口基线对比异常检测的阈值设计考虑正常波动范围调用次数日均波动约 20%token 消耗波动约 15%单日成本波动约 25%。阈值设为正常波动的 2 倍以上确保只捕获真正的异常而非日常波动。三、成本监控与异常预警的代码实现# LLM 调用记录与成本追踪 import time from dataclasses import dataclass from typing import Dict, List, Optional from collections import defaultdict dataclass class LLMCallRecord: 单次 LLM 调用记录 call_id: str module_name: str # emotion / recipe / schedule model_name: str # gpt-4o-mini / gpt-4o input_tokens: int output_tokens: int latency_ms: float timestamp: float cost: float # 本次调用成本元 class LLMCostTracker: LLM 调用成本追踪器 设计意图每次调用后记录详情 按模块和时段聚合统计 为异常检测提供基线数据。 # 各模型的单价元/千token MODEL_PRICING { gpt-4o-mini: {input: 0.01, output: 0.03}, gpt-4o: {input: 0.15, output: 0.60}, claude-3-haiku: {input: 0.01, output: 0.025}, } def __init__(self): self._records: List[LLMCallRecord] [] self._module_stats: Dict[str, defaultdict] {} def record_call( self, module_name: str, model_name: str, input_tokens: int, output_tokens: int, latency_ms: float ) - LLMCallRecord: 记录一次 LLM 调用 import uuid # 计算本次调用成本 pricing self.MODEL_PRICING.get(model_name) if not pricing: raise ValueError(f未注册的模型: {model_name}) cost ( input_tokens / 1000 * pricing[input] output_tokens / 1000 * pricing[output] ) record LLMCallRecord( call_idstr(uuid.uuid4()), module_namemodule_name, model_namemodel_name, input_tokensinput_tokens, output_tokensoutput_tokens, latency_mslatency_ms, timestamptime.time(), costcost ) self._records.append(record) return record def get_module_daily_stats( self, module_name: str, date: Optional[str] None ) - dict: 获取某模块某天的聚合统计 target_date date or time.strftime(%Y-%m-%d) day_records [ r for r in self._records if r.module_name module_name and time.strftime(%Y-%m-%d, time.localtime(r.timestamp)) target_date ] if not day_records: return {module: module_name, date: target_date, count: 0} total_cost sum(r.cost for r in day_records) total_input_tokens sum(r.input_tokens for r in day_records) total_output_tokens sum(r.output_tokens for r in day_records) return { module: module_name, date: target_date, count: len(day_records), total_cost: round(total_cost, 2), avg_input_tokens: round(total_input_tokens / len(day_records)), avg_output_tokens: round(total_output_tokens / len(day_records)), avg_latency_ms: round(sum(r.latency_ms for r in day_records) / len(day_records)), } # 异常检测器 — 滑动窗口基线对比 class CostAnomalyDetector: 成本异常检测器 设计意图用过去7天同一时段的均值作为基线 当当前值偏离基线超过阈值时触发预警。 阈值设为正常波动的2倍避免误报。 # 异常阈值 CALL_COUNT_THRESHOLD 0.5 # 调用次数偏差50% TOKEN_COUNT_THRESHOLD 0.3 # Token消耗偏差30% DAILY_COST_THRESHOLD 0.4 # 单日成本偏差40% BASELINE_WINDOW 7 # 7天基线窗口 def __init__(self, tracker: LLMCostTracker): self.tracker tracker def detect_module_anomaly( self, module_name: str ) - Optional[dict]: 检测某模块的成本异常 返回 None 表示无异常 返回异常详情表示偏离基线超过阈值。 # 计算当前时段统计 current_stats self.tracker.get_module_daily_stats(module_name) if current_stats[count] 0: return None # 计算7天基线 baseline self._compute_baseline(module_name) if baseline[avg_count] 0: return None # 检查调用次数偏差 call_deviation abs( current_stats[count] - baseline[avg_count] ) / baseline[avg_count] if call_deviation self.CALL_COUNT_THRESHOLD: return { module: module_name, type: 调用次数异常, current: current_stats[count], baseline_avg: baseline[avg_count], deviation: f{call_deviation:.1%}, suggestion: 检查模块是否存在重复调用或循环请求 } # 检查 Token 消耗偏差 token_deviation abs( current_stats[avg_input_tokens] - baseline[avg_input_tokens] ) / max(baseline[avg_input_tokens], 1) if token_deviation self.TOKEN_COUNT_THRESHOLD: return { module: module_name, type: Token消耗异常, current_avg_input: current_stats[avg_input_tokens], baseline_avg_input: baseline[avg_input_tokens], deviation: f{token_deviation:.1%}, suggestion: 检查prompt是否意外增长是否包含冗余上下文 } return None def detect_daily_cost_anomaly(self) - Optional[dict]: 检测单日总成本异常 import datetime today datetime.date.today().strftime(%Y-%m-%d) current_total sum( r.cost for r in self.tracker._records if time.strftime(%Y-%m-%d, time.localtime(r.timestamp)) today ) # 计算7天日均成本基线 baseline_daily_avg self._compute_daily_cost_baseline() if baseline_daily_avg 0: return None cost_deviation abs(current_total - baseline_daily_avg) / baseline_daily_avg if cost_deviation self.DAILY_COST_THRESHOLD: return { type: 单日成本异常, current_total: round(current_total, 2), baseline_avg: round(baseline_daily_avg, 2), deviation: f{cost_deviation:.1%}, suggestion: 逐模块排查异常调用来源 } return None def _compute_baseline(self, module_name: str) - dict: 计算7天基线均值 import datetime daily_counts [] daily_input_tokens [] for i in range(1, self.BASELINE_WINDOW 1): date (datetime.date.today() - datetime.timedelta(daysi)).strftime(%Y-%m-%d) stats self.tracker.get_module_daily_stats(module_name, date) daily_counts.append(stats.get(count, 0)) daily_input_tokens.append(stats.get(avg_input_tokens, 0)) return { avg_count: sum(daily_counts) / len(daily_counts) if daily_counts else 0, avg_input_tokens: sum(daily_input_tokens) / len(daily_input_tokens) if daily_input_tokens else 0, } def _compute_daily_cost_baseline(self) - float: 计算7天日均成本基线 import datetime daily_totals [] for i in range(1, self.BASELINE_WINDOW 1): date (datetime.date.today() - datetime.timedelta(daysi)).strftime(%Y-%m-%d) day_total sum( r.cost for r in self.tracker._records if time.strftime(%Y-%m-%d, time.localtime(r.timestamp)) date ) daily_totals.append(day_total) return sum(daily_totals) / len(daily_totals) if daily_totals else 0四、成本监控的采样频率与存储成本边界全量记录每次调用的详细数据模型、token、延迟会产生大量存储开销。日均 3000 次调用每次记录约 200 字节日增 600KB月增 18MB。对于中小规模应用18MB 的存储开销完全可接受。但日均 10 万次调用的大型应用月增 600MB 需要考虑数据生命周期管理30 天内的数据保留完整记录超过 30 天的仅保留聚合统计详细记录归档到冷存储。异常检测的采样频率也有边界模块级异常每小时检测一次日级成本异常每天检测一次。过于频繁的检测每分钟会增加计算开销且短期波动容易触发误报。五、总结LLM 调用成本监控的关键要点三个维度调用次数、token 消耗、单次成本按模块和时段聚合统计滑动基线过去 7 天同一时段均值作为基线偏差超过阈值触发预警阈值设计调用次数偏差 50%、token 消耗偏差 30%、日成本偏差 40%设为正常波动的 2 倍数据生命周期30 天内保留完整记录超过 30 天仅保留聚合统计检测频率模块级每小时检测日级成本每天检测避免高频误报生产落地步骤注册模型单价表 → 每次调用后记录详情 → 按模块聚合统计 → 实现 7 天滑动基线 → 配置偏差阈值 → 异常预警通知 → 数据生命周期管理。