设置

语言

构建多模型 AI Agent:实用架构指南

L
LemonData
·2026年2月26日·422 次浏览
构建多模型 AI Agent:实用架构指南

大多数 AI Agent 在所有环节都使用单一模型。规划步骤、工具调用、总结、错误恢复。这在演示中可行,但在生产环境中,这是一种浪费。

需要深度推理的规划步骤并不需要与 JSON 提取步骤使用相同的模型。代码生成任务的要求与分类任务的要求也截然不同。使用 Claude Opus 4.6(每 1M output tokens 25 美元)来格式化日期字符串,就像聘请资深架构师来刷墙一样。

以下是如何构建能够将每个步骤路由到最佳模型的 Agent。

如果你正在处理 API 层而非 Agent 层,请在阅读本文的同时参考 Agent-First API 设计为什么团队从直接使用模型 API 转向统一 AI API。当底层 API 接口足够稳定,可以在不重写编排代码的情况下更换模型时,多模型 Agent 的效果最佳。

多模型 Agent 架构

用户请求
    │
    ▼
┌─────────────┐
│   路由器     │  ← 对任务复杂度进行分类
│ (快速模型)   │
└──────┬──────┘
       │
   ┌───┴───┐
   ▼       ▼
┌──────┐ ┌──────┐
│简单模型│ │复杂模型│
└──┬───┘ └──┬───┘
   │        │
   ▼        ▼
┌─────────────┐
│   聚合器     │  ← 合并结果
│ (快速模型)   │
└─────────────┘

三个组件:

  1. 一个根据复杂度对传入任务进行分类的路由器
  2. 一个匹配不同任务类型的模型池
  3. 一个在需要时合并结果的聚合器

在实践中,生产环境的 Agent 通常还需要另外两个部分:

  1. 当首选模型失败或变慢时的备选策略 (fallback policy)
  2. 一个记录每个步骤的模型选择、延迟和成本的遥测层 (telemetry layer)

如果没有这两部分,多模型 Agent 很快就会变成一个行为不可预测的黑盒。

使用 OpenAI SDK 实现

通过聚合器使用单一 API key,无需管理多个 SDK 即可访问所有模型:

from openai import OpenAI

client = OpenAI(
    api_key="sk-lemon-xxx",
    base_url="https://api.lemondata.cc/v1"
)

# 具有成本/能力层级的模型池
MODELS = {
    "router": "gpt-4.1-mini",        # $0.40/1M in - 快速分类
    "simple": "gpt-4.1-mini",         # $0.40/1M in - 提取、格式化
    "reasoning": "claude-sonnet-4-6",  # $3.00/1M in - 规划、分析
    "complex": "gpt-4.1",             # $2.00/1M in - 代码生成、多步执行
    "budget": "deepseek-chat",         # $0.28/1M in - 批量处理
}

def route_task(task: str) -> str:
    """使用廉价模型对任务复杂度进行分类。"""
    response = client.chat.completions.create(
        model=MODELS["router"],
        messages=[
            {"role": "system", "content": """将此任务分为以下一类:
- simple: 数据提取、格式化、翻译
- reasoning: 分析、规划、比较
- complex: 代码生成、多步问题解决
- budget: 批量处理、非关键任务
仅回复类别名称。"""},
            {"role": "user", "content": task}
        ],
        max_tokens=10
    )
    category = response.choices[0].message.content.strip().lower()
    return MODELS.get(category, MODELS["simple"])

def execute_task(task: str, context: str = "") -> str:
    """将任务路由到合适的模型并执行。"""
    model = route_task(task)
    messages = []
    if context:
        messages.append({"role": "system", "content": context})
    messages.append({"role": "user", "content": task})

    response = client.chat.completions.create(
        model=model,
        messages=messages
    )
    return response.choices[0].message.content

实战 Agent:代码审查流水线

这是一个审查 Pull Request (PR) 的实用多模型 Agent:

def review_pr(diff: str) -> dict:
    """多模型 PR 审查流水线。"""

    # 步骤 1:对更改进行分类(廉价模型)
    classification = client.chat.completions.create(
        model="gpt-4.1-mini",
        messages=[{
            "role": "user",
            "content": f"分类这些代码更改:{diff[:2000]}\n"
                       "类别:bugfix, feature, refactor, docs, test"
        }],
        max_tokens=20
    ).choices[0].message.content

    # 步骤 2:安全扫描(推理模型)
    security = client.chat.completions.create(
        model="claude-sonnet-4-6",
        messages=[{
            "role": "system",
            "content": "你是一名安全审查员。检查: "
                       "SQL 注入、XSS、身份验证绕过、代码中的密钥、"
                       "不安全的反序列化。请指明具体的行号。"
        }, {
            "role": "user",
            "content": f"审查此 diff 的安全问题:\n{diff}"
        }]
    ).choices[0].message.content

    # 步骤 3:代码质量(通用模型)
    quality = client.chat.completions.create(
        model="gpt-4.1",
        messages=[{
            "role": "user",
            "content": f"审查代码质量:命名、结构、"
                       f"错误处理、测试覆盖率。\n{diff}"
        }]
    ).choices[0].message.content

    # 步骤 4:总结(廉价模型)
    summary = client.chat.completions.create(
        model="gpt-4.1-mini",
        messages=[{
            "role": "user",
            "content": f"用 3 个要点总结此 PR 审查:\n"
                       f"类型:{classification}\n"
                       f"安全:{security[:500]}\n"
                       f"质量:{quality[:500]}"
        }]
    ).choices[0].message.content

    return {
        "classification": classification,
        "security": security,
        "quality": quality,
        "summary": summary
    }

典型 PR 审查(2K token diff)的成本明细:

步骤 模型 输入 Token 成本
分类 GPT-4.1-mini ~2,100 $0.0008
安全 Claude Sonnet 4.6 ~2,500 $0.0075
质量 GPT-4.1 ~2,500 $0.0050
总结 GPT-4.1-mini ~1,200 $0.0005
总计 ~$0.014

如果所有四个步骤都使用 Claude Sonnet 4.6,成本约为 0.028 美元。多模型方法将成本降低了 50%,同时在最关键的环节(安全审查)使用了最强大的模型。

按能力路由,而非仅按价格

许多团队开始进行多模型路由时遵循一个简单的规则:昂贵的任务交给昂贵的模型,廉价的任务交给廉价的模型。

这是一个很好的初步尝试,但还不够。

更强大的路由策略会考虑四个维度:

  • 推理深度 (reasoning depth)
  • 上下文长度 (context length)
  • 工具调用可靠性 (tool-use reliability)
  • 延迟敏感度 (latency sensitivity)

这会产生更好的规则:

  • 规划和任务分解交给推理能力强的模型
  • 提取和格式化交给廉价、快速的模型
  • 代码审查交给具有最佳 Bug 发现行为的模型
  • 全库分析交给具有最大上下文窗口的模型

这也是为什么 编程模型对比价格对比 应该直接指导你的路由器,而不是仅仅躺在研究文件夹里。

LangChain 集成

from langchain_openai import ChatOpenAI

# 创建具有不同配置的模型实例
fast = ChatOpenAI(
    model="gpt-4.1-mini",
    api_key="sk-lemon-xxx",
    base_url="https://api.lemondata.cc/v1"
)

reasoning = ChatOpenAI(
    model="claude-sonnet-4-6",
    api_key="sk-lemon-xxx",
    base_url="https://api.lemondata.cc/v1"
)

# 在 LangChain 链中使用
from langchain_core.prompts import ChatPromptTemplate

classify_chain = ChatPromptTemplate.from_template(
    "Classify: {input}"
) | fast

analyze_chain = ChatPromptTemplate.from_template(
    "Analyze in depth: {input}"
) | reasoning

何时使用多模型 Agent

多模型路由增加了复杂性。在以下情况下是值得的:

  • 你的 Agent 处理多种任务类型(不仅仅是聊天)
  • 每月 API 成本超过 100 美元(节省变得有意义)
  • 你需要特定的模型优势(Claude 用于代码,Gemini 用于长上下文,GPT 用于速度)
  • 某些步骤对延迟敏感,而其他步骤则不然

对于简单的聊天机器人或单一用途的 Agent,单一模型就足够了。当每个请求都需要相同的能力时,路由的开销并不合理。

临界点通常是以下情况之一:

  • 你在为低价值任务支付高端推理费用
  • 某个供应商的停机现在已成为真正的业务风险
  • 整个工作流中的上下文需求差异巨大
  • 你在一个昂贵的核心阶段周围需要更便宜的审查/提取/总结阶段

如果以上都不符合,单一模型仍然是正确答案。

常见失败模式

多模型系统会以可预测的方式失败:

1. 路由器过于“聪明”

如果路由器的 prompt 变成了一个巨大的分类练习,你在决定做什么上花费了太多。保持路由器廉价且粗放。

2. 输出契约漂移

一个模型返回干净的 JSON,另一个返回带有 JSON 块的散文,导致你的下游解析器崩溃。在每次交接时使用显式的 schema 和验证。

3. 备选方案悄无声息地改变了质量

在供应商压力期间路由到更便宜的模型,如果用户看到完全不同的质量表现,可能会让 Agent 显得不稳定。这就是为什么 限流策略 属于设计内部,而不是事后才考虑的事情。

4. 缺少成本报告

如果你不记录每个步骤的模型选择、成本和延迟,你就无法判断多模型设计是否真的节省了资金。

极简评估循环

你不需要一个巨大的评估平台来负责任地运行多模型 Agent。

从每次运行一个表格或一个数据库表开始记录:

  • 用户任务类别
  • 路由器决策
  • 每步使用的最终模型
  • 每步的延迟
  • 总 token 成本
  • 是否触发了备选方案
  • 用户是否接受了答案

这为你提供了足够的信号来回答关键问题:

  • 路由器是否足够频繁地选择了正确的昂贵模型?
  • 哪一步消耗了大部分预算?
  • 备选方案是在挽救运行还是仅仅在掩盖不稳定性?
  • 廉价路径对于重复性任务是否足够好?

这也是统一网关有所帮助的原因。当模型使用分散在许多供应商中时,很难组建一个可对比的运行账本。当一切都通过一个 API 层时,监控负担就会降低。

保持架构“枯燥”

最好的多模型 Agent 不会让人觉得新奇。它们在操作上让人觉得“枯燥”(稳定且可预测)。

这意味着:

  • 编排层有一个稳定的请求形状
  • 有一个定义路由规则的统一位置
  • 有一个检查成本和延迟的统一位置
  • 每个任务系列有一个备选策略
  • 模型白名单有一个单一事实来源

如果你的 Agent 图看起来很聪明,但你的操作员无法解释为什么一个请求去了这个模型而不是另一个,那么设计还没有完成。

何时不要使用多模型 Agent

在某些情况下,简单的设计显然胜出。

不要仅仅因为模型目录很大就添加路由。

在以下情况下坚持使用单一模型:

  • 产品重复执行一项狭窄的任务
  • 模型之间的质量差异对用户来说无关紧要
  • 你的流量太低,成本优化无关紧要
  • 你的运维层面已经缺乏监控
  • 你还没有足够强大的评估手段来判断路由是起到了帮助还是副作用

一个经过精心选择、具有良好重试机制、prompt 规范和可观测性的单一模型,往往优于一个没人信任的华丽多模型图。

正确的问题不是“我们可以路由吗?”,而是“路由是否为此工作流带来了更好的质量、更低的成本或更安全的失败行为?”

如果答案模糊不清,请保持架构简单,直到工作流本身变得更加多样化。

核心要点

  1. 使用能处理好每个步骤的最廉价模型
  2. 将昂贵的模型留给真正需要它们的任务
  3. 分类/路由步骤应始终使用最廉价的可用模型
  4. 衡量每个 Agent 运行的实际成本,而不仅仅是每 token 价格
  5. 使用单一 key 的 API 聚合器可以显著简化多模型访问

多模型 Agent 本身并不更好。只有当工作流确实包含不同类型的工作时,它们才更好。


通过一个 API 访问所有模型:LemonData 通过单一 API key 提供 300 多个模型。无需管理多个供应商账户,也无需为每对供应商重新开发路由,即可构建多模型 Agent。

分享: