跳到正文
LangChain:Blog·· 2 小时前精选AI 评分69

LangChain 讲解如何在 Agent Harness 中构建模型路由器

How to Build a Model Router in the Harness

AI 导读

LangChain 在其开源编码 Agent Open SWE 中构建模型路由器,在 973 个线程的 A/B 测试中,中位成本从 $2.61 降到 $0.94(降 64%),PR 合并率 29.2% 对 27.3%,质量无可测变化。

推荐理由

作者用自己 Open SWE 的 A/B 数据讲清路由如何省 64% 成本且质量不降,步骤可直接迁移到其他 Agent。

正文 · AI 翻译

前沿 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%)。这些类别是基于每个线程标题和元数据的启发式分类。

A week of Open SWE interactive threads by task type

按任务类型划分的一周 Open SWE 交互线程

我们还研究了智能体追踪特征如何因任务类型而异。我们发现,与功能工作调查相关的线程往往更长,成本和轮次中位数更高。与测试和发布流程相关的线程则相对较短且成本较低。

为了判断“复杂度”,我们同时使用总成本和调用次数作为信号:成本相当直接地反映复杂度,因为更大的任务使用更多 token;而调用次数则更为微妙,因为高次数可能意味着任务更难,或者模型需要后续跟进才能完成任务。

The six largest task categories: thread count, median agent invocations, median LLM cost, and complexity mix

六个最大的任务类别(不包括“其他”),8 月 29 日至 9 月 5 日:线程数、智能体调用次数中位数、LLM 成本中位数(有归属用量的线程)以及复杂度构成

在数据收集时,所有 Open SWE 线程都通过一个顶级前沿模型进行路由。上述数据表明,鉴于复杂程度范围,Open SWE 处理的许多任务可能并不需要前沿智能。

任务复杂度的这种差异给了我们一个值得检验的假设:路由器可以从初始请求中推断任务的类型和难度,并将其发送到更便宜或更快的模型,而不会降低结果质量。

第 2 步:了解模型

Artificial Analysis Intelligence Index 在一组通用任务上对模型进行评分,并报告每项任务的成本,因此你可以将它们全部绘制在一条智能与成本的曲线上。帕累托前沿是那些最便宜且最聪明的模型集合。

Intelligence vs. cost per task, with the Pareto frontier and the three models selected for the router

智能与每项任务成本,附帕累托前沿、我们为路由器选择的三个模型,以及一些其他模型作为参照。图表数据:Artificial Analysis Intelligence Index,截至 2026 年 9 月 9 日。

我们沿着曲线选定了三个模型,每个在成本、速度和智能之间有不同的平衡:

  • 快速: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 倍。看看我们是如何做到这一点的,请参阅Building a Harness with Jev。

路由器在每个线程开始时只选择一次模型,整个线程都使用该模型。自然的反对意见是:如果一个线程在运行中途改变了主题或复杂度怎么办?虽然这个朴素的路由器设计没有解决这个问题,但我们会在下面的“下一步是什么”部分中讨论中途路由。

第 4 步:跟踪任务结果

路由器的价值在于降低成本,但前提是质量不会下降。路由器必须做好两件事:所选的模型需要能够完成任务,并且它应该是能够完成任务的成本最低、速度最快的模型。这意味着你需要一种跟踪任务结果的方法。有两种方法可以做到这一点:

  1. 离线评估在固定数据集上运行路由器,因此你可以安全且可重复地比较不同版本。问题在于数据集:它必须看起来像你的真实流量,并且按照用户关心的标准进行评分。对于编码智能体来说,这意味着 PR 质量和可审查性,而这些很难离线评分。
  2. A/B 测试将实时线程在路由器和单一模型基线之间进行拆分,并在每个线程都能衡量的成功指标上进行比较。实时流量自然是一个具有代表性的数据集,但缺点是用户可能会被置于一个并非最优的路由器之下。

我们使用两个结果信号进行了 A/B 测试:

  • 已合并的 PR:Open SWE 现在会记录它打开的每个 PR 以及该 PR 是被合并还是关闭。每个线程的已合并 PR 成为我们的主要成功指标。
  • 用户反馈:我们在 Open SWE 中添加了点赞和点踩功能,因此用户可以评价任何线程,包括那些从未产生 PR 的问题。每个评价都会作为反馈记录在该线程的 LangSmith trace 上。

我们在一个 LangSmith Custom App 中跟踪了这两者。已合并的 PR 是更强的信号。反馈较为稀疏,因为只有一小部分线程会被评价,但正是在这里我们听到了路由错误,比如下面第一个测试中引用的那些。

实验

我们的第一个 A/B 测试将路由器与始终使用我们最强模型进行了比较:一半的线程通过路由器处理,另一半始终使用 GPT-6 Astra,总共涉及 973 个线程。

Experiment 1 results: router vs. always GPT-6 Astra

质量没有可测量的变化。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 倍。

LLM cost per thread: always GPT-6 Astra vs. routed, and routed threads split by tier

每个线程的 LLM 成本,9 月 16 日至 22 日(对数刻度):始终使用 GPT-6 Astra 对比路由,以及按层级拆分的路由线程。层级小提琴图的宽度随线程数量缩放。白线和标签标记中位数。

用户反馈也指向了同样的问题。当简单请求在 GPT-6 Astra 上运行时,工程师们直接标记了超支,评论如:“这个查询太贵了”和“这个请求不应该被路由到性能模型。”

💡 这个结果并不令人意外,因为对照组是我们最昂贵的模型。但这是一个许多智能体都会受益的改变:很多智能体过度追求质量,最终导致超支。尤其是对于任务多样的智能体,路由可以降低成本。

我们还将路由器与相反的对照组进行了测试:一半的线程通过路由器,另一半始终使用快速模型。我们在一天内就结束了这个测试,还没等到它产生具有统计意义的结果。工程师们几乎立刻标记了仅使用快速模型这一组的问题,而且由于输出质量低,这正在干扰他们的生产力。

下一步是什么

这个模型路由器的实现是一个概念验证,为构建最优路由器奠定了基础。以下是一些我们可以探索改进的领域:

  • 在 DeepSWE 或其他编码基准上对路由器进行基准测试,这样我们就可以根据受控基线来评估路由决策,而不是仅仅依赖生产流量上的 A/B 测试。
  • 为 子智能体 选择模型。 目前子智能体独立于路由器选择自己的模型。对子智能体也进行路由,尤其是在运行时间较长的任务上,可以进一步降低成本。
  • 在线程中途重新路由。 当新消息与早先的消息差异足够大时,比如一个问题变成了错误修复,更换模型可能会带来收益。代价是提示缓存:切换模型会丢弃它,因此新模型会以全价重新读取线程。对于异步智能体,这个成本通常可以忽略不计,因为在人类回合之间,当 TTL 较短(如 5 分钟)时,缓存往往无论如何都会过期。
  • 用更多信号来完善路由标准,例如在追踪中挖掘用户情绪:找出用户感到沮丧的线程,这可能意味着任务需要更强的模型。

开始使用

如果你要为自己的智能体添加路由,我们会从这里开始:

  1. 理解任务。 你的追踪记录了智能体被要求做什么的真实记录,而 LangSmith Insights 可以帮助你从中发现模式,这样你就可以在选择层级之前看到任务组合。
  2. 理解模型。 根据现代基准,沿着成本-智能曲线选择几个模型。LangChain 的模型接口可跨提供商使用,因此你可以随时更换模型,而无需重新设计你的应用程序。
  3. 在框架中构建路由器。 将路由视为上下文工程,类似于经典的特征工程:决定路由器应该看到哪些信息,以便根据你的智能体领域对模型适配做出最佳决策。
  4. 跟踪任务结果。 在路由之前设置成功度量:评估、在线评估器或追踪上的用户反馈。如果构建评估数据集成本太高或太困难,对实时流量进行 A/B 测试效果也很好。

随着新模型(包括开放权重模型)不断登陆前沿,适合某项任务的模型也在不断变化。由于 LangChain 与模型无关,要获得这些收益只需更换层级,而无需重建你的智能体。

要为你自己的智能体添加路由,你可以添加我们新发布的 模型路由中间件。给它你的基础提示词、模型层级以及每个层级的标准,它就会在每个线程开始时选择一个模型。我们很期待你在 X 或 LangChain GitHub issues 上提供反馈。

延伸阅读

致谢

感谢 Mason Daugherty、Kevin Frank 和 Harrison Chase 对本文提出的深思熟虑的反馈。还要感谢支持这项实验的 OpenSWE 团队!

来源:LangChain:Blog · langchain.com