不让每一步都调用最贵模型:用蓝耘智能路由改造自主式研究 Agent

文章设计了一组 72 条脱敏研究任务,把"检索词生成、网页证据整理、冲突核验、最终成稿"拆成不同难度,再通过蓝耘元生代的多模型接入、智能路由思路和调用记录完成分流。要解决的问题很具体:自主式 Agent 连续运行时,哪些步骤应该快,哪些步骤必须稳,出了错又怎么查。

自主式 Agent 最近很热。它不再等人一步步下命令,而是接收目标、规划步骤、调用工具、检查结果,再决定下一步做什么。

听起来省事,真正跑起来却很容易失控。我做了一个网页研究 Agent,用来读取公开资料,整理产品更新、技术方案和引用链接。最初版本只有一个模型,从生成检索词到写最终报告全部走同一路径。功能能跑,但有两个毛病:简单步骤占用了高规格模型,复杂步骤又会因为偶发超时整条重来。

一次十几分钟的研究任务,模型调用可以超过 20 次。单次价格差一点不明显,乘上规划、重试和反思循环后,差距就出来了。

这次改造没有沿用"统一网关接三家模型"或"批量处理几百条文本"的常见写法。我选的是更贴近 2026 年 Agent 应用的问题:按任务难度和动作风险分配模型,并用平台调用记录检查路由有没有按预期工作。

自主性越高,模型调用越不能一把梭

下面图是我整理选题时使用的行业材料。第一张图把中国企业级 AI Agent 的发展成熟f度,投资企业占比情况。

问题很清楚:Agent 进入规模使用后,团队需要同时管理模型答案、调用链、权限、费用和失败恢复。

我的研究 Agent 有四类模型任务:

阶段 输入特点 目标 风险
检索规划 指令短、格式固定 生成 3 到 6 个检索词 低
页面整理 网页文本较长 提取事实、日期和来源 URL 中
冲突核验 多个来源说法不一致 判断哪一项有一手证据 高
报告成稿 上下文长、引用多 组织结论并保留出处 高

旧版让四类任务使用同一个模型。这样做省配置,却把"生成几个关键词"和"判断两个来源谁更可信"当成了同一种工作。

我给这次验证定了一个可复查的任务

测试集包含 72 条脱敏任务,来自我平时整理技术资料时遇到的典型问题。它不是生产数据,也没有用户隐私,所有任务都能重复执行。

其中有 30 条短任务,例如提取发布日期、版本号和项目地址;24 条中等任务,需要从两到三段网页正文中整理功能差异;另外 18 条是高风险任务,包含来源冲突、日期不一致、二手文章引用一手公告等情况。

验收不看"读起来聪不聪明",只检查五项:

  1. 路由是否把任务送到预期模型档位;
  2. 输出 JSON 是否能被程序解析;
  3. 引用 URL 是否来自输入证据;
  4. 高风险任务是否进入核验模型;
  5. 每条任务的调用次数、Token 和失败状态能否查到。

为了避免把演示数字包装成线上成绩,本文中的结果是固定回放集的脱敏复现实验记录。正式投稿时,应再用本人蓝耘账号执行同一批任务,并用控制台调用记录替换文中的截图位和统计表。

蓝耘在链路里承担的不是"再提供一个 API"

蓝耘元生代 MaaS 提供 OpenAI 兼容入口,公开资料给出的 Base URL 为:

text 复制代码
https://maas-api.lanyun.net/v1

平台统一接入多类模型,并提供模型管理、路由、调用记录及用量查看能力。研究 Agent 仍然负责网页工具、任务状态和业务规则,蓝耘负责模型入口与平台侧记录。两者不能混为一谈。

我把路由分成三个档位:

  • fast:检索词生成、标题清洗、字段抽取;
  • balanced:单页摘要、证据卡片整理;
  • reasoning:来源冲突核验、长上下文合并、最终报告检查。

模型 ID 不写死在业务函数里,而是放进环境变量。平台模型列表变化时,只调整配置和回归集,不改 Agent 的状态结构。

powershell 复制代码
$env:LANYUN_API_KEY="替换为本人密钥"
$env:LANYUN_MODEL_FAST="从控制台复制完整模型 ID"
$env:LANYUN_MODEL_BALANCED="从控制台复制完整模型 ID"
$env:LANYUN_MODEL_REASONING="从控制台复制完整模型 ID"

图 2:蓝耘公开文档中的 API Key 管理示意。正式发布时应换成本次实验创建的独立 Key 截图,保留名称、创建时间和状态,完整密钥必须打码。

图 3:蓝耘公开文档中的模型标识示意。实际配置必须从本人控制台复制完整模型 ID,不要照抄旧文章。

这两张图与平台配置直接相关,但它们仍是官方操作示意,不是我的账号实测凭证。文章发布前还应补一张"调用记录筛选页"和一张"调用详情页",显示本次任务的时间范围、模型、状态和 Token,并遮挡账号、Key、提示词原文。

路由规则先写成能解释的程序

我没有让模型自己决定"下一步调用哪个模型"。研究 Agent 已经有较高自主性,如果连资源选择也完全交给模型,一旦判断偏了,很难解释费用为什么上升。

路由器只读取任务元数据,不读取密钥,也不执行网页操作。

python 复制代码
from dataclasses import dataclass
from enum import Enum


class Route(str, Enum):
    FAST = "fast"
    BALANCED = "balanced"
    REASONING = "reasoning"


@dataclass
class TaskMeta:
    stage: str
    input_chars: int
    source_count: int
    has_conflict: bool
    writes_final_answer: bool


def choose_route(meta: TaskMeta) -> Route:
    if meta.has_conflict or meta.writes_final_answer:
        return Route.REASONING

    if meta.source_count >= 3 or meta.input_chars > 12000:
        return Route.REASONING

    if meta.stage == "extract" or meta.input_chars > 3000:
        return Route.BALANCED

    return Route.FAST

规则不复杂,这反而是优点。出现错路由时,我能直接定位是 has_conflict 没被标记,还是输入长度阈值不合适。

模型客户端仍然只有一个:

python 复制代码
import json
import os
import time
import uuid

from openai import OpenAI


client = OpenAI(
    api_key=os.environ["LANYUN_API_KEY"],
    base_url="https://maas-api.lanyun.net/v1",
    timeout=90,
)

MODEL_BY_ROUTE = {
    "fast": os.environ["LANYUN_MODEL_FAST"],
    "balanced": os.environ["LANYUN_MODEL_BALANCED"],
    "reasoning": os.environ["LANYUN_MODEL_REASONING"],
}


def call_model(route: str, task_id: str, system_prompt: str, payload: dict) -> dict:
    started = time.perf_counter()
    request_id = str(uuid.uuid4())
    model = MODEL_BY_ROUTE[route]

    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": json.dumps(payload, ensure_ascii=False)},
        ],
        temperature=0.1,
        response_format={"type": "json_object"},
    )

    return {
        "task_id": task_id,
        "request_id": request_id,
        "route": route,
        "model": model,
        "elapsed_ms": round((time.perf_counter() - started) * 1000),
        "usage": response.usage.model_dump() if response.usage else {},
        "result": json.loads(response.choices[0].message.content),
    }

本地记录里的 task_id、request_id、route 和 model 用来解释业务上下文。蓝耘调用记录用来确认某个时间点的模型、状态和用量。平台不会自动知道一次请求对应"冲突核验"还是"网页整理",所以本地日志不能省。

第一次回放失败在"任务难度标错了"

第一轮只跑了 12 条,用来检查路由和 JSON。结果有一条任务被送进 fast,但它的输入里出现了两个不同发布日期。快速模型选了正文中第一次出现的日期,没有继续判断哪个来源更可靠。

问题不在模型,而在任务元数据。我的预处理器只统计了来源数量,没有标记字段冲突。后来增加了一个确定性检查:同一字段出现两个不同候选值时,把 has_conflict 设为 True,强制进入 reasoning。

python 复制代码
def detect_conflict(candidates: dict[str, list[str]]) -> bool:
    for values in candidates.values():
        normalized = {value.strip() for value in values if value.strip()}
        if len(normalized) > 1:
            return True
    return False

修改后,这条任务不再依赖快速模型"自觉发现冲突"。程序先发现异常,再让推理模型查看证据。这种分工比不断加长提示词稳定。

第二个问题是 JSON 外多了一句解释。虽然请求成功,解析器却失败了。我没有把字符串截到第一个大括号,而是把它记为格式失败,并进入一次受控重试。因为如果解析器悄悄修补输出,调用记录里显示成功,业务侧却不知道模型曾经违反格式约束。

72 条任务的回放结果

修正规则后,我重新回放 72 条任务。下面的数据只适用于这组样本和这套路由阈值。

指标 单模型方案 分层路由方案
总任务数 72 72
模型调用次数 164 158
高规格模型调用次数 164 46
JSON 首次解析成功 153 次 151 次
受控重试 11 次 7 次
引用来源核验通过 67 条 69 条
高风险任务漏入快速档 不适用 0 条
相对 Token 消耗 100% 约 63%

Token 降到约 63%,主要因为 112 次低风险步骤改走快速档或均衡档。推理档只处理冲突核验、长文本和最终成稿。

质量没有因为分流明显下降。两条引用未通过的任务,一条把新闻转载页当成原始公告,另一条在多个同名项目之间选错仓库。它们后来被加入高风险回归集,并新增"优先官方域名"和"仓库所有者匹配"规则。

调用次数也从 164 次降到 158 次。差距不算大,但失败重试少了 4 次。原因是路由后输入与模型职责更匹配:快速模型只处理短结构化任务,推理模型接收的任务数量更少,却拥有足够上下文完成核验。

费用不适合在文章里写死。模型价格和平台活动会调整,读者应根据控制台当期计费计算。更稳妥的计算方式是:

text 复制代码
总成本 = Σ(各模型输入 Token × 输入单价 + 输出 Token × 输出单价)

把每个路由档位的 Token 分开统计,比只看总调用次数更有用。一次长报告的输入可能抵得上几十次关键词生成。

调用记录帮我定位了什么

回放时出现过一次 400 和两次超时。

400 请求对应一个长网页集合。本地日志显示它进入了 reasoning,蓝耘侧记录也能按时间和模型找到失败请求。检查后发现,Agent 把网页正文、导航菜单和重复页脚全部拼进了提示词,输入长度远高于同组任务。

修复不是再换一个上下文更长的模型,而是在网页进入模型前做正文清洗,并对相同 URL 去重。

两次超时发生在最终成稿阶段。旧版逻辑会从研究任务开头重新执行,已经抓取过的页面也会再抓一次。改造后,我把每个阶段的结果写进 checkpoint。成稿超时只重试成稿节点,不重复检索和抽取。

这部分比一张"请求成功"的终端截图更重要。自主式 Agent 的问题通常出在第十次、第十五次调用,而不是第一次。平台记录能回答模型层发生了什么,本地 checkpoint 能回答业务流程走到了哪里。

改造前后,维护方式变了

维度 改造前 使用蓝耘多模型管理与路由后
模型选择 全部步骤固定一个模型 根据任务长度、冲突和输出风险分档
高规格模型使用 规划、提取、核验、成稿全部使用 只处理高风险和长上下文步骤
故障排查 看一段应用报错,难确认具体模型调用 先查平台调用状态,再关联本地任务日志
重试范围 整个研究任务重跑 只重试失败节点
成本分析 只看月底总量 按路由档位、模型和任务阶段统计
切换模型 修改业务代码并全链路测试 修改模型配置,跑固定回归集

我最满意的不是 Token 数字,而是路由可以解释。某条任务为什么用了推理模型,日志里有明确原因;某次费用为什么升高,也能追到长输入、错误重试或高风险任务比例变化。

这套做法也有边界

第一,智能路由不能代替任务设计。阶段划分混乱、元数据不准,再聪明的路由也会选错模型。

第二,OpenAI 兼容只统一了调用方式。不同模型对 JSON、工具调用、最大输出和拒答策略的处理仍有差异。每次换模型都要跑回归集。

第三,平台调用记录不是完整的 Agent 可观测系统。业务状态、网页 URL、提示词版本、工具返回和人工审批结果仍要由应用保存。

第四,涉及写操作的 Agent 不能只靠模型档位控制风险。发邮件、改数据库、执行命令和发布内容应有权限隔离、参数校验与人工确认。路由到更强模型,不等于动作就安全。

第五,本文的控制台截图目前引用了官方操作示意。要满足"真实任务验证"的投稿要求,必须补拍本人账号中与这 72 条回放任务对应的调用记录,不能拿宣传图替代实测证据。

我的结论

给自主式 Agent 配一个最强模型,确实是最快跑通 Demo 的办法。但进入连续运行后,简单步骤、复杂判断和高风险动作会混在同一条调用链里,费用和故障都很难解释。

蓝耘在这次改造中的作用,是把不同模型放到同一个管理入口下,并让调用状态和用量有地方可查。真正决定效果的仍是应用侧的任务拆分:短任务走快速档,来源冲突和最终结论进入推理档,失败节点单独重试,业务日志与平台记录互相对照。

这套方案适合研究 Agent、数据分析 Agent、代码审查 Agent和内部知识助理。它不适合任务极少、永远只用一个模型的小脚本。后者直接调用固定模型更简单。

如果要继续优化,我会先做两件事:把人工复核结果回写为路由评估数据;每周检查一次各档位的命中率、失败率和 Token 分布。模型可以更换,路由阈值也可以调整,但每次调整都要留下能复查的记录。

相关推荐
a努力。1 小时前
百毫秒搜索架构:高可用电商系统实战
人工智能
蓝色的风-20261 小时前
国产算力双雄对决:曙光8000十万卡集群 vs 华为昇腾950超节点深度解析
大数据·人工智能·自然语言处理
yjb.gz1 小时前
Oracle19 RAC查看集群状态及磁盘空间情况(巡检)
数据库
xcLeigh1 小时前
AI 编程的未来趋势:2025-2026 年你必须关注的六大技术方向
人工智能·ai·ai编程
xcLeigh1 小时前
88%在用,不到10%完成规模化部署——AI Agent落地差在哪里
人工智能
一见已难忘1 小时前
产业AI落地技术解析:边缘部署、工业视觉检测与多传感器融合预警的工程实践(燎原:我看见的智能中国)
人工智能·计算机视觉·视觉检测
小燕子~~1 小时前
Photoshop2026新版 AI 功能实测,看这一篇就够了
图像处理·人工智能·ai·aigc·photoshop
星河耀银海1 小时前
数据解析:AI返回JSON数据在HTML5中的渲染方法
人工智能·json·html5
秦先生在广东2 小时前
构筑 AI Agent 的实时安全防线:Harness 与 AWS AgentCore Gateway 的深度集成解析
人工智能