恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
P2防幻觉:给 AI 装四道闸门,让每句话都有据可查
首页
资讯中心
/
P2防幻觉:给 AI 装四道闸门,让每句话都有据可查
P2防幻觉:给 AI 装四道闸门,让每句话都有据可查
发布时间:2026/10/5 8:25:46
P2防幻觉给 AI 装四道闸门让每句话都有据可查一次本机实践非对照实验 —— 它把幻觉变「可控」但不「归零」。本文所有数字均来自本机实测工具返回、文件哈希、日志原文不引用任何我无法当场验证的第三方统计。图用户请求经 planner→executor→verifier依次过 P0 规则机检、P1 异构评审、P2 双模型辩论DeepSeek 辩护 / 千问 检察官规则失守或证据不足则转人工兜底。一、一次假通过比一次明显的失败更危险事情很简单我给自己配了一个 MCP 服务端用来把思考包转发给推理模型。我先在自己的终端里测了。协议握手正常工具列表正常真实调用返回可用。我告诉用户配好了。然后用户在应用里一调用——MCP error -32000: Connection closed。挖下去才发现根因是编码服务端用 sys.stdout.write() 输出中文。在我的 Git Bash 里环境带着 PYTHONUTF81Python 的 stdout 是 utf-8一切正常但应用启动进程时不带这个变量Python 回退到系统代码页 cp936/GBK写出的是 GBK 字节。客户端按 UTF-8 严格解析遇到非法字节直接判定报文损坏关掉连接。同一个文件两套环境两种结果。我做了一次对照实验改前 改后严格 UTF-8 解码 ❌ byte 0xb0 invalid start byte ✅ 通过出现替换字符 ✅ 有 ❌ 无中文工具描述 һ’˼’ 把一份’思考包’发送给推理引擎真正让我后背发凉的不是这个 bug 本身而是我最初的自测通过了。我用了一个和真实运行环境不同的环境得到了一个假的绿灯。这就是 AI 工程里最典型的幻觉温床证据看起来是对的但它测的不是你要交付的那个东西。二、问题的本质模型不是在撒谎是在补全说明下面三条是我在设计这套流程时的判断依据不是我跑过的对照实验结论。让模型仔细一点“不确定就说不知道”效果有限。原因不是模型不听话而是1.流畅不等于正确。 模型会用同样自信的语气说已验证和我觉得应该是。2.同一次生成无法真正自审。 让模型复查自己的结论它复用的是同一套权重和同一段上下文——这不是交叉验证是回声。3.“我说我完成了不是证据。 唯一算数的是文件属性、工具返回、哈希、日志、可点开的来源链接。所以真正有效的解法不是提醒”是结构让交付物必须过闸过不了就停在闸里。三、四道闸门这是我最后落地的结构命名沿用它的分级P2防幻觉。闸门 判什么 用什么判 不过怎么办P0 规则机检 文件存在 / 尺寸 / 哈希 / 数量 / schema / 数值区间 确定性脚本 直接失败不进模型P1 异构模型评审 声明与证据是否自洽 一个独立模型 reviseP2 官方核验 辩论 事实是否真有外部来源 浏览器检索 双模型对辩 ≤2 轮 reject / human人工兜底 规则失败≥1、事实不一致、无证据 人 escalate_human两条铁律规则优先。 能用脚本判定的绝不上模型。能机检就不主观。规则不过不进模型评审。 否则模型会拿着一堆错数据输出一个很流畅的错误结论。一个具体例子配置完 MCP 后我的规则闸是 10 条——JSON 是否合法、命令是否绝对路径、既有配置是否被误改、initialize 是否返回预期 serverInfo、工具数量是否达标、浏览器二进制是否存在、真实搜索能否读回结果……10/10 才放行。这是单次配置的通过记录不代表规则闸的漏报率——漏报要另设测试才能测。四、角色隔离让出题人和阅卷人不是同一个人四个角色每个都有明确的不做什么角色 只做 禁止planner 出工单steps / params / expected_claims / risk_level 不碰文件、不写执行结论、缺参数必须反问不许脑补executor 按工单调工具、回读实测值 不自由发挥、不补事实verifier 审 expected_claims vs measured 不重新生成业务内容debate high 风险的事实核验、证据检索与仲裁 不做检索以外的事最关键的一条是防自嗨verifier 和 debate 只接收声明 证据短文本不接收 executor 的完整推理过程。这条反直觉但极其重要。如果评审者看到了执行者的推理链它就会被那条思路带着走变成确认而不是审查。只给它结论和证据它才会真的去看证据本身。同理high 任务必须用两个不同厂商的模型我用 DeepSeek 通义千问一个当检察官专门找漏洞一个当辩护律师回应。禁止用同一个模型自我复查来顶替交叉互审。五、工单把要做什么翻译成可判定的声明工单的核心字段不是步骤而是 expected_claims——每一步预期能机器判定的结果。{“step”: 2,“tool”: “files.extract_entities”,“params”: { “source”: “in/resume.pdf,target:in/resume.pdf, target: in/resume.pdf,target:tmp/entities.json” },“expected_claims”: [{ “claim”: “实体文件存在”, “check”: “path_exists”, “args”: { “path”: “KaTeX parse error: Expected EOF, got } at position 20: …entities.json }̲ }, { clai…tmp/entities.json”, “schema”: “entity_list” } },{ “claim”: “至少1个公司名”, “check”: “count”, “args”: { “entity_type”: “company”, “op”: “gte”, “value”: 1 } }]}对 high 任务还有一条硬要求每条事实类 claim 必须锚定一个可检索实体——公司名、人名、日期、证书编号。没有实体P2 就无从下手等于放弃核验。六、三个真实案例案例 A编码根因——自测通过是最危险的证据就是开头那个。修复方式是在进程内锁定编码不依赖启动环境def _force_utf8_stdio():for stream in (sys.stdin, sys.stderr):try:stream.reconfigure(encoding“utf-8”)except Exception:passdef send(msg):# 直写字节绕开文本层的编码与换行转换sys.stdout.buffer.write(json.dumps(msg, ensure_asciiFalse).encode(“utf-8”) b\n)sys.stdout.flush()可复用的教训自测必须复现真实启动环境。在 Git Bash 里 PYTHONUTF81 是天然的必须用 env -u PYTHONUTF8 -u LANG 模拟应用环境否则就是假绿灯。案例 B搜索 MCP——独立评审挑出了我看不见的漏洞为了让模型能自主搜索我配了浏览器 MCP。规则闸全过initialize 返回 serverInfo.namePlaywrighttools/list 返回 26 个 browser_* 工具真实打开搜索引擎也读回了 10781 字符的结果。我判定 pass。然后我把它交给独立模型通义千问短评。它给了pass_with_notes理由是你用的是预填充 URL?qxxx只证明页面能打开没证明模型会在搜索框里打字、回车。它说得对。我补了一轮打开首页 → 在 #sb_form_q 里真实键入 quantum computing breakthroughs 2026 → 回车 → 读快照28403 字符URL 变成对应的搜索结果页判定 PASS_DYNAMIC。在本例中这就是异构评审的价值它挑的正是我自己看不见的盲区。至少在我这套模型组合下让执行者回头复查自己没能挑出这种我连测都没想到要测的漏洞。请注意限定语这是一次观察不是异构评审一定优于自我复查的普适定律。换个模型对、换个任务域结论可能不同。案例 C简历核验——防幻觉也包括承认防不了用户让我核对一份简历里的工作经历和公司名是否真实然后填到招聘官网。我出了工单但把两个东西明确拦了下来4.招聘官网 URL 未提供 → 填表步骤标记 BLOCKED_PENDING_INPUT不脑补站点。5.能力边界公开网络只能核实公司名是否真实存在这个人是否在这家公司任职过和在职起止日期属于个人隐私没有公开来源 → 一律 escalate_human禁止用模型推断代替证据。很多人以为防幻觉就是让 AI 什么都能查明白。恰恰相反——它最重要的一次输出是承认自己查不到。把已核实和不可核实混在一起报给用户是比答错更严重的幻觉。七、这套东西防不了什么我不想把它吹成万能药。先说清楚这不是对照实验没有基线组我也拿不出幻觉率下降 X%“这类效果数字——凡是这类指标我一律不写。 它明确防不住没有公开来源的事实个人隐私、内部数据、未公开的人事信息 → 转人工。源头污染如果权威来源本身就写错了两个模型一致也只是一致地错”。多模型解决的是自洽性不是真理性。规则脚本自身写错P0 是地基地基错了上面全错。所以要给 verify.py 做版本管理。成本high 任务要多轮检索和辩论慢、贵。所以它只用在真正高风险的场景招聘核对、对外发布、法务财务医疗、有副作用操作。它的真实作用是把幻觉从不可见的偶发错误变成可解释、可追溯、可拦截的确定流程。不是归零是可控。八、想用起来整套东西我已经打包好了技能 MCP 服务端 P0 脚本 示例工单三步就能装1) 装四个角色技能cp -r 01-技能/wb-* ~/.workbuddy/skills/2) 装 MCP填好 key 与绝对路径deepseek-bridge / qwen-bridge / playwright-search3) 把「项目指令」全文贴进 WorkBuddy 的 Project Instructions如果你只想取走一条最有价值的实践我建议是这条先问一句这条结论是靠脚本判定的还是靠模型觉得的 凡是能用脚本判定的就不要交给模型。附本文涉及的工单、执行记录、验证报告均为真实产物可在包的 04-示例logs/ 中逐条对照。