semantic-router 的 decision 选择算法:让决策模型为每条请求挑选最合适的模型
后端API网关模型推理服务AI Agent【免费下载链接】semantic-routerAn open, programmable decision layer for models and compute.项目地址https://gitcode.com/gh_mirrors/sem/semantic-router点击查看免费下载导读decision是 vLLM semantic-router 路由决策decision中一种基于决策模型的候选模型选择算法selection algorithm当某条路由匹配后路由器不再按固定顺序或静态分数选模型而是把请求原文与每个候选模型的文字描述一起交给一个决策模型由它一次性给出每个候选的概率概率最高者应答。本篇将结合仓库源码与官方配置片段完整讲解该算法的适用场景、两套配置写法、参数约束、降级兜底与可观测性机制帮助你把它正确接入自己的路由配置。一、算法概述一个模型一次提问选出应答者decision选择算法的核心行为是向一个决策模型提问路由决策中的哪些modelRefs应该回答这条请求。你为每个候选模型写一句话描述模型通读整条请求后给每个候选一个概率概率最高的候选被选中。官方文档 对其定义为由模型选择而模型会阅读整条请求而非只看少量元数据默认复用 Router 自己的决策模型因此选择过程不需要额外加载第二份模型副本每个候选都会得到一个概率并显示在 selection traces选择轨迹中当模型无法在时限内作答时回退到第一个modelRef保证路由始终可用。它解决什么问题如果没有选择算法路由只能按固定的modelRefs顺序取第一个模型这完全无视请求内容如果让一个普通聊天模型来挑选则需要一次文本生成的往返generation round trip外加输出解析。而决策模型回答的是同一个问题却一次推理即完成直接返回概率分布不需要文本生成天然适配路由的高频低延迟路径。何时使用推荐使用决策decision有 2 个及以上候选且每个候选的优势可以用一句话描述并且选谁取决于请求本身问什么。改用static当顺序永远不变、无需感知请求内容时用static默认取modelRefs第一项确定性、零依赖参见 static 算法文档。改用multi_factor当选择目标主要是成本、延迟或负载时用multi_factor基于 quality/latency/cost/load 加权或字典序目标做权衡参见 multi_factor 算法文档。二、工作原理从请求到概率的完整链路从源码看该算法在运行期被编译为一次针对内置model_selection任务的 Choice 提问。关键实现位于选择器实现src/semantic-router/pkg/selection/decision_model.go配置结构与超时src/semantic-router/pkg/config/decision_signal.go模型运行时绑定src/semantic-router/pkg/extproc/req_filter_decision_model_selector.go预编译模型卡片src/semantic-router/pkg/extproc/decision_selection_prepare.go整体流程可以概括为四步决策匹配请求先经过routing.signals.decision中定义的问题如request_kind选择问题当路由规则的AND/OR条件命中本例request_kind code后路由进入选择阶段。构建候选DecisionModelSelector.choices()遍历modelRefs为每个候选生成{Key: 模型名, Description: 描述}。描述优先级为algorithm.decision.candidates中显式给出的描述 → 模型自身配置的 description → 模型名本身。一次提问invoke闭包见req_filter_decision_model_selector.go构造Question{ID: selector, Type: choice}通过内置BuiltinTask(model_selection)编译任务计划携带请求状态state即请求文本和候选列表向指定 deployment 发出单次调用。产出分数模型返回Choice、Probabilities与Confidence。每个候选的概率直接成为该候选的选择分数CandidateScores概率最高者即SelectedModel并附带一条形如decision model deployment chose model的推理说明Reasoning。单测 src/semantic-router/pkg/selection/decision_model_test.go 精确印证了这一契约模型返回{large: 0.3, small: 0.7}时选择器选中small得分 0.7同时AllScores保留全部概率候选描述缺失时回落到模型配置描述如测试中small的 Fast and cheap。请求复用与模型卡片预编译默认场景下选择器不指定 deployment会复用路由决策模型所在的 deployment——也就是已经回答了请求内置信号的那份模型因此不需要加载第二份模型副本no second copy。在构建期prepareDecisionSelectionCards会遍历所有可达路由配方为每个type: decision的选择器预取模型卡片并校验card.Serves(decisions)即该部署必须支持 decisions 能力面同时在卡片上预编译任务计划请求路径只读取这份快照不会在请求时做模型发现。三、配置详解一复用 Router 默认决策模型不写deployment时选择工作交给global.model_catalog.system.decision_model指向的决策模型。默认决策模型为Vela 2.0 0.3B除非你按 选择模型大小 换成更大尺寸。完整配置如下来自 官方决策文档global: model_catalog: deployments: primary: provider: model_runtime artifact: vllm-sr/Vela-2.0-4B device: rocm system: decision_model: deployment: primary routing: signals: decision: - name: request_kind question: type: choice instructions: What kind of request is this? choices: - key: code description: Writing, reviewing or debugging code - key: chat description: Anything else decisions: - name: code-route priority: 100 rules: operator: AND conditions: - type: decision name: request_kind label: code modelRefs: - model: qwen3-8b use_reasoning: false - model: qwen3-32b use_reasoning: true algorithm: type: decision decision: instructions: Which model should answer this request? candidates: qwen3-8b: Fast general model for routine code qwen3-32b: Strong reasoning model for hard code timeout_ms: 1000该示例揭示了几个要点决策模型通过global.model_catalog.system.decision_model.deployment: primary绑定到primary部署。源码 src/semantic-router/pkg/config/decision_model.go 中DecisionModelDeployment()会校验该 deployment必须存在且使用provider: model_runtime否则直接报错must use provider model_runtimedecision_model.deployment必须精确命名一个已声明的部署。选择器的默认绑定可能解析为 Vela 或 Decision 1.0/2.0 家族被选中的资源必须支持 choice 任务prepareDecisionSelectionCards中的Serves(decisions)校验就是为此设计。选择发生在决策匹配之后且是对同一 deployment 的一次独立调用in its own call——即信号评估与模型选择是两个任务只是共享同一份模型副本。四、配置详解二显式指定其他决策模型如 Decision 2.0如果想让另一个模型来挑选——比如一个专门的 Decision 2.0 模型——在信号和选择器上各命名一个model_runtime部署即可global: model_catalog: deployments: decision-kai: provider: model_runtime artifact: vllm-sr/Decision-2.0-Kai-0.6B routing: signals: decision: - name: request_kind deployment: decision-kai question: type: choice instructions: What kind of request is this? choices: - key: code description: Writing, reviewing or debugging code - key: chat description: Anything else decisions: - name: code-route priority: 100 rules: operator: AND conditions: - type: decision name: request_kind label: code modelRefs: - model: qwen3-8b use_reasoning: false - model: qwen3-32b use_reasoning: true algorithm: type: decision decision: deployment: decision-kai instructions: Which model should answer this request? candidates: qwen3-8b: Fast general model for routine code qwen3-32b: Strong reasoning model for hard code timeout_ms: 1000这里decision-kai同时出现在两处routing.signals.decision[].deployment让信号问题由它作答和algorithm.decision.deployment让选择问题也由它作答。源码中DecisionSelectorDeployment()decision_model.go的规则是选择器显式命名 deployment 时覆盖默认绑定未命名时回落到决策模型共享部署。官方片段 config/fragments/algorithm/selection/decision.yaml 给出了同样的配置模板并带上了固定 revisioncd49ea3813fd8ba0928a9a23ef6c9a0f2f0cd764确保同一名字始终加载同一份文件。五、参数约束与校验规则DecisionSelectionConfig的结构定义于 src/semantic-router/pkg/config/decision_signal.go字段说明约束 / 默认值deployment选择器使用的部署省略则复用路由决策模型所在部署命名时必须为provider: model_runtime不能带多余空白instructions给决策模型的问题描述必填不能为空candidates模型名 - 一句话描述的映射只能描述该 decision 的modelRefs中的模型未描述者使用其配置的描述timeout_ms单次选择调用的截止时间取值[1, 60000]缺省时使用DefaultDecisionTimeoutMs 10001 秒校验逻辑在 src/semantic-router/pkg/config/validator_decision_signal.go 的validateDecisionSelectorConfig中实现常量定义于 decision_signal.go候选数量decision 需要2 到 255 个不同的modelRefsMinDecisionChoices 2、MaxDecisionChoices 255且模型名不能重复candidates 键必须属于 modelRefscandidates中出现任何一个未在modelRefs中声明的模型名都会导致配置校验失败instructions必填timeout_ms超过MaxDecisionTimeoutMs60000 ms会被拒绝命名 deployment 不得带首尾空白且必须指向model_runtime部署。六、降级兜底与可观测性降级到第一个 modelRef当模型未就绪not ready、应答超时answers late、过载overloaded或返回非法答案invalid answer时Router 会记录一次选择降级selection fallback并使用modelRefs中第一个候选。源码 src/semantic-router/pkg/extproc/req_filter_classification_selector.go 定义了细粒度的降级原因码例如selector_timeout/selector_cancelled调用超时或被取消selector_invocation_failed模型运行时调用失败selector_invalid_output/selector_undeclared_candidate模型返回了非法答案或未声明的候选selector_unavailable选择器不可用。recordSelectionFallback会把降级结果构造成一个SelectionResult选中第一个 modelRef得分记 0同时累计 Prometheus 指标ModelSelectionFallbackTotal按 method/decision/reason 分桶见 src/semantic-router/pkg/selection/metrics_selection_events.go以及ModelSelectionTotal、ModelSelectionDuration、ModelSelectionScore等常规选择指标src/semantic-router/pkg/selection/metrics.go。响应头与预览x-vsr-selected-model选中的模型会通过该响应头报告给调用方常量定义于 src/semantic-router/pkg/headers/headers.go。Routing Preview管理 API 的POST /api/v1/routing/preview路径定义见 src/semantic-router/pkg/apiserver/api_paths.go会向决策模型提出同样的选择问题并把其选择报告为 selected model不会调用后端生成答案。这让你可以在不产生实际推理成本的情况下验证路由与选择逻辑。选择器本身的单测decision_model_test.go还覆盖了两类关键失败invoke 返回错误时映射为ErrDecisionModelInvocation模型返回未声明候选时映射为ErrDecisionModelAnswer——两者都会在外层触发上述降级路径。七、如何挑选决策模型决策模型的选型直接决定选择质量与延迟。建议从最小且足够准确的模型开始模型规模适合运行特点vllm-sr/Decision-2.0-Kai-0.6B0.6BCPU16 核约 0.2s 回答两个问题或任意 GPU快速、简单的路由问题默认起点vllm-sr/Decision-2.0-Eos-0.8B0.8BCPU 或任意 GPU稍难的问题成本相近vllm-sr/Decision-2.0-Sol-2B2BGPU低流量下可 CPU需要更多判断力的问题vllm-sr/Decision-2.0-Nox-4B4BGPU更细粒度的问题、更多选项vllm-sr/Decision-2.0-Lux-9B9BGPU24GB 及以上中等成本下的最高准确率vllm-sr/Decision-2.0-Vega-27B27B64GB 及以上单 GPU总体最准确完整的选型建议、各尺寸在 Router 信号套件上的准确率与延迟记录参见 决策模型指南 与 选择模型。编写candidates描述时遵循像请教同事一样写 instructions每个选项用几个词描述清楚的原则——短而具体的选项通常能得到最可靠的答案。八、小结decision选择算法把让谁回答从固定顺序或文本生成中解放出来一次决策模型调用即可拿到完整概率分布默认复用 Router 已有的决策模型副本失败时自动降级到首个modelRef并辅以x-vsr-selected-model响应头、selection traces 与 Prometheus 指标保证可观测性。配置上只需记住三条边界——候选数在 2 到 255 之间、candidates只能描述modelRefs内的模型、命名 deployment 必须为model_runtime。需要按成本/延迟/负载权衡时改用multi_factor需要确定性基线时改用static而让模型读懂请求再决定的场景正是decision的主场。赞分享后端API网关模型推理服务AI Agent【免费下载链接】semantic-routerAn open, programmable decision layer for models and compute.项目地址https://gitcode.com/gh_mirrors/sem/semantic-router点击查看免费下载相关推荐Serge模型选择指南如何根据需求挑选最适合的AI模型Serge模型选择指南如何根据需求挑选最适合的AI模型 面对众多AI模型如何选择最适合自己需求的Serge模型这份完整指南将帮助你快速了解不同模型的特点和AI 应用大模型本地部署后端前端解决ldn_mitm联机难题5个常见问题与高效解决方案解决ldn_mitm联机难题5个常见问题与高效解决方案 ldn_mitm是一款让本地无线支持的游戏实现联机功能的工具通过它可以轻松突破本地网络限制实现游戏游戏开发嵌入式网络OpenPLC_v3与Siemens S7协议通信实战从配置到调试全流程OpenPLC_v3与Siemens S7协议通信实战从配置到调试全流程 OpenPLC_v3是一款功能强大的开源PLC运行时系统支持与多种工业协议通信其工业制造嵌入式物联网上一篇Aptos Move 链上依赖实战使用 aptos 依赖语法引用链上已发布包pack1 依赖 pack2 最小示例下一篇Hacker101 演讲深度解读InfoSec 行业的倦怠危机——安全从业者与赏金猎人的心理健康与工作生活平衡创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Android学生成绩管理系统开发:数据库设计、接口与避坑指南

Android学生成绩管理系统开发:数据库设计、接口与避坑指南

简介:基于Android的学生成绩管理系统是一套面向移动开发初学者的完整项目资源,覆盖SQLite数据库操作、Java业务逻辑与原生UI设计三大核心模块。系统实现了学生信息及成绩的增删改查、条件查询、排序以及基础异常处理,并针对本地存储和异步加载…

2026/10/12 3:33:06 阅读更多 →
Disconf 安装部署指南:disconf-client 快速集成与 disconf-web 全流程上线实战

Disconf 安装部署指南:disconf-client 快速集成与 disconf-web 全流程上线实战

配置中心后端微服务 【免费下载链接】disconf Distributed Configuration Management Platform(分布式配置管理平台) 项目地址: https://gitcode.com/gh_mirrors/di/disconf 点击查看 免费下载 导读 Disconf(Distributed Configuration Management Pla…

2026/10/12 3:32:05 阅读更多 →
STM32 | U8g2 OLED库移植与使用案例

STM32 | U8g2 OLED库移植与使用案例

目录 一、小球在 OLED 屏幕平面内运动并碰撞反弹的效果 二、 简单的波形生成和显示程序: 三、三维三角形旋转展示 四、正方形平面内顺时针旋转 五、带有旋转点的空心圆圈应用 六、字幕滚动效果 七、下雪动画效果 八、进度条动画效果 自己移植的U8g2库,OLED库…

2026/10/12 3:32:05 阅读更多 →

最新新闻

AI编程协作的三层过滤网与人机分工实践

AI编程协作的三层过滤网与人机分工实践

1. 从“写一行删三行”到“AI是副驾”:我的真实演进路径几年前第一次在编辑器里敲下// TODO: 这里需要一个防抖函数,然后盯着光标发呆十分钟——不是不想写,是根本记不清setTimeout的闭包陷阱怎么绕、clearTimeout该不该判空、节流和防抖的边…

2026/10/13 6:01:40 阅读更多 →
Postgres Operator UI 前端构建指南:webpack 与 Riot.js 驱动的 ECMAScript 前端编译详解

Postgres Operator UI 前端构建指南:webpack 与 Riot.js 驱动的 ECMAScript 前端编译详解

云原生后端数据库运维 【免费下载链接】postgres-operator Postgres operator creates and manages PostgreSQL clusters running in Kubernetes 项目地址: https://gitcode.com/gh_mirrors/po/postgres-operator 点击查看 免费下载 导读:Postgres Oper…

2026/10/13 6:01:40 阅读更多 →
K8s Web UI 访问故障排查:从访问链路到认证层逐层定位

K8s Web UI 访问故障排查:从访问链路到认证层逐层定位

最近隔三差五就有人在群里问:“我的 k8s 集群装好了,Web UI 面板也部署进去了,但是浏览器就是打不开,到底是哪里出了问题?”这个问题我前前后后帮人排查过几十次,经验告诉我:UI 面板进不去&…

2026/10/13 6:01:40 阅读更多 →
Android商城App课程设计:从环境搭建到答辩验收的完整实战指南

Android商城App课程设计:从环境搭建到答辩验收的完整实战指南

简介:一份完整的安卓购物商城App课程设计报告,适合Android开发入门者、毕业设计选题学生及相关课程作业参考。报告围绕购物商城App展开,涵盖项目背景、开发环境(Android Studio Java)、MVC系统架构、首页/分类/发现/购…

2026/10/13 6:01:40 阅读更多 →
claude-mem 记忆系统实战:从架构设计到检索注入的完整落地指南

claude-mem 记忆系统实战:从架构设计到检索注入的完整落地指南

1. 从零认识 claude-mem:它到底在解决什么问题第一次看到 claude-mem 这个名字,我下意识把它拆成了两半:claude 和 mem。前者指向的是当下最常被开发者挂在嘴边的那类大语言模型交互场景,后者则是 memory,记忆。合在一…

2026/10/13 6:01:40 阅读更多 →
Streamyfin 后台下载模块(Background Downloader)深入解析:从 TypeScript API 到 iOS / Android 原生实现

Streamyfin 后台下载模块(Background Downloader)深入解析:从 TypeScript API 到 iOS / Android 原生实现

音视频移动开发 【免费下载链接】streamyfin A modern Jellyfin client built with Expo 项目地址: https://gitcode.com/gh_mirrors/st/streamyfin 点击查看 免费下载 本篇技术指南以 modules/background-downloader/README.md 为骨架,结合 Streamyfin…

2026/10/13 6:00:40 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →