欢迎光临
我们一直在努力

把“模型路由”重新诊断为信息问题——ACRouter 与 CodeRouterBench

核心结论速览

  • 作者用一个"只改路由器能看到什么信息、不动其架构"的消融,证明了 LLM 路由器的真正瓶颈是信息缺失而非推理能力:把"各模型在各维度的实测分数"这种数字喂进零样本路由器,AvgPerf 从 41.41 直接跳到 47.74(相对 +15.3%),且超过了编码了同样维度先验的启发式基线 DimensionBest(47.50)。
  • 据此把路由形式化为 Context → Action → Feedback(C-A-F)循环,对应到上下文老虎机,并把评测指标从"单次准确率"换成累积遗憾(cumulative regret);C-A-F 同时充当一个能把所有现存路由方法归位的统一分类框架。
  • 落地系统 ACRouter(Orchestrator + Verifier + Memory 三件套)在自建的 CodeRouterBench(约 1.01 万任务、10 维度)上,ID 测试拿到路由器最高 AvgPerf(49.98%)、最低累积遗憾;在 agentic 编程的 OOD 测试上(62.50%)显著超过所有静态学习器(普遍低于随机)、在线老虎机与"永远选 Opus"。

  • 一、研究背景与动机

    故事要从一个很具体的用户处境讲起。今天一个稍微重度的开发者,手里同时握着 Claude、GPT、还有本地跑的若干开源模型;而在代码这件事上,没有任何一个模型在所有维度上碾压其余所有模型。论文把这个落差讲成一个"立场分歧":

    • 现有的 coding agent(Claude Code、Codex 之类)都是 provider-centric(厂商中心)——固定一个自家模型打天下。对厂商而言这是最优解:用自家模型、成本可预测、闭源可控。
    • 但用户要的是 user-centric(用户中心)——我不在乎是谁家的模型,我只关心这道题用哪个模型质量最高、最划算。

    这两种立场的冲突,把问题逼到了一个朴素的形式:一道任务进来,到底该路由给哪个模型? 这不是新问题(RouterBench、LLMRouterBench 等一系列工作都在做),但本文的切入点不一样——它没有去卷"怎么训一个更强的路由器",而是先停下来问:路由器到底卡在哪?是脑子不够,还是信息不够?

    支撑动机的,是作者对 8 个前沿代码模型的实测(Opus 4.6、Sonnet 4.6、GPT-5.4、Qwen3-Max、Qwen3.5-Plus、GLM-5、Kimi-K2.5、MiniMax-M2.7)。结论有两条硬数据:

    • 能力互补是真实存在的。 Opus 平均分最高(42.9%),但算法设计被 GLM-5 反超(47.2% vs 25.4%,相对 +86%)、测试生成被 Qwen3-Max 反超(82.7% vs 39.2%,+111%)、数据科学被 Kimi-K2.5 反超。9 个维度里有 5 个不同模型当过"维度冠军"。
    • 强模型普遍更贵。 Opus 的总花费约为 Kimi 的 12 倍。

    互补 + 价差,意味着"既提质又省钱"在原理上成立——这就是整篇论文的立论地基。


    二、相关工作与定位

    把前人路线放进一个坐标系,本文的位置就清楚了。作者后文用 C-A-F 框架(见第四节)顺手做了一张"现存方法归位表",这里先按思想谱系梳理:

    路线代表信息状态核心局限
    单模型 任一固定后端 放弃了一切互补性
    静态启发式 DimensionBest、kNN 冻结的先验 决策时不产生新信息,跨任务不累积
    静态训练策略 LogReg、RouteLLM、微调 Qwen 训练时一次性写死 训练分布外(OOD)即崩
    在线老虎机 LinUCB、LinTS 流式更新的参数化记忆 每臂线性模型,缺乏 context-aware 推理
    本文(ACRouter) C-A-F 三件套 执行落地反馈 + 跨任务累积的细粒度记忆 (见第九节)

    本文相对于这些工作的"补缺"在于一句诊断:上述方法要么不在决策时产生新信息(前三类),要么产生的信息被线性模型的表达力卡死(在线老虎机)。RouterBench / LLMRouterBench 这类工作把基准建在"单次准确率"上,无法刻画"信息随任务流累积"的过程;本文则主张评测必须是流式的、按累积遗憾计的,并为此自建了带"每题 × 每模型"结果矩阵的 CodeRouterBench。

    一句话定位:别人在优化路由器,本文在重新定义路由问题——从"选模型的一次性分类"变成"在任务流上不断产生并累积信息的序贯决策"。


    三、研究问题与核心贡献

    形式化问题定义

    给定一条任务流 {pi}i=1N\\{p_i\\}_{i=1}^N{pi}i=1Npip_ipi 为第 iii 道编程任务的 prompt)与一个候选模型池 M={m1,…,mK}\\mathcal{M}=\\{m_1,\\dots,m_K\\}M={m1,,mK}(本文 K=8K=8K=8)。路由策略 π\\piπ 在每一步观测上下文 cic_ici 后选择一个动作(模型)ai∈Ma_i\\in\\mathcal{M}aiM,执行后获得反馈 fif_ifi。目标不是最大化单次准确率,而是最小化相对于逐题最优 oracle 的累积遗憾(定义见第五节)。

    逐条贡献与新颖性分级

  • 【思想创新 ★★★】把路由瓶颈从"推理"重新诊断为"信息"。 这是全文的命门,由 Table 1 的"纯信息消融"支撑(第七节详述)。它把"该不该做路由"和"路由该怎么做"两个问题都重新接地了。
  • 【框架创新 ★★☆】C-A-F 循环 + 上下文老虎机视角 + 累积遗憾指标。 三者绑定:循环给出"信息如何流动",老虎机给出"为什么该用累积遗憾",累积遗憾给出"评测应该量什么"。C-A-F 同时是一张能把所有现存方法归位的分类表(Table 4),让消融天然成立。
  • 【基准贡献 ★★★】CodeRouterBench。 约 1.01 万任务、10 维度、含一个专门留作 OOD 的 agentic 维度,并预采集了"每题 × 每模型"的结果矩阵——这是能在流上算累积遗憾的前提,现有路由基准不具备。
  • 【系统贡献 ★★☆】ACRouter。 Orchestrator / Verifier / Memory 三件套,分别对应"整合信息 / 产生信息 / 累积信息"三条设计要求。
  • 【实证发现 ★★☆】三个反直觉副发现。 “最强 coder 是最差 router”、“微调是门槛、规模不是”、“维度只能解释约 27% 的路由信号”。

  • 四、方法详解(重点章节)

    4.1 符号体系与 C-A-F 建模

    在这里插入图片描述

    定义一个状态随任务流演化的循环:

    ci→ Decide ai→ Execute fi→ Memorize ci+1
    c_i \\xrightarrow{\\ \\text{Decide}\\ } a_i \\xrightarrow{\\ \\text{Execute}\\ } f_i \\xrightarrow{\\ \\text{Memorize}\\ } c_{i+1}
    ci Decide ai Execute fi Memorize ci+1

    • Context ci=(pi, di, H<i)c_i=(p_i,\\,d_i,\\,\\mathcal{H}_{<i})ci=(pi,di,H<i):当前 prompt pip_ipi、任务元数据 did_idi(维度标签等)、以及累积记忆 H<i\\mathcal{H}_{<i}H<i(前 i−1i-1i1 步验证后的轨迹)。
       人话:决策前路由器手上掌握的全部信息——这道题长什么样、它属于哪一类、以及过去做过的题攒下的经验。
    • Action ai∈Ma_i\\in\\mathcal{M}aiM:选择哪个模型。M\\mathcal{M}M 就是那 8 个候选模型的集合,∈\\in 读作"属于",即 aia_iai 是这 8 个里的某一个。
    • Feedback fi=(s^i, κ^i)f_i=(\\hat s_i,\\,\\hat\\kappa_i)fi=(s^i,κ^i):验证器给出的性能分 s^i\\hat s_is^i 与成本 κ^i\\hat\\kappa_iκ^i
       人话:这次选择的"成绩单"——做得好不好、花了多少。字母头上的帽子  ^\\hat{\\ } ^ 表示这是验证器"估"出来的分,不是上帝视角的真值。

    关键在 H<i\\mathcal{H}_{<i}H<i 这一项:每跑完一圈,验证后的结果进入下一圈的上下文,所以"下一次决策更知情"。静态路由器结构上做不到这件事——它的信息状态是冻结的,ci+1c_{i+1}ci+1cic_ici 共享同一份死先验。

    由诊断(第七节)引出的两条设计要求:

    • (i) 产生信息:每次决策要落地执行、真把输出跑进验证器,而非靠静态先验或模型自评;
    • (ii) 累积信息:把这些信息跨任务流累积,让后续决策能 condition 在过去结果上。

    4.2 C-A-F 作为统一分类框架(Table 4)

    在这里插入图片描述

    把三件套——Orchestrator(决策)、Verifier(产信息)、Memory(累信息)——分别删掉或冻结,就能把所有现存方法归位:

    • 单模型 = 三者皆无;
    • 静态启发式(DimensionBest、kNN)= 冻结记忆、无策略、无验证;
    • 静态训练策略(LogReg、RouteLLM、微调 Qwen)= 仅有训练好的 Orchestrator;
    • 在线老虎机(LinUCB / LinTS)= 参数化记忆 + argmax 策略 + 只看 reward 的验证。

    这张表的妙处在于:它让"消融实验"和"与基线对比"成了同一件事——每个基线就是 ACRouter 抽掉某些组件后的特例。

    4.3 ACRouter 三模块拆解

    ① Orchestrator(整合信息 → 对应"决策")。 决策中枢。综合三路信号:DimensionBest 先验、从 Memory 用 cosine kNN 取回的 top-10 历史邻居、任务元数据;核心策略是一个微调过的 Qwen3.5-0.8B 叠加启发式规则,用加权投票出最终选择。

    Fig. 2 的例子很直观:一道运行时报错的 bug 修复任务,四个投票者(api_llm→MiniMax、logreg→GLM-5、memory_KNN→Kimi、dim_best→Kimi)加权后 Kimi-K2.5 得 1.47 分胜出,argmax 选 Kimi 去修。

    ② Verifier(产生信息 → 对应"执行/反馈")。 沙盒原生的打分器,把 AST 解析、沙盒执行、prompt 内嵌测试、规则信号等多路信号按类型加权,聚合成统一分 ui∈[0,1]u_i\\in[0,1]ui[0,1](见第五节 Eq. 8)。关键是它不依赖 ground-truth oracle 测试——尤其在 OOD 上没有标准答案测试时,全靠这些代理信号自算置信度。

    ③ Memory(累积信息 → 对应"记忆")。 在线向量库。以任务 embedding(voyage-code-3 / BGE-large)为 key,value 存"选了哪个模型 / 性能 / 成本 / 验证轨迹";检索用 cosine kNN 取 top-10;FIFO 上限 20K 条,每跑完一圈就地更新。强调这是基于 embedding 的细粒度记忆,而非 DimensionBest 那种粗粒度的"维度哈希"——所以"某候选模型在相似任务上最近的成功/失败"都能对 Orchestrator 可见。

    4.4 路由主循环(伪代码)

    Input: 任务流 {p_1..p_N}, 模型池 M, 探测集预热的 Memory H, 微调策略 θ
    for i = 1 .. N:
    d_i ← extract_metadata(p_i) # 维度等元数据
    N_i ← Memory.knn(embed(p_i), k=10) # 取相似历史邻居
    votes ← {
    dim_best : DimensionBest(d_i),
    logreg : LogReg(p_i),
    api_llm : Qwen3.5-0.8B_θ(p_i, d_i, N_i),
    mem_knn : majority_model(N_i)
    }
    a_i ← argmax_m Σ_v w_v · 1[votes[v] = m] # 加权投票
    y_i ← a_i.run(p_i) # 执行
    u_i, κ_i ← Verifier(y_i, p_i) # 产生信息: 统一分 + 成本
    Memory.insert(embed(p_i) → {a_i, u_i, κ_i, trace}) # 累积信息 (FIFO 20K)
    Output: 路由轨迹 {a_i}, 累积遗憾 CumReg_N


    五、关键公式与理论推导(数学重点章节)

    这是一篇以实证与系统为主的论文,数学体量不大,但有四个核心形式对象值得逐一讲透。下面每个公式我都会先逐符号翻译成人话,再讲它为什么这么设,能上手算的地方配一个小例子。

    5.0 读公式前:一张符号小抄

    如果下面这些记号让你打怵,先记住这 7 条,后面就都能跟下来:

    • 下标 iii:表示"第 iii 道任务"。xix_ixi 就是"第 iii 题的那个 xxx"。
    • 求和号 ∑i=1N\\sum_{i=1}^{N}i=1N:把 iii 从 1 到 NNN 的东西全部加起来。
    • max⁡j\\max_jmaxj:在所有候选 jjj 里取最大的那个数值。
    • arg⁡max⁡j\\arg\\max_jargmaxj:取到最大值的那个 jjj 本身(要的是"哪个选项",不是"最高分多少")。路由器干的就是 arg⁡max⁡\\arg\\maxargmax——它要的是"选哪个模型"。
    • ∈\\in:属于。ai∈Ma_i\\in\\mathcal{M}aiM = aia_iai 是集合 M\\mathcal{M}M 里的一员。
    • [0,1][0,1][0,1]:闭区间,取值在 0 到 1 之间(含两端),常用来表示"归一化后的分数 / 概率"。
    • 帽子 x^\\hat{x}x^:估计值,不是真值(比如验证器估出来的分)。

    5.1 奖励函数:把"质量"与"成本"压成单一标量

    ri(ai)=ϵ1 si(ai)+ϵ2 κi(ai),ϵ1=1, ϵ2=−0.1
    r_i(a_i)=\\epsilon_1\\, s_i(a_i)+\\epsilon_2\\,\\kappa_i(a_i),\\qquad \\epsilon_1=1,\\ \\epsilon_2=-0.1
    ri(ai)=ϵ1si(ai)+ϵ2κi(ai),ϵ1=1, ϵ2=0.1

    逐符号翻译(人话):

    • aia_iai:这道题你选的那个模型。
    • si(ai)s_i(a_i)si(ai):这个模型在这题上的性能分(越高越好,可理解成"做得多对")。
    • κi(ai)\\kappa_i(a_i)κi(ai):这个模型在这题上的成本(钱 / 算力,越高越费)。
    • ϵ1=1, ϵ2=−0.1\\epsilon_1=1,\\ \\epsilon_2=-0.1ϵ1=1, ϵ2=0.1:两个权重。性能权重是 111,成本权重是 −0.1-0.10.1
    • rir_iri:综合奖励——给这次选择打的总分。

    一句话:做得好加分,花得多扣分,把两件事压成一个数。

    为什么成本权重是负的? 因为花钱是"坏事",要从总分里扣掉,所以前面带负号。

    为什么是 −0.1-0.10.1 而不是 −1-11? 这等于宣布"质量比成本重要 10 倍"。它真正的作用是个裁判(tie-breaker):只有当两个模型质量几乎打平时,成本才有资格决定胜负;只要质量差出一截,再贵也照选贵的。

    上手算一遍(两个模型二选一):

    模型性能 sss成本 κ\\kappaκr=s−0.1κr=s-0.1\\kappar=s0.1κ
    A(强但贵) 0.90 2.0 0.90−0.20=0.700.90-0.20=\\mathbf{0.70}0.900.20=0.70
    B(弱但便宜) 0.60 0.5 0.60−0.05=0.550.60-0.05=\\mathbf{0.55}0.600.05=0.55

    奖励选 A(0.70>0.550.70>0.550.70>0.55)——A 贵了 4 倍,但质量优势仍压过成本。
    若把权重换成 ϵ2=−1\\epsilon_2=-1ϵ2=1 再算:rA=0.90−2.0=−1.10r_A=0.90-2.0=-1.10rA=0.902.0=1.10rB=0.60−0.5=0.10r_B=0.60-0.5=0.10rB=0.600.5=0.10,这次反而选 B。可见 −0.1-0.10.1 这个小数字本身,就决定了天平往"质量"还是"成本"那边倒。

    坑:sssκ\\kappaκ 必须先各自归一化到可比尺度,否则系数没意义。而且论文自己说 provider 端缓存命中率看不到、成本测不准,所以在 ID 上这一项基本只是"软裁判",奖励近似退化成 ri≈sir_i\\approx s_irisi(详见第九节)。

    5.2 累积遗憾:评测指标的重新定义

    CumRegN(π)=∑i=1N(max⁡jRij−Ri,ai)
    \\mathrm{CumReg}_N(\\pi)=\\sum_{i=1}^{N}\\Big(\\max_{j}R_{ij}-R_{i,a_i}\\Big)
    CumRegN(π)=i=1N(jmaxRijRi,ai)

    先说什么是"遗憾(regret)":事后回看,“要是这题当时选了最好的那个模型,我本可以多拿多少分”。你实际拿到的,减去理论上最该拿到的,那个差距就是遗憾。 你永远不可能超过最优,所以遗憾总是 ≥0\\ge 00,越小越好,000 就是步步最优。

    逐符号翻译:

    • RijR_{ij}Rij:第 iii 题、用第 jjj 个模型,拿到的回报(就是上面那个含成本的 rrr)。
    • max⁡jRij\\max_j R_{ij}maxjRij:第 iii 题里把 8 个模型都试一遍,回报最高的那个值——这题"开了天眼"最该拿的分。
    • Ri,aiR_{i,a_i}Ri,ai:你的策略实际选的模型 aia_iai 拿到的分。
    • max⁡jRij−Ri,ai\\max_j R_{ij}-R_{i,a_i}maxjRijRi,ai:第 iii 题的单题遗憾(≥0\\ge 00)。
    • ∑i=1N(⋯ )\\sum_{i=1}^N(\\cdots)i=1N():把 NNN 道题的遗憾全部累加——这就是累积遗憾。

    一句话:累积遗憾 = 在整条任务流上,你和"每题都开天眼选最优"之间的总差距。

    为什么要换掉"单次准确率"这把旧尺子? 因为准确率只看"平均做对多少",看不到"信息有没有越攒越多、后面有没有比前面更准"。遗憾是流式的,能体现"前面踩的坑有没有让后面少踩"——而这正是 C-A-F 想量的能力。


    下面是全文最该讲透的一步推导:「逐题 oracle」远远强于「最优单模型」,这就是路由值得做的数学理由。

    先把两种"理想策略"分清楚:

    • 逐题 oracle:每道题各自挑当题最优 → 总分 ∑imax⁡jRij\\sum_i \\max_j R_{ij}imaxjRij
    • 最优单模型:先选定一个模型,全程只用它 → 总分 max⁡j∑iRij\\max_j \\sum_i R_{ij}maxjiRij

    它们之间有一个恒成立的不等式:

    ∑imax⁡jRij  ≥  max⁡j∑iRij
    \\sum_i \\max_j R_{ij}\\ \\ \\ge\\ \\ \\max_j \\sum_i R_{ij}
    ijmaxRij    jmaxiRij

    为什么?一句话证明: 对任何一个固定的模型 j0j_0j0,每一题都有 max⁡jRij≥Ri,j0\\max_j R_{ij}\\ge R_{i,j_0}maxjRijRi,j0(一堆数里取最大,当然不小于其中任意一个)。把所有题加起来:∑imax⁡jRij≥∑iRi,j0\\sum_i \\max_j R_{ij}\\ge \\sum_i R_{i,j_0}imaxjRijiRi,j0。这对每一个 j0j_0j0 都成立,所以对"那个让右边最大的 j0j_0j0"也成立——于是左边 ≥\\ge 右边。证毕。

    用具体数字感受这个差距(2 题 × 2 模型,格子里是回报):

    模型 A模型 B
    题 1 0.9 0.3
    题 2 0.2 0.8
    • 最优单模型:A 的总分 0.9+0.2=1.10.9+0.2=1.10.9+0.2=1.1,B 的总分 0.3+0.8=1.10.3+0.8=1.10.3+0.8=1.1,取较大者 =1.1=\\mathbf{1.1}=1.1
    • 逐题 oracle:max⁡(0.9,0.3)+max⁡(0.2,0.8)=0.9+0.8=1.7\\max(0.9,0.3)+\\max(0.2,0.8)=0.9+0.8=\\mathbf{1.7}max(0.9,0.3)+max(0.2,0.8)=0.9+0.8=1.7
    • 差距 =1.7−1.1=0.6=1.7-1.1=\\mathbf{0.6}=1.71.1=0.6

    0.60.60.6 是任何单模型策略都吃不到的红利——哪怕你永远选最强的那个,也只能逼近 1.11.11.1,碰不到 1.71.71.7。只有"每题换最合适的模型"(也就是路由)才能把这 0.60.60.6 捞回来。

    把它对回论文:CodeRouterBench 上逐题 Oracle =57.00=\\mathbf{57.00}=57.00,而最强单模型 Opus 平均才 42.942.942.9——这之间十几个点的鸿沟,就是上面那个 0.60.60.6 的放大版,是 ACRouter 存在的全部意义。也正因如此,累积遗憾里的 oracle 不是"最强模型",而是"每题开天眼",这是一把高得多、也诚实得多的标尺。

    前提:累积遗憾能算出来,靠的是一张预采集好的"每题 × 每模型"回报矩阵 R∈RN×KR\\in\\mathbb{R}^{N\\times K}RRN×KNNN 道题、KKK 个模型,每格都先把结果跑出来存好)。这正是 CodeRouterBench 必须自建、区别于"只测单次准确率"旧基准的地方。

    5.3 统一验证分:把多路异质信号聚成置信度(Eq. 8 概形)

    ui=∑t∈Twt ϕt(yi,pi)∑t∈Twt ∈[0,1]
    u_i=\\frac{\\sum_{t\\in\\mathcal{T}} w_t\\, \\phi_t(y_i,p_i)}{\\sum_{t\\in\\mathcal{T}} w_t}\\ \\in[0,1]
    ui=tTwttTwtϕt(yi,pi) [0,1]

    逐符号翻译:

    • ttt:一种检查信号。比如:代码能不能被 AST 解析(语法对不对)、丢进沙盒能不能跑通、prompt 自带的测试过不过、有没有违反某些规则。
    • ϕt(yi,pi)∈[0,1]\\phi_t(y_i,p_i)\\in[0,1]ϕt(yi,pi)[0,1]:第 ttt 种检查打的分(111 = 完全通过,000 = 完全不过,中间值 = 部分通过)。
    • wtw_twt:这种检查的可信权重。"沙盒真的跑通了"比"语法没报错"更能说明问题,所以前者权重更高。
    • 分子 ∑twtϕt\\sum_t w_t\\phi_ttwtϕt:把各项检查分按可信度加权求和。
    • 分母 ∑twt\\sum_t w_ttwt:所有权重之和,作用是归一化——把结果压回 [0,1][0,1][0,1]

    一句话:这就是一个加权平均。把好几个"局部体检指标"按可信度平均成一个 0 ⁣∼ ⁣10\\!\\sim\\!101 的"健康分" uiu_iui,当作"没有标准答案时,这段代码大概率对不对"的估计。

    为什么一定要除以 ∑twt\\sum_t w_ttwt(归一化)? 不除的话,检查项越多、分子越大,不同任务之间没法比;除完之后无论用了几个信号,uiu_iui 都稳稳落在 0 ⁣∼ ⁣10\\!\\sim\\!101,可以直接当性能分 sis_isi 喂进上面的奖励函数。

    上手算一遍:

    检查项得分 ϕ\\phiϕ权重 wwwwϕw\\phiwϕ
    AST 可解析 1.0 1 1.0
    沙盒跑通 1.0 3 3.0
    内嵌测试过一半 0.5 2 1.0

    u=1.0+3.0+1.01+3+2=56≈0.83u=\\dfrac{1.0+3.0+1.0}{1+3+2}=\\dfrac{5}{6}\\approx 0.83u=1+3+21.0+3.0+1.0=650.83

    坑(我作为读者的):这套打分全靠"代理信号和真实正确率正相关"这个假设。论文没给 uiu_iui 对真值的校准曲线——万一这些"体检指标"本身不准,Memory 累积下来的就是被污染的反馈,而后面所有决策都建在这堆反馈上。这是地基性的隐患(第九节展开)。

    5.4 路由信号的可解释上界:互信息只有约 27%

    附录 D.3 给出一个信息论量级估计:oracle 选择 yty_tyt 与任务维度 dtd_tdt 之间的互信息,仅占 yty_tyt 熵的约 27%:

    I(yt; dt)H(yt)≈0.27
    \\frac{I(y_t;\\,d_t)}{H(y_t)}\\approx 0.27
    H(yt)I(yt;dt)0.27

    附录 D.3 给了一个信息论量级估计:oracle 的选择 yty_tyt(该选哪个模型)与任务维度 dtd_tdt 之间的互信息,只占 yty_tyt 总不确定性的约 27%:

    I(yt; dt)H(yt)≈0.27
    \\frac{I(y_t;\\,d_t)}{H(y_t)}\\approx 0.27
    H(yt)I(yt;dt)0.27

    先把三个吓人的词翻译成人话:

    • H(y)H(y)H(y):“该选哪个模型"这件事本身有多难猜。如果 8 个模型常常各擅一摊、谁都可能是答案,那就很难猜,熵就大。可以想成"要猜中该选谁,平均得问多少个是 / 否问题”。
    • 条件熵 H(y∣d)H(y\\mid d)H(yd):已经知道任务维度 ddd 之后,"该选谁"还剩多少没猜准。
    • 互信息 I(y;d)=H(y)−H(y∣d)I(y;d)=H(y)-H(y\\mid d)I(y;d)=H(y)H(yd):知道维度后,难度下降了多少——也就是"维度"这条线索到底含多少金。

    所以 I(y;d)H(y)≈0.27\\dfrac{I(y;d)}{H(y)}\\approx 0.27H(y)I(y;d)0.27 在说:"维度"这条线索,只能消除约 27% 的"该选谁"的不确定性;剩下约 73% 藏在每道题的具体长相里(用了什么算法、调了什么 API、怎么处理边界)。

    打个比方:你要猜一个人爱看什么电影(yyy)。只知道他的"年龄段"(ddd=维度)能帮你猜对一部分,但更准的线索其实是他"上周具体看了哪几部"(题目的具体内容)。维度是粗线条,具体内容才是细线索。

    这个 27% 一下把全文串起来了:

    • 它是 DimensionBest 的天花板——只吃维度先验,最多到 0.4750.4750.475,永远够不到 oracle 的 0.5700.5700.570,因为它只抓住了那 27%。
    • 它也是 ACRouter 用 embedding 记忆的理由——剩下那 73% 的信号在题目内容里,只能靠"按具体题目长相去检索相似历史"才能捞到,维度标签捞不着。

    一句话:27% 既是粗粒度路由的上限,也是细粒度记忆存在的全部依据。


    六、实验设置

    模型池(8 个前沿代码模型):Opus 4.6、Sonnet 4.6、GPT-5.4、Qwen3-Max、Qwen3.5-Plus、GLM-5、Kimi-K2.5、MiniMax-M2.7。

    基准 CodeRouterBench:

    • 从 15+ 个公开 benchmark 重整出约 10,111 道任务,分 10 个维度;
    • 9 个单轮维度(代码生成 / 算法设计 / bug 修复 / 代码补全 / 重构 / 数据科学 / 多语言 / 代码理解 / 测试生成),各约 1,111 题;
    • 第 10 个 agentic programming 维度专门留作 OOD(176 题,来自 SWE-bench Verified、LongCLI-Bench、FeatureBench、SWE-CI)。

    数据切分:探测集 7,080(用于 profile 模型、训练分类器、暖启动 Memory)、ID 测试 2,919、OOD 测试 176。

    评价指标:AvgPerf(路由后平均性能)、累积遗憾(相对逐题 oracle)、Perf/$(成本效率)、Pareto 前沿。7 个维度用执行式打分(沙盒 pass@1),3 个维度用代理指标 + LLM-as-Judge。

    baseline 谱系:单模型(含"永远选 Opus")、静态启发式(DimensionBest、kNN)、静态学习器(LogReg、RouteLLM、TF-IDF+MLP、微调 Qwen 0.8B–27B)、在线老虎机(LinUCB、LinTS)。

    实现细节:Orchestrator 用微调 Qwen3.5-0.8B;Memory 用 voyage-code-3 / BGE-large 做 embedding,FIFO 上限 20K;OOD 的 agentic 评测把标准 250 步砍到 40 步(作者称"相对排名不受影响")。


    七、实验结果与深度分析

    7.1 命门实验:纯信息消融(Table 1)

    在这里插入图片描述

    只改"路由器能拿到什么信息"、不动架构:

    设置AvgPerf解读
    Oracle(逐题最优,理论上界) 57.00 路由红利的天花板
    DimensionBest(按先验给每维配最优模型) 47.50 静态启发式上界
    Vanilla(零样本 LLM 路由器,Sonnet 4.6) 41.41 起点
    +Dimension(额外告知任务属于哪个维度) 41.18 几乎没动,甚至略降
    +Perf stats(告知各维度实测性能数字) 47.74 暴涨,且 > DimensionBest

    两个信号极其干净:

  • 光告诉模型"这是个 bug fixing 任务"(维度名字)没用(41.41→41.18);但把"各模型在各维度的实测分数"这种数字喂进去,直接 41.41→47.74,相对涨 15.3%。
  • 这个 47.74 甚至超过了编码了同样维度先验的启发式路由器 DimensionBest(47.50)。
  • 附录 D.4 再补一刀:Vanilla 路由器的模型选择分布几乎是均匀的,根本没利用维度结构;只要把性能先验喂进去,它不改任何架构就追平甚至超过 DimensionBest。

    这张表是全文的逻辑支点:LLM 路由器的瓶颈是信息缺失,不是推理能力。后面所有设计(C-A-F、三件套)都是这条诊断的工程兑现。

    7.2 主结果(Table 3)

    In-Distribution(n=2,919):ACRouter 拿到路由器里最高的 AvgPerf(49.98%)和最低的累积遗憾(205.5),比握着完整维度先验的 DimensionBest 还高 2.48 个点。所有轻量分类器(LogReg、RouteLLM、TF-IDF+MLP、微调 Qwen)挤在 46–47 区间,在线老虎机也是 46–47。
    在这里插入图片描述

    OOD(n=176,分水岭):

    • 静态学习器全线崩盘:轻量分类器 OOD 掉到 8.93%–21.43%,比随机(31.25%)还低——典型的过拟合到训练分布。
    • 在线老虎机活得好一些(LinUCB 49.82% / LinTS 46.43%),因为在流上持续更新,但受限于每臂线性模型,缺乏 context-aware 推理。
    • ACRouter 拿到 62.50%,领先在线老虎机、领先"永远选 Opus"(57.14%)、也领先微调 Qwen(55.36%),累积遗憾 17.0 全表第一。

    累积遗憾曲线(Fig. 5):ID 上静态方法增长更快,OOD 上直接塌掉,只有 ACRouter 随 Memory 累积验证经验把信息缺口补上。Pareto 前沿(Fig. 6)上 ACRouter 把前沿往上顶,且成本低于"永远选 Opus"。

    7.3 三个反直觉副发现

    • “会写代码"≠"会做路由”(App C.1):让 8 个模型分别当路由器,Opus 4.6 在 0-shot 和 3-shot 里都垫底,尽管它本身是最强 coder。路由是另一种能力。
    • 微调是门槛,规模不是(App C.2):Qwen 从 0.8B 扫到 27B(约 30 倍参数),AvgPerf 只动 0.5 个点(46.21→46.74);但不微调的话,基座模型直接吐出格式错误的路由 token、退化到默认单模型。这解释了主表为何用 0.8B。
    • 维度只能解释约 27% 的路由信号(App D.3):见 5.4 节。这是"细粒度记忆 > 维度哈希"的定量依据。

    7.4 必须正视的一处反转:GPT-5.4 的"房间里的大象"(App D.7 / Table 14)

    作者老实交代:一次更新后的单跑 GPT-5.4 在同一 OOD split 上解出了 75.00%(132/176),几乎追平逐题 oracle 的 75.89%,把 ACRouter 的 62.50% 甩开 12.5 个点。这是个 apples-to-oranges 的对比(ACRouter 用的是原始 8-backend bundle,没把升级版 GPT-5.4 纳入候选池),但它说明一件事:在 agentic 这种"基础编码能力主导"的场景里,一个更新的强单模型直接吊打了路由器,OOD 那个 headline 数字是脆弱的。 诚实可贵,但确实削弱了 OOD 叙事(第九节展开)。


    八、创新点与亮点

    真正的方法论贡献(思想层):

  • 诊断的重定向——把路由瓶颈从"推理"挪到"信息"。这不是又一个路由器,而是把整个问题的因变量换了。Table 1 那个"喂数字就涨 15.3%、还超过启发式上界"的结果,是全篇最有说服力的一击。
  • C-A-F 的双重身份——它既是 ACRouter 的设计蓝图,又是一张能把单模型 / 启发式 / 静态学习器 / 在线老虎机全部归位的分类表,让"消融"与"对比基线"合二为一。配上"累积遗憾"这个被老虎机视角正当化的新指标,评测范式被换掉了。
  • CodeRouterBench——预采集"每题 × 每模型"结果矩阵 + 专设 agentic OOD 维度,是流式路由研究的可复用底座。
  • 扎实但属工程优化的部分:

    • ACRouter 的三件套本身。Orchestrator 是"DimensionBest 投票者 + LogReg 投票者 + 微调小模型 + kNN 记忆"的加权集成;Verifier 是多信号沙盒打分;Memory 是 FIFO 向量库。每一块都合理、好用,但都不是新原理——它的强,来自它比任何被比较的基线都掌握更多信息。这一点要和"思想创新"分开记账。

    九、局限性与潜在问题

    在这里插入图片描述

    论文自陈的不足:成本因缓存不可观测而仅作次要指标;OOD 评测把 250 步砍到 40 步;GLM-5 有约 14.5% 任务缺失按 0 计;结果绑定特定模型版本,需靠 V2/V3 roadmap 持续更新。

    我作为读者发现的隐患:

  • OOD 叙事被 GPT-5.4 反转削弱(见 7.4)。"一个更新的单模型就能反超路由器"这件事,对"路由在 OOD 上更有价值"的核心主张是结构性的威胁,而非边角料。
  • ACRouter 买的是性能,不是效率。 别被"比永远选 Opus 便宜"误导——Opus 是池子里最贵的,这是个很低的标尺。Perf/$:ACRouter 是 3.79(ID),而轻量分类器普遍 6+。ID 上 ACRouter($13.21)甚至比 DimensionBest($12.89)还略贵,换来 2.48 个点;OOD 上花 $52.97。它的价值主张是"质量",成本效率反而不占优。
  • "成本感知"框架在虚晃。 ϵ2=−0.1\\epsilon_2=-0.1ϵ2=0.1 在 ID 上"基本只是软性 tie-breaker",reward 近乎退化为 ri≈sir_i\\approx s_irisi。那么以"成本感知 reward"算出来的累积遗憾,所承载的信息量比表面看上去少。
  • "超过 DimensionBest"没那么惊喜。 DimensionBest 本来就是 ACRouter 的一个投票者,再叠加 Memory-kNN 与微调策略——它严格地比被比较的基线掌握更多信息。在这个设定下超过 DimensionBest,与其说是架构胜利,不如说是把"信息缺失"论点又复述了一遍。
  • 验证器的可靠性未被严格检验。 整套"执行落地反馈"的前提是 Verifier 打分靠谱,尤其 OOD 上它在没有 ground-truth 测试时聚合代理信号。论文没给 uiu_iui 相对真值的独立校准——若验证器有噪声,Memory 累积的就是噪声反馈,这是地基性的一环。
  • 老虎机更多是 framing 而非工具。 它用 contextual bandit 正当化"累积遗憾"这个指标,但 ACRouter 本身是个 LLM + kNN 的启发式集成,没有任何 regret bound。这个老虎机联系是描述性的,不是规定性的。
  • OOD 统计基底薄:仅 176 题、单一维度、还砍了步数;"相对排名不受影响"是断言不是证明。GLM-5 的缺失值按 0 计,还会同时压低它的均分、并可能影响 oracle 与维度冠军的认定。

  • 十、个人评述与启发

    价值判断。 这篇最有价值的不是 ACRouter 这个系统(它本质是"把更多信息塞进一个集成投票器"),而是那个诊断——把路由瓶颈从"推理"重新定位到"信息",并配上 C-A-F 这个统一视角和 CodeRouterBench 这个能算累积遗憾的流式评测台。诊断 + 基准是会被后人反复引用的东西;具体系统则会随模型版本快速过时。

    可复现性评估。 中等偏上。基准与"每题 × 每模型"矩阵若如承诺开源,复现性会很好;但 ACRouter 的复现依赖于微调小策略、embedding 后端、验证器权重等一串工程细节,且全部结果绑定 2026 年的特定模型快照——半年后模型一升级,绝对数字大概率全变,需靠基准自身的滚动更新维持有效性。

    可拓展方向。 论文在 §E.3 点了更大的野心:C-A-F 这套"观察上下文→行动→拿反馈→更新记忆"的范式不止用于模型路由,还能推广到工具选择、prompt 策略选择、思考预算分配——把路由当成 agent 决策的一个最小实例。这个推广方向比 ACRouter 本身更有想象空间:任何"在动作集上序贯决策、且能拿到执行反馈"的 agent 子问题,原则上都能套这个壳。

    对相关研究者的借鉴。

    • 做路由/调度的:先量一下你的瓶颈是信息还是推理,再决定要不要去卷更大的策略模型——Table 1 的方法论(纯信息消融)本身就值得复用。
    • 做基准的:单次准确率不足以刻画序贯系统,预采集结果矩阵 + 累积遗憾是个干净的范式。
    • 做 agent 的:把 C-A-F 当成一张检查表——你的系统在每步产生新信息了吗?这些信息跨步累积了吗?很多 agent 之所以"记不住教训",就是缺了这两条里的某一条。
    赞(0)
    未经允许不得转载:171主机测评 » 把“模型路由”重新诊断为信息问题——ACRouter 与 CodeRouterBench
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址