news 2026/10/13 2:32:30

semantic-router 强化学习驱动选择算法 rl_driven 实战指南:Thompson Sampling、Router-R1 与在线个性化路由

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
semantic-router 强化学习驱动选择算法 rl_driven 实战指南:Thompson Sampling、Router-R1 与在线个性化路由
  • 后端
  • API网关
  • 模型推理服务
  • AI Agent

【免费下载链接】semantic-router

An open, programmable decision layer for models and compute.

项目地址:https://gitcode.com/gh_mirrors/sem/semantic-router
点击查看免费下载

导读

rl_driven是 semantic-router 中面向在线探索与个性化的模型选择算法:它不再像静态选择器那样冻结当前的"最优模型",而是让路由决策在交互中持续学习——既可以用 Thompson Sampling 做有原则的探索/利用权衡,也可以接入 Router-R1 风格的 LLM-as-Router 让大模型直接分析查询并选择模型。读完本文,你将掌握rl_driven的三大子模式(Thompson Sampling、Router-R1、Concurrent Arena)、完整配置项与参数含义、反馈学习与状态持久化机制,以及当前仓库中该算法在 v0.3 配置体系下的迁移前提与限制。

概览:什么是 rl_driven

rl_driven(RL-Driven)是 semantic-router 选择(selection)算法族中用于在线学习路由策略的成员,核心思想是"持续探索、持续积累反馈、按用户个性化",而不是固化一个静态排名。v0.3 版本的英文教程将其定位为支持多种子模式的选择算法:

  • Thompson Sampling(默认):基于贝叶斯后验采样实现探索/利用平衡;
  • Router-R1(LLM-as-Router):由外部 LLM 服务器分析查询、执行"think / route"动作来决定路由目标;
  • Concurrent(Arena 模式):作为 looper 算法使用时,并发执行全部候选模型并聚合结果,适合 A/B 测试与 arena 评估。

中文教程指出其对应配置片段为config/fragments/algorithm/selection/rl-driven.yaml(在当前仓库快照中,该 fragment 文件未包含,算法完整实现位于 src/semantic-router/pkg/selection/rl_driven.go,英文教程位于 website/versioned_docs/version-v0.3/tutorials/algorithm/selection/rl-driven.md)。

从源码注释看,该实现的设计参照了 Router-R1 论文(arXiv:2506.09033)的多轮路由与奖励结构:格式奖励、结果奖励与成本奖励的加权组合,另有 GMTRouter(arXiv:2511.08590)作为个性化路由的相关工作被一并提及。

主要优势

  • 支持探索,而非总利用当前最佳模型:算法会在"当前最佳"之外保留随机的、成本感知的探索行为,避免陷入局部最优;
  • Thompson Sampling 提供有原则的探索/利用平衡:以 Beta 分布后验为每个候选建模,采样决策天然带有不确定性感知;
  • Router-R1 模式让 LLM 推理路由:查询复杂度、成本效率与模型能力交由大模型综合权衡;
  • 按用户个性化,路由随交互积累而适应:每个用户维护独立的偏好模型,并通过混合因子与全局偏好融合;
  • 支持隐式反馈:可自动检测的满意度信号(如 satisfied、wrong_answer)以较低权重参与学习;
  • 在线学习行为局部收敛在单条决策:不需要离线重训,学习发生在每次选择与反馈之内。

它解决什么问题?

若路由器应当持续学习而非冻结当前胜者,静态选择器会成为瓶颈:它无法感知"某用户对某模型偏好更强"或"某个新模型值得试探"。rl_driven正是为这些场景暴露基于探索的策略——把学习策略内建在路由器里,让模型选择能随奖励与用户反馈持续改进。

何时使用:

  • 路由应在线探索候选模型;
  • 个性化应随时间适应不同用户;
  • 可以承受一定的探索成本,以换取长期更优的选择;
  • 希望无外部依赖地获得有原则的探索时,优先 Thompson Sampling;
  • 已训练好 router LLM 服务器时,可选用 Router-R1 模式。

三种子模式详解

1. Thompson Sampling(默认)

Thompson Sampling 为每个候选模型的成功概率建模为 Beta 分布:

$$\theta_m \sim \text{Beta}(\alpha_m, \beta_m)$$

每次请求到达时,对每个候选模型从其 Beta 分布中采样一次,选择采样值最高的模型:

$$m^* = \arg\max_m \theta_m$$

收到反馈后按下述规则更新分布:

  • 胜(Win):$\alpha_m \leftarrow \alpha_m + 1$
  • 负(Loss):$\beta_m \leftarrow \beta_m + 1$
  • 平局(Tie):$\alpha_m \leftarrow \alpha_m + 0.5,\ \beta_m \leftarrow \beta_m + 0.5$

当use_thompson_sampling: false时,回退为epsilon-greedy,以exploration_rate作为 $\epsilon$:以概率 $\epsilon$ 随机选一个(成本感知时偏向更便宜的)模型,否则选择后验均值最高的模型。探索率还按exploration_decay随选择次数衰减,并受min_exploration下限约束。

2. Router-R1(LLM-as-Router)

当enable_llm_routing: true且配置了router_r1_server_url时,选择器首先调用外部 Router-R1 LLM 服务器(实现于 src/training/model_selection/rl_model_selection/router_r1_server.py,基于 arXiv:2506.09033 的 think/route 动作模式)分析查询并直接给出路由决策。客户端实现见 src/semantic-router/pkg/selection/router_r1_client.go:向服务端POST /route提交{"query": ...},解析返回的selected_model与thinking;服务端提供/health健康检查端点。若 LLM 选中的模型不在候选列表中,会选择部分匹配;仍不匹配则报错或按llm_routing_fallback回退。

Router-R1 奖励结构:$R = R_{\text{format}} + (1-\alpha) \cdot R_{\text{outcome}} + \alpha \cdot R_{\text{cost}}$

组件说明
$R_{\text{format}}$格式不正确为 -1(由format_reward_penalty指定),正确为 0
$R_{\text{outcome}}$基于与标准答案的精确匹配(Exact Match),取值 0~1
$R_{\text{cost}}$与"模型大小 × 输出 token 数"成反比(按 $10 美元/1M tokens 归一化)
$\alpha$cost_reward_alpha,性能与成本的权衡系数

3. Concurrent(Arena 模式)

当rl_driven以 looper 算法的type: "concurrent"形式使用(如 ratings、fusion、remom 等 looper 家族算法语境,参见 src/semantic-router/pkg/looper 与 config/fragments/algorithm/looper 下的配置片段),可以并发执行全部候选模型并聚合结果——适用于 A/B 测试与 arena 评估场景。源码中SelectMultiRound与AggregateResponses也提供多轮并行查询与结果聚合能力(默认最多max_aggregation_rounds个模型,聚合策略为置信度加权选择,见 rl_driven.go 中MultiRoundResult相关实现)。

选择流程与反馈流程

选择流程(Thompson Sampling 路径)

反馈流程

配置指南

决策级配置示例

中文教程给出如下完整配置(用于routing.decisions[].algorithm中,配合type: rl_driven使用):

algorithm: type: rl_driven rl_driven: exploration_rate: 0.15 exploration_decay: 0.97 min_exploration: 0.03 use_thompson_sampling: true enable_personalization: true personalization_blend: 0.4 session_context_weight: 0.35 implicit_feedback_weight: 0.5 cost_awareness: true cost_weight: 0.2 storage_path: state/rl-driven.json auto_save_interval: 30s use_router_r1_rewards: true cost_reward_alpha: 0.3 format_reward_penalty: -1.0 enable_llm_routing: false router_r1_server_url: "" llm_routing_fallback: thompson enable_multi_round_aggregation: false max_aggregation_rounds: 3

参数表

下表合并了英文教程的默认值与源码 rl_driven.go 中RLDrivenConfig的字段注释、selection_config.go 中RLDrivenSelectionConfig的 YAML 绑定,以及DefaultRLDrivenConfig()的真实默认值:

参数类型默认值说明
exploration_ratefloat0.3初始探索率(epsilon),取值 0~1,越大越爱探索
exploration_decayfloat0.99每 100 次选择后的衰减因子(0~1),越小衰减越快
min_explorationfloat0.05探索率下限(0~1),保证永远保留一点探索
use_thompson_samplingbooltrue使用 Thompson Sampling 而非 epsilon-greedy
enable_personalizationbooltrue按用户维护独立偏好模型
personalization_blendfloat0.7全局与用户偏好的混合因子:1.0 完全个性化,0.0 完全全局
session_context_weightfloat0.3会话内反馈对采样的影响权重(0~1)
implicit_feedback_weightfloat0.5隐式(自动检测)反馈的权重(0~1),默认只算显式反馈的一半
cost_awarenessbooltrue启用成本感知探索(偏好便宜模型)
cost_weightfloat0.2成本在探索/采样中的影响权重
storage_pathstring—RL 状态持久化文件路径(可选)
auto_save_intervalstring30s自动保存间隔;非法值回退到默认 30s(见 auto_save_interval.go)
use_router_r1_rewardsbooltrue启用 Router-R1 风格奖励计算
cost_reward_alphafloat0.3奖励中成本占比:0.0 纯结果、1.0 纯成本
format_reward_penaltyfloat-1.0响应格式不正确时的惩罚值
enable_llm_routingboolfalse启用 LLM-as-Router 模式
router_r1_server_urlstring—Router-R1 LLM 服务器地址(需暴露/route与/health)
llm_routing_fallbackstringthompsonLLM 路由失败时的行为:thompson回退采样,error直接报错
enable_multi_round_aggregationboolfalse启用多轮路由(并行查询多个模型并聚合)
max_aggregation_roundsint3多轮模式最多查询的模型数(默认 3,且不超过候选数)

源码默认值速查

DefaultRLDrivenConfig()(rl_driven.go)中与上述表格一致的关键默认:ExplorationRate=0.3、ExplorationDecay=0.99、MinExploration=0.05、UseThompsonSampling=true、EnablePersonalization=true、PersonalizationBlend=0.7、SessionContextWeight=0.3、ImplicitFeedbackWeight=0.5、CostAwareness=true、CostWeight=0.2、UseRouterR1Rewards=true、CostRewardAlpha=0.3(30% 成本、70% 结果)、FormatRewardPenalty=-1.0。未配置时选择器会使用这套默认值(NewRLDrivenSelector(nil)即走默认分支,测试TestNewRLDrivenSelector对此有覆盖)。

源码级实现解析

三层偏好结构

RLDrivenSelector内部维护了四类状态(见 rl_driven.go):

  • globalPreferences:全局共享偏好;
  • userPreferences:user_id → model → preference的用户级偏好;
  • categoryPreferences:category → model → preference的类别级偏好;
  • sessionContext:session_id → model → SessionModelStats的会话内近期表现统计。

选择时getPreference按优先级融合:先取全局,再按PersonalizationBlend与用户偏好混合,若命中决策名(类别)还会再与类别偏好混合 0.3 权重(rl_driven.go)。混合是对 Beta 分布参数的加权和(blendPreferences),测试TestRLDrivenSelector_BlendPreferences验证了该公式。InitializeFromConfig会以均匀先验Beta(1,1)初始化全局偏好,并把模型配置中的Pricing.PromptPer1M写入成本表、把类别ModelScores静态评分换算为 Beta 先验(alpha = 1 + score×10)。

Beta 采样:Marsaglia–Tsang 的 Gamma 变体

BetaDistribution.Sample()通过 Gamma 分布比值法生成:$X \sim \text{Beta}(a,b) = \frac{\text{Gamma}(a,1)}{\text{Gamma}(a,1)+\text{Gamma}(b,1)}$,其中 Gamma 变体采用 Marsaglia 与 Tsang 算法(gammaVariate,alpha<1 时先做提升变换),随机数全部来自math/rand/v2的并发安全包级函数。测试TestBetaDistribution_Sample以 10000 次采样的均值逼近理论均值验证了正确性,TestBetaDistribution_ConcurrentSample与TestRLDrivenSelector_ConcurrentSelect(32 goroutine 并发压测)验证了并发安全。

成本感知与会话上下文

  • applyCostBonus:将模型成本在候选池内归一化到 0~1,便宜模型获得(1-normalizedCost) * cost_weight的采样加成(rl_driven.go);
  • selectRandomModel:epsilon-greedy 探索时按成本排序,50% 概率从最便宜的三分之一中选(rl_driven.go);
  • applySessionContext:用会话内胜率Successes/Selections与当前采样值按SessionContextWeight加权(rl_driven.go);
  • calculateConfidence:以1 - 4×variance度量分布确定度,并用交互次数的 sigmoid 因子平滑,最终钳制在 0~1(rl_driven.go)。

可观测性

每次选择都会通过RecordRLSelection记录指标、构造人类可读的Reasoning(如RL-driven: [Thompson Sampling: sampled=0.82, Beta(8.0, 2.0), mean=0.800, personalized for user=xxx]);GetLeaderboard/GetUserLeaderboard按后验均值排序输出模型榜单,GetDebugState导出配置与全局/用户偏好快照,便于排查。

反馈学习机制

Feedback结构(selector.go)包含:WinnerModel、LoserModel、Tie、DecisionName、UserID、SessionID、FeedbackType(隐式反馈类型,取值如satisfied、need_clarification、wrong_answer、want_different)与Confidence(0~1)。更新逻辑(UpdateFeedback,见 rl_driven.go):

  • 先经NormalizeFeedback规范化与校验(winner/loser 至少其一、不得自比、confidence 必须在 0~1,见 feedback.go);
  • 隐式反馈按ImplicitFeedbackWeight × Confidence加权:测试TestRLDrivenSelector_ImplicitFeedback验证 alpha 增量约为0.5 × 0.8 = 0.4;
  • 反馈同时更新全局、用户(个性化开启且带 UserID)、类别(带 DecisionName)三级偏好,并更新会话上下文;
  • 胜者 alpha 增加、负者 beta 增加、平局双方各加 0.5(updatePreference,rl_driven.go)。

测试TestRLDrivenSelector_UpdateFeedback、TestRLDrivenSelector_Personalization(100 次选择中 model-a 被选中超 60 次)与TestRLDrivenSelector_SessionContext分别覆盖了比较反馈、个性化生效与会话统计更新。

状态持久化与多副本注意事项

配置storage_path后,选择器通过NewFileEloStorage持久化全局、用户(键前缀_rl_user:)、会话(前缀_rl_session:,均 base64 URL 编码)与类别偏好(rl_driven.go):Beta 均值被换算为 Elo 风格评分(约 1000~2000),重启后可还原为 Beta 先验。auto_save_interval会经config.ParsePeriodicInterval校验,非法值回退默认 30s 而非报错。测试 rl_driven_storage_test.go 验证了"写入→关闭→重载"后用户偏好与会话统计完整恢复。

英文教程给出明确警告(v0.3):多副本场景下,RL 驱动的偏好与会话上下文属于本地学习状态——若只保存在内存或本地storage_path,多副本之间无法共享。在 Helm 部署中,当某个生效决策使用algorithm.type: rl_driven时,多副本渲染默认会被拒绝;需要保持单副本,或先将选择器状态外置再关闭该安全护栏。

版本迁移注意事项:rl_driven 与 global.router.learning.adaptation

以当前仓库源码为准,存在一个重要的适用前提:在 v0.3 规范中,rl_driven这类跨请求学习型算法已从决策级algorithm.type迁出。验证器 validator_decision.go 会对algorithm.rl_driven直接报错:"algorithm.rl_driven is no longer supported; use global.router.learning.adaptation";配置加载器 loader.go 同样将global.router.model_selection下的rl_driven视为已移除字段,并建议迁移到global.router.learning.adaptation与global.router.learning.protection(学习建议 + 稳定性保护的在线学习体系,配置结构见 learning_config.go,支持enabled、candidate_set、strategy等字段)。同时,src/training/model_selection/rl_model_selection/README.md 明确说明 Router-R1/GMTRouter 训练原型"未接入 semantic-router 运行时或受支持的配置 schema",router_r1_server.py只是独立演示服务器。

因此实践时请区分两种场景:阅读与理解算法原理,rl_driven的源码与测试是权威参考;在生产 v0.3 配置中直接使用,则需按迁移提示改用global.router.learning.adaptation体系,或保持本教程描述的旧版决策级配置并确认你所用发行版仍支持该 schema。

已知限制

  • Thompson Sampling 在样本足够前(min_samples效应)难以有效利用,需要一定交互量;
  • Router-R1 的 LLM 路由会给每次请求增加额外 LLM 调用的延迟;
  • Router-R1 模式需要独立部署并训练 router LLM 服务器(参考 router_r1_server.py 的演示实现);
  • 探索会带来短期成本,以换取长期更优选择;
  • 偏好与会话状态默认是本地学习状态,多副本部署需外置状态或保持单副本。

结语

rl_driven把"探索—反馈—个性化"的在线学习闭环内建到路由决策中:底层是扎实的贝叶斯 Thompson Sampling,上层可插拔 Router-R1 的 LLM 路由与多轮聚合,并辅以成本感知、会话上下文、三层偏好融合与文件持久化。无论你是想为候选模型池引入有原则的探索,还是想实现按用户自适应的个性化路由,本文给出的配置示例、参数表与源码级原理都可以作为直接起点;同时请务必确认你所使用的 semantic-router 版本是否支持决策级rl_driven,在 v0.3 当前代码中它已迁移至global.router.learning.adaptation学习体系。

  • 后端
  • API网关
  • 模型推理服务
  • AI Agent

【免费下载链接】semantic-router

An open, programmable decision layer for models and compute.

项目地址:https://gitcode.com/gh_mirrors/sem/semantic-router
点击查看免费下载

相关推荐

上一篇:WarcraftHelper魔兽兼容性修复:让经典游戏在现代电脑上完美运行
下一篇:如何免费永久备份微信聊天记录:完整指南与实用技巧

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 2:30:29

WinForm + SQLite + EF:内部工具快速重构的可靠技术选型

简介&#xff1a;这是一套面向WinForm桌面开发者的SQLite集成示例工程&#xff0c;基于.NET Framework 4.8&#xff0c;演示如何借助EntityFramework ORM框架完成SQLite数据库的读取、新增与删除操作。工程内置主窗口列表展示数据&#xff0c;并封装了EF数据访问层&#xff0c;…

作者头像 李华
网站建设 2026/10/13 2:30:15

应急响应|客户勒索病毒中招 无安全设备下的五分钟极速溯源复盘

本篇文章共 4000字&#xff0c;完全阅读全篇约5分钟 州弟学安全&#xff0c;只学有用的知识 前言 大家好&#xff0c;我是州弟。 上周给大家分享了关于近期渗透测试中高危逻辑漏洞挖掘的思路&#xff0c;得到了不少师傅的反馈。今天咱们换个视角&#xff0c;从红队进攻转到蓝…

作者头像 李华
网站建设 2026/10/13 2:28:46

AI Agent 面试题 106:如何设计Agent架构的中间件层?

&#x1f525; AI Agent 面试题 106&#xff1a;如何设计Agent架构的中间件层&#xff1f;摘要&#xff1a;本文深入解析了「如何设计Agent架构的中间件层&#xff1f;」这一 AI Agent 领域的核心面试题。文章从 混合架构模式 的基本概念出发&#xff0c;系统性地剖析了 中间件…

作者头像 李华
网站建设 2026/10/13 2:28:44

Haproxy+Keepalived+PXC构建MySQL强一致高可用架构

1. 项目概述&#xff1a;为什么需要这套组合拳来扛住数据库流量洪峰在某次支撑某高校在线选课系统的压测中&#xff0c;我亲眼见过单台MySQL实例在峰值时段每秒被砸进3200个连接请求&#xff0c;CPU直接飙到98%&#xff0c;慢查询日志里堆满了超过5秒的SELECT语句。那一刻我就意…

作者头像 李华
网站建设 2026/10/13 2:27:57

银行存储架构智能化改造:从传统稳定到AI数据底座

在金融基础设施这行摸爬滚打了快十年&#xff0c;前几年干得最多的活儿是给核心账务系统做存储双活演练&#xff0c;一帧都不能丢、一个字节都不能错&#xff0c;那是银行存储的命根子。但最近这一两年&#xff0c;风向明显变了&#xff1a;行里大会上反复出现的关键词已经从数…

作者头像 李华