如何在 harness 中构建模型路由器
How to Build a Model Router in the Harness
LangChain 介绍如何在 agent harness 内构建模型路由器,并在开源编码智能体 Open SWE 上验证:相比始终使用顶级前沿模型,每条线程中位成本降低 64%,质量无可测变化。
LangChain 公开了在 harness 内做模型路由的完整方法,含任务分析、分层标准与 A/B 结果,可迁移到自建智能体。
前沿 LLM 依然昂贵。随着智能体变得无处不在并大规模运行,这种成本令人望而却步。幸运的是,大多数智能体并不需要为每项任务都配备前沿级别的智能。模型实验室甚至也这么说:Anthropic 的模型选择指南指出,“对于许多应用而言,从像 Claude Haiku 4.5 这样更快、更具成本效益的模型入手,可能是最优方案。”
超过某个临界点后,收益就会递减:能力更强的模型带来的质量提升微乎其微,而成本和延迟却持续攀升。优秀的智能体具备模型-框架-任务匹配:为特定任务配备合适的模型和恰当的上下文。模型路由器会为每项任务挑选合适的模型。我们认为,路由决策应当属于智能体框架,而非通用网关,因为选择合适的模型需要框架已经组装好的、而网关通常缺乏的领域和任务上下文。
最近在 LangChain,我们切身感受到了这种痛点:每月的编码智能体支出开始迅速攀升。在听到客户也有同样的担忧后,我们着手为Open SWE——我们的开源编码智能体——构建一个高效的模型路由器。与之前始终使用顶级前沿模型的基线相比,它将每个线程的中位成本降低了 64%,且质量没有可测量的变化。本文将介绍我们如何构建该路由器、学到了什么,以及你如何着手将模型路由构建到你的智能体中。
第 1 步:理解任务
我们的试验平台是Open SWE,我们的工程师通过 Slack 和 Web UI 使用它来询问有关代码库的问题并请求代码更改。在构建路由器之前,我们需要了解开发者使用 Open SWE 的任务类型。我们从LangSmith 追踪中提取了线程级数据:传入请求的类型,以及每个线程的成本和轮次(作为复杂度的近似度量)。我们在LangSmith Custom Apps 中进行了探索,直接基于 Open SWE 追踪构建了一个小型界面。
我们选取了一周的交互线程,使用 LLM 分类器按任务类型为每个线程打上标签。LangSmith Insights 也可以为你在追踪中完成这类分组。代码更改占主导地位:新功能(22%)和缺陷修复(17%)是最大的两类,其次是测试或空操作运行(16%)。这些类别是基于每个线程标题和元数据的启发式分类。

我们还研究了智能体追踪特征如何因任务类型而异。我们发现,与功能开发调查相关的线程往往更长,成本和轮次中位数更高。与测试和发布流程相关的线程则相对较短且成本较低。
为了判断“复杂度”,我们同时使用总成本和调用次数作为信号:成本相当直接地反映复杂度,因为更大的任务使用更多 token;而调用次数则更为微妙,因为高次数可能意味着任务更难,或者模型需要多次跟进才能完成任务。

在数据收集时,所有 Open SWE 线程都通过一个顶级前沿模型进行路由。上述数据表明,鉴于复杂度的范围,Open SWE 处理的许多任务可能并不需要前沿智能。
任务复杂度的这种差异给了我们一个值得检验的假设:路由器可以从初始请求中推断出任务的类型和难度,并将其发送给更便宜或更快的模型,而不会降低结果质量。
第 2 步:理解模型
Artificial Analysis Intelligence Index 在一组共同任务上对模型进行评分,并报告每个任务的成本,因此你可以将它们全部绘制在一条智能与成本的曲线上。帕累托前沿是最便宜且最智能的模型集合。

我们沿着曲线选定了三个模型,每个模型在成本、速度和智能之间有不同的平衡:
- 快速:GLM-5.3-Flash(xhigh)
- 均衡:GPT-5.6 Sol(medium)
- 性能:GPT-6 Astra(low)
我们选择了来自不同提供商的模型,而快速层级是一个开放模型。GLM-5.3-Flash 位于帕累托前沿,紧邻闭源模型,这再次表明开放模型已经跨过了一个门槛。LangChain 与模型无关,具有通用的模型接口,在提供商之间工作方式相同,因此当有更好的模型出现时,将其换入只需对路由器做一行修改。
第 3 步:在 harness 中构建路由器
在映射了任务组合并选定了三个层级之后,我们需要通过读取每个传入请求并将其发送到能够成功处理它的最便宜层级,来将任务与模型匹配。在 LangChain 中,这一决策自然适合放在中间件中,它可以在不改变 agent 其他任何内容的情况下替换 agent 调用的模型(参见动态模型选择)。
Open SWE 中的路由器在线程的第一条人类消息上运行。它有三个部分:
- 基础提示词:告诉分类器它的职责:选择最有可能完成任务的最便宜模型。
- 每个层级的标准:对每个层级应承担的工作的简短、通俗的描述。
- 分类器模型:读取请求并根据标准和提示词选择一个层级。
通用基准只是一个起点。每个层级的标准应来自两个来源:你自己的任务分析,以及每个提供商对其模型最擅长之处的说明。我们将第 1 步的任务分解与 GPT-5.6 Sol、GPT-6 Astra 和 GLM-5.3-Flash 的提供商指南相结合,来编写基础提示词和每个层级的标准。
这些标准是为 Open SWE 的任务集编写的,因此路由器与 Open SWE 处理的任务深度耦合。这就是它属于 harness 的原因,因为 harness 已经拥有 agent 的任务特定上下文(其提示词、工具和领域知识),而通用网关缺乏这些。
我们的第一个版本使用了一个带有结构化输出的 LLM,并以用户的请求作为提示。现在,分类器运行在Jev上,这是一个新发布的决策模型,使分类速度几乎快了 50 倍。请参阅使用 Jev 构建 Harness,了解我们是如何做到的。
路由器在每个线程开始时选择一次模型,整个线程都使用该模型。自然的反对意见是:如果线程中途改变主题或复杂度怎么办?虽然这个朴素的路由器设计没有解决这个问题,但我们会在下面的“下一步”部分介绍中途路由。
第 4 步:跟踪任务结果
路由器的价值在于降低成本,但前提是质量不下降。路由器必须做好两件事:所选模型需要能够完成任务,并且它应该是能够完成任务的成本最低、速度最快的模型。这意味着你需要一种跟踪任务结果的方法。有两种方法可以做到这一点:
- 离线评估在固定数据集上运行路由器,因此你可以安全且可重复地比较不同版本。问题在于数据集:它必须看起来像你的真实流量,并根据用户关心的内容进行评分。对于编码智能体来说,这意味着 PR 质量和可审查性,而这些很难离线评分。
- A/B 测试将实时线程在路由器和单一模型基线之间进行拆分,并根据你可以为每个线程衡量的成功指标进行比较。实时流量自然是一个具有代表性的数据集,但缺点是用户可能会被分配到并非最优的路由器。
我们使用两个结果信号进行了 A/B 测试:
- 已合并的 PR:Open SWE 现在会记录它打开的每个 PR 以及该 PR 是被合并还是关闭。每个线程的已合并 PR 成为我们的主要成功指标。
- 用户反馈:我们在 Open SWE 中添加了点赞和点踩功能,因此用户可以评价任何线程,包括那些从未产生 PR 的问题。每个评价都会作为反馈记录在线程的 LangSmith trace 上。
我们在一个LangSmith 自定义应用中跟踪了这两者。已合并 PR 是更强的信号。反馈较为稀疏,因为只有一小部分线程会被评价,但正是在这里我们听到了路由错误,比如下面第一个测试中引用的那些。
实验
我们的第一个 A/B 测试将路由器与始终使用我们最强模型进行了比较:一半线程经过路由器,一半始终使用 GPT-6 Astra,总共涉及 973 个线程。

质量没有可测量的变化。29.2% 的路由线程最终合并了 PR,而对照组为 27.3%(p = 0.49)。PR 打开率也持平(38.9% 对 39.6%,p = 0.82)。
成本大幅下降。路由线程的中位成本为 $0.94,而对照组为 $2.61,降低了 64%。平均值下降了 42%,p90 下降了 37%,因此节省的不仅仅是少数便宜的离群值。
大多数请求不需要最强的模型。在路由线程中,56% 流向 balanced,34% 流向 fast,只有 10% 流向 performance。各层级之间的成本阶梯很陡峭:中位线程在 fast 上花费 $0.097,在 balanced 上花费 $1.50,在 performance 上花费 $2.88,相差 30 倍。

用户反馈也指向了同样的问题。当一个简单的请求在 GPT-6 Astra 上运行时,工程师们直接标记了超支,评论道:“这个查询太贵了”以及“这个请求不应该被路由到性能模型。”
💡 这个结果并不令人意外,因为对照组是我们最昂贵的模型。但这是一个许多智能体都会受益的改变:很多智能体过度追求质量,最终导致超支。尤其是对于任务种类多样的智能体,路由可以降低成本。
我们还将路由器与相反的对照组进行了测试:一半的线程通过路由器,另一半始终使用快速模型。我们在一天之内就结束了这个测试,还没等到它产生具有统计意义的结果。工程师们几乎立刻就标记了仅使用快速模型这一组的问题,而且由于输出质量低,这正在干扰他们的生产力。
下一步
这个模型路由器的实现是一个概念验证,为构建最优路由器奠定了基础。以下是一些我们可以探索改进的方向:
- 在 DeepSWE 或其他编码基准上对路由器进行基准测试,这样我们就可以对照受控基线来评估路由决策,而不是仅仅依赖对生产流量的 A/B 测试。
- 为 子智能体 选择模型。目前子智能体独立于路由器选择自己的模型。对子智能体也进行路由,尤其是在运行时间较长的任务上,可以进一步降低成本。
- 在线程中途重新路由。当新消息与之前的消息差异足够大时,比如一个问题变成了错误修复,更换模型可能会带来收益。代价是提示缓存:切换模型会丢弃它,因此新模型需要以全价重新读取整个线程。对于异步智能体来说,这个代价通常可以忽略不计,因为在人类轮次之间缓存通常无论如何都会过期,尤其是当 TTL 很短时(比如 5 分钟)。
- 用更多信号来完善路由标准,例如从追踪记录中挖掘用户情绪:找出用户感到沮丧的线程,这可能意味着该任务需要更强的模型。
开始使用
如果你要为自己的智能体添加路由,我们会从这里开始:
- 理解任务。你的追踪记录保存着智能体被要求做什么的真实记录,而 LangSmith Insights 可以帮助你从中发现模式,这样你就可以在选择层级之前了解任务组合。
- 理解模型。根据现代基准,沿着成本-智能曲线选择几个模型。LangChain 的模型接口可跨提供商使用,因此你可以随时更换模型,而无需重新设计你的应用程序。
- 在框架中构建路由器。将路由视为上下文工程,类似于经典的特征工程:决定路由器应该看到哪些信息,以便根据你的智能体领域对模型适配度做出最佳决策。
- 跟踪任务结果。在路由之前设置成功度量:评估、在线评估器或对追踪记录的用户反馈。如果构建评估数据集成本太高或太困难,对实时流量进行 A/B 测试也很有效。
随着新模型(包括开放权重模型)不断登陆前沿,适合某项任务的模型也在不断变化。由于 LangChain 与模型无关,要获得这些收益只需更换层级,而无需重建你的智能体。
要为你自己的智能体添加路由,你可以添加我们新发布的 模型路由中间件。给它你的基础提示词、模型层级以及每个层级的标准,它就会在每个线程开始时选择一个模型。我们期待你在 X 或 LangChain GitHub issues 上提供反馈。
延伸阅读
- GitHub 上的 Open SWE
- 使用 Jev 构建 Harness
- 模型路由中间件文档
- LangSmith 可观测性文档
- LangSmith 评估文档
- LangSmith 自定义应用
- 在 LangSmith 中记录用户反馈
- Artificial Analysis 智能指数
致谢
感谢 Mason Daugherty、Kevin Frank 和 Harrison Chase 对本文的深思熟虑的反馈。还要感谢支持这项实验的 OpenSWE 团队!
来源:LangChain Blog · langchain.com