Semantic Router Elo 算法指南:基于 Bradley-Terry 的在线反馈模型选择与评分

发布时间:2026/10/15 16:02:32
Semantic Router Elo 算法指南:基于 Bradley-Terry 的在线反馈模型选择与评分 后端API网关模型推理服务AI Agent【免费下载链接】semantic-routerAn open, programmable decision layer for models and compute.项目地址https://gitcode.com/gh_mirrors/sem/semantic-router点击查看免费下载elo是 Semantic Routerv0.3 文档体系中一类反馈驱动的模型选择算法它用 Elo 式的评分系统对候选模型进行两两比较并持续更新排名。本文以 elo.md 为主体结合 pkg/selection/elo.go 的源码实现完整讲解算法原理、选择流程、反馈 API、持久化机制与全部配置参数读完即可在路由决策中配置并使用algorithm.type: elo实现越用越准的在线模型排序。概述elo 是什么elo是一种基于历史成对比较pairwise comparison反馈的模型选择算法。它不再依赖一次性启发式规则而是把用户/评估者每一次哪个模型表现更好的反馈沉淀为可复用的评分候选模型通过 Elo 评分系统被持续排序评分随新反馈不断演化。该算法在源码中作为一类独立的选择方法存在其方法标识定义于 pkg/selection/selector.go// MethodElo uses Elo rating system with Bradley-Terry model // Models are scored based on pairwise comparisons using preference feedback MethodElo SelectionMethod elo其理论依据是RouteLLM: Simple and Effective LLM RoutingarXiv:2406.18665一文核心是利用Bradley-Terry 模型做成对偏好学习在 pkg/selection/selector.go 的包注释中同样明确标注了该论文引用。核心优势复用历史反馈不只看当前请求的即时启发式信号而是利用历史积累的成对偏好数据。在线学习随着更多比较反馈到达评分持续更新无需重新训练模型。类别加权支持按决策类别维护独立评分不同工作负载互不干扰。可配置时间衰减可逐步遗忘过时比较适应模型能力漂移。成本感知可选在质量与价格之间做可配置的权衡。算法原理Bradley-Terry 模型与 Elo 更新Elo 评分建立在Bradley-Terry 模型之上该模型估计模型 A 优于模型 B的概率$$P(A \succ B) \frac{1}{1 10^{(R_B - R_A) / 400}}$$每次成对比较后评分按如下规则更新$$R_A R_A K \cdot (S_A - E_A)$$其中$K$ 为学习率配置项k_factor默认 32值越大评分波动越剧烈$S_A$ 为实际结果胜 1.0、负 0.0、平 0.5$E_A P(A \succ B)$ 为期望得分。源码中这条公式被完整实现于 pkg/selection/elo.go 的applyPairwiseFeedbackLocked// Calculate expected scores using Bradley-Terry model // E_a 1 / (1 10^((R_b - R_a) / 400)) expectedWinner : 1.0 / (1.0 math.Pow(10, (loserRating.Rating-winnerRating.Rating)/400.0)) expectedLoser : 1.0 - expectedWinner // Determine actual scores actualWinner, actualLoser : 1.0, 0.0 if feedback.Tie { actualWinner 0.5 actualLoser 0.5 } // Update ratings: R R K * (actual - expected) winnerRating.Rating e.config.KFactor * (actualWinner - expectedWinner) loserRating.Rating e.config.KFactor * (actualLoser - expectedLoser)注意平局tie时胜负双方实际得分各取 0.5更新后评分总和守恒。每次比较同时累加Comparisons并根据是否平局分别统计Wins/Losses/Ties。当开启category_weighted时每个决策维护独立的按类别评分categoryRatings以decision name → model → rating的映射存储见 elo.go因此模型在 math 类别的表现不会影响其 coding 类别评分。源码实现EloSelector 的构成与初始化配置结构与默认值EloConfig结构体定义于 pkg/selection/elo.go字段与 YAML 配置一一对应其默认值来自 DefaultEloConfig 与顶层常量常量值含义DefaultEloRating1500.0新模型的初始评分EloKFactor32.0默认学习率EloMinRatingFromScore1000.0静态分数0–1转换 Elo 的基准EloRatingRange1000.0分数区间0–1 映射到 1000–2000默认配置为InitialRating1500、KFactor32、CategoryWeightedtrue、DecayFactor0.0、MinComparisons5、CostScalingFactor0.0。评分数据结构每个模型维护一条ModelRating记录elo.go包含评分与胜负平统计同时作为持久化 JSON 结构type ModelRating struct { Model string json:model Rating float64 json:rating Comparisons int json:comparisons Wins int json:wins Losses int json:losses Ties int json:ties }注册与工厂装配elo通过 pkg/selection/factory.go 的Factory.Create()创建case MethodElo分支先构造NewEloSelector(f.cfg.Elo)再调用InitializeFromConfig(f.modelConfig, f.categories)用模型配置初始化评分与成本在CreateAll()中还会注册到全局Registryfactory.go便于运行时按方法名取出。InitializeFromConfigelo.go承担冷启动种子职责为所有配置中的模型建立全局评分初始值取InitialRating从模型配置的Pricing.PromptPer1M读取成本供成本感知选择使用若开启category_weighted则把每个类别下的静态分数ModelScores0–1线性映射为 Elo 评分rating 1000 score * 1000。关于学习到的评分不应被静态种子覆盖这一点elo_category_seed_test.go 专门做了回归测试从存储恢复出的已学习评分如 1740在InitializeFromConfig之后保持不变而缺失的模型才使用静态分数作为种子见 TestInitializeFromConfigSeedsMissingCategoryRating。选择流程Select整体选择流程如下Select的源码实现elo.go与流程图中按评分排名的直观描述略有差异实际采用概率化加权选择取评分getRatingsForCandidates按决策名优先查类别评分缺失则回退全局评分再回退到initial_rating对应流程图中Enough comparisons?的 fallback 分支。计算选择概率以标准 Elo 概率尺度P_i 10^(R_i/400) / Σ 10^(R_j/400)归一化为分数这是 Bradley-Terry 模型的等价形式。成本调整若CostScalingFactor 0且SelectionContext.CostWeight 0调用applyCostAdjustment见下节。选出最优取分数最高的模型并基于评分稳定性计算置信度。成本感知调整applyCostAdjustmentelo.go先把各候选成本归一化到 0–10 为最便宜1 为最贵再对便宜模型加成分数normalizedCost : (cost - minCost) / (maxCost - minCost) costBonus : (1.0 - normalizedCost) * costWeight * e.config.CostScalingFactor scores[model] * (1.0 costBonus)当所有候选成本相同maxCost minCost时不做任何调整costWeight来自请求上下文cost_scaling_factor决定整体权衡强度。置信度计算calculateConfidenceelo.go用 sigmoid 函数把比较次数映射到 0–1 置信度min_comparisons即阈值k : 0.2 // Steepness threshold : float64(e.config.MinComparisons) confidence : 1.0 / (1.0 math.Exp(-k*(float64(rating.Comparisons)-threshold)))比较次数达到阈值后置信度快速趋近于 1评分尚不稳定时置信度较低。选中的SelectionResult会携带Method: MethodElo、Score、Confidence以及形如Selected based on Elo rating 1568.0 (win rate: 20/30)的Reasoning类别加权模式下还会加上Category xxx:前缀。GetLeaderboardelo.go则按评分降序返回全部模型的排行榜可用于调试与监控。反馈流程Feedback反馈是elo学习的唯一数据来源整体流程如下反馈 API通过 HTTP 接口提交成对反馈以更新 Elo 评分curl -X POST http://localhost:8000/api/v1/feedback \ -H Content-Type: application/json \ -d { query: Solve: 2x 5 15, winner_model: gpt-4, loser_model: llama-3.2-3b, decision_name: math_reasoning }反馈字段说明字段必填说明query是原始查询文本winner_model是更优的模型名loser_model否被否定的模型用于成对比较tie否两个模型表现相当decision_name否类别上下文用于类别加权 Elouser_id否用户标识按用户追踪confidence否反馈置信度0.0–1.0源码中的三种反馈模式Feedback结构定义于 pkg/selection/selector.go除了文档表格列出的字段还包含response响应文本、session_id、conversation_id、feedback_type取值如satisfied、need_clarification、wrong_answer、want_different与timestamp供隐式反馈与多轮会话场景使用。UpdateFeedbackelo.go的处理路径是先NormalizeFeedback规范化并校验再更新全局评分若开启category_weighted且提供了decision_name则同步更新类别评分最后persistRatings。其内部updateRatingLockedelo.go支持三种模式成对比较WinnerModel与LoserModel都设置标准 Elo 更新走applyPairwiseFeedbackLocked正向单模型反馈仅WinnerModelapplyWinnerOnlyFeedbackLocked给予K * 0.1的小幅奖励约为 K 因子的 10%用于信号驱动、只知道某个模型表现好的场景负向单模型反馈仅LoserModelapplyLoserOnlyFeedbackLocked施加同等幅度的小幅惩罚。反馈校验契约feedback.go 定义了严格的反馈契约与对应错误反馈对象为空 →ErrFeedbackRequiredwinner_model与loser_model均为空 →ErrFeedbackModelRequired两个模型名相同含去空格后相同→ErrFeedbackSelfComparison禁止自我比较confidence超出 [0,1]、为 NaN 或无穷 →ErrFeedbackConfidenceRange。NormalizeFeedback还会对所有状态键模型名、决策名、用户/会话/对话 ID、反馈类型做TrimSpace规范化feedback_test.go 与 TestValidateFeedbackRejectsInvalidContracts 覆盖了上述全部边界情况。持久化与自动保存elo的评分是本地学习状态。配置storage_path后评分通过FileEloStoragepkg/selection/storage.go持久化为 JSON 文件包含version、last_updated、global_ratings与category_ratings四个部分StoredRatings结构见 storage.go。几个值得注意的实现细节原子写入saveToFile先写临时文件path .tmp再os.Rename原子替换避免中途崩溃产生半截文件storage.go。防御性加载文件不存在或为空时返回全新状态文件损坏时先备份为path .corrupted再报错storage.go。数据清洗sanitizeRatings会把评分钳制在100–3000合理区间并把负数的胜负平统计归零storage.go。启动加载NewEloSelector配置了存储路径后会先loadFromStorage()恢复已有评分再启动后台自动保存elo.go。自动保存StartAutoSave以后台 goroutine 定期把脏状态MarkDirty标记写入磁盘关闭时做最后一次保存storage.go。auto_save_interval若缺失或非法会回退到默认的30sauto_save_interval.go因此文档示例中的1m仅是合法取值之一。多副本状态告警:::warning Multi-replica stateElo 评分无论是保存在内存还是本地storage_path都属于本地学习状态。在 Helm 部署下只要某个活跃决策使用了algorithm.type: elo多副本 router 渲染默认会被拒绝——因为各副本的本地评分会各自演化、产生不一致的选择结果。请保持单一 router 副本或将选择器状态外部化如共享存储/外部服务再考虑关闭该安全护栏。:::配置详解完整配置片段如下对应ModelSelectionConfig.Elo解析于 pkg/selection/factory.goalgorithm: type: elo elo: initial_rating: 1500 # 新模型的起始评分 k_factor: 32 # 学习率越高波动越大 category_weighted: true # 启用按类别独立评分 decay_factor: 0.0 # 旧比较的时间衰减0 不衰减 min_comparisons: 5 # 评分稳定所需的最小比较次数 cost_scaling_factor: 0.0 # 成本权重0 忽略成本 storage_path: /var/lib/vsr/elo_ratings.json # 评分持久化文件路径 auto_save_interval: 1m # 自动保存频率参数一览参数类型默认值说明initial_ratingfloat1500新模型的起始 Elo 评分k_factorfloat32评分波动性建议范围 1–100category_weightedbooltrue启用按类别独立评分decay_factorfloat0.0旧比较的时间衰减0–1min_comparisonsint5评分稳定所需的最小比较次数cost_scaling_factorfloat0.0每 1M tokens 成本惩罚0 忽略storage_pathstring—Elo 评分的持久化文件路径auto_save_intervalstring1m自动保存间隔如5m、30s源码默认回退 30s参数背后的实现影响initial_rating决定新模型冷启动时的起点也用于无记录时的评分回退getRatingsForCandidates的最后兜底分支decay_factor目前作为配置契约保留默认 0 表示不衰减。k_factor直接缩放每次更新的步长updateRatingLocked系列函数与单模型反馈K * 0.1都依赖它。category_weighted控制Select优先查类别评分还是全局评分elo.go也决定反馈是否同步更新类别评分。min_comparisons作为置信度 sigmoid 的阈值比较次数越过该值后置信度快速上升。cost_scaling_factor只有大于 0 且请求携带CostWeight时才启用成本调整。storage_path/auto_save_interval控制评分生命周期的两个关键参数——前者决定是否启用文件持久化后者决定落盘频率不配置storage_path时评分仅存内存。它解决了什么问题当模型质量随时间漂移时静态优先级列表与一次性启发式会迅速过时。elo让路由从成对反馈中持续学习使候选排名反映的是观测到的实际胜负而不是冻结的假设。源码中的 selector_elo_test.go 直观演示了这一演化过程通过 10 轮强胜中、中胜弱、强胜弱的模拟反馈strong-model/medium-model/weak-model的评分严格按预期排序强 中 弱排行榜顺序与胜负统计强 20 胜、弱 20 负均被断言验证——这就是评分随反馈演化的最小闭环。何时使用你能够收集路由级别route-level的反馈或质量比较排名需要随着更多比较反馈持续提升某条路由存在可重复的工作负载评分体系能沉淀价值你希望在线学习而不想为每次模型切换重新训练。已知限制需要足够的成对比较评分在稳定之前需要足够样本由min_comparisons控制冷启动问题新模型一律从initial_rating起步与真实能力无关不过可借助类别的静态ModelScores种子加速收敛无语义理解elo纯粹由反馈驱动不分析查询语义。进一步探索想深入验证或改造elo行为可以围绕以下源码文件继续阅读核心实现pkg/selection/elo.go选择、反馈更新、成本调整、置信度、排行榜方法注册与装配pkg/selection/factory.go、pkg/selection/selector.go反馈校验契约pkg/selection/feedback.go持久化实现pkg/selection/storage.go、pkg/selection/auto_save_interval.go测试用例selector_elo_test.go、elo_category_seed_test.go、feedback_test.go指标观测pkg/selection/metrics.goModelEloRating、ModelComparisons、ModelWinRate等指标随选择与反馈自动上报其中elo在源码的算法分级测试中被归类为TierSupported生产可用tier_test.go无需额外外部依赖即可运行适合作为反馈闭环型路由的落地起点。赞分享后端API网关模型推理服务AI Agent【免费下载链接】semantic-routerAn open, programmable decision layer for models and compute.项目地址https://gitcode.com/gh_mirrors/sem/semantic-router点击查看免费下载相关推荐Semantic Router 的 Elo 评分模型选择基于在线反馈的动态路由算法指南Semantic Router 的 Elo 评分模型选择基于在线反馈的动态路由算法指南 本文围绕 vLLM Semantic Router 项目中的 Elo后端API网关模型推理服务AI Agentsemantic-router 的 Elo 选择算法基于反馈评分驱动的模型路由实践指南semantic router 的 Elo 选择算法基于反馈评分驱动的模型路由实践指南 导读 本文围绕 semantic router 提供的 elo 模型选后端API网关模型推理服务AI Agentsemantic-router 中的 Elo 评分模型选择运行时在线学习选路算法实现指南semantic router 中的 Elo 评分模型选择运行时在线学习选路算法实现指南 本文围绕 semantic router 的 Elo Rating后端API网关模型推理服务AI Agent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询