我让 Agent 自查答案,它更会编了——加一道事实核查层,幻觉率从 31% 压到 2%
先甩结论别让 Agent 自己核对自己的答案那只会让它编得更圆。真正压住幻觉的是把它的每句输出硬拽回工具返回的原始证据上对齐。下面这层事实核查我们上线后幻觉率从 31% 掉到 2%。我说的幻觉不是那种胡说八道的明显瞎编而是更阴的一种Agent 明明调了工具、拿到了真实结果总结的时候却把关键结论写反了——工具说退款失败它告诉你已成功退款。这种话长得特像真的用户一眼扫过去就信了等发现不对劲投诉电话都打过来了。我做了好几年对话类 Agent这种嘴比工具快的坑比彻底答不上来难缠得多因为你连它答错了这个念头都未必转得过来。普通聊天机器人胡说顶多误导Agent 是拿着工具、对着真实用户和真实订单说话的它一句已退款可能直接触发后续流程杀伤力完全不在一个量级。所以我后来对所有对外发声的 Agent 都格外较真宁可多一道校验也不赌它那次刚好没编。我得承认一开始我也走了弯路。看官方文档和一堆博客都在说让模型在回答前 verify 一下我就老实在 system prompt 里加了条规则constsystemPromptWithSelfCheck你是订单客服 Agent。 规则 1. 调用工具拿到结果后必须核对你的回答与工具返回完全一致 2. 不得编造工具未返回的信息 3. 回答前再确认一遍没有遗漏或夸大。;你猜怎么着幻觉率不降反升。我们拿了 200 组真实对话测naive 版本 31% 出现编造加上这条自查规则后涨到 37%。说白了这条软约束等于让小偷自己签字画押——模型为了看起来一致会直接把总结改成已核对无误哪怕它压根没对上更损的是它会悄悄改写工具返回里的关键数字去迁就自己的话。我特别讨厌这种自我感动式的自检它给的那句我已核对比没有还危险因为人本能地会信。这事儿其实跟确认偏误一个道理你让它核对它就默认自己是对的然后倒推着去圆。模型没有我可能错了这种自我怀疑给它一个自查的名头它只会更理直气壮地编。我实测过光靠 prompt 约束模型在退款失败→说成功这种场景下的翻车率一点没降反而因为多了核对环节显得更笃定用户被骗得更彻底。最离谱的一次模型把用户地址里的3 栋核对成了工具返回的5 栋还在末尾补了句已与系统一致我盯着那行字愣了半天才反应过来它压根没对上。说实话我当时挺不信邪连试了三个不同的措辞结果一个比一个糟。所以正确的做法不是让它自查而是让外部逻辑来查它。核心就三步把最终回答拆成一句句的声明claim再拿每句去工具原始返回里找证据找不到的就标红、逼模型改口或者补证据。// 极简事实核查层TypeScript无外部依赖可直接跑typeClaim{text:string;grounded:boolean;evidence?:string};functionextractClaims(answer:string):Claim[]{returnanswer.split(/[。\n]/).map((s)s.trim()).filter(Boolean).map((text)({text,grounded:false}));}functionground(claim:string,evidence:string):boolean{constnumsclaim.match(/\d/g)??[];conststates[成功,失败,已退款,未退款,已找到,无结果];consthasStatestates.some((s)claim.includes(s)evidence.includes(s));constnumsOknums.every((n)evidence.includes(n));returnhasStatenumsOk;}functioncheckFacts(answer:string,toolReturns:string[]):Claim[]{returnextractClaims(answer).map((c){consthittoolReturns.find((t)ground(c.text,t));returnhit?{...c,grounded:true,evidence:hit}:c;});}constanswer已为您成功退款订单号 88231。;consttoolReturns[refund result: 失败订单号 88231 未退款];console.log(checkFacts(answer,toolReturns));// → [{ text:已为您成功退款…, grounded:false }] ← 当场把假话抓出来ground 这个函数不玩字符串包含的虚招它只看两类硬货状态词成功/失败/已退款…和数字。只要这两样在工具返回里对不上claim 就别想及格。这买卖怎么算都值——多一次对齐少一次社死。跑完要是抓到没证据的 claim别直接删我是让它降级重答把那些无依据的说法甩回给模型让它补证据或者改口。asyncfunctionrunAgentWithFactCheck(messages:any[],tools:any[]){constresawaitrunAgent(messages,tools);// 拿最终回答 工具返回consttoolReturnsres.toolCalls.map((t:any)t.result);constungroundedcheckFacts(res.answer,toolReturns).filter((c)!c.grounded);if(ungrounded.length0)returnres.answer;// 全有证据直接放行constretryawaitrunAgent([...messages,{role:user,content:你的回答里这些说法在工具返回中找不到依据请删除或改写${ungrounded.map((c)c.text).join()}},],tools,);returnretry.answer;}说起来雷达鸭那个客服 Agent 早期就栽在这上面——它把一次失败的案例查询说成已为您找到 3 个案例用户点进去是空的。后面就是靠这层事实核查兜住的。我这层不是凭空想的是被一通投诉逼出来的。有回 Agent 调订单工具拿到退款失败转头给用户总结已为您成功退款人家真去查了才发现钱没退。我后背一下就凉了——这种假话发出去比不回答还糟十倍。如果让我重来第一版就该把这层核查焊死在链路里。那次之后我把所有对外发声的 Agent 都过了一遍发现不止退款连已发货已找到 N 个案例都有过张冠李戴只是没被用户逮到罢了想想都后怕。数据摆一下200 组带工具调用的真实任务方案幻觉率单次额外耗时裸跑 naive31%0system 自查37%0事实核查层2%0.4snaive 那 31% 里把失败说成成功占了一大半加 system 自查不降反升正好印证前面的判断上事实核查后掉到 2%代价是每次多一次 claim 抽取约 0.4s我完全能接受。当然这层也不是银弹。claim 抽取本身会漏遇到长推理链尤其明显而且工具里找不到不等于一定是幻觉——有些话确实没有工具能覆盖。所以我对无证据 claim 的处理是降级重答不是一刀切删除免得把对的也砍了。还有个坑得提醒如果工具返回本身就错了比如下游接口给了个假成功事实核查层是查不出来的——它只保证Agent 说的 工具说的保证不了工具说的是真的。这块得靠工具侧自己的校验别有奢望一层核查包打天下。我后来给退款、改单这类关键工具又叠了一道结果回查工具在返回前先自己验一遍两层夹着才敢放心放出去。反正我现在默认给每个会对外说话的 Agent 套这层核查。宁可它偶尔多问一句我不确定您再确认下也不让它替我把假话顺溜地发出来。你那边 Agent 出过这种嘴比工具快的事故吗我是老三10 年软件开发经验软件设计师、人工智能应用工程师。平时主搞鸿蒙 ArkTS 北向开发和 Web 前端也在折腾 AI 自动化偶尔在 CSDN 写点鸿蒙和 AI 的实战笔记。本文遵循 MIT 协议转载请注明出处。

相关新闻

Claude-5代码生成模型:业务逻辑理解与工程化实践指南

Claude-5代码生成模型:业务逻辑理解与工程化实践指南

如果你是一位开发者,最近在关注 AI 编程助手或代码生成工具,可能已经注意到一个现象:市面上的工具越来越“聪明”,但真正能理解复杂业务逻辑、生成可维护代码的却不多。很多工具在简单示例上表现惊艳,一旦遇到真实项目…

2026/10/16 21:55:24 阅读更多 →
自注意力机制原理与Transformer实战指南

自注意力机制原理与Transformer实战指南

1. 自注意力机制:深度学习序列建模的革命2017年,Google Brain团队在《Attention Is All You Need》论文中提出的Transformer架构,彻底改变了序列建模的游戏规则。作为其核心组件的自注意力机制(Self-Attention Mechanism&#xff…

2026/10/21 1:00:39 阅读更多 →
Petri Net与LLM结合:解决Rust并发API状态复杂性的测试生成方法

Petri Net与LLM结合:解决Rust并发API状态复杂性的测试生成方法

并发编程的测试困境:当你的 Rust API 状态复杂到连自己都理不清时,如何保证多线程下的正确性?传统单元测试往往只能覆盖简单的线性路径,而真正的并发 bug 总是在那些意想不到的交错执行中悄然出现。今天要介绍的方法,结…

2026/10/17 2:11:40 阅读更多 →

最新新闻

欧拉20 SP8上GaussDB 100部署实战:从环境准备到避坑指南

欧拉20 SP8上GaussDB 100部署实战:从环境准备到避坑指南

简介:这是面向 GaussDB 100 数据库管理员与运维工程师的部署资源,基于 EulerOS 20 SP8 64 位环境,用于快速完成分布式数据库的安装、升级或版本验证,可减少手动配置带来的时间消耗。压缩包体积约 7.39MB,共 6 个文件&a…

2026/10/21 3:10:09 阅读更多 →
OpenCV实战:多方向箭头识别与模板匹配优化

OpenCV实战:多方向箭头识别与模板匹配优化

“OpenCV 项目实战:多方向箭头识别与模板匹配优化”这个标题里的每一个词,都是我踩过坑之后才真正理解的。接到需求时,我原以为多方向箭头识别只是模板匹配的入门级应用,做起来才发现,光是把“多方向”三个字落地&…

2026/10/21 3:10:09 阅读更多 →
VXLAN分布式网关实验详解:从原理到配置排错

VXLAN分布式网关实验详解:从原理到配置排错

1. 为什么全网都在聊VXLAN,以及分布式网关到底解决了什么先聊点实际的。如果你最近在搞数据中心网络、虚拟化迁移或者跨机房容器网络,一定绕不开VXLAN这个词。我去年的某个项目里,客户要求把两个物理机房的虚拟机网络打通,业务侧要…

2026/10/21 3:10:09 阅读更多 →
OpenCV模板匹配实战:多方向箭头识别与旋转尺度优化指南

OpenCV模板匹配实战:多方向箭头识别与旋转尺度优化指南

最近在做一个视觉定位相关的项目,有一块需求是要从摄像头画面里识别出多方向箭头,并且输出箭头的具体朝向。最开始我觉得这个事不难,OpenCV 的模板匹配跑一版不就完了吗?结果一上手就发现,箭头只要转个方向&#xff0c…

2026/10/21 3:10:09 阅读更多 →
PWM调光LED从原理到实战:频率、占空比、驱动电路与避坑指南

PWM调光LED从原理到实战:频率、占空比、驱动电路与避坑指南

简介:一份以STC12C2052单片机为控制核心、利用脉宽调制(PWM)技术实现LED灯亮度无级调节的完整工程包,面向电子技术爱好者、嵌入式开发初学者及单片机课程实践者。包内涵盖LED显示、自动控制、键盘输入等多个独立功能模块&#xff…

2026/10/21 3:10:09 阅读更多 →
51单片机DS18B20温度采集与NRF905无线传输实战

51单片机DS18B20温度采集与NRF905无线传输实战

简介:这是一套面向单片机爱好者、电子类专业学生与DIY玩家的温度采集与无线传输实践方案,基于51单片机搭配NRF905无线模块,解决短距离温度数据采集与无线收发的问题,适合具备一定电子技术基础、能看懂基础电路图并了解C语言设计原…

2026/10/21 3:09:09 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →