当 480B 大模型在数到 103 时翻车:把推理外包给 Prolog 的 MCP 服务器
凌晨两点的合规问题
想象你是某家公司的安全工程师。凌晨两点,oncall 电话响了——审计团队要你立刻回答一个问题:
> "用户 user_0142 能不能部署到生产环境?"
听起来简单。但你打开权限系统一看:
- user_0142 属于
devops_team组 devops_team继承自engineer_roleengineer_role又继承自base_employeebase_employee有read_logs权限devops_team有deploy_staging权限- 只有
senior_devops才有deploy_prod权限 - 但 user_0142 上周被临时授予了
deploy_prod直属权限 - 然而
deploy_prod要求目标资源必须加密 - 而生产服务器
prod-server-03的磁盘加密状态在上次配置变更后……没人更新过
你把这个问题丢给 GPT-4。它自信地说:"根据您描述的角色层级,user_0142 作为 devops_team 成员,应该可以部署到生产环境。" 听起来合理。但它是错的——因为 deploy_prod 要求资源加密,而 prod-server-03 没加密。模型没做这一步推理,它只是在做语义匹配。
这就是 2026 年 LLM 在合规领域翻车的日常。
语义检索是用电钻钉钉子
最近几年,业界对"让 LLM 处理规则"的标准答案是 RAG(检索增强生成):把公司政策切片、向量化、塞进向量数据库,用户提问时检索最相似的几段,喂给 LLM 让它回答。
这个范式在"开放问答"场景下很好用——"我们公司的差旅政策是什么?"——检索到相关段落,模型总结一下,皆大欢喜。
但有一类问题,RAG 从根上就不对:需要逻辑推导的问题。
Bartolomeo Bogliolo 在 arXiv 新论文《Euclid-MCP》里把这个错位讲得很直白:
> "用语义检索执行正式规则,就像用电钻钉钉子——工具很强大,但底层操作(近似匹配 vs 逻辑推导)对任务来说是错的。"
为什么错?因为 RAG 的核心假设是"语义相似 ≈ 相关性 ≈ 正确性"。但在规则世界里:
- 正确性 = 逻辑后果:决策必须从显式规则集逻辑推出,不是从文本相似度推出
- 检索到的规则子集必须逻辑完备:向量检索不能保证你捞到了所有相关规则、也没捞到冲突规则
- 审计需要形式化证明:不是"模型看到了类似规则",而是"这条结论由规则 R1、R3、R7 经三步推导得出"
Euclid-MCP:让 LLM 当诗人,让 Prolog 当会计
论文给出的方案叫 Euclid-MCP——一个开源的 MCP(Model Context Protocol)服务器,把确定性的逻辑推理引擎暴露给任何 MCP 兼容的 LLM 客户端。
核心思路一句话:LLM 负责把世界描述清楚,Prolog 负责算出答案。
这就像你让一个文笔流利但不擅长算账的文案,和一个算盘打得飞快但不会写诗的会计搭档——文案把业务场景翻译成会计能看懂的账目,会计算出精确数字,文案再把数字讲回给老板听。
具体架构是三层:
用户提问
↓
[LLM 客户端] 把自然语言翻译成 Euclid-IR 事实和规则
↓
[Euclid-MCP 服务器] 把 Euclid-IR 编译成 SWI-Prolog 程序
↓
[SWI-Prolog] 执行确定性推理,返回答案 + 证明树
↓
[LLM 客户端] 把结果和证明渲染回自然语言
关键设计是中间那层 Euclid-IR——一种人类可读、LLM 易生成、引擎无关的 Horn 子句中间表示。它不是 Prolog 语法,而是更简洁的声明式语言:
fact(user_0142, has_role, devops_team).
fact(devops_team, inherits, engineer_role).
fact(engineer_role, inherits, base_employee).
fact(base_employee, can, read_logs).
fact(devops_team, can, deploy_staging).
fact(senior_devops, can, deploy_prod).
fact(user_0142, direct_grant, deploy_prod).
rule(deploy_prod, requires, encrypted_resource).
fact(prod_server_03, encryption, false).
LLM 只需要会写这种"事实清单",不需要懂 Prolog 的回溯、合一、cut 这些复杂概念。Euclid-MCP 服务器自动把它编译成可执行的 SWI-Prolog 程序,跑出确定答案。
为什么这层中间表示很关键? 因为它让 LLM 的任务从"做多步逻辑推理"降级为"把自然语言翻译成结构化事实"——前者是 LLM 的弱项,后者是 LLM 的强项。把模型的强项留给模型,把模型的弱项外包给专门工具。
翻车现场:1000 条事实下的大模型集体幻觉
论文里最扎眼的是那个大规模 RBAC(基于角色的访问控制)基准测试。
任务设置:1000 个合成用户,7 个有继承关系的角色,17 个基础权限,20 个直属授权——总共 1053 条事实。这个规模已经超出任何 LLM 的工作记忆。
对比三方:
- A:llama3.1:8b(小模型,本地跑)
- B:qwen3-coder:480b(大模型,云端跑)
- C:llama3.1:8b + Euclid-MCP(小模型 + Prolog 外挂)
| 题目 | 正确答案 | A (8B) | B (480B) | C (8B+Euclid) |
|---|---|---|---|---|
| 有多少用户有 delete_repo 权限? | 31 | 1 ❌ | 1 ❌ | 31 ✅ |
| user_0142 能 push_code 吗? | Yes | ✅ | ✅ | ✅ |
| 有多少用户有 deploy 权限? | 103 | 100 ❌ | 901 ❌ | 103 ✅ |
| user_0834 能 read_logs 吗? | Yes | ❌ | No ❌ | ✅ |
| user_0222 能 manage_billing 吗? | Yes | ✅ | No ❌ | ✅ |
| 准确率 | — | 2/5 | 2/5 | 5/5 |
| 平均延迟 | — | 6966ms | 3695ms | 963ms |
| 平均输出 token | — | 165 | 212 | 12 |
第一,480B 大模型并不比 8B 小模型好。 两边都是 2/5。在需要精确计数和多层继承推理的任务上,参数量救不了你——模型再大,也只是在"更自信地胡说"。
第二,480B 模型说有 901 个用户有 deploy 权限,实际是 103。 差了 8 倍。这不是"近似正确",这是系统性幻觉。模型不是"差一点",是根本没在做推理——它在生成听起来合理的数字。
第三,Euclid-MCP 不仅准,还快,还省 token。 963ms vs 3695ms,12 个输出 token vs 212 个。为什么?因为 LLM 只需要生成一个简短的查询("count users with deploy"),不需要自己一步步推理。重活脏活都让 Prolog 干了,LLM 只负责翻译和汇报。
第四,小规模下三者差不多。 论文还有个小规模测试(5-15 条事实),三方都是 5/5。这说明:当事实少到能塞进上下文窗口、推理链浅到一两步时,LLM 单干也行。Euclid-MCP 的价值在规模上——事实超过几百条,模型就开始崩。
证明树:不只是答案,还要解释为什么
Euclid-MCP 不只是返回 yes/no,它还能返回完整的证明树。
问"user_0142 为什么有 deploy_prod 权限?",系统会返回:
user_0142 has deploy_prod
← user_0142 direct_grant deploy_prod (直属授权)
BUT deploy_prod requires encrypted_resource
← prod_server_03 encryption = false (资源未加密)
→ DENIED: resource constraint not satisfied
这个能力在合规审计里是刚需。审计员不是要一个"是/否",他们要的是可追溯的决策链——每一步引用了哪条规则、哪个事实。纯 LLM 给不出这种东西,RAG 也给不出(它只能给"我看了这几段文档",给不出推导过程)。
更酷的是系统支持反事实推理(what-if):
- "如果我把 user_0142 提升为 senior_devops,他会获得哪些新权限?"
- "如果给 prod_server_03 加密,哪些当前被拒的请求会变成允许?"
为什么是 MCP?为什么是现在?
这篇论文的时机很有意思。MCP(Model Context Protocol)是 2024 年底 Anthropic 推出的开放标准,让 LLM 应用能以统一接口调用外部工具和数据源。2026 年 MCP 生态已经爆发——从文件系统、代码仓库到数据库,各种 MCP 服务器遍地开花。
但直到这篇论文之前,几乎没有 MCP 服务器把形式化推理引擎当作一等公民暴露出来。已有的 Prolog-MCP 之类的工作存在,但都是通用 Prolog 执行,没有针对政策建模、合规检查做专门设计。
Euclid-MCP 填的就是这个空缺:不是"让 LLM 跑 Prolog 代码",而是"让 LLM 描述业务规则,让专门工具执行并给出可审计的证明"。
这个区分很关键。前者是给 LLM 一把瑞士军刀,后者是给 LLM 一个专业会计。前者灵活但容易出错,后者死板但保证正确。在合规场景下,你要的是后者。
工程洞察:把推理外包,而不是训练进去
这篇论文对我个人最大的启发不是 Prolog、不是 MCP,而是一个更普适的工程原则:
与其训练模型学会推理,不如把推理步骤外包给专门工具。
这个原则其实我们一直在用,只是没意识到:
- 你不会训练 LLM 学会算 17 位浮点乘法,你让它调 Python
eval() - 你不会训练 LLM 记住所有航班时刻,你让它调航班 API
- 你不会训练 LLM 学会 SQL 优化,你让它调数据库
这和"计算器 vs 心算"的分工是同构的。你不会因为一个人心算慢就说他笨——你给他一个计算器。你也不会因为 LLM 在 1000 条事实的 RBAC 推理上幻觉就说它没用——你给它一个 Prolog 外挂。
更深层的问题是:为什么 480B 模型在 1000 条事实下翻车? 不是参数不够,是范式不对。LLM 的推理是"基于模式补全"的——它在生成下一个 token 时,找的是"这种上下文下通常接什么"。但逻辑推导不是统计模式,是符号操作。你不可能通过加参数让一个统计模型变成符号引擎——这是范式级别的限制。
Euclid-MCP 的解法是:承认这个限制,绕过去。让 LLM 做它擅长的(自然语言理解、结构化生成),让它不擅长的(多步逻辑推导)外包出去。这不是"模型不够强"的妥协,是"工具分工"的工程智慧。
和 RAG 不是替代,是互补
论文很明确地强调:Euclid-MCP 不是要替代 RAG,而是和它互补。
- RAG 适合:开放问答、文档检索、知识探索——"我们公司的差旅政策是什么?"
- Euclid-MCP 适合:政策执行、合规检查、访问审查——"user_0142 能否部署到生产?"
- 两者结合:RAG 检索相关政策文档,Euclid-MCP 评估具体配置是否合规
稳定推理基底:给 Agent 生态一个"共同事实"
论文最后一段我觉得很有前瞻性。它讨论了一个正在浮现的问题:Agent 时代的政策碎片化。
现在很多复杂任务用 LLM Agent 完成——Agent 收集信息、写代码、调用工具、返回结果。这降低了幻觉,但引入了新问题:每个新合规问题可能催生新 Agent、新生成的程序、新的政策解释。随着时间推移,组织会积累一堆不一致的、临时的政策实现,难以审计、比较、演进。
Euclid-MCP 的解法是把规则知识外部化到一个共享的、稳定的、可审计的知识库:
- 共享:所有 Agent 和工具查询同一份政策定义
- 稳定:政策只在 Euclid-IR 知识库更新时变,不会因为新 Agent 上线就变
- 可审计:每个决策都能追溯到具体规则和事实,不管哪个 Agent 发起的
- 可复用:同一份知识库支持访问审查、部署审批、事件响应、合规报告,不用重新编码逻辑
局限与思考
论文也诚实地列了几个局限:
1. 只有 Horn 子句:不支持析取、cut、列表模式匹配。复杂数据结构、非单调推理做不了。 2. 规模上限:4000 条事实表现好,10 万+ 条事实可能需要索引、tabling 或迁移到 Datalog 引擎。 3. 后端依赖:目前只实现了 SWI-Prolog 后端,虽然 Euclid-IR 设计为引擎无关,但替代后端(Datalog、SMT)还没实现。 4. 集成成本:需要额外的工具链(Euclid-IR 生成、错误处理、解释渲染),比纯 RAG 复杂。
我觉得最关键的局限其实是第四条——集成成本。Euclid-MCP 要求 LLM 学会写 Euclid-IR,这本身是个 prompt engineering 任务。如果 LLM 翻译错了(把"继承"写成"直属"),Prolog 算出的就是错世界的正确答案。垃圾进、垃圾出——这个古老原则在神经-符号系统里依然成立。
但好消息是:翻译任务比推理任务简单得多,可调试得多。翻译错了,你能从 Euclid-IR 里直接看到哪里不对;推理错了,你只能对着 LLM 的自然语言输出猜它哪步想岔了。可调试性本身就是工程价值。
结语:分工比统一更有效
Euclid-MCP 这篇论文给我最大的启发,是一个跨领域的工程原则:
分工比统一更有效。
- LLM 做自然语言理解,Prolog 做逻辑推导
- LLM 做模式识别,Prolog 做符号操作
- LLM 做灵活的,Prolog 做确定的
- LLM 做大概的,Prolog 做精确的
Euclid-MCP 不是让 LLM 变得更会推理,而是承认 LLM 在某些推理上不可靠,把这部分工作交给一个 1972 年就发明出来的逻辑编程语言。这个"退一步"的姿态,反而比"加参数加 RL 让模型自己学会推理"更务实、更可靠、更可审计。
有时候最好的创新不是发明新工具,是重新看见老工具的价值——Prolog 50 多岁了,但在 MCP 时代,它找到了新的位置。就像螳螂虾 5 亿年进化出来的声子盾牌原理,和人类 20 世纪发明的声子晶体是同一件事——重要原理会被独立发现多次,工具的价值会随时代重新被定义。
---
论文:arXiv:2607.21412 — Euclid-MCP: A Model Context Protocol Server for Deterministic Logical Reasoning via Prolog 作者:Bartolomeo Bogliolo 代码:https://github.com/meob/Euclid-MCP 一句话总结:让 LLM 当诗人,让 Prolog 当会计,MCP 当他们之间的电话线——合规问题就再也不会在凌晨两点翻车了。
🌟 智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
🎁 领取 2000万 Tokens