AI Router 技术调研 — Skill 智能路由方案选型
调研日期:2026-05-28 目标:从本地 67 个 skills 中,根据用户自然语言请求快速匹配最相关的 skill
一、背景与问题
当前项目有 67 个 skills,路由完全依赖:
- CLAUDE.md 硬编码规则(如”trace 分析请求默认使用 vdrop-pipeline-orchestrator”)
.claude/commands/斜杠命令(仅 4 个入口)- LLM 上下文理解(Claude Code 将所有 skill 描述注入 system-reminder)
核心问题:
- skill 数量增长后 LLM 选择准确率下降
- 新增 skill 必须手动修改 CLAUDE.md 或 orchestrator 代码
- skill.json 的
tags/type字段未被任何路由逻辑消费 - 全量描述注入消耗 context window(预算上限 1%)
二、Claude Code 的 Skill Routing 机制(逆向分析)
通过对 Claude Code v2.1.153 二进制的分析,确认其路由机制:
| 维度 | 实现方式 |
|---|---|
| 路由算法 | 纯 LLM-based,无 embedding 预筛选 |
| 机制 | 将所有 skill 名称+描述注入 system-reminder,LLM 自主选择 |
| 描述来源 | SKILL.md / .claude/commands/*.md 的 frontmatter description 字段 |
| 扩展性控制 | skillListingMaxDescChars=1536 字符/skill |
| 预算控制 | skillListingBudgetFraction=0.01(占 context 1%) |
| 增量机制 | computeSkillListingDelta — 首次完整列表,后续只发 delta |
| Visibility 模式 | name-only、user-invocable-only、off |
| TRIGGER/SKIP | 纯 prompt engineering 标记,非系统级逻辑 |
结论:Claude Code 用最简单的”全量列举 + 模型自选”模式。没有任何 embedding/向量化逻辑。扩展性靠截断描述和预算比例控制。
三、主流 AI Router 方案对比
3.1 方案全景
| 方案 | 类型 | 开源 | 路由延迟 | 本地部署 | 适合 skill 路由 |
|---|---|---|---|---|---|
| semantic-router (Aurelio Labs) | Embedding cosine sim | MIT | 10-50ms | 完全支持 | 强烈推荐 |
| RouteLLM (lm-sys/Berkeley) | MF/BERT classifier | Apache 2.0 | 1-50ms | 完全支持 | 推荐(需改造) |
| Claude Code 内置 | LLM in-context | 闭源 | N/A | N/A | 当前方案 |
| Not Diamond | Meta-model classifier | SDK 开源/模型闭源 | 50-200ms | 不支持 | 不适合 |
| Martian Model Router | Learned routing (黑盒) | 闭源 | 30-100ms | 不支持 | 不适合 |
| OpenRouter | 规则+auto | 闭源 | 20-50ms | 不支持 | 不适合 |
| Unify.ai | Benchmark-driven | 闭源 | 10-30ms | 不支持 | 不适合 |
3.2 Semantic Router 详解(首选方案)
项目:aurelio-labs/semantic-router | MIT 许可
核心原理:
- 每个 Route 定义 5-10 条 utterances(示例话术)
- 初始化时将所有 utterances 编码为向量存入 Index
- 请求到来时,将 query 编码,与 Index 中向量做 cosine similarity
- 取 top_k 结果,按 route 聚合(mean/max),超过阈值则命中
架构:
Query → Encoder → cosine sim → top_k → aggregation → threshold → RouteChoice
支持的 Encoder:
| 类型 | 实现 |
|---|---|
| 远程 API | OpenAI, Cohere, Mistral, Google, AWS, Jina, LiteLLM |
| 本地模型 | HuggingFace (sentence-transformers), FastEmbed, Ollama |
| 稀疏 | BM25, TF-IDF |
| 多模态 | CLIP, ViT |
2024-2025 关键更新:
- HybridRouter(dense + BM25 sparse 融合)
- PostgreSQL Index 支持
- Async 全链路
- Asymmetric Encoding
- Python 3.9-3.13
性能:
- 本地 Index + 本地 encoder:~10ms
- 远程 API encoder:50-200ms(网络延迟)
- 准确率:语义区分明确时 > 95%
3.3 RouteLLM 详解(备选方案)
项目:lm-sys/RouteLLM | Apache 2.0
4 种路由器:
- Matrix Factorization(推荐,1-5ms)
- BERT classifier(10-50ms)
- Causal LLM classifier
- Weighted Elo (sw_ranking)
原设计场景:强弱模型间路由,降低 85% 成本维持 GPT-4 95% 质量。
改造为 skill 路由:需将二分类扩展为多分类头,用偏好数据训练。
四、Embedding 模型选型
| 模型 | 维度 | 中文效果 | 本地部署 | 推荐度 |
|---|---|---|---|---|
| BGE-M3 (BAAI) | 1024 | 优秀(MTEB-Chinese 榜首级) | ONNX/sentence-transformers | ★★★★★ |
| jina-embeddings-v3 | 1024 | 良好 | 需 API 或自部署 | ★★★★ |
| bge-large-zh-v1.5 | 1024 | 优秀 | sentence-transformers | ★★★★ |
| nomic-embed-text v1.5 | 768 | 一般 | Ollama 原生 | ★★★ |
| text-embedding-3-small (OpenAI) | 1536 | 良好(中文短文本一般) | 需 API | ★★★ |
| m3e-base | 768 | 良好 | sentence-transformers | ★★★ |
结论:BGE-M3。中文效果顶级,支持 dense+sparse+colbert 三模式,ONNX Runtime 推理单条 <20ms。
五、向量检索选型
67 skills × 10 utterances = ~670 条向量,直接 numpy cosine similarity 暴力搜索即可。
| 方案 | 适用规模 | 部署复杂度 | 推荐 |
|---|---|---|---|
| numpy 暴力搜索 | <10K 向量 | 零依赖 | 当前场景首选 |
| FAISS (IndexFlatIP) | <100K | 轻量 | 未来扩展备选 |
| ChromaDB | 任意 | 中等(有持久化) | 过重 |
| Qdrant | 分布式 | 重 | 杀鸡用牛刀 |
六、中文场景关键经验
来自国内团队的实际生产经验:
-
中文口语化挑战:“帮我看看”、“搞一下”等模糊表达对 embedding 路由挑战大,需要比英文多 2-3 倍的 utterance 样本
-
区分度问题:route 数量超过 20 后区分度下降明显,建议做层级路由(先大类再细分)
-
生产数据:某电商客服团队,semantic-router + bge-large-zh,50 条路由:
- P99 延迟 35ms
- 纯 embedding 准确率 88%
- 加 LLM fallback 后 96%(P99 升到 1.2s)
-
纯 embedding 天花板:中文场景约 90%,生产环境几乎都需要混合策略
-
关键词兜底:建议对确定性高的触发词加规则匹配(如
/commit→ commit skill)
七、推荐架构
7.1 整体路由流程
用户输入
│
├─── 精确匹配(斜杠命令 /commit, /frame-analyst 等)→ 直接路由
│
├─── 关键词规则匹配("trace 分析" → vdrop-pipeline-orchestrator)→ 直接路由
│
└─── Semantic Router
│
├─ BGE-M3 encode (本地, <20ms)
├─ cosine similarity vs skill embeddings (<1ms)
│
├─ Top-1 score > 0.75 → 直接路由
├─ Top-1 score 0.5~0.75 → 返回 Top-3 候选供 LLM 精排
└─ Top-1 score < 0.5 → fallback 到 LLM 全量判断
7.2 层级路由(应对 67 个 skills)
Level 1: 大类分流(按 tier/type)
├─ orchestrator 类
├─ trace 分析类(deep_analysis)
├─ 报告生成类(reporter)
└─ 工具类
Level 2: 类内细粒度匹配
└─ 在对应类别的 skills 中做 embedding 匹配
7.3 索引构建策略
每个 skill 生成:
- 1 条 description embedding(来自 skill.json 的 description)
- 5-10 条 utterance embeddings(人工编写的触发例句)
- 查询时取 max-sim 作为该 skill 的得分
Few-shot utterance 比纯 description 效果好 10-15%。
八、与 Claude Code 当前方案对比
| 维度 | Claude Code 当前 | Embedding Router 方案 |
|---|---|---|
| Token 消耗 | 所有 skill 描述注入 context(1% budget) | 零 context 消耗 |
| 路由延迟 | LLM 推理时间内含 | <50ms 独立路由 |
| 准确率 | 高(LLM 强)但随 skill 增多下降 | 85-92%(中文),+fallback 达 96% |
| 扩展性 | 受 context window 限制 | 线性扩展,1000+ skill 无压力 |
| 新增 skill | 需手动改 CLAUDE.md | 只需添加 utterances 重建索引 |
| 维护成本 | 低(全靠 LLM) | 中(需维护 utterances) |
九、实施路线图
Phase 1:最小可行方案(1-2 天)
- 为每个 skill.json 增加
utterances字段(5-10 条中文触发例句) - 使用
semantic-router+ BGE-M3 构建索引脚本 - 实现查询接口:输入用户文本 → 输出 Top-3 skill + 置信度
- 在 CLAUDE.md 中指导 Claude 参考路由结果
Phase 2:集成优化(3-5 天)
- 实现层级路由(先按 tier/type 分流)
- 加入 HybridRouter(dense + BM25)提升关键词场景
- 实现关键词规则白名单兜底
- 建立 utterance 质量评估和覆盖率检查
Phase 3:动态学习(1-2 周)
- 记录用户实际选择的 skill,渐进优化 utterances
- 实现 threshold auto-tuning
- A/B 测试路由准确率
- 反馈闭环:路由错误时自动收集负样本
十、技术栈总结
核心框架: aurelio-labs/semantic-router (MIT)
Embedding:BGE-M3 via sentence-transformers / ONNX Runtime
向量检索: numpy cosine similarity(暴力搜索)
Fallback: LLM function calling(Claude)
规则引擎: 关键词匹配 + 斜杠命令精确路由
语言: Python 3.9+
参考资源
- semantic-router GitHub
- RouteLLM GitHub
- BGE-M3 HuggingFace
- MTEB Chinese Leaderboard
- RouteLLM 论文: “RouteLLM: Learning to Route LLMs with Preference Data” (2024)