识别 Agent 的幻觉与隐蔽错误
系列入口:如何使用 Agent。相关:如何验收产出、评测集。
一、为什么幻觉最难防
在 Agent 的各种错误里,幻觉——产出看似合理、自信,实则缺乏事实依据甚至完全虚构——是最危险的一类。语法错误会被编译器抓住、逻辑偏差可能被测试发现,但一句"这个函数在三处被调用、返回这几个字段"如果是编的,它在形式上和真话毫无区别:同样流畅、同样肯定、同样专业。
这正是它可怕的地方:你无法靠文风或自信程度判断真假。 编造的部分不会有任何"我在猜"的标记,反而因为读起来通顺而更容易被接受,并可能被下游的人或 Agent 当作事实继承、层层扩散。识别幻觉,不能依赖感觉,只能依赖核查机制。

二、幻觉通常怎么产生
理解成因,才好对症。幻觉大多不是"故意骗人",而是以下几种情形。
信息不足却不承认。 当所需的代码、文档或数据缺失时,理想行为是如实说"这里我没有找到依据、无法确认";但模型倾向于给出一个完整、有用的答案,于是用一个看似合理的猜测把缺口补上,却不标注这是猜测。把可能性当成事实。 它读到一些线索,推断"应该是这样",但没有验证,就以肯定口吻写成结论。引用不存在的东西。 在长任务或上下文被压缩后,它可能凭模糊印象写出并不存在的函数名、字段、接口或调用关系。
一个共同特征是对"未确认"保持沉默。因此,当你看到一份毫无保留、全是绝对化结论、对覆盖范围和未决项只字不提的产出时,反而要提高警惕。
三、手段一:关键陈述必须可溯源
最根本的一条,是要求产出中的关键论断都能指回依据——具体的代码位置、真实数据、官方文档。
实操上,可以让 Agent 在报告重要结论时附带来源(文件与行号、查询、链接),使每句话可被核查;你再随机挑几处回到源头确认。这个"要它交代出处"的动作本身就能显著抑制编造,因为胡乱引用比空口下结论更容易被戳穿。判断一条陈述是否可信,标准很简单:能不能在原始材料里找到它。 找不到出处、或出处与说法不符的,无论多合理都应存疑。
这里要把"事实一致"提到和"逻辑正确"同等的位置。内部逻辑再自洽,只要与外部事实不符就是错的——而这恰恰是单靠通读最容易漏掉的维度。
四、手段二:边界用例把问题逼出来
很多隐蔽错误在典型输入下藏得很好,一到边界就现形。
主动构造边界与异常情况——空值、零、极大或极小、恰好临界点、缺失字段、非法格式、重复操作、极端顺序——让 Agent 的产出在这些条件下接受检验。一个被编造的假设往往只在"一切正常"的想象里成立,遇到边界就暴露出它并未真正核对过。这与测试设计里的四角度框架相通:正常、边界、异常、组合,后三类尤其能照出"想当然"。
对于它给出的方案,可以追问"在某某极端情况下会怎样",观察它是回到代码核实、还是继续凭空推测。真正可靠的答案会以事实回应,而不是再补一个同样自信的猜测。
五、手段三:交叉验证与多源比对
单一来源容易被一个自信错误带偏,交叉验证能有效降低这种风险。
让结论经受独立的第二次检查:换一个独立的 Agent/上下文重新核对同一问题(参考输出校验模式),或从两个不同的信息源比对——代码与文档、两个接口、日志与数据。如果独立来源得出一致结论,可信度大增;若互相矛盾,正好提示这里需要深查,而不是选一个听起来顺的就信。
要注意交叉验证不是简单地让"同一个思路再说一遍"——那只会复制错误。真正的交叉需要切断立场共享、回到原始事实独立判断,正如"校验者与产出者保持距离"所强调的。
六、在流程上提前拦阻
除了检测,更好的是减少幻觉发生与扩散的土壤:
- 喂足真实材料:让 Agent 在有依据的情况下工作,缺信息时明确允许并鼓励它说"不知道/需确认"。
- 只读权限兜底:涉及外部系统时,用只读最小权限,防止一个自信却错误的判断真的造成写入后果。
- 产出校验关口:在结论被下游使用前,安排独立校验,别让未核查的陈述直接进入后续环节。
- 区分事实与推测:要求产出中明确标注哪些是已证实、哪些是待确认的假设。
七、几类高频幻觉的具体模样
把幻觉说得具体些,更便于在真实产出里一眼认出。
虚构接口或符号:它写出一个并不存在的函数、参数、字段或配置项,名字起得极符合惯例,编译器或运行时才会报错;在纯方案阶段甚至不会报错,直接骗过评审。臆测调用关系:声称某函数被三个地方调用、某模块依赖某服务,实际并非如此——这类论断常出现在重构影响面分析里,若据此动手会漏掉或误伤真实调用方。编造数据或结论:在分析日志、查询结果时给出一个查无实据的数字或趋势,语气却像亲眼所见。把假设当现状:把"系统大概应该是这样设计的"写成"系统就是这样",而真实实现可能完全不同。
这几类的共同点是都在陈述外部事实、且都没有自动验证。一个能帮你定位风险的简单判据:产出中凡是涉及"代码里有什么、数据是多少、系统如何行为"的断言,都应列入核查范围;纯粹的逻辑推演则风险较低。
八、用提问把"猜测"逼出来
除了被动核查,你还可以主动用提问让它暴露自己其实没确认。
有效的问法是要求它区分"我看到的"与"我推断的",并给出具体位置:比如"你说这个字段一定存在,请给出定义它的文件和行号""这是你在代码里确认的,还是你的推测?如果是推测,请标注"。诚实的回答会指回真实位置或干脆承认不确定;而幻觉往往在"请给出处"这一步露馅,因为它无法为虚构的东西提供真实坐标。
还可以顺着追问边界:"如果这个字段缺失/为 null 会怎样?"——基于事实的答案会回到代码说明实际处理,凭空想象的答案则容易继续给出一厢情愿的"理想行为",前后一对照就能察觉。
九、防止幻觉扩散到下游
一个幻觉最危险的时刻,是它被写进文档、方案或下游代码后开始"自我证实":后来者(或另一个 Agent)读到它,便把它当作已知事实引用,错误于是层层传播、越来越难纠正。
因此要在第一道关口就拦住:未经核查的关键论断不直接进入交付物;需要传递时明确标注"待核实"。同时让事实有唯一、权威的来源(真实代码、数据库、官方文档),而不是以"某份 AI 生成的说明"为依据。这样即使一处出错,也能顺着权威来源快速证伪,而不是在一堆相互引用的二手材料里越陷越深。
十、责任始终在人
必须明确一点:采用 Agent 产出的决定,责任在做决定的人,而不在 Agent。 "是 AI 说的"不能成为错误流入生产的免责理由。这不是为了加重负担,而是提醒你把核查当作分内的最后一道工序。
好消息是,你不需要为所有内容负"逐行保证"的责,而是为流程负责:是否让它在充分真实的材料上工作、是否对高风险论断做了核查、是否用只读权限和人工确认兜住了不可逆操作。把这套机制立起来,幻觉的发生概率和危害都会被压到可控范围,你也才能放心地把更多事情交给它。
十一、什么时候可以降低核查强度
如果对每个任务、每个论断都满负荷核查,成本会高到难以持续,也违背了使用 Agent 的初衷。核查强度应当随可信度和风险动态调整。
可以从两个维度决定:论断的风险与该来源的稳定记录。对于低风险、可自动验证、且该 Agent 在同类任务上反复核查无误的产出,可以更多依赖自动化检查、减少人工回源;对于高风险论断,哪怕它历史表现很好,也应保留关键抽查。这里的信任是"挣来的":当稳定可验证的记录不断累积,可以逐步放宽低风险通道,但始终不把高风险闸门完全交出去。
需要警惕的是把"一直没出错"误当成"不会出错"——模型行为可能随上下文、版本、输入分布而变化。因此即便对高度信任的通道,也宜保留轻量的持续监控和少量随机抽查,一旦发现命中率下滑就立刻收紧。核查不是非黑即白的"全信或全疑",而是一套随证据和风险伸缩的梯度。
十二、把防幻觉做进工作流
个人临场核查之外,更可靠的是把防幻觉固化为团队工作流的一部分,让它不依赖某个人当天是否细心。
几个可落地的环节:在关键产出模板里强制区分"已核实事实"与"待确认假设"并附来源;在 CI 或评审流程中加入对高风险论断的独立校验关口(可复用本模块的评测/回归集);对涉及外部系统的操作统一采用只读最小权限 + 敏感动作人工确认,使一个漏网的幻觉至多造成可挽回的后果;并在事后把真实幻觉案例补入回归样本,防止复发。
这样形成一条完整防线:充分材料降低幻觉发生、来源标注与抽查提高识别率、权限和兜底限制危害、复盘回流防止重演。 当防幻觉从"靠自觉"变成"靠流程",整个团队使用 Agent 的下限才真正被托住,敢于把更重要的工作交给它。
十三、对"不确定"保持健康期待
最后要调整的是一种心理预期:很多人对 Agent 的期待是"它应该给我确定答案",于是面对它的"我不确定"反而失望、甚至倾向于选择它偶尔给出的斩钉截铁版本。这种期待本身在鼓励幻觉。
更健康的态度,是把"如实表达不确定"视为 Agent 高质量的标志,而非缺陷。在信息确实不足时,一个会停下、会请求补充材料或要求人工核实的 Agent,远比一个永远自信的 Agent 安全、可靠。你要追求的不是"它什么都敢答",而是**"它在该有把握时有把握、在没把握时让你知道"**。
当你主动奖励这种诚实——不因它说不知道而不满,反而据此补充信息、共同确认——模型也更可能稳定地保持认识论上的诚实。识别幻觉的终点,不只是练就一双火眼金睛,更是建立一种协作关系:让确定性与不确定性都被诚实地表达,人才能在正确的地方投入判断、在可以放手的地方安心放手。
十四、常见问题
Q:它说得特别肯定,是不是就更可信? 恰恰不能这么判断。真话和编造可以同样肯定,自信程度与是否属实没有因果关系;越是斩钉截铁的关键论断,越值得核查出处。
Q:Agent 偶尔承认"不确定",是好事吗? 是非常好的信号。如实标注未确认项,说明它没有用猜测强行补全;比起一份全绿、毫无保留的报告,这种产出更诚实、也更安全。
Q:核查每句话成本太高,怎么办? 只核查关键、高风险的论断——会影响决策、写入操作、对外结论的部分;普通细节可抽查。把"要出处 + 抽样验证"固化为流程,成本很低却能抓住主要风险。
Q:多个 Agent 都说一样,算证实了吗? 只有当它们基于各自独立的事实核查时才算;若只是共享同一错误前提或互相引用,那只是错误被重复,不是验证。
Q:模型版本更新后,以前的核查经验还有效吗? 不能想当然沿用。模型升级可能同时改善旧问题、引入新偏差,因此版本更新后应重新跑评测集、复查高风险论断,并重新观察一段真实表现,再决定核查强度;把"版本变更"当作一次需要重新建立信任的节点,而不是默认新版只会更好。
八、检查清单
- 关键陈述都附带来源,且抽样回到原始材料确认属实。
- 对"未确认/未找到依据"如实标注,未用猜测填空。
- 已用空值、临界、非法、极端顺序等边界用例检验。
- 重要结论经过独立来源或独立 Agent 的交叉验证。
- Agent 在真实、充分的材料上工作,事实与推测已分开标注。
- 外部连接以只读最小权限兜底,产出经校验后再被下游使用。
总结
幻觉之所以最危险,是因为错误内容和真话一样自信流畅、无法凭文风识别,且常在信息不足时被"强行补全"后当成事实扩散;对治它不靠感觉而靠机制——要求关键陈述可溯源并抽样事实核查、用边界与异常用例逼出想当然、让结论经独立来源交叉验证,同时在流程上喂足真实材料、允许它说"不知道"、用只读权限和产出校验提前拦阻,才能挡住这类最会伪装的错误。