引言
在昨天的文章中我们聊到,可观测性让团队第一次能够回答“Agent 到底在干什么”。而当 Agent 稳定跑起来之后,老板们问的第二个问题往往是:“它一个月要烧多少钱?为什么这么贵?”
一个未经优化的多智能体系统,成本可以是其理论下限的 5 到 20 倍。真正的浪费很少来自“模型太贵”,而是来自三类系统性浪费:用大炮打蚊子(简单任务用了顶级模型)、重复计算(同样的检索与推理反复执行)、以及失控的长尾(少数 Agent 陷入自循环,把预算烧穿)。
本文梳理 2026 年生产级的成本工程(Cost Engineering)与智能模型路由(Intelligent Model Routing)实践:如何度量成本、如何归因、以及如何在不牺牲质量的前提下把账单砍掉一大半。
一、先把成本变成可观测指标
你无法优化你无法度量的东西。成本工程的第一步,是把钱变成和延迟、错误率一样的一等指标。
延续可观测性的 Span 模型,我们在每个 LLM Span 上直接写入三组属性:
- 用量:
llm.prompt_tokens、llm.completion_tokens、llm.cached_tokens。 - 价格:
llm.model、llm.unit_price_in、llm.unit_price_out。 - 归因:
agent.task_id、agent.worker_id、tenant.id。
from opentelemetry import trace
tracer = trace.get_tracer("littlecorn.agent")
PRICING = {
# 单位:美元 / 百万 token
"flagship-large": {"in": 6.0, "out": 24.0},
"mid-tier": {"in": 0.8, "out": 3.2},
"small-fast": {"in": 0.1, "out": 0.4},
}
def record_llm_span(span, model: str, usage, tenant_id: str, worker_id: str):
price = PRICING[model]
cost = (
usage.prompt_tokens * price["in"] / 1_000_000
+ usage.completion_tokens * price["out"] / 1_000_000
)
span.set_attribute("llm.model", model)
span.set_attribute("llm.prompt_tokens", usage.prompt_tokens)
span.set_attribute("llm.completion_tokens", usage.completion_tokens)
span.set_attribute("llm.cached_tokens", getattr(usage, "cached_tokens", 0))
span.set_attribute("llm.cost_usd", round(cost, 6))
# 归因维度:没有归因的成本数据无法驱动任何优化决策
span.set_attribute("tenant.id", tenant_id)
span.set_attribute("agent.worker_id", worker_id)
return cost
关键洞察:把 llm.cost_usd 写进 Span 后,成本就自动拥有了链路、租户、Worker 三个维度的切片能力。你会立刻发现:真正的成本黑洞往往不是最贵的那次调用,而是某个高频低价值环节。
二、成本归因:找出真正的黑洞
一旦成本可切片,就能构建一张成本归因表,按“单位产出成本”而非“总成本”排序:
| 维度 | 指标 | 说明 |
|---|---|---|
| 任务级 | 单任务成本 (cost per task) | 端到端一次 Agent 任务的总花费 |
| 业务级 | 单成功任务成本 | 总成本 ÷ 成功任务数,惩罚失败重试 |
| 用户级 | 单租户成本 | 识别补贴过度或滥用的租户 |
| 阶段级 | 规划/检索/生成/反思占比 | 定位可优化环节 |
实践经验:在多数 Agent 系统中,“反思(reflection)”与“检索(retrieval)重排”两个环节常常占据了 40% 以上的成本,却只贡献不到 10% 的质量提升——这正是路由与缓存最该发力之处。
三、智能模型路由:让合适的模型做合适的事
模型路由是成本工程中回报最高的一招。核心思想:不是所有请求都值得用旗舰模型。2026 年主流的路由策略分为三层。
1. 静态路由(Static Routing)
按任务类型或阶段硬性指派模型。例如规划用旗舰模型(需要强推理),格式清洗用小型模型(只需遵循指令):
STAGE_ROUTING = {
"planning": "flagship-large", # 强推理,低频,值得
"tool_call": "mid-tier", # 结构化输出,中频
"summarize": "small-fast", # 摘要压缩,高频,便宜
"format_fix": "small-fast", # 纯格式,极高频
}
def pick_model(stage: str) -> str:
return STAGE_ROUTING.get(stage, "mid-tier")
仅此一招,在典型系统中即可降低 30%~50% 成本,且几乎无质量损失——因为大部分 token 花在了“不需要聪明”的环节。
2. 复杂度感知路由(Complexity-Aware Routing)
用一个小而快的路由分类器(可以是 0.1B 级小模型,甚至规则 + 嵌入相似度)先判断请求复杂度,再决定升级到旗舰模型:
def route_by_complexity(query: str, context) -> str:
# 极简启发式:越短、越结构化、命中缓存的请求 → 用小模型
if len(query) < 40 and looks_structured(query):
return "small-fast"
# 小分类器预测难度(0=易, 1=难)
difficulty = router_classifier.predict(query, context)
if difficulty < 0.3:
return "small-fast"
elif difficulty < 0.7:
return "mid-tier"
return "flagship-large"
复杂度路由的要点是“够用即止”:宁可偶尔让简单请求走小模型得到略逊但可接受的答案,也不要为 90% 的简单请求支付旗舰价格。用在线评估(见昨日文章)持续监控各路由分支的忠实度,一旦小模型分支质量下滑就自动收敛阈值。
3. 级联路由(Cascading / Fallback)
先用便宜模型回答,并用一个廉价的置信度校验器判断答案是否可靠;不可靠时才升级到更强模型。这是“延迟换成本”的经典权衡:
def cascading_generate(query: str) -> str:
cheap = call_llm("small-fast", query)
if confidence_ok(cheap, query): # 规则 + 小模型自评
return cheap # 约 70% 请求在此终止
if confidence_ok(mid := call_llm("mid-tier", query), query):
return mid
return call_llm("flagship-large", query)
四、语义缓存:消灭重复计算
Agent 系统中大量请求是语义重复的(换个说法问同一件事)。相比精确字符串缓存,语义缓存按嵌入相似度命中,命中率可高出一个数量级:
def cached_answer(query: str, threshold: float = 0.95) -> str:
qvec = embed(query)
hit, score, cached = vector_cache.search(qvec, top_k=1)
if hit and score >= threshold:
return cached["answer"] # 命中即零推理成本
answer = run_agent(query) # 未命中才真正执行
vector_cache.upsert(qvec, {"answer": answer})
return answer
配合提示词缓存(Prompt Caching)——把稳定不变的系统提示、工具定义、少样本示例放在前缀以享受缓存折扣——两项叠加常可节省 20% 以上的直接推理成本。
五、失控长尾与预算护栏
最危险的成本不是“贵”,而是“不可预测”。一个陷入自循环的 Agent 能在一夜之间烧掉数月预算。必须设置多层预算护栏(Budget Guardrails):
- 单任务预算:为每次任务设置 token / 美元上限,超限即强制终止并降级返回部分结果。
- 循环探测:监控 Span 深度与重复工具调用签名,连续 N 次相同调用即熔断。
- 租户配额:按租户设置日/月预算,超限自动切换廉价模型或排队。
- 异常告警:单任务成本超过 P99 的 3 倍时实时告警。
class BudgetGuard:
def __init__(self, max_usd: float, max_steps: int):
self.max_usd, self.max_steps = max_usd, max_steps
self.spent, self.steps = 0.0, 0
def charge(self, cost: float):
self.spent += cost
self.steps += 1
if self.spent > self.max_usd or self.steps > self.max_steps:
raise BudgetExceeded(f"spent=${self.spent:.4f} steps={self.steps}")
六、单位经济性:比“总成本”更重要的指标
成本优化的北极星不是“总花费最低”,而是单位经济性(Unit Economics)最优。建议长期跟踪:
- 单成功任务成本(Cost per Successful Task):把失败重试计入分母,逼迫团队关注“一次性做对”。
- 每美元质量分(Quality per Dollar):Judge 质量分 ÷ 成本,衡量性价比。
- 缓存命中率与小模型分流比例:两个最直接的成本杠杆。
经验法则:优化顺序永远是 消除浪费 → 缓存 → 路由 → 蒸馏。跳过前三步直接去训练小模型,往往是在优化一个本不该存在的成本。
七、与可观测性、评估体系形成闭环
成本工程无法独立存在,它与前几篇文章的架构天然闭环:
- 可观测性提供归因:Span 上的
llm.cost_usd与归因维度是成本分析的数据基础。 - 在线评估提供质量约束:任何降本动作都必须通过质量门禁,避免“省了钱、废了产品”。
- 路由与缓存提供杠杆:在质量约束下,动态寻找成本与效果的帕累托最优点。
八、总结与展望
AI Agent 的成本工程,本质上是把“烧钱的黑盒”改造为“可度量、可归因、可调控”的经济系统。通过把成本写进 Span、建立单位经济性指标、实施分层模型路由与语义缓存、并设置严密的预算护栏,团队往往能在不牺牲质量的前提下把账单降低 50%~80%。
展望未来,随着自适应路由策略与价格感知调度器的成熟,Agent 将能够根据实时价格、负载与质量反馈自主选择最优执行路径——让自主智能体不仅聪明,而且经济。