Signal-driven intelligent router for mixture-of-models, deployed as Envoy ExtProc gRPC sidecar. Uses a DecisionEngine that evaluates recursive boolean expression trees over 20+ signal types to route LLM requests across heterogeneous model fleets, balancing cost, privacy, safety, and capability. Kubernetes-native, MCP-compatible, with embedded ML inference via Rust/Candle FFI in the Go runtime.
LLM 模型爆炸式增长,不同模型在能力、规模、成本、隐私边界上差异显著。生产环境需要同时使用多个模型(local / private / frontier),但缺乏系统级智能路由层来根据请求语义、安全性、用户权限等维度自动选择最优模型。现有方案要么只做简单负载均衡,要么只做意图分类——无法表达复杂的组合路由策略。
Signal-Driven Decision Routing: 核心架构是一个 DecisionEngine,将路由决策建模为 20+ 种异构信号类型上的布尔表达式树(AND/OR/NOT)递归求值。
信号类型覆盖:keyword、embedding、domain、fact_check、user_feedback、reask、preference、language、context、structure、complexity、modality、authz、jailbreak、PII、KB、conversation、session_metric、event_context、projection。每个信号携带 confidence 分数。
决策选择支持三种策略:priority(按优先级)、confidence(按置信度)、tiered(分层后再按置信度排序)。
部署架构: 不是自建代理,而是作为 Envoy External Processing (ExtProc) gRPC filter 运行,可以无侵入地部署到任何 Envoy-based gateway(Istio、Gloo、standalone)。
ML 推理内嵌: 通过 candle-binding / ml-binding / nlp-binding 三层 Rust → Go FFI,将分类、嵌入等 ML 模型推理直接嵌入 Go 进程,避免外部模型服务的额外延迟。
核心技术壁垒: 20+ 异构信号类型 × 布尔表达式树组合决策。复制这一架构需要同时解决两个难题:(1) 每种信号类型都需要独立的 ML 模型或规则引擎进行提取(jailbreak detector、domain classifier、embedding model、PII filter 等),(2) 信号之间的组合逻辑需要可配置的表达式树求值器——而非硬编码 if-else。两者的耦合使得系统的 signal surface area 成为核心护城河。
Kubernetes 控制面: Router 通过 controller-runtime watch CRD(RouterConfig),支持 hot-reload 配置变更。CRD 定义路由规则、决策树、模型选择策略。
数据面关键路径:
selectBestDecision 根据策略(priority / confidence / tiered)选出最优语言分工:
vllm-sr)、SDK、模型训练(LoRA fine-tuning)无形式化作者证明 — 仅实证。
本项目为工程系统(代码仓库),非学术论文,不包含显式的数学性能模型或定理证明。相关学术工作:
| 文档 | 内容 | 状态 |
|---|---|---|
| Vision Paper (2026-03-24) | Workload-Router-Pool Architecture | 已发布,未含于本 L1 |
| White Paper (2026-02-27) | Signal Driven Decision Routing for MoM | 已发布,未含于本 L1 |
| When to Reason (2510.08731) | 语义路由决策时机 | Accepted |
| Category-Aware Semantic Caching (2510.26835) | 异构 workload 缓存策略 | Published |
若需形式化模型,以下维度值得建模:
本 L1 来源为代码仓库,不直接包含实验数据表格。可获取的实证信息如下。
| 指标 | 值 | 时间段 |
|---|---|---|
| Stars | 4,200 | ~8 months (Sep 2025 – May 2026) |
| Forks | 682 | 同期 |
| Commits | 1,399 | 同期 |
| Open PRs | 75 | 截至 2026-05 |
| Open Issues | 104 | 截至 2026-05 |
| 发布版本 | v0.1 Iris → v0.2 Athena | Jan 2026 → Mar 2026 |
仓库内含多层测试与验证工具:
bench/ — 路由性能基准测试套件perf/ — 性能剖析工具e2e/ — 端到端集成测试src/fleet-sim/ — 异构模型 fleet 模拟器,用于在部署前测试路由策略src/training/ — LoRA fine-tuning pipeline,用于训练 domain classifier 和 jailbreak detector相关论文中的实验结果(未含于本 L1,但由项目直接产出):
| 工作负载场景 | 适用程度 | 原因 |
|---|---|---|
| 多模型异构 fleet,请求语义多样 | 强 | 20+ 信号类型 + 布尔表达式树可精细路由 |
| 单模型部署,纯负载均衡 | 弱 | 信号提取开销无法被路由优化抵消 |
| 安全合规场景(jailbreak/PII 过滤) | 强 | 内置 jailbreak、PII、hallucination 信号 |
| 低延迟在线服务(<10ms routing overhead) | 中等 | Candle FFI 内嵌推理降低延迟,但多信号提取仍有开销 |
| Edge 部署(资源受限) | 中等 | 架构支持,但 Envoy + Router 两进程的 footprint 较大 |
| # | 论证步骤 | 证据 / 设计选择 |
|---|---|---|
| 1 | 模型爆炸 → 需要系统级路由 | README: "the number of models is exploding... choosing and connecting the right models is a system problem" |
| 2 | 路由需要多维信号,不只是 intent classification | SignalMatches 定义了 20+ 种信号类型,远超典型路由器的 keyword/embedding 两类 |
| 3 | 复杂路由策略需要可组合的逻辑表达 | DecisionEngine 用 AND/OR/NOT 布尔表达式树递归求值,而非硬编码规则 |
| 4 | 信号提取需要 ML 推理 → 延迟敏感 → 需要内嵌推理 | 通过 Rust Candle FFI 将 ML 推理嵌入 Go 进程,避免网络往返 |
| 5 | 部署不应侵入现有基础设施 | 选择 Envoy ExtProc 而非自建代理,可无缝接入 Istio/Gloo/standalone Envoy |
| 6 | 配置应是声明式、可热更新的 | Kubernetes CRD + controller-runtime watch,支持 hot-reload |
| 7 | 安全是路由的一等公民,不是附加功能 | jailbreak、PII、hallucination 检测作为内置信号类型,参与决策树求值 |
| 8 | 路由策略需要在生产前可验证 | fleet-sim 模拟器用于离线测试路由策略 |
pkg/decision/engine.go — DecisionEngine 完整实现:
EvaluateDecisionsWithSignals() — 遍历所有 decisions,对每个执行布尔表达式树求值,收集匹配结果evalNode() — 递归求值 RuleNode,支持 AND/OR/NOT 三种算子,叶节点调用 evalLeaf()evalLeaf() — 对单个信号条件求值,通过 matchesSignalType() 分发到具体信号类型的查找逻辑matchesSignalType() — 将 19 种信号类型映射到 SignalMatches 结构体的对应字段,domain 类型有特殊匹配逻辑(matchesDomainCondition)selectBestDecision() — 根据 strategy (priority / confidence / tiered) 排序选出最优决策SignalMatches 结构体(pkg/decision/engine.go)定义了完整的信号词汇表:
KeywordRules, EmbeddingRules, DomainRules, FactCheckRules,
UserFeedbackRules, ReaskRules, PreferenceRules, LanguageRules,
ContextRules, StructureRules, ComplexityRules, ModalityRules,
AuthzRules, JailbreakRules, PIIRules, KBRules,
ConversationRules, SessionMetricRules, EventContextRules,
ProjectionRules + SignalConfidences map[string]float64
cmd/main.go — 启动序列:
parseRuntimeOptions() → 解析命令行参数loadRuntimeConfigOrFatal() → 加载 YAML 配置routerruntime.NewRegistry() → 初始化运行时组件注册表ensureModelsDownloadedOrFatal() → 下载 HuggingFace 模型initializeRuntimeDependencies() → 初始化 embedding runtime(Candle/ONNX FFI)newExtProcServerOrFatal() → 创建 Envoy ExtProc gRPC serverwarmupRouterRuntime() → 预热推理引擎startKubernetesControllerIfNeeded() → 启动 K8s CRD controllerstartExtProcServerOrFatal() → 监听 gRPC 请求pkg/k8s/ — CRD controller 实现:
NewController(ControllerConfig{...}) — 创建 controller,接受 OnConfigUpdate 回调实现 hot-reloadStart(ctx) — 启动 watch & reconcile 循环| 依赖 | 版本 | 用途 |
|---|---|---|
| envoyproxy/go-control-plane | v1.35.0 | Envoy ExtProc gRPC API |
| mark3labs/mcp-go | v0.42.0-beta.1 | MCP server 实现 |
| openai/openai-go | v1.12.0 | OpenAI API 集成 |
| anthropics/anthropic-sdk-go | v1.19.0 | Anthropic API 集成 |
| qdrant/go-client | v1.17.1 | Qdrant 向量存储 |
| milvus-io/milvus-sdk-go | v2.4.2 | Milvus 向量存储 |
| controller-runtime | v0.22.4 | K8s CRD reconciliation |
| alecthomas/participle | v2.1.4 | DSL 解析器 |
pkg/dsl/),允许运维人员用自定义语法编写路由规则,超越纯 YAML 配置的表达力。