幻觉处理
问题
AI 应用上线后用户反馈模型频繁"编造"信息,如何排查和解决?
答案
一、排查流程
二、幻觉应对策略
| 策略 | 做法 | 效果 |
|---|---|---|
| RAG 检索增强 | 从知识库检索事实作为上下文 | ⭐⭐⭐⭐⭐ |
| Prompt 约束 | "仅根据以下内容回答,无法回答请说不知道" | ⭐⭐⭐⭐ |
| 自我一致性 | 多次采样取多数一致结果 | ⭐⭐⭐ |
| 引用溯源 | 要求附上信息来源段落 | ⭐⭐⭐⭐ |
| 后处理校验 | 用另一个模型验证事实性 | ⭐⭐⭐ |
| 温度调低 | temperature=0 减少随机性 | ⭐⭐ |
三、面向工程的解决方案
// 结合 RAG + 引用溯源 + 拒答机制
async function answerWithGrounding(query: string) {
// 1. 检索相关文档
const docs = await vectorStore.search(query, { topK: 5 })
// 2. 相关性过滤 — 分数过低则拒答
const relevant = docs.filter(d => d.score > 0.7)
if (relevant.length === 0) {
return { answer: '抱歉,我没有找到相关信息', sources: [] }
}
// 3. 带约束的 Prompt
const prompt = `
仅根据以下文档回答用户问题。
如果文档中没有相关信息,请明确说"根据现有资料无法回答"。
回答时必须标注信息来源 [来源1]、[来源2]。
文档:
${relevant.map((d, i) => `[来源${i + 1}] ${d.content}`).join('\n')}
问题:${query}
`
const answer = await llm.generate(prompt, { temperature: 0 })
return { answer, sources: relevant }
}
关键点
幻觉无法完全消除,核心思路是:缩小生成范围 + 提供事实依据 + 允许拒答。
常见面试问题
Q1: 为什么 LLM 会产生幻觉?
答案:
LLM 本质是概率语言模型,按概率生成下一个 Token。它不具备"知道"与"不知道"的边界意识。幻觉的根源包括:
- 训练数据噪音:互联网语料包含错误信息
- 知识截断:训练数据有截止日期
- 分布偏差:对高频模式过度拟合
Q2: RAG 能否彻底解决幻觉?
答案:
不能。RAG 能大幅降低事实性幻觉,但仍可能出现:
- 检索到错误/过时的文档
- 模型忽视上下文内容,按自身知识回答
- 多文档信息矛盾时,模型随机选择
需结合 Prompt 约束、引用溯源、人工兜底形成完整方案。
Q3: 如何量化衡量幻觉程度?
答案:
- 忠实度 (Faithfulness):回答是否与提供的上下文一致
- LLM-as-Judge:用 GPT-4 检查回答中的错误陈述
- 人工抽检:定期抽样评估,计算幻觉率
- 工具:RAGAS、DeepEval