Router-MCP 高精度路由识别 MVP
这是一个围绕“准确率优先、宁可拒答也不误触发”构建的最小可运行 Router-MCP 路由识别服务。它不是通用聊天机器人,而是一个针对结构化路由层,负责把用户口语化输入安全、可解释地路由到 MCP / Skill / Tool / Planner。
当前实现
agent-router-mcp:统一入口、路由编排、输出结构化决策。semantic-router:配置驱动的候选召回与多字段打分,默认优先调用本地 embedding 服务并自动回退规则召回。NeMo-Guardrails 风格守护层:对执行前决策做二次守护,控制 clarify / refuse 质量,拦截高风险误执行。- 多意图拆分:一句话可拆成多个子任务分别决策。
- planning intent:识别“方案设计 / 任务拆解 / 步骤规划 / 工作流编排”并路由到
plan。 - 作用域控制:支持
tenant / customer / role / enabled过滤。 - 可解释 trace:每个子意图保留标准化、召回、过滤、打分、决策审计信息。
local_embedding_service:独立目录部署的本地 embedding 服务,主路由服务通过 HTTP 调用。- API / CLI / MCP Server / OpenClaw 薄包装 / 评测脚本 / 单测:可直接本地演示。
目录结构
config/
capabilities.yaml # 能力注册表示例
router_settings.yaml # 阈值、别名、反问模板、打分配置
docs/eval/datasets/
qdport_real_query_30_eval.yaml # 30 条基础命中集
qdport_generalized_query_240_eval.yaml # 240 条泛化评测集
qdport_multiturn_query_240_eval.yaml # 240 条多轮对话评测集
src/router_mcp/
agent_router_mcp/ # 路由编排服务
semantic_router/ # 候选召回与语义打分
guardrails/ # 执行前守护与反问/拒答规范
pipeline/ # normalize / slot / rerank / decision
registry/ # registry schema 与加载校验
eval/ # 批量评测脚本
api.py # FastAPI demo API
cli.py # CLI demo
tests/
test_router_pipeline.py
test_api.py快速开始
python3 -m pip install -e '.[dev]'
pytest
python3 -m pip install -r local_embedding_service/requirements.txt
python3 -m local_embedding_service.app
python3 scripts/extract_qdport_eval_datasets.py
python3 scripts/generate_multiturn_eval_dataset.py
python3 -m router_mcp.eval.run_eval --summary-only
python3 -m router_mcp.eval.run_eval --dataset docs/eval/datasets/qdport_real_query_30_eval.yaml --dataset docs/eval/datasets/qdport_generalized_query_240_eval.yaml --summary-only
python3 -m router_mcp.eval.run_multiturn_eval --dataset docs/eval/datasets/qdport_multiturn_query_240_eval.yaml
python3 -m router_mcp.cli "帮我查下今天异常流程,再把昨天没跑完的补跑一下" --tenant qingdao_port --customer default --role supervisor --execute
python3 -m router_mcp.cli "先别执行,先规划一下这个需求怎么落地" --tenant qingdao_port --customer default --role supervisor --plan
python3 -m router_mcp.app
python3 -m router_mcp.mcp_server日常开发建议直接使用固定验证脚本:
scripts/verify_quick.sh
scripts/verify_boundary.sh
scripts/verify_full.sh说明:
scripts/extract_qdport_eval_datasets.py现在默认优先读取仓库内的缓存 bundle:
qdport_generalized_query_240.json
- 如需重新从外部 Excel 全量抽取,仍可显式传
--source /path/to/qdport_query_generalization_v2.xlsx
如果动了 API / MCP / OpenClaw 入口,可加:
scripts/verify_quick.sh --with-apiDashboard 前端工程位于 frontend/,开发与构建命令:
cd frontend
npm install
npm run dev
npm run buildnpm run dev:本地起前端开发服务器,自动代理后端 APInpm run build:生成frontend/build/,供 FastAPI 在/提供生产页面- 如果直接运行
python3 -m router_mcp.app且还没构建前端,根路径会返回提示先执行cd frontend && npm install && npm run build
服务启动后可用接口:
GET /capabilitiesPOST /capabilities/validatePOST /routePOST /route/explainPOST /route/planPOST /route/batch
API 示例
POST /route
{
"text": "帮我查下今天异常流程,再把昨天没跑完的补跑一下",
"context": {
"tenant_id": "qingdao_port",
"customer_scope": "default",
"role": "supervisor",
"allow_execute": true
},
"dry_run": true
}返回重点字段:
overall_decisiondecisions[].decisiondecisions[].trace_iddecisions[].reasondecisions[].evidencedecisions[].goal_typedecisions[].risk_leveldecisions[].selected_capabilitydecisions[].decision_reasondecisions[].matched_capabilitiesdecisions[].confidence_breakdowndecisions[].missing_slotsdecisions[].clarify_questiondecisions[].refuse_reasondecisions[].execution_targetdecisions[].audit_trace
核心决策原则
- 高置信单命中才执行。
- 多候选接近时优先
clarify。 - 缺关键槽位时必须
clarify。 - 方案设计 / 任务拆解 / 步骤规划 / 多阶段编排时进入
plan。 - 未命中或低置信度时
refuse。 - 高风险执行缺少确认或证据不足时强制拦截。
customer / tenant / role不匹配时直接过滤,不允许越权命中。
默认评测集覆盖
- 明确命中样例
- 模糊表达样例
- 多意图样例
- 未命中样例
- 高相似能力混淆样例
- 权限不足样例
- 缺槽位样例
评测输出至少包含:
correct_decisionscorrect_capabilitiestop1_accuracytopk_recallclarify_countrefuse_countexecute_countfalse_execute_countwrong_route_ratedirect_execution_rateclarification_precisionrefusal_precisionplanning_detection_precisionplanning_detection_recall
其中 false_execute_count 是当前 MVP 最关键指标。
当前默认 run_eval 会顺序跑两套整理后的评测集:
- qdport_real_query_30_eval.yaml:30 条基础命中集,用于检查最基础的流程名直达命中
- qdport_generalized_query_240_eval.yaml:240 条泛化评测集,用于检查 execute / clarify 边界与泛化稳定性
另外新增了一套并行维护的多轮评测集:
- qdport_multiturn_query_240_eval.yaml:由 30 条基础命中集派生出的 240 条多轮对话样本,覆盖
clarify_fill_slots / proposal_confirm_cancel_revise / context_break_or_new_request
这套数据不进入默认 run_eval,而是通过独立 runner 回放共享 session_key + thread_id 的 turns:
python3 -m router_mcp.eval.run_multiturn_eval \
--dataset docs/eval/datasets/qdport_multiturn_query_240_eval.yaml如果需要覆盖默认口径,仍可显式传入 --dataset ...。
最新调优结果
本轮调优重点放在 5 件事:
- 补强中文口语槽位抽取:
最近三天 / 本班 / 上一班 / 按货种汇总 / excel / 发给值班负责人 / 录到目标系统 - 支持
查 -> 整理 -> 发出的结构化步骤识别,并给同 family 多步骤链增加 rerank 组合分 - 修正 family 级别 guardrail:
query/generatefamily 可以按 family 安全放行,executefamily 仍必须按 resolved member 槽位复核;hard_confusion强制 clarify - 补齐
plan / refuse:显式 planning intent 检测、planner capability、MCP/OpenClaw 薄包装和 planning 指标 decision.py的 guardrail 阻断收尾分支抽成具名finalize_rule,并补齐rule_nametrace 回归测试- 对运行时能力集做轻量归一化:合并同名 seed family、去掉单成员 family 的同名 leaf,并对剩余不可安全合并的重名 seed leaf 做运行时改名,避免出现 “A 或 A / generate 还是 generate”
在默认 240 条泛化评测集 qdport_generalized_query_240_eval.yaml 上,当前 summary-only 指标为:
decision_accuracy:0.8125execute_count:81clarify_count:159direct_execution_rate:0.3375false_execute_count:0wrong_route_count:0named_target_accuracy:0.9667trace_coverage:1.0reason_coverage:1.0
这轮结果对应的关键策略是:
- 恢复
missing_required_slots -> clarify - 关闭
hard_confusion高分直通 execute 的豁免
关于 LLM 的当前口径也需要明确:
- 当前主链路仍是
heuristic + 结构化规则 - 只有当
heuristic槽位候选置信度name aliases -> aliasescapability_description -> descriptiongeneralized_user_query -> examplesrequired_slots -> required_slotsaction_type -> 统一 action_typeclarify_when / reject_when -> guardrail hints
这样当前服务默认会同时加载手工高精度样例能力和 500 条原始种子能力。
开发约定与最新报告
- 开发方式、下一步任务与工程约束见 Agents.md
- 本轮路由优化与启动性能沉淀见 2026-04-04-routing-optimization-report.md
- guardrail finalize 规则对象化增量报告见 2026-04-04-guardrail-finalize-rule-report.md
