RouteLLM 深度解读:把模型选择变成成本-质量路由问题

从工程视角拆解 RouteLLM:它如何用偏好数据学习强弱模型路由,matrix factorization router、阈值、CPT/APGR 指标分别是什么意思,以及怎样接到真实 session eval 系统里。

RouteLLM 深度解读:把模型选择变成成本-质量路由问题

如果一个系统里有很多 LLM 请求,最朴素的做法是全部交给最强模型。这样质量通常稳,但成本也最高。

RouteLLM 要解决的问题正是这个:

每个请求进来时,先判断“便宜模型够不够”。够,就走便宜模型;不够,再走强模型。

它不是一个大模型,也不是 OpenRouter、9Router 那种 provider 网关。它更像一层“模型选择算法”:用一个很小的 router,提前预测强模型相对弱模型是否有明显优势,然后用阈值控制质量和成本之间的取舍。

这篇文章从工程视角拆 RouteLLM:它到底在学什么,为什么要用 preference data,matrix factorization router 是什么意思,CPT/APGR 这些指标怎么看,以及它应该怎样接到真实 session eval 系统里。

1. 先把问题说清楚

假设线上有两个模型:

strong model: 效果好,价格高
weak model:   价格低,效果弱一些

如果所有请求都给 strong model,质量最高,但很多简单请求其实浪费。

如果所有请求都给 weak model,成本最低,但复杂请求会掉质量。

RouteLLM 试图找到中间状态:

简单请求 -> weak model
困难请求 -> strong model

这个问题看似简单,难点在于:router 做决策时还没有看到模型回答。它只能看用户 query,提前判断强模型是否值得被调用。

所以 RouteLLM 学的不是“哪个回答更好”,而是:

给定一个 query,
strong model 比 weak model 更可能赢吗?

这就是它和 LLM judge、reward model 的关键区别。

  • LLM judge:回答已经生成之后,判断哪个回答好。
  • RouteLLM:回答生成之前,判断该调用哪个模型。

前者可以看结果,后者只能看题目。RouteLLM 的难度就在这里。

2. 一点点概率和阈值基础

RouteLLM 里会出现“概率”和“阈值”。不用复杂数学,可以用一个很小的例子理解。

router 看见一个请求后,输出一个数:

P(strong wins) = 0.82

意思不是“强模型一定会赢”,而是:

根据训练数据里类似请求的经验,
强模型更可能比弱模型答得好,
估计概率是 82%。

接下来需要一个阈值,比如:

threshold = 0.6

决策规则就是:

如果 P(strong wins) >= threshold -> 用 strong model
否则 -> 用 weak model

换几个数看得更清楚:

queryrouter 估计强模型胜率threshold路由结果
发票意图分类0.200.60weak
退款政策边界0.730.60strong
代码诊断0.850.60strong

阈值越低,越容易走 strong,质量更稳,成本更高。

阈值越高,越容易走 weak,成本更低,质量风险更大。

所以 RouteLLM 的本质不是“自动省钱”,而是:

用一个可校准的阈值,把模型选择变成一条可调的成本-质量曲线。

3. RouteLLM 的系统位置

RouteLLM 放在线上链路里,大概是这样:

flowchart LR
  A[User query] --> B[RouteLLM router]
  B --> C{strong wins probability}
  C -->|above threshold| D[Strong model]
  C -->|below threshold| E[Weak model]
  D --> F[Response]
  E --> F

注意它不是 cascade。

cascade 通常是:

先让 cheap model 答
答得不稳再升级 strong

RouteLLM 的目标更激进一点:

只调用一个最终模型。

这带来两个好处:

  • 不需要先生成一个 cheap 回答,所以延迟更低。
  • 不需要多次调用 LLM,所以额外 token 成本更少。

代价也很明确:

  • router 判断错了,就可能把难题送给 weak。
  • 它必须从 query 本身学出“任务难度”和“模型能力差距”。

这也是为什么 RouteLLM 需要高质量 preference data。

4. Preference Data:为什么不是直接标难度

一个直觉做法是让人标:

这个 query 是简单 / 中等 / 困难

RouteLLM 没有走这条路。它用的是 preference data:

query
model A 的回答
model B 的回答
人类投票:A 更好 / B 更好 / 平局

它的训练信号不是“题目难不难”,而是“在这个题目上,强弱模型谁赢了”。

这更贴近路由目标。因为“难”本身并不重要,重要的是:

弱模型是否已经能答到足够好?

举个例子:

请把这段英文翻译成中文。

这个任务对人来说不一定简单,但很多 weak model 已经能做得很好。它不该自动走 strong。

再看:

根据这三段上下文,判断退款是否违反地区政策,并给出合规答复。

这里强弱模型的差距可能很大,应该更倾向 strong。

所以 RouteLLM 学的是“强弱模型的相对收益”,不是抽象难度。

论文主要用 Chatbot Arena 的公开人类偏好数据作为基础数据。Chatbot Arena 里用户对匿名模型回答投票,天然形成了大量 pairwise preference。RouteLLM 再把模型按 Arena 分数聚成 tiers,把顶层模型视为 strong class,把较弱一层视为 weak class,从而缓解具体模型对之间标注稀疏的问题。

5. 数据增强为什么重要

RouteLLM 论文里一个很关键的观察是:只用 Arena 数据,router 在 MT-Bench 上表现不错,但到 MMLU、GSM8K 这类分布不同的 benchmark 时,效果会明显变弱。

这说明 router 不是学到一个抽象万能的“智力判断器”。它仍然受训练数据分布影响。

论文用了两类增强:

第一类是 golden-label data。

比如 MMLU 有标准答案。可以让 strong 和 weak 都答题,谁更接近标准答案,谁就赢。这样就能把“学科选择题”这种分布补进训练数据。

第二类是 LLM-judge-labeled data。

对于开放问答,没有标准答案,就让 strong 和 weak 分别回答,再用 GPT-4 这类 judge 产生偏好标签。

这和我们做 session eval 的思路是同一个方向:

真实任务分布越接近训练/校准数据,
router 越可能可靠。

所以工程上不要幻想拿开源 RouteLLM 直接扔到所有业务流量上就自动最优。它能给你一个很好的起点,但要想在真实业务里稳定省钱,必须把自己的 session 分布喂给评测和校准过程。

6. 四种 Router:它们分别在学什么

RouteLLM 开源仓库里支持几类 router,其中 README 当前推荐 mf,也就是 matrix factorization router。

6.1 Similarity-weighted ranking

这个方法很像“找相似题,然后看历史投票”。

流程可以想成:

新 query 进来
  -> 用 embedding 找训练集中相似 query
  -> 相似 query 的投票权重更高
  -> 用加权 Elo / Bradley-Terry 估计 strong 是否更可能赢

它的优点是直观,不需要复杂训练。

缺点是推理时要依赖相似检索和计算,速度、工程复杂度、分布覆盖都会影响效果。

6.2 Matrix factorization router

这是 RouteLLM 里最值得关注的版本。

它借鉴推荐系统的思路:用户和商品之间有一个隐含偏好矩阵,但矩阵很稀疏,于是学习低维向量来预测缺失位置。

类比到 LLM routing:

query 像“用户”
model 像“商品”
score(query, model) 表示这个模型回答这个 query 的潜在质量

如果训练数据说:

model A 在 query x 上赢了 model B

模型就学习让:

score(query x, model A) > score(query x, model B)

这样训练完成后,给一个新 query,它就能估计 strong 和 weak 的相对分数,再转成“strong wins probability”。

这类方法的好处是:

  • 比纯相似检索更可学习
  • 比大 LLM router 更轻
  • 推理开销低
  • 能利用模型和 query 的隐向量结构

论文和仓库都把 mf 作为很实用的默认选择。

6.3 BERT classifier

BERT classifier 更直接:

输入 query
输出 strong 是否会赢

它是一个文本分类器。优点是表达能力比简单方法强,缺点是需要足够多、足够贴近分布的数据。论文里也观察到,高容量模型在低数据或分布不匹配时未必更好。

6.4 Causal LLM classifier

这个版本用一个小型 causal LLM 做分类器。它看起来最“智能”,但训练和部署成本也更高。

它适合什么场景?

query 很复杂
需要更强语义理解
有足够训练数据
router 本身的成本仍然远低于 strong model

但对第一版业务落地,我不会优先建议从 causal LLM router 起步。它容易把系统复杂度拉高。

7. CPT 和 APGR:论文指标到底在看什么

RouteLLM 论文没有只报“准确率”。这是对的,因为路由系统不是分类竞赛,它关心的是成本-质量曲线。

CPT:达到某个质量需要多少 strong 调用

CPT 可以理解成:

为了恢复强弱模型质量差距中的某个比例,
router 至少需要把多少请求发给 strong model?

比如:

CPT(80%) = 14%

可以粗略理解为:

为了拿回 80% 的强模型质量收益,
只需要 14% 的请求走 strong。

这个指标很贴近业务,因为你最终关心的就是:

为了达到目标质量,我要付多少 strong model 调用?

APGR:整条成本-质量曲线的面积

APGR 看的是不同阈值下,router 能恢复多少强弱模型之间的质量差距。

一个 router 如果只在某个阈值下好,APGR 不一定高。

一个 router 如果在很多成本预算下都稳定比 random routing 好,APGR 会更好。

业务上可以这样理解:

CPT 适合定一个目标点。
APGR 适合比较 router 整体能力。

8. 论文结果该怎么读

RouteLLM 论文和 LMSYS 博客里有几个重要结论。

第一,在 MT-Bench 上,RouteLLM 的 router 能显著减少强模型调用。LMSYS 博客里给出的结果是,使用 Arena 数据增强后,matrix factorization router 只需要约 14% GPT-4 调用就能达到 95% GPT-4 表现,相比 random baseline 便宜 75%。

第二,在 MMLU、GSM8K 上,只用 Arena 数据时效果会弱很多,因为分布不同。加入少量 in-domain 或 judge-labeled 数据后,router 表现明显改善。

第三,router 有一定跨模型泛化能力。论文测试了把原来 GPT-4 / Mixtral 的路由设置换成 Claude 3 Opus / Sonnet、Llama 3.1 70B / 8B 等模型对,不重新训练也能保持比 random 更好的表现。

第四,router 本身开销相对小。论文报告的几类 router 开销,相比 GPT-4 generation 成本很低。这个很重要,因为如果 router 自己太贵,省钱逻辑就不成立。

这些结果值得重视,但也要读出边界:

RouteLLM 的效果来自“训练/增强数据和目标流量足够相似”。
分布不匹配时,router 会退化。

所以它不是免配置的魔法,而是一个可以被数据校准的工程组件。

9. 开源框架怎么用

RouteLLM 仓库提供了 serving 和 evaluation 两部分。

安装大致是:

pip install "routellm[serve,eval]"

启动 OpenAI-compatible server:

python -m routellm.openai_server --routers mf --config config.example.yaml

请求时通过 model 字段指定 router 和 threshold:

router-mf-0.5

它的意思是:

使用 mf router,并用 0.5 作为路由阈值。

仓库也提供 threshold calibration:

python -m routellm.calibrate_threshold \
  --task calibrate \
  --routers mf \
  --strong-model-pct 0.5 \
  --config config.example.yaml

这一步很关键。因为同一个 threshold 在不同业务流量上的 strong call rate 不一样。你不能拿公开数据上校准出来的阈值,直接假设它在线上也会把 30% 请求发给 strong。

评测命令类似:

python -m routellm.evals.evaluate \
  --routers random sw_ranking bert \
  --benchmark gsm8k \
  --config config.example.yaml

仓库当前支持的 benchmark 包括 mmlugsm8kmt-bench。这对复现论文有用,但业务落地时更重要的是把自己的 session eval 接进去。

10. 和 9Router、OpenRouter、Promptfoo 的区别

这几个名字容易混。

工具本质解决的问题
RouteLLM路由算法/框架判断强模型是否值得调用
9Router本地 API 网关把 CLI/IDE 请求接到多个 provider,做 fallback 和 token saving
OpenRouter托管模型聚合 API用一个 API 调多个模型/provider
Promptfoo评测框架批量评估 prompt/model/provider 输出效果

它们可以组合,但职责不同。

一个比较合理的工程组合是:

flowchart TD
  A[Production sessions] --> B[Promptfoo / custom eval]
  B --> C[Task labels and preference data]
  C --> D[RouteLLM calibration or training]
  D --> E[Routing policy]
  E --> F[9Router or custom gateway]
  F --> G[Weak / Mid / Strong providers]

Promptfoo 负责“评出来”。

RouteLLM 负责“学会怎么选”。

9Router 或自研 gateway 负责“线上转发”。

OpenRouter 则可以作为 provider 聚合层。

11. 怎么接到真实 Session Eval

我们前面做的 session eval 系统,产物是:

task_type -> cheapest passing model

这已经能做规则路由:

intent_triage -> cheap
refund_policy -> mid
code_debug -> strong

RouteLLM 更适合下一阶段:当你发现同一个 task_type 里仍然有明显难易差异时。

比如 refund_policy 里可能有三类:

明确 45 天超期 -> mid 足够
跨地区政策 + 优惠券 + 部分退款 -> strong 更稳
用户要求绕过政策 -> strong 或人工

这时候只靠 task_type 不够细。你需要一个 query-level router,在同一类任务内部继续分流。

落地路径可以是:

第一阶段:规则路由
  task_type -> model tier

第二阶段:收集 pairwise preference
  同一 session 上 weak/mid/strong 的回答谁更好

第三阶段:训练或校准 router
  输入 session/query,输出 strong wins probability

第四阶段:线上灰度
  先 shadow routing,再小流量生效

不要一上来就训练 RouteLLM。先让 eval 系统稳定产出标签,再让 router 学。

12. 什么时候不该用 RouteLLM

RouteLLM 很适合:

  • strong 和 weak 之间成本差距大
  • 大量请求其实 weak 能处理
  • 请求分布稳定
  • 有 session eval 或 preference data
  • 能接受少量路由错误,并有 fallback 机制

它不适合:

  • 所有请求都高风险,不能容忍 weak 误答
  • 任务分布变化很快,但没有持续校准
  • 请求必须严格满足工具/权限/合规策略,路由只是次要问题
  • 你只有很少流量,router 的工程复杂度超过节省成本
  • 你还没有可靠评测集,只是想“自动省钱”

尤其在金融、支付、合规、医疗这类场景里,RouteLLM 不能替代安全策略。它只能帮助选择模型,不能保证业务行为安全。

13. 我会怎么落一版生产方案

如果要把 RouteLLM 思路接进真实系统,我会这样做:

flowchart TD
  A[Sample production sessions] --> B[Human-reviewed eval set]
  B --> C[Run weak / mid / strong outputs]
  C --> D[Judge + deterministic checks]
  D --> E[Preference labels]
  E --> F[Router calibration]
  F --> G[Shadow traffic]
  G --> H[Online metrics]
  H --> I[Threshold update]
  I --> G

第一步不是训练,而是建数据。

每条 session 至少要有:

  • task_type
  • success criteria
  • weak/mid/strong outputs
  • judge 分数
  • 人工抽样复核
  • 失败原因分类

然后先做两个简单 baseline:

always weak
always strong

再加一个规则 router:

task_type -> model tier

最后才比较 RouteLLM router:

query/session -> probability strong wins

如果 RouteLLM 相比规则 router 没有明显收益,就不要复杂化。如果它能在同等质量下降低 strong call rate,再考虑上线。

14. 一句话总结

RouteLLM 的核心洞察是:

模型选择不是配置问题,而是一个可以从偏好数据里学习的成本-质量决策问题。

它把“要不要调用强模型”变成:

预测 strong model 在这个 query 上是否值得花钱

再通过 threshold 把质量和成本调成一条曲线。

但它的效果不是凭空来的。它依赖三件事:

  1. 有代表性的 preference data。
  2. 和真实流量接近的校准集。
  3. 上线后持续监控路由错误。

所以最稳的落地方式不是“直接上 RouteLLM”,而是:

先有 session eval,
再有 preference labels,
最后才有 learned router。

这也是它和前面那套 session 评测系统的关系:评测系统负责产生可信信号,RouteLLM 负责把这些信号压缩成实时路由决策。

参考