一行自然语言如何变成精准工具调用?korean-law-mcp query-router路由引擎实现原理
【免费下载链接】korean-law-mcp법제처 국가법령정보를 LLM에서 바로 조회하는 MCP 서버. 법령·판례·조례 검색과 인용 검증 | MCP server for Korean law — search statutes, precedents, and ordinances, and verify citations项目地址: https://gitcode.com/gh_mirrors/ko/korean-law-mcp
korean-law-mcp 是一个把韩国法제처(法律信息处)42 个开放 API 封装成 10 个工具的韩国法律 MCP 服务器,支持法令、判例、条例检索与引用验证。它最巧妙的部分,是内置的 query-router 路由引擎:你只需输入一行自然语言,它就能读懂意图、选对工具、填好参数,甚至自动串起后续查询链路。本文用大白话拆解这套路由引擎的实现原理,帮你理解"自然语言 → 精准工具调用"背后到底发生了什么。
🎯 效果先行:一行话直接变成精准工具调用
先看路由引擎的实际效果。在 Claude 或 ChatGPT 里问一句"관세법 제38조 알려줘"(告诉我关税法第 38 条),路由引擎会自动判定这是"特定条款查询",先调search_law("관세법")拿到法令 ID(MST),紧接着调get_law_text取出第 38 条正文——两次调用全程无需你指定任何参数。
| 你说的一句话 | 路由引擎的实际动作 |
|---|---|
| 민법 제103조 인용 검증해줘(验证民法第 103 条的引用) | 走verify_citations引用验证,而不是查条文 |
| 민법 제103조 판례(民法第 103 条的判例) | 走search_precedents判例检索 |
| 2023.5.10 당시 도로교통법 제44조(2023 年 5 月 10 日当时的道路交通法第 44 条) | 走applicable_law行为时法判定 |
| 2007다27670 아직 유효해?(2007다27670 还有效吗?) | 走cite_check判例生死确认 |
| 서울시 주차 조례(首尔市停车条例) | 走search_ordinance自治法规检索 |
| 任何没匹配上模式的问题 | 兜底走chain_full_research综合研究 |
🧩 路由引擎的四个核心部件
query-router 并不是一坨"if-else",而是拆成了职责清晰的四个文件,CLI 和 MCP 服务器共用同一套判定逻辑:
| 部件 | 职责 | 路径 |
|---|---|---|
| 匹配引擎 | 遍历模式表,处理让路与兜底 | query-router.ts |
| 模式表(声明部) | "什么自然语言 → 什么工具"的 30+ 条规则 | route-patterns.ts |
| 参数提取器 | 从原文抽出法令名、条款号、别表号、日期等 | query-extract.ts |
| 场景判定语汇 | 9 种场景(罚则、关税、时间旅行等)的唯一规则源 | scenario-rules.ts |
整体数据流可以这样理解:
自然语言 "관세법 제38조 알려줘" │ ▼ ┌── query-router.routeQuery() ─────────────────┐ │ ① 按优先级遍历模式表,逐条做正则匹配 │ │ ② 命中后检查 yieldsTo:是否需要"让路" │ │ ③ 调 extract 提取参数,可能触发内部开关 │ │ ④ 解析日期范围、附加场景标签、组装流水线 │ └──────────────┬──────────────────────────────┘ ▼ search_law(관세법) ──MST──▶ get_law_text(제38조)更完整的分层说明可以参考官方架构文档:docs/ARCHITECTURE.md。
⚖️ 优先级排序:越具体的意图越先接球
每条模式都带一个priority(数值越小越优先)。模块加载时所有模式按优先级一次性排好序(route-patterns.ts),之后每来一句查询就按序尝试正则匹配,第一个命中的模式接球。
优先级体现的是"具体程度":
- 优先级 1:特定条款查询("XX법 제38조"这类条款号在句尾的形态),因为它意图最明确;
- 优先级 2:条款影响图、判例生死确认、行为时法、引用验证等杀手级功能;
- 优先级 3~9:明确法令名、国税厅法规解释、关税/处罚等场景规则;
- 优先级 10+:判例、解释例、条例、程序等较宽泛的意图;
- 全部没命中:兜底交给
chain_full_research综合研究(query-router.ts)。
比如"화관법"(化学品管理法)和"화관법 시행령"(其施行令)会先经过约称扩展变成全称再检索,而单独一句"방법"(方法)这类词则被黑名单拦下,避免把"方法"误判成以"법"结尾的法令名——这类细节都沉淀在模式表里(route-patterns.ts)。
🤝 让路机制 yieldsTo:高优先级也会主动避让
如果只看优先级,"민법 제103조 인용 검증해줘"(验证民法第 103 条的引用)会被优先级 1 的条款查询模式吞掉,"引用验证"这个更深的意图就丢了。
为此引擎设计了让路机制:高优先级模式声明了"我让给谁"(yieldsTo列表)。匹配成功后,引擎会直接拿接收方的正则再跑一遍,确认对方真的能接住才让球(route-patterns.ts)。
条款查询模式声明向 16 个模式让路(route-patterns.ts):
yieldsTo: impact_map / applicable_law / verify_citations / cite_check / amendment / precedent / annex ...巧妙之处在于:让路时不另抄一份"守卫关键词",而是原地评估接收方自己的正则——接收方词表扩充时,守卫自动跟着变,不会出现"两份词表各改了一半"的失同步问题。对应的回归测试保证"민법 제103조 인용 검증해줘"必须到达verify_citations:query-router.routing.test.ts。
🎛️ 四个内部开关:_skip / _fallback / _reroute / _needsMst
提取参数时,extract函数可以通过返回特殊"开关"改变路由走向,这是引擎处理复合意图的主要手段:
| 开关 | 含义 | 典型场景 |
|---|---|---|
_skip | 本模式命中但意图不符,交给下一个模式 | "최근 개정된 근로기준법 제60조"命中统计模式,但指了具体条款,让给改订追踪 |
_fallback | 只有关键词、缺法令名,转综合研究 | 单独问"별표"(别表)而没有法令名 |
_reroute | 命中后改道去另一个工具 | "신고 방법"(申报方法)命中申报模式,因含"方法"让给程序详解 |
_needsMst | 需要先搜法令拿 MST,再查详情 | 条款查询 → 自动组装搜索+详情两级流水线 |
这些开关在路由结果里会被剥离干净,不会泄漏成工具参数;提取器对"조(条)兆"("예산 3조"里的 3 兆)这类歧义也做了专门防误伤(query-extract.ts)。
🔗 自动流水线与场景附加:一次提问,多步到位
路由结果不只是"一个工具",还可以携带pipeline(后续步骤队列)。两种典型自动流水线:
- 搜索 → 详情自动链:tool-chain-config.ts 为 12 个搜索工具各配置了对应的详情工具(判例搜索接
get_precedent_text、解释例搜索接get_interpretation_text……)。命中搜索类模式时,引擎自动把"取第一条结果的详情"挂成管道,你问"근로기준법 제74조 해석례"就会一次拿到列表+正文; - 法令检索 → 条款查询:条款查询带
_needsMst时,引擎组装search_law→get_law_text两级;如果一次问多个条款("민법 제309조·제310조"),会为每个条款各生成一级,避免第二个条款被吞掉(query-router.ts)。
场景附加是另一层自动化:路由命中chain_*链式工具后,引擎调用 detectScenarioName 判定场景标签(penalty 罚则 / customs 关税 / time_travel 时间旅行等 9 种),自动挂到参数上。比如"관세 환급을 못 받았어"(关税退税没收到)会自动挂上action_plan场景;"개인정보보호법 2020-01-01 vs 2025-11-01"则触发 time_travel 场景,自动抽取两个时间点做新旧条文 diff。场景规则只存一份,CLI 和 MCP 两侧读数完全一致,不会出现"同一句话走两个入口、两种结果"。
📅 两个容易忽略的细节:日期顺序与确认提示
日期解析放在匹配之后。引擎先用原文做模式匹配,命中后才解析日期范围,并把时间表达从搜索词里剥掉。顺序反了会出大错:"최근 3년 이내 개정"(近 3 年内修订)这句话里,"近 3 年内"本身就是改订追踪的触发词——若先把日期删掉再匹配,触发词就没了(query-router.ts)。
判不准时,宁可问一句也不猜。"민법 2024"这种"法令名+单个时间点"的模糊查询,引擎会保守地按改订历史处理,同时返回clarify确认文案,提示你"如果要 2024 年当时施行的正文,请写'2024.1.1 당시 민법'"(route-patterns.ts)。同理,若你要求看"전문"(全文)但目标工具不支持full参数,引擎会把它记入unsupportedParams明示出来,而不是静默丢弃。
🚀 动手试试:把路由引擎接到你的 AI 里
想亲眼看看路由过程,最简单的入口是 CLI(安装方式见 README.md 的"설치 및 사용법"一节):
korean-law "민법 제1조" # 自然语言一行,路由引擎自动选工具 korean-law list # 查看全部工具 korean-law help search_law # 查看单个工具帮助接上 Claude Desktop 或 ChatGPT 后,直接用日常语气提问即可——"전세금 못 받았어"(没收到押金)会被判成行动规划场景,按 5 个步骤给出诊断、救济手段、申请机构、所需文书和注意事项。想深入看路由判定细节,建议从 query-router.ts 的主匹配函数读起,配合 route-patterns.ts 的模式表逐条对照,半小时就能把整个"接球→让路→传球"的机制过一遍。
一句话总结:query-router 用"优先级接球 + 正则让路 + 参数开关 + 自动流水线"四层设计,把自然语言的模糊性压缩到工具调用之前,让 AI 助手在查韩国法的时候少猜一步、快一步。
【免费下载链接】korean-law-mcp법제처 국가법령정보를 LLM에서 바로 조회하는 MCP 서버. 법령·판례·조례 검색과 인용 검증 | MCP server for Korean law — search statutes, precedents, and ordinances, and verify citations项目地址: https://gitcode.com/gh_mirrors/ko/korean-law-mcp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考