AI技术文章

openJiuwen X-Router自演进模型路由技术首发,昇腾亲和,Agent越跑越省,实测减少50+%Token消耗

作者:量子位0 次浏览 来源:量子位
openJiuwen X-Router自演进模型路由技术首发,昇腾亲和,Agent越跑越省,实测减少50+%Token消耗

不是所有任务都需要最强的模型。让每一次请求选对模型,让每一次反馈都成为下一次更优、更省的选择。不是所有任务都需要最强的模型。让每一次请求选对模型,让每一次反馈都成为下一次更优、更省的选择。

不是所有任务都需要最强的模型。让每一次请求选对模型,让每一次反馈都成为下一次更优、更省的选择。

你有没有想过,你的Agent可能一直在“用力过猛”

先做一个思想实验。

你问AI助手一个再简单不过的问题:“帮我把这句话翻译成英文。”

它调用的,是一个参数量千亿、跑在云端最贵算力上的模型。你问它一个需要通盘推演、写五十行代码、还要自己debug三轮的难题,它调用的还是同一个模型。

这是今天绝大多数AI应用的真实状态:一个模型包打天下。

问题还不止于“贵”。真实场景里,一个Agent往往同时握着本地模型、云端模型,以及来自不同厂商的多种服务。当可选模型越来越多,新的麻烦随之出现:

  • 简单任务用昂贵模型,带来不必要的成本;
  • 复杂任务交给轻量模型,效果不稳定;
  • 依赖固定规则做选择,很难跟上业务与模型的持续变化。

用户真正需要的,不是一张需要反复维护的模型路由表,而是让Agent自己完成判断:这次请求该由谁处理,为什么这样选择,下一次能否做得更好。

问题出在哪?出在我们把“路由”这件事给忘了。

从“一个模型包打天下”到“一支模型队伍”

现实世界里的调度智慧,随处可见。

点外卖时,平台不会派最近的骑手去送最远的一单,也不会为了三公里的单子调动整个配送站;医院分诊台不会让所有人直接挂专家号,而是先判断病情轻重,再决定看哪个科室、找哪位医生;快递分拣中心如果想要“送得快”,前提是“分得准”。

它们的共同点是:手里有一支队伍,并且知道每一项任务该交给队里的谁。

Agent也该如此。

今天的Agent背后,现实已经是一支队伍了:有的模型推理能力强但贵且慢,有的轻快便宜但只能干简单活,有的擅长写代码,有的多模态理解更好。

每个模型各有所长,也各有所短。以PC办公场景为例,删除文件和写PPT,所需的能力显然不同。

问题是:谁来当这位调度员?

这就是openJiuwen智能路由要解决的事。

openJiuwen是由华为2012实验室、华为云、终端、计算、算力先遣队等团队联合高校、企业等广大开发者联合构建的开源AI Agent平台。

此次,openJiuwen团队给出的答案是——在Agent与模型之间,增加一层面向请求的智能决策能力,一个专门负责“这一轮任务,该用哪个模型、用什么策略”的路由引擎。

一句话说清:智能路由在做什么

基于任务复杂度,动态决策与编排群智协同及最优模型选择,实现成本-效果综合最优。

翻译成大白话:看菜下饭,量体裁衣。

简单的问题,用轻快的模型快速回;复杂的问题,调度更强的模型深思考;需要多个模型互相印证的问题,组织多模型协同作战、再统一汇总;而每一次决策的结果,都会变成经验,让下一次的判断更准。

这里的关键词是“动态”。它不是一个开关,不是一份写死的配置表,而是一个会随着任务、用户、负载、成本实时变化的决策系统。

这套系统要有三个属性,缺一个都不成立:

  • 可配置——不同业务能带着自己的偏好进来。这一轮要最省,还是这一轮要最快,由业务方说了算,而不是被一套写死的规则绑住;
  • 可演进——模型生态是流动的,新模型每个月都在冒出来,老模型在悄悄降价,同一模型迭代一个版本能力分布就可能换个样子。策略必须能跟着一起长;
  • 可观测——每一次决策的依据、每一次执行的反馈都要能看见、能回溯。一个说不清“为什么选它”的路由器,用户不敢把它放进生产。

那它到底怎么做到的?

三层能力,构成一个完整的路由体系

openJiuwen团队把这套体系拆成三层,它们各自解决一个独立的问题:第一层负责“看得准”,第二层负责“选得对”,第三层负责“越用越好”。

第一层:精准画像——“认识队伍里的每个人”

要做调度,首先得知道每个人擅长什么。

模型的能力不是一张静态标签。说“这个模型代码能力强”不够用——强到什么程度?在什么类型的题目上强?换个领域还强不强?模型还在迭代,能力还在变。

openJiuwen的做法是:基于历史数据,离线刻画每个模型的能力画像,并在线动态刷新——当模型版本变动或表现发生变化时,画像的更新时延优于1分钟。

画什么?不只是“代码能力8分、数学能力7分”这种模糊打分,而是精细化的刻画:不同任务类型上的表现、不同难度下的表现、时延和功耗特性、成本量级。

有了精准的画像,路由才有一个可靠的起点——决策与执行分离,路由层只管判断,具体调用交给宿主,两者互不耦合。

文章配图

△模型能力画像——每个模型都有一份动态更新的能力档案

第二层:决策——“这一轮,到底交给谁”

画像有了,接下来是真正难的部分:面对一个具体请求,怎么选?

先看请求本身。Agent的任务是多轮的、有状态的,复杂度判断不能只看当前这一句,要看整条轨迹:我们走到哪了,接下来要做什么,前面失败过什么。

openJiuwen把最近的对话窗口连同工具调用进展一起送进判断,并专门做了一处处理——Agent循环的尾部常被工具输出占满,任务本身会被挤出窗口时,openJiuwen团队特别保留了最近一次用户诉求,确保调度员始终知道“雇主想要的是什么”。

再看系统状态。这是纯算法视角容易漏掉、但对真实收益影响最大的一块:

  • KV缓存亲和:这个请求的上下文,跟哪个模型上已有的缓存更“熟”?复用缓存能省下大量重复计算——同样的模型,缓存命中与不命中,成本可以差出一截。
  • 实时负载:此刻哪个模型更空闲、响应更快?同价位的两个模型,负载不同,时延可能差一倍。
  • 目标可用性:某个模型刚超时或被限流,这一轮就不该再往它身上撞。这类信息会写进状态,成为下一次决策的排除项。

换句话说,路由的输入不只是“这个问题的难度”,而是“这个问题的难度+整个系统此刻的状态”。

最后才是决策本身。这本质上是一个多目标优化问题:质量够不够、成本值不值、时延等不等得起、上下文和工具支不支持、用户更看重速度还是质量。

openJiuwen的做法是基于候选模型能力、时延功耗、用户偏好等约束,构建启发式优化算法,综合选出最优模型——选的是“最优”的那一个,而不是“看起来最强”的那一个。

文章配图

△动态路由决策——多路信息汇聚后的实时权衡。系统按“请求分析 → 算法判定 → 输出选择 → 宿主调用”的链路工作,模型池每次选其一

第三层:演进——“越用越准,而且要能跟着模型生态一起长”

前两层解决的是“此刻怎么选”。

但如前面所说,一套写完就冻结的策略,三个月后必然过时。所以第三层解决的是:这套系统能不能自己变聪明。

openJiuwen的做法,是把“学习”从“运行”里拆出来——状态解耦。这一条是整套架构里最不起眼、但决定性的设计:

  • 算法是纯函数:给定同样的请求和同样的状态快照,必须给出同样的决策。决策逻辑里不允许藏着跨请求的记忆,也不允许有隐藏的随机性。
  • 状态是可丢弃的提示:所有跨请求的记忆——历史结果、排除项、缓存亲和、经验数据——全部外置到独立的状态层,算法每一轮只读它一眼。
  • 反馈闭环:每次调用结束后,宿主把结果回报回来:成功还是失败、用了多久、大概花了多少、这一轮做得好不好。这些反馈写回状态层,成为下一轮的输入。

这三条合起来,产生了一个很实用的性质:状态丢了,只是降质为“冷路由”,不会让请求失败;而算法要升级、要换一个新的学习模型,不用动状态层,也不用动宿主。

从运行时的角度看,这条闭环长这样:用户请求进来 → 路由算法分析请求、判定模型 → 宿主执行、调用选中的模型 → 返回用户;

与此同时,执行结果被送去评估(质量评分、调用成本、成败、时延,可接入后台评分模型)→ 关联请求、模型与反馈形成经验积累 → 演进模块检索相似经验、权衡质量与成本 →应用于下一次决策。

系统在这里有一个克制而重要的默认:样本不足或优势不明显时,保留原判定——不为了“演进”而演进。

文章配图

△反馈驱动的路由自演进——将执行结果转化为经验,持续修正后续选模决策

正是这个设计,让“演进”这条路真正走得通——算法和状态各自独立,谁升级都不会拖住对方。

于是就有了两条互不干扰的演进通路:一条在运行时自我学习,靠Contextual Bandit和轻量强化学习从真实反馈里持续抽经验;一条在逻辑上持续迭代,画像更新、算法替换、策略升级都是独立模块。

为什么这件事重要?

因为它决定了这套路由是“一次性的工程”,还是“能活三年的基础设施”。前者每次模型换代都要重做一遍,后者只需要换掉一个模块。

再进一步:从“选模型”到“编排协同”

三层能力之上,还有一个更大的空间。

一是多模型协同。

当一个问题确实很难、单模型不足以给出可信答案时,路由层可以调度多个模型协同作答——让不同的模型分别给出参考结果,再经过语义去重、质量筛选、冲突消解、压缩整理,最终聚合成一个更高质量的答案。

多模型协同天然昂贵,所以关键在于能不能聪明地协同:重复的答案不必重复计算,站不住脚的答案及早淘汰,模型之间结论不一致时有机制判断谁更可信。

这类能力,openJiuwen团队已经在WorkSwarm的MoA(多模型协同)中做了实现,并支持通过路由框架统一接入——路由决定“这一轮要不要发动多个模型、发动哪几个”,MoA负责“多个模型的结果怎么收拢成一个”。

一个管派谁上场,一个管场上怎么配合。

文章配图

△MOA多模型协同——重点不是“多”,而是聚合得聪明

二是策略自编排。

不再局限于“选模型”,而是把模型、Skill/Tool、SubAgent等多种能力放在同一个调度框架下统一编排——某一步交给模型推理,某一步交给工具执行,某一步派个子Agent去查证。

路由的粒度,从“选模型”升级为“编排整个执行策略”。

再加上策略自闭环优化:通过构建反馈Hook点和Fallback机制,验证并总结执行结果和错误根因,让策略能够自行优化——每一次失败都不会被浪费。

关键难点:在四个目标之间走钢丝

讲到这里,有必要单独说说这件事真正的难点。

模型路由最难的,从来不是“能不能选”,而是如何在成本、时延、质量、上下文/工具兼容性之间做实时权衡。

  • 把成本压到极致,质量可能就崩了,用户转头就走;
  • 把质量顶到最高,成本会失控,业务方不答应;
  • 一味追求低时延,可能在关键问题上给出草率答案;
  • 只看单次最优,忽略了缓存复用,整体反而更贵。

这是一个典型的没有标准答案的多目标权衡问题。理论上没有免费的午餐,实践中也没有一个参数能适配所有场景。

openJiuwen的思路不是去找一个“万能的最优解”,而是把权衡这件事本身变成一个可配置、可演进、可观测的系统:不同业务可以带着自己的偏好进来;决策依据来自真实的执行反馈,而不是纸面上的假设;策略可以随着数据积累持续演进,越用越准。

这套机制落到代码里长什么样?看这张图。

文章配图

△openJiuwen智能路由整体架构——路由算法(Algorithm)、状态管理(State)、自演进(Evolving)三块解耦,向上对接WorkSwarm/MoA的协同编排,向下对接候选模型池;对外是纯函数接口调用,不产生无状态之外的影响

架构里的Algorithm一层,是把“怎么判断”做成可插拔的能力。

目前已经落地的算法包括x-router:基于五档复杂度分档的路由算法,支持端云分级、本地能力边界判断、进程内小模型分类器、失败降级永不升级,并用上下文Bandit做经验修正。

同层还有其他路线——比如Rust版本的轻量前瞻路由,走的是高维特征空间质量预测与任务轨迹预测、联合优化的路子,静态编译、无运行时依赖、可直接嵌入宿主进程。

也就是说,x-router是这台引擎里的一个算法模块,而不是引擎本身。

引擎提供的是那套“可配置、可演进、可观测”的骨架;换算法不改骨架,换骨架不动算法。

下面的实测数据,用的就是x-router这条算法通路。

实测:在哪些榜单上,拿到了什么结果

技术讲完了,看效果。

openJiuwen团队想回答两个最直接的问题:启用智能路由之后,能否减少不必要的模型调用成本?开启自演进之后,路由策略能否随着真实使用持续优化?

实验设置

团队把x-router接入WorkSwarm,使用PinchBench全量147个任务进行评测,任务覆盖日志分析、数据分析、编码、研究等11个类别。

x-router的复杂度分类器采用本地部署的Qwen3-0.6B,直接跑在进程内,无需额外启动独立服务。五级模型池配置如下:

文章配图

△五级模型池配置——从SIMPLE到REASONING五档,本地模型与云端模型混合编队

对应的能力分档逻辑是:从SIMPLE到REASONING,简单任务优先使用轻量模型,复杂任务按需升级能力——查询“HTTP 429是什么含义”走轻量模型,编写数据处理脚本走通用或高能力模型,多文档研究走研究型模型,数学证明与深度推理才交给推理模型。

文章配图

△五级能力路由——根据任务复杂度匹配合适的模型能力,追求的不是“选更便宜的”,而是“能用轻量模型完成就不必调用强模型,能力不足时才让更强模型接手”

三种运行模式

为保证对比公平,三组实验使用相同的评测模型和评分标准,并统计不同模式下的PinchBench得分及真实模型调用成本:

  • 全云基线(All Kimi-K2-Thinking):不使用智能路由,所有请求统一交给指定的云端强模型;
  • x-router静态路由:启用x-router的复杂度路由,但不开启自演进;
  • x-router Bandit自演进:在静态路由基础上开启Bandit自演进,根据相似任务的真实执行结果动态调整路由策略。

结果一:PinchBench——得分几乎持平,成本降44.6%

文章配图

△PinchBench实测结果——横轴为模型调用总成本,纵轴为PinchBench得分;越靠近左上角,代表以更低成本拿到更高任务质量

x-router静态路由取得66.3%的PinchBench得分,总模型调用成本$8.25。相比全量调用Kimi-K2-Thinking(71.36%、$11.11),得分下降5.1%,而模型调用成本降低了25.7%。

开启Bandit自演进后,成本进一步从$8.25降至$6.16,较静态路由再降约25.3%;与此同时,PinchBench得分提高4.4%,达到70.70%。

与全云基线相比:x-router Bandit自演进模式得分70.70% vs 71.36%,仅低0.66个百分点,几乎持平;而模型调用成本从$11.11降至$6.16,整体降低约44.6%。

这组对比回答了两个问题:静态路由证明了“按需选模”本身就能砍掉不必要的强模型调用;自演进则证明了——反馈闭环带来的不只是省钱,还有质量的回升。成本降了25.3%的同时得分反升4.4%,这是“越用越准”最直接的证据。

结果二:Terminal-Bench/LLMRouterBench——成功率达Opus的95.2%,成本降51.4%

openJiuwen团队还在Terminal-Bench/LLMRouterBench上用Opus4.8/Qwen3.5-122B/Qwen3.5-35B三档位模型池做了单轮/多轮路由测试:

  • cost focused模式下,降成本51.4%,成功率达Opus的95.2%;
  • quality focused模式下,降成本15.7%,成功率达Opus的98.6%。

文章配图

△Terminal-Bench/LLMRouterBench实测结果——横轴为模型调用总成本,纵轴为任务成功率;基于Opus4.8/Qwen3.5-122B/Qwen3.5-35B三档位模型池进行路由

两个榜单、两种偏好设置,指向同一个结论:接近顶配的质量,可以用大约一半的成本拿到。

而且“省多少、让多少质量”是用户自己选的——这正是“可配置”落到数字上的样子。

快速上手

1. 安装

model-router的内核是Rust,Python侧是PyO3扩展。

git clone https://gitcode.com/openJiuwen/model-router.git

cd model-router

cargo build

pip install maturin

maturin develop

如需使用x-router算法,在已激活的Python虚拟环境中执行:

maturin develop --extrasx-router

2. 配置

路由的行为由一份TOML描述。最简形态如下:

# config/edge.toml

algorithm = “passthrough”

[state]

backend = “memory”

ttl_secs = 300

max_entries = 1024

[targets]

models = [“local-default”]

切换到x-router只需改算法名并补上模型池与分类器:

algorithm = “x-router”

[targets]

models = [“model-a”, “model-b”, “model-c”, “model-d”, “model-e”]

[x-router.classifier_model]

model_path = “/path/to/qwen3-0.6b”

local_models = [“model-a”]

3. 调用

装配路由,发起请求,拿到决策后由宿主自己调用模型,再把结果回报回去——这就是前面说的“决策与执行分离”。

import openjiuwen from openjiuwen import Feedback, Router  router = Router.from_config("config/cloud.toml")  decision = await router.route({     "messages": [{"role": "user", "content": "hi"}],     "session_id": "s1",     "agent_id": "host", })  # 宿主自行调用 decision.selected_model_id 对应的模型  await router.report(     Feedback.ok(decision, latency_ms=12, session_id="s1", agent_id="host") )

x-router的调用方式在语义上一致,分类器直接运行在本地进程中:

from openjiuwen import x_router  router = x_router.build_router("router.toml")  selection = x_router.build_request(     [{         "role": "user",         "content": "Compare Raft and Paxos for a five-node cluster."     }],     session_id="s-1",     agent_id="my-agent", )  # Router 会从 decision.selected_model_id 中返回推荐调用的模型 decision = router.route_sync(selection)

Rust宿主可直接静态链接openjiuwen-runtime:

use openjiuwen_runtime::{Feedback, RequestMetadata, RouteHint, RouteRequest, Router};  let router = Router::from_config("config/edge.toml")?; let decision = router.route(&req, &RouteHint::default())?;  let mut feedback = Feedback::ok(req.routing_key(), &decision.selected_model_id, 40); feedback.route_id = decision.route_id.clone(); router.report(feedback);

详细使用说明参考代码仓README。

为什么这件事,现在特别重要

最后聊几句判断。

第一,模型会越来越多,路由会越来越刚需。

今天大家还在讨论“哪个模型最强”,但很快,这个问题会变成“哪个组合最合适”。

因为模型生态正在快速分化:有的往强推理走,有的往轻量端侧走,有的往多模态走,有的专攻代码或某个垂直领域。

没有哪个模型能在所有维度上都赢,这意味着选择本身,正在成为一种核心能力。

第二,成本是Agent走向大规模落地的真正门槛。

Agent和聊天机器人最大的区别,是它会长时间、多轮次、多工具地持续工作。

这意味着Token消耗不是线性增长,而是成倍放大。一个在Demo里跑得很漂亮的能力,如果成本压不下来,在真实业务里就跑不起来。

路由不是锦上添花的优化,而是Agent能不能规模化的前置条件。

第三,通用性比单点最优更重要。

团队不打算为某个特定场景做一套定制的最优解。openJiuwen智能路由的目标,是一套统一的、可嵌入的路由框架:同一套内核,通过配置就能实例化出不同的部署形态——

  • 端侧形态:单进程、内存态、零外部依赖,路由与推理同机共处,把决策开销压到可以忽略;
  • 云侧形态:状态层外置,决策依据来自全局的模型表现与负载视图;
  • 企业私有化形态:在有限的模型清单内做最优搭配,策略与数据都留在本地;
  • 端云混合形态:端侧判断简单任务自己消化,复杂任务交给云端——同一套决策逻辑,两侧给出同样的答案。

一套框架,多种形态。换的是部署拓扑,不换的是那套“看菜下饭”的判断逻辑。

文章配图

△一套路由框架,多种部署形态

结语:让每一分算力,都用在最该用的地方

回到开头那个思想实验。

openJiuwen团队真正想改变的,不是“用哪个模型”这个具体选择,而是“选择”这件事本身的发生方式——从开发者预先写死的配置,变成一个运行时会思考、会权衡、会学习的系统。

打个比方:过去团队给Agent配的是一位“照着名单发活”的排班员,现在他们想给它配一位真正的调度员。

这位调度员知道每个人此刻的状态,知道这一单的轻重缓急,知道客户最在意什么,而且每做完一单,他对整支队伍的理解就更深一分。

这正是openJiuwen智能路由想做的事:不是让Agent用更强的模型,而是让Agent用更对的模型。

而x-router只是这台引擎里已经跑通的一条算法通路。

接下来,openJiuwen团队还会推出包括路由策略强化学习训练在内的更多自演进能力,让短期经验逐步沉淀为更加稳定的长期路由策略。

相关能力在持续开发和验证中,更多进展敬请关注openJiuwen社区后续发布。

openJiuwen智能路由已开源,欢迎关注openJiuwen开源社区,第一时间上手体验。

相关资源

openJiuwen官网:https://www.openjiuwen.com/

AtomGit:https://atomgit.com/openJiuwen/model-router

GitHub:https://github.com/openJiuwen-ai/model-router

x-router README:https://atomgit.com/openJiuwen/model-router/blob/main/python/openjiuwen/x_router/README.md

https://github.com/openJiuwen-ai/model-router/blob/main/python/openjiuwen/x_router/README.md

x-router示例:https://atomgit.com/openJiuwen/model-router/blob/main/examples/x_router_cli.py

文章来自于微信公众号 “量子位”,作者 “量子位”

相关主题

读完之后

加入 AINRK 交流群

了解加入交流群的方式,与更多 AI 从业者交流。

查看交流群说明(在新窗口打开)