Agent 如何降低幻觉:从检索接地到事实验证的系统工程
单次 LLM 生成的幻觉是「口误」,Agent 的幻觉是「系统性偏差」——它在多轮推理、工具调用与上下文拼接中被反复确认、包装和放大。
一、Agent 幻觉的独特之处:它比单次生成更难治
单次 LLM 生成的幻觉,边界清晰:模型编了一个不存在的「事实」,纠正即可。但 Agent 的幻觉有四个独特来源,任何一个都足以让传统的「提示词防幻觉」失效:
| 来源 | 机制 | 示例 |
|---|---|---|
| 上下文缺口 | 检索不到 / 检索不全,模型用先验知识填补 | 知识库没有 2026 年政策,模型按 2025 年编 |
| 工具错误 | 工具返回错误或空结果,模型「合理」脑补 | 天气 API 超时,Agent 说「今日晴」 |
| 累积放大 | 中间步骤的错误被后续推理当作前提 | 第一步算错汇率,第二步基于错误数字算总价 |
| 指令误解 | Agent 分不清「检索到的」与「我推测的」 | 把推理假设当成检索事实写进结论 |
核心洞察: Agent 幻觉的本质是**「模型无法区分自己的记忆、上下文与工具输出」**。因此抑制策略必须围绕一件事展开——让 Agent 的每一个结论都能追溯到可信来源,并让它在无法追溯时学会说「不知道」。
二、第一道防线:检索接地(Grounding)
没有检索的 Agent 注定是幻觉重灾区。但「接了 RAG」不等于「接地成功」——检索质量差时,模型反而会被不相关的上下文误导。
2.1 检索质量工程
- Query 改写:用户口语化问题先改写为检索友好形式(
"北京明天天气" → "2026-08-12 北京 天气预报"),再查向量库; - 混合检索 + 重排序:向量召回 + 关键词召回合并,用 Reranker 精排后取 top-5~8,避免「只按向量相似度」带来的语义偏移;
- Chunk 质量:按语义边界切分而非硬切 512 token,保证每个 chunk 自带完整上下文;
- 新鲜度:时效性数据(政策、行情)标注时间戳,过期内容不进上下文。
2.2 让模型「只能」用上下文说话
提示词层面约束模型的行为边界,而不是「不要编造」这种空洞指令:
回答规则:
1. 你只能依据【参考资料】中的内容作答。
2. 每个事实性陈述后标注来源编号,如 [1][2]。
3. 【参考资料】中没有答案时,直接回答"资料暂缺",并说明缺少哪类信息。
4. 禁止使用参考资料之外的知识补充细节。
要点:给模型一个「安全出口」(资料暂缺),而不是让它硬答。 空洞的「不要编造」约束(负面约束)反而会诱导犯错——心理学上的讽刺性过程理论同样适用于 LLM。
2.3 引用溯源与后验校验
- 强制逐句引用标注(来源编号);
- 后端对引用做校验:检查引用的 chunk 是否真的包含该陈述(可用检索匹配或 NLI 判断「陈述是否被证据支持」);
- 校验不通过的句子标记为「低置信」,降级展示或交由验证 Agent 复核。
三、第二道防线:结构化约束——不给幻觉留发挥空间
模型的幻觉往往发生在「自由发挥」最旺盛的地方。用结构约束压缩自由度,是成本最低、见效最快的抑制手段。
3.1 强制结构化输出
用 JSON Schema / 工具调用(Function Calling)约束输出格式,让模型在预设的字段内作答,而非自由行文:
{
"type": "object",
"required": ["answer", "confidence", "sources", "unknown"],
"properties": {
"answer": { "type": "string", "description": "基于资料的直接回答" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 },
"sources": {
"type": "array",
"items": { "type": "string", "description": "引用来源编号" }
},
"unknown": {
"type": "boolean",
"description": "资料不足时为 true,此时 answer 应为'资料暂缺'"
}
}
}
结构化输出的三个收益:
- 强制自省:
unknown字段的存在,迫使模型在生成前显式判断「资料够不够」; - 可校验:schema 校验 + 字段级规则校验(如日期格式)在 LLM 之外拦截错误;
- 可追踪:
sources字段让每个答案都能回溯证据。
3.2 约束生成(Constrained Decoding)
对格式敏感的字段(日期、数字、代码、枚举),用约束解码直接限制 token 采样空间,模型根本没有机会生成非法值。示例:日期必须匹配 \d{4}-\d{2}-\d{2},枚举只能取 schema 中的值。
3.3 低温度 + 参数纪律
- 事实性任务用
temperature=0~0.2,把随机性压到最低; - 关闭「创造性的等价表述」,要求模型复述而非改写上下文中的关键事实;
- 对不确定的问题,
max_tokens越短越好——输出越长,编造的窗口越大。
四、第三道防线:自洽性验证——让模型自己「说两遍」
单次生成无法自我纠错,但多次生成的一致性是幻觉的强信号。真实事实多次生成高度一致,幻觉则飘忽不定。
4.1 Self-Consistency:采样取众数
对高风险问题,同一个 prompt 采样 3~5 次(可微调 temperature),取答案的多数票:
采样 1:答案是 42
采样 2:答案是 42
采样 3:答案是 43 ← 与多数不一致,标记低置信
一致性低于阈值(如 3 次中有 2 次一致)时,降级处理:标注「结果存在分歧」或转入人工/验证 Agent 复核。
4.2 Self-Reflection:生成后自我审查
让模型对自己的输出做一次批判性审查:
请逐条检查你上一步的回答:
1. 每条陈述是否都能在【参考资料】中找到直接依据?
2. 是否把推测当成了事实?(推测必须以"可能/推测"明确标注)
3. 是否存在相互矛盾的陈述?
对每个问题,给出"通过/不通过"及理由,不通过的直接修正。
Self-Reflection 并非万能——模型有时会「自信地确认错误答案」,但对格式、矛盾、引用缺失类问题效果明显。它更适合作为规则审查的补充,而非唯一手段。
4.3 辩论式验证(Multi-Agent Debate)
多个 Agent 从不同角色视角回答同一问题并互相审查,分歧处强制给出证据:
Agent A(资料派):严格依据检索文档作答
Agent B(常识派):基于通用知识作答
Agent C(审校派):对比 A/B 的回答,指出冲突点并给出裁决理由
研究与实践均表明,多 Agent 辩论能显著降低错误共识,代价是成本成倍增加——只对高风险、高价值请求启用(如金融建议、医疗信息)。
五、第四道防线:事实验证 Agent——给系统装上质检员
把「验证」从提示词技巧升级为独立的系统组件,是 Agent 幻觉治理的成熟工程化路径。
5.1 验证 Agent 的工作流
生成结果 → 事实抽取 → 证据检索 → 一致性判定 → 输出分级
- 事实抽取:用 NER/LLM 从回答中抽取「可验证的原子事实」(如"X公司2024年营收增长30%");
- 证据检索:每个原子事实独立检索证据;
- 一致性判定:判断「事实陈述 vs 证据」是否一致(NLI 蕴含判断 / 检索命中判定);
- 输出分级:按验证结果给每条陈述打标:
| 标签 | 含义 | 处理 |
|---|---|---|
| ✅ 已验证 | 证据支持 | 正常展示 |
| ⚠️ 存疑 | 证据不足或矛盾 | 降级展示,附「该信息未经核实」 |
| ❌ 冲突 | 与证据冲突 | 拦截修正或拒绝输出 |
| 未知 | 无法验证 | 标注「模型推测」,不得作为事实 |
5.2 工具错误时的「失败处置协议」
Agent 调工具失败时的默认行为,决定了幻觉的下限:
失败处理规则:
1. 工具返回空结果/错误时,禁止用常识填补。
2. 如实报告:"查询失败,无法获取该数据",并给出失败原因。
3. 允许重试 1 次;重试仍失败则中止该步骤,不继续推导。
4. 涉及数值的结论,必须展示计算过程与数据来源,便于复核。
关键原则:工具失败的默认输出是「不知道」,而不是「猜一个」。
5.3 多步 Agent 的防累积放大
- 每一步的中间结论写入带来源的显式状态(结构化字段),而非自由文本——避免「来源」在传递中丢失;
- 每步增加前置校验节点:输入数据非法(空、超范围、格式错)时短路,不进入下一步推理;
- 关键数值(金额、日期、ID)做格式与范围规则校验,规则校验永远在 LLM 之前;
- 对「数值计算类」任务,用**代码工具(计算器、Python 解释器)**代替模型心算——模型负责选公式,计算交给确定性工具。
六、评估:没有度量就没有治理
幻觉抑制的效果必须可量化,否则所有手段都是「感觉上变好了」。
6.1 建立幻觉评估集
- 构造带标注的评估集:每道题包含「正确回答」「关键事实点」「陷阱点」(易混淆事实、过时信息);
- 至少覆盖三类:检索可得型(验证 RAG 链路)、检索不可得型(验证"资料暂缺"能力)、多步推理型(验证累积放大控制)。
6.2 核心指标
| 指标 | 含义 | 目标 |
|---|---|---|
| 幻觉率 | 回答中含未被证据支持陈述的比例 | 越低越好,按业务定阈值 |
| 资料暂缺正确率 | 检索不可得时正确拒答的比例 | ≥ 90% |
| 引用准确率 | 引用编号与实际证据的匹配度 | ≥ 95% |
| 分歧检出率 | 自洽性采样发现矛盾的比例 | 与幻觉率负相关 |
| 端到端准确率 | 最终回答的事实正确率 | 业务指标 |
6.3 灰度与回归
- 每次 Prompt、检索、验证逻辑变更都跑评估集,防幻觉能力不允许回退;
- 线上按「新策略 → 10% 流量 → 对比幻觉率与用户投诉」逐步放量。
七、组合拳:不同场景的配置建议
| 场景 | 建议组合 | 说明 |
|---|---|---|
| 通用问答(低风险) | 检索接地 + 结构化输出 + 引用标注 | 成本优先,Prompt 层治理 |
| 客服/业务咨询(中风险) | 以上 + 自洽性采样 + 规则校验 | 关键字段加约束解码 |
| 金融/医疗建议(高风险) | 以上 + 事实验证 Agent + 辩论验证 | 验证 Agent 全量复核,低置信不输出 |
| 多步数值计算 | 检索接地 + 代码工具计算 + 前置校验 | 计算交给确定性工具 |
治理顺序建议: 先做检索接地(解决 60% 问题)→ 再做结构化约束(解决格式与拒答)→ 最后按风险等级上验证 Agent(解决剩余长尾)。不要一开始就堆多 Agent 辩论——成本高且边际收益递减。
八、关键结论
- Agent 幻觉的根源是「来源不可追溯」:让每个结论有来源、每个来源可验证、无法验证就拒答,是治理的主线。
- 先接地,再约束,后验证:检索接地解决大部分问题,结构化约束压缩发挥空间,事实验证 Agent 兜底长尾。
- 给模型「不知道」的权利:空洞的「不要编造」不如明确的「资料暂缺」出口,负面约束反而诱导犯错。
- 确定性优先:能用规则校验、代码工具、约束解码解决的,就不要依赖模型「自觉」。
- 评估驱动治理:建立幻觉评估集与灰度机制,所有手段以指标为证,防幻觉能力不允许回退。
降低幻觉不是「让模型更老实」,而是「让系统更可追溯」——当每个结论都能指出来源,幻觉就失去了藏身之处。