如何检测和缓解 Agent 的幻觉(Hallucination)?
难度:中级 分类:Safety & Alignment
简短回答
幻觉(Hallucination)是 LLM 生成看似合理但事实错误的内容的现象,在 Agent 系统中尤其危险——因为 Agent 会基于幻觉内容做出实际行动(调用工具、修改数据、返回用户)。行业报告显示幻觉相关事故每年造成超过 2.5 亿美元损失。检测方法分三类:(1) 不确定性估计——通过 logprob 分析、多次采样一致性检查识别低置信度输出;(2) 知识验证——将 LLM 输出与外部知识库/搜索结果交叉验证(RAG 可减少 35-60% 幻觉);(3) 自我一致性检查——让 LLM 对同一问题生成多个回答,不一致的部分可能是幻觉(FINCH-ZK 方法)。缓解策略:RAG 接地(用检索事实约束生成)、Multi-Agent 验证(Guardian Agent 架构可将幻觉率降至 1% 以下)、结构化输出约束(限制自由生成的空间)、人工闭环(关键场景由人类确认事实)。Agent 特有的幻觉问题:即使工具返回了正确数据,Agent 在解读和总结时仍可能引入幻觉。
详细解析
幻觉的类型
代码块
Plain Text
LLM 幻觉分类:
├── 内在幻觉(Intrinsic Hallucination)
│ ├── 与输入矛盾:生成的内容与提供的上下文冲突
│ └── 示例:文档说"收入增长10%",Agent 总结为"收入下降"
│
├── 外在幻觉(Extrinsic Hallucination)
│ ├── 凭空捏造:生成无法从输入或已知知识验证的内容
│ └── 示例:虚构不存在的论文、编造 API 参数
│
└── Agent 特有的幻觉
├── 工具输出误解:工具返回 A,Agent 总结成 B
├── 跨步骤信息丢失:多步推理中遗忘或歪曲之前的结果
└── 虚构工具能力:Agent 声称工具可以做某事但实际不能
检测技术
代码块
Python
class HallucinationDetector:
"""幻觉检测系统"""
# 方法 1:Log Probability 分析
def logprob_detection(self, response, logprobs):
"""低 logprob 的 token 序列可能是幻觉"""
suspicious_spans = []
for i, (token, logprob) in enumerate(zip(response.tokens, logprobs)):
if logprob < -5.0: # 极低概率的 token
suspicious_spans.append({
"position": i,
"token": token,
"logprob": logprob,
"confidence": "low",
})
缓解策略
代码块
Python
幻觉缓解效果对比
#SKfFUAfyUunw text { white-space: pre; }#SKfFUAfyUunw .fb0 { stroke: var(--N900-FG, 0.15); }#SKfFUAfyUunw .fb0 {stroke: rgba(31,35,41, 0.15)}#SKfFUAfyUunw .fx0 { stroke-miterlimit: 10; }#SKfFUAfyUunw .fx0 {stroke-miterlimit: 10}#SKfFUAfyUunw .fa1 { fill: rgb(187, 191, 196); }#SKfFUAfyUunw .fa1 {fill: rgb(187, 191, 196)}#SKfFUAfyUunw .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#SKfFUAfyUunw .fx1 {font-style: normal}#SKfFUAfyUunw .fx2 { text-anchor: middle; }#SKfFUAfyUunw .fx2 {text-anchor: middle}#SKfFUAfyUunw .fx3 { dominant-baseline: central; }#SKfFUAfyUunw .fx3 {dominant-baseline: central}#SKfFUAfyUunw .fx4 { stroke: none; }#SKfFUAfyUunw .fx4 {stroke: none}#SKfFUAfyUunw .fc0 { fill: var(--text-caption); }#SKfFUAfyUunw .fc0 {fill: #646a73}#SKfFUAfyUunw .fa2 { fill: var(--text-link-disabled); }#SKfFUAfyUunw .fa2 {fill: rgb(187, 191, 196)}#SKfFUAfyUunw .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#SKfFUAfyUunw .fx5 {font-style: normal}#SKfFUAfyUunw .fx6 { text-anchor: start; }#SKfFUAfyUunw .fx6 {text-anchor: start}#SKfFUAfyUunw .fx7 { dominant-baseline: alphabetic; }#SKfFUAfyUunw .fx7 {dominant-baseline: alphabetic}#SKfFUAfyUunw .fc1 { fill: rgb(0, 0, 0); }#SKfFUAfyUunw .fc1 {fill: rgb(0, 0, 0)}#SKfFUAfyUunw .fb1 { fill: var(--N900-FG, 0.15); }#SKfFUAfyUunw .fb1 {fill: rgba(31,35,41, 0.15)}#SKfFUAfyUunw .fb2 { fill: rgb(209, 217, 224); }#SKfFUAfyUunw .fb2 {fill: rgb(209, 217, 224)}#SKfFUAfyUunw .fa3 { fill: var(--bg-body); }#SKfFUAfyUunw .fa3 {fill: #fff}ABCD12345678缓解策略RAG 接地Guardian Agent 验证多次采样一致性结构化输出约束CoT 推理RAG + NeMo Guardrails温度设为 0幻觉减少率35-60%80-99%40-60%20-30%15-30%90-97%10-20%延迟影响+200ms+2-5s×N 倍无0.5+300ms无成本影响低高×N 倍无中中无
常见误区 / 面试追问
误区:"用 RAG 就能消除幻觉" — RAG 显著减少幻觉但不能消除。LLM 仍可能忽略检索到的文档而"自由发挥",或错误解读文档内容。RAG 需要配合输出验证和 Faithfulness 评估(如 Ragas 的 Faithfulness 指标)。
误区:"Agent 调了工具就不会幻觉" — Agent 在解读工具输出时仍然会引入幻觉。例如:数据库返回"Q3 收入 1200 万",Agent 可能总结成"Q3 收入增长 20%"(增长率是 Agent 自己编的)。需要对工具输出的解读进行专门验证。
追问:"如何在成本和幻觉检测率之间取平衡?" — 分级策略:(1) 所有输出用结构化约束 + 低温度(免费);(2) 重要场景用 RAG 接地(低成本);(3) 关键决策用 Guardian Agent 验证(高成本但最可靠)。按场景风险级别分配检测预算。
追问:"幻觉能被完全消除吗?" — 从当前技术看,不能。幻觉是 LLM 生成机制的固有特性(基于概率采样而非事实检索)。但可以通过多层缓解将关键场景的幻觉率降到极低水平(< 1%)。长期方向:Guardian Agent 架构 + 神经符号混合方法。