Skip to content
🔗 分享本题
查看我的学习进度 →

23 模块 Q15 教学图:生产环境 Agent 成本超支告警:预算控制最佳实践

🧠 图解记忆:预算控制要先可归因,再用分层阈值告警,并为异常增长准备降级与止损动作;点击图片可查看原图。

💡 答案要点

Agent 成本构成:

总成本 = Token成本 + API调用次数成本 + 计算资源成本

Token成本 = Σ(输入Token数 × 单价) + Σ(输出Token数 × 单价)

预算控制四层架构:

┌─────────────────────────────────────────────────────────┐
│              Agent 成本控制四层架构                       │
├─────────────────────────────────────────────────────────┤
│  Layer 1: 每日预算硬限制(最后防线)                      │
│  ├── 日预算 $200,超 $200 自动熔断                        │
│  ├── 按 Agent 拆分预算(Orchestrator: $80, Worker: $120)│
│  └── 余额不足时拒绝新任务,排队等待                       │
├─────────────────────────────────────────────────────────┤
│  Layer 2: 实时告警(提前发现问题)                        │
│  ├── 预计日成本 > 80% 阈值 → warning                     │
│  ├── 预计日成本 > 100% 阈值 → critical                    │
│  └── Token消耗速率异常(突增 > 3x)→ 立即告警             │
├─────────────────────────────────────────────────────────┤
│  Layer 3: 成本优化(主动降本)                            │
│  ├── 模型降级:GPT-4 → DeepSeek V4-Flash(简单任务)               │
│  ├── 缓存命中:相同问题直接返回(省 100%)                │
│  ├── 步数限制:> 10步强制结束(防死循环)                  │
│  └── Prompt压缩:LLMLingua 减少 30% token                │
├─────────────────────────────────────────────────────────┤
│  Layer 4: 成本归因(搞清楚钱花在哪)                      │
│  ├── 按 Agent 类型归因(SearchAgent 消耗最多)            │
│  ├── 按用户归因(Top 10 用户占 60% 成本)                │
│  └── 按任务类型归因(多跳问答比简单问答贵 5x)             │
└─────────────────────────────────────────────────────────┘

实现代码:

展开 Python 代码示例(75 行)
python
from datetime import datetime, timedelta
from collections import defaultdict
import asyncio

class AgentBudgetController:
    def __init__(
        self,
        daily_budget_usd: float = 200.0,
        warning_threshold: float = 0.8
    ):
        self.daily_budget = daily_budget_usd
        self.warning_threshold = warning_threshold
        self.spent_today = 0.0
        self.agent_budgets = {
            "orchestrator": daily_budget_usd * 0.4,
            "search": daily_budget_usd * 0.3,
            "executor": daily_budget_usd * 0.3
        }
        self.alerted_agents = set()
    
    async def check_budget(self, agent_name: str, task_cost: float):
        """每次 Agent 调用前检查预算"""
        remaining = self.agent_budgets.get(agent_name, 0) - self.spent_today
        
        # Layer 1: 硬限制
        if self.spent_today + task_cost > self.daily_budget:
            raise BudgetExceededError(
                f"日预算已超,当前${self.spent_today:.2f},剩余${self.daily_budget - self.spent_today:.2f}"
            )
        
        # Layer 2: 实时告警
        cost_rate = self.spent_today / (datetime.now().hour + 1)
        projected_daily = cost_rate * 24
        
        if projected_daily > self.daily_budget * self.warning_threshold:
            if agent_name not in self.alerted_agents:
                await self.send_alert(
                    agent_name=agent_name,
                    severity="warning",
                    message=f"预计日成本${projected_daily:.2f},超过{self.warning_threshold*100}%阈值"
                )
                self.alerted_agents.add(agent_name)
    
    async def record_cost(
        self,
        agent_name: str,
        input_tokens: int,
        output_tokens: int,
        model: str
    ):
        """记录成本并更新预算"""
        cost = self.calculate_cost(input_tokens, output_tokens, model)
        self.spent_today += cost
        
        cost_gauge.labels(
            agent=agent_name,
            model=model,
            date=datetime.now().strftime("%Y-%m-%d")
        ).inc(cost)
    
    def calculate_cost(self, input_tok: int, output_tok: int, model: str) -> float:
        pricing = {
            "gpt-4o": (0.005, 0.015),
            "deepseek-v4-flash": (0.0005, 0.0015),
            "claude-3-opus": (0.015, 0.075)
        }
        in_price, out_price = pricing.get(model, (0.0, 0.0))
        return (input_tok / 1000 * in_price) + (output_tok / 1000 * out_price)
    
    async def send_alert(self, agent_name: str, severity: str, message: str):
        await pagerduty.create_incident(
            title=f"Agent成本告警: {agent_name}",
            severity=severity,
            body=message
        )

成本归因 Dashboard:

yaml
# Grafana Panel: Agent成本归因
- title: 成本按Agent分布
  expr: |
    sum(increase(agent_cost_total{date="2026-05-15"}[1d])) by (agent_name)
  type: pie

- title: 成本按用户分布(Top 10)
  expr: |
    topk(10, sum(increase(agent_cost_total[1d])) by (user_id))
  type: table

- title: 成本按任务类型分布
  expr: |
    sum(increase(agent_cost_total[1d])) by (task_type)
    / sum(increase(agent_cost_total[1d])) * 100
  legend: "{{task_type}}: {{value}}%"

面试话术:

"成本控制包括预算/配额、预测告警、按租户和步骤归因,以及缓存、路由、上下文和步数优化。硬限制要设计关键业务的降级与豁免;缓存键还要包含权限、版本和时效,不能为省钱返回越权或过期结果。异常增长要沿 trace 查请求量、token、重试、模型和缓存命中变化。"

📚 参考:Langfuse:预算与成本告警