在 harness 里造一个 Model Router:同样的代码任务,成本中位数降 64%
在 harness 里造一个 Model Router:同样的代码任务,成本中位数降 64%
译者按:本文翻译自 LangChain 官方博客 How to Build a Model Router in the Harness(作者 S. Runkle、E. Yurtsev,2026 年 10 月 1 日发布)。为符合中文技术阅读习惯,harness、router、middleware、trace、thread、tier 等术语保留英文原文。原文结尾的 Further reading 与 Acknowledgements 部分未能抓取,此处以正文为主。
核心要点
- 很多任务并不需要前沿模型的智力。 在我们的实验里,模型路由把每个编程任务的中位成本比基线降低了 64%,而质量没有可察觉的变化。
- 一个有效的 model router 属于 harness,而不是通用网关。 选对模型需要领域和任务上下文,这些上下文 harness 本来就已经备好,而网关通常没有。
- 有效的 router 设计植根于可观测性和 evals。 它需要你理解 agent 的任务空间、做过模型表现调研,并有清晰的成败标准。
前沿 LLM 依旧昂贵。当 agent 变得无处不在、规模化运行时,这个成本高到难以承受。好在,大多数 agent 并不需要每个任务都用前沿级智力。模型厂商自己也是这么说的:Anthropic 的选型指南指出,"对很多应用来说,从 Claude Haiku 4.5 这样更快、更具性价比的模型起步,可能才是最优解。"
过了某个临界点,收益就开始递减了:更强的模型带来的质量提升很小,成本和延迟却持续攀升。一个好的 agent 具备model-harness-task 的匹配——为特定任务配上正确的模型和正确的上下文。model router 就是为每个任务挑出那个模型的组件。我们认为,路由决策属于 agent harness,而不是通用网关,因为选对模型所需的领域和任务上下文,正是 harness 已经组织好、而网关通常不具备的东西。
我们最近在 LangChain 真切感受到了这个痛点:每月的编程 agent 开销开始快速上升。在听到客户也有同样的困扰后,我们着手为 Open SWE——我们的开源编程 agent——打造一个有效的 model router。相比之前一直使用顶级前沿模型的基线,它把每个线程的中位成本降低了 64%,质量没有可测量的变化。本文讲我们是怎么造这个 router 的、学到了什么,以及你可以怎么把模型路由做进自己的 agent。
Step 1:理解任务
我们的试验田是 Open SWE,我们的工程师从 Slack 和一个 web UI 使用它,用来提问代码库相关问题、请求代码变更。在造 router 之前,我们需要先弄清楚开发者都在用 Open SWE 做什么类型的任务。我们从 LangSmith trace 里拉取线程级数据:进来的请求类型,以及每个线程的成本和轮次数(作为复杂度的近似衡量)。这个探索是在 LangSmith Custom Apps里做的,直接在 Open SWE trace 之上搭了一个小界面。
我们取了一周的交互线程,用 LLM 分类器给每一个打上任务类型标签。LangSmith Insights也能替你在 trace 上做这类分组。代码变更占了主导:新功能(22%)和 bug 修复(17%)是最大的两类,其次是测试或空跑(16%)。这些类别是基于每个线程标题和元数据的启发式判断。
我们还考察了 agent trace 特征如何因任务类型而异。我们发现,与功能开发调研相关的线程往往更长,成本和轮次数中位数也更高;与测试、发布流程相关的线程则相对短且便宜。
为了判断"复杂度",我们同时用总成本和调用次数作为信号:成本比较直接地反映复杂度,因为更大的任务用更多 token;调用次数则更微妙,高次数可能意味着任务更难,也可能意味着模型需要多次追问才完成。
采集数据时,所有 Open SWE 线程都路由到同一个顶级前沿模型。上面的数据表明,鉴于任务复杂度的分布,Open SWE 处理的很多任务可能并不需要前沿级智力。
任务复杂度的这种差异给了我们一个值得验证的假设:router 可以从初始请求推断出任务的类型和难度,把它发给更便宜或更快的模型,而不损害结果。
Step 2:理解模型
Artificial Analysis Intelligence Index用一组公共任务给模型打分,并报告每个任务的成本,于是你可以把所有模型画到同一条"智力 vs 成本"曲线上。Pareto 前沿就是那一组又便宜又聪明的模型。
我们在曲线上选了三个模型,各自在成本、速度、智力上有不同的平衡:
- Fast: GLM-5.3-Flash (xhigh)
- Balanced: GPT-5.6 Sol (medium)
- Performance: GPT-6 Astra (low)
我们选了来自不同厂商的模型,其中 fast 档是一个开源模型。GLM-5.3-Flash 就坐在 Pareto 前沿上、紧挨着闭源模型,这又一次说明开源模型已经跨过了一个门槛。LangChain 是与模型无关的,它有一套通用的模型接口,在各厂商之间表现一致,所以当更好的模型出现时,换进 router 只是改一行的事。
Step 3:在 harness 里造 router
任务组合已经摸清、三档也选好了,接下来就要把任务和模型配上:读取每一个进来的请求,把它发给能够成功处理它的最便宜那一档。在 LangChain 里,这个决策天然落在 middleware里,middleware 可以替换 agent 调用的模型,而不改动 agent 的其他任何地方(见 dynamic model selection)。
Open SWE 里的 router在线程的第一条人类消息上运行。它由三部分组成:
- 一段 base prompt: 告诉分类器它的职责:挑出最可能完成任务、又最便宜的那个模型。
- 每一档的判定标准: 用简短的自然语言描述每一档应该承接的工作。
- 一个分类器模型: 读取请求,按标准和 prompt 挑出一档。
通用 benchmark 只是一个起点。每一档的标准要从两个来源写:你自己的任务分析,以及各家厂商对其模型擅长什么的说明。我们把 Step 1 的任务拆解,与 GPT-5.6 Sol、GPT-6 Astra、GLM-5.3-Flash的厂商指南结合起来,写成了 base prompt 和每一档的标准。
这些标准是为 Open SWE 的任务集写的,所以 router 与 Open SWE 处理的任务深度耦合。这正是它属于 harness 的原因: harness 已经拥有 agent 的任务专属上下文(它的 prompt、tools 和领域知识),而通用网关没有。
我们的第一版用一个 LLM 做结构化输出,把用户请求喂进去。现在分类器跑在 Jev上——一个刚发布的决策模型,让分类快了将近 50 倍。具体做法见《Building a Harness with Jev》。
router 在每个线程开头挑一次模型,整个线程都用这个模型。自然而然会有人反驳:如果一个线程中途换话题或变复杂度了呢?这个朴素 router 设计没有处理这种情况,我们会在下面的"下一步"里谈中途路由。
Step 4:追踪任务结果
router 的价值在于降本,但前提是质量不退化。router 必须做对两件事:选中的模型得能完成任务,而且它应该是能完成任务的模型里最便宜、最快的那个。这意味着你需要一套追踪任务结果的机制。有两种做法:
离线 evals让 router 在一份固定数据集上跑,于是你能安全、可复现地比较不同版本。难点在数据集:它必须长得像你的真实流量,并且按照用户关心的标准打分。对一个编程 agent 来说,这意味着 PR 的质量和可审查性,而这些在离线很难打分。
A/B 测试把线上线程分给 router 和单模型基线,用一个你能对每个线程测得的成败指标来对比。线上流量天然就是有代表性的数据集,但代价是用户要承受一个可能并非最优的 router。
我们跑了 A/B 测试,用了两个结果信号:
- 合并的 PR: Open SWE 现在会记录它开的每一个 PR 以及它是被合并还是关闭。每个线程合并的 PR 数成了我们的主要成败指标。
- 用户反馈: 我们给 Open SWE 加了点赞和点踩,用户可以给任何线程评分,包括那些最终没产出 PR 的提问。每条评分都会作为反馈记录到这个线程的 LangSmith trace 上。
我们把两者都追踪在一个 LangSmith Custom App里。合并的 PR 是更强的信号。反馈比较稀疏,因为只有一小部分线程会被评分,但正是在这里我们听到了路由失误,比如下面第一个测试里引用的那些。
实验
我们的第一次 A/B 测试把 router 和"一直用最强模型"作对比:一半线程走 router,一半一直用 GPT-6 Astra,总共 973 个线程。
质量没有可测量的变化。 走 router 的线程里 29.2% 以合并的 PR 收尾,对照组是 27.3%(p = 0.49)。PR 开启率也基本持平(38.9% vs 39.6%,p = 0.82)。
成本降了很多。 router 线程的中位成本是 $0.94,对照组是 $2.61,低了 64%。均值降了 42%,p90 降了 37%,所以省下来的不只是几个便宜的离群点。
大多数请求并不需要最强模型。 走 router 的线程里,56% 去了 balanced,34% 去了 fast,只有 10% 去了 performance。各档之间的成本阶梯很陡:中位线程成本在 fast 上是 $0.097,balanced 上 $1.50,performance 上 $2.88,差了 30 倍。
用户反馈指向同一个方向。当一个简单请求跑在 GPT-6 Astra 上时,工程师直接留言点出浪费,比如:"这个查询也太贵了""这个请求根本不该被路由到 performance 模型。"
💡 考虑到对照组是我们最贵的模型,这个结果并不让人意外。但它是很多 agent 都能受益的改变:不少 agent 过度偏重质量,最后花冤枉钱。尤其是任务种类多样的 agent,路由能把成本压下来。
我们还测了 router 和相反的对照组:一半线程走 router,一半一直用 fast 模型。这个测试我们不到一天就终止了,还没来得及产出统计上有意义的结果。工程师几乎立刻就在 fast-only 那一组上报了问题,低下的输出质量正在拖累他们的效率。
下一步
这个 model router 的实现是一个概念验证,是构建最优 router 的地基。以下是几个我们可以探索改进的方向:
- 在 DeepSWE 或其他编程 benchmark 上给 router 做基准测试,这样我们就能评估路由决策与受控基线的对比,而不是只靠线上流量的 A/B 测试。
- 为 subagents 做模型选择。 目前 subagent 独立于 router 自己挑模型。给 subagent 也做路由,尤其是在长跑任务上,能进一步降本。
- 线程中途重新路由。 当一条新消息与前面的差异足够大时,比如一个提问变成了 bug 修复,换模型可能划算。代价是 prompt cache:换模型会把它丢掉,新模型要以全价重新读一遍线程。对异步 agent 来说这个代价往往可以忽略,因为当 TTL 很短(比如 5 分钟)时,缓存本来就在人类回合之间过期了。
- 用更多信号细化路由标准,比如从 trace 里挖掘用户情绪:找出用户感到沮丧的线程,这可能意味着该任务需要更强的模型。
上手
如果你要在自己的 agent 里加路由,我们会从这几步开始:
- 理解任务。 你的 trace记录了 agent 被要求做的事的真实档案,LangSmith Insights帮你从中找出模式,这样你在挑档位之前就能看清任务组合。
- 理解模型。 沿着成本-智力曲线挑几个模型,参考现代 benchmark。LangChain 的模型接口跨厂商通用,所以你随时能换模型,不用重写应用。
- 在 harness 里造 router。 把路由当作 context engineering,类似于经典的 feature engineering:决定 router 应该看到哪些信息,才能在给定 agent 领域的前提下,对模型匹配做出最好的决策。
- 追踪任务结果。 在路由之前就把成败度量放到位:evals、online evaluators,或在 trace 上收集用户反馈。如果建 eval 数据集太贵或太难,线上流量的 A/B 测试也是个好办法。
一个任务最合适的模型一直在变,因为新模型(包括开放权重模型)不断落在前沿上。因为 LangChain 与模型无关,接住这些收益意味着换一个档位,而不是重建你的 agent。
要给你自己的 agent 加路由,可以接入我们新发布的 model routing middleware:把你的 base prompt、模型档位和每一档的判定标准交给它即可。
参考文档与链接
- How to Build a Model Router in the Harness(原文) — LangChain 官方博客,S. Runkle、E. Yurtsev,2026-10-01
- langchain-ai/open-swe — 本文试验田,开源编程 agent
- Open SWE model_selection.py — 文中 router 的实现源码
- model routing middleware — 新发布的即用型路由 middleware
- How to build a custom agent harness — model-harness-task fit 的背景
- Building a Harness with Jev — 用 Jev 决策模型做分类器,快近 50 倍
- Open models have crossed a threshold — 开源模型进入 Pareto 前沿的判断
- LangChain 模型接口文档 — dynamic model selection 与跨厂商模型切换
- Anthropic:Choosing a model — 不必每个任务都上前沿模型的厂商建议
- Artificial Analysis Intelligence Index — 智力 vs 每任务成本曲线数据源
- LangSmith Insights — 对 trace 做分组与模式挖掘
- LangSmith Custom Apps — 本文的探索与追踪界面
你的 agent 是每个任务都上最强模型吗?会考虑加一层路由吗?评论区聊聊你的判断。觉得有用的话,点个赞让更多人看到。
作者: itech001
来源: 公众号:AI人工智能时代(the-ai-era)
网站: https://www.theaiera.top/
关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top
本文首发于 AI人工智能时代,转载请注明出处。