幻觉缓解策略:怎么让AI少说胡话?
开篇:先泼一盆冷水
在说怎么”缓解”幻觉之前,我得先告诉你一个坏消息:
幻觉不能100%消除。
原因很简单:AI的工作方式就是”概率预测”,不是”知识检索”。只要是概率预测,就有可能出错。
你不可能让AI既能自由发挥创造力,又保证100%不说错话——这俩是矛盾的。
就像你不可能让一个人既能天马行空地写小说,又保证每个字都有文献依据。
但好消息是:我们可以通过很多方法,把幻觉的概率降到很低很低,低到在大多数场景下可以接受。
今天这篇文章,就是告诉你这些方法。
一、为什么LLM会产生幻觉?(快速回顾)
在深入方法之前,先快速回顾一下幻觉是怎么产生的。
1.1 AI本质是个”猜词机器”
你给AI一段话,它做的事情是”猜下一个字该是什么”。
它不是在”回忆正确答案”,而是在”模仿最像正确答案的模式”。
1.2 幻觉产生的三大原因
原因一:训练数据有问题
AI学的是海量网络文字,而网上有多少错误信息,你懂的。
原因二:知识过时了
AI的知识有截止日期,2023年12月之后发生的事,它要么不知道,要么瞎编。
原因三:边界模糊
AI学了太多知识,但知识之间的边界它不一定清楚,容易”混搭”。
二、方法一:RLHF——让AI学会”乖一点”
2.1 什么是RLHF?
RLHF的全称是”Reinforcement Learning from Human Feedback”,翻译过来就是”从人类反馈中进行强化学习”。
这个名字听起来很复杂,但其实原理很简单:
就是让人来教AI:什么该说,什么不该说。
2.2 RLHF是怎么工作的?
第一步:先训练一个”好学生”
先用人工标注的高质量问答数据,让AI学会”正常说话”。
这一步叫”监督微调”(SFT)。你可以理解为:请了一个好老师,手把手教AI怎么回答问题。
第二步:让人来打分
然后,让人类评估员来评估AI的回答好不好。
比如同一个问题,让AI生成两个回答,让人来选哪个更好:
问题:水的沸点是多少?
回答A:水的沸点是100摄氏度。
回答B:水的沸点是100摄氏度,在海平面气压下。
评估员:A和B哪个更好?
→ B更好,因为它更完整
第三步:训练一个”打分模型”
用这些人类打分的数据,训练一个模型,让它能自动判断”这个回答好不好”。
这个”打分模型”就叫”奖励模型”(Reward Model)。
第四步:用强化学习来优化
有了奖励模型,就可以让AI”自我进化”了。
AI生成回答 → 奖励模型打分 → 根据分数调整策略 → 生成更好的回答 → 继续打分 → …
这个过程不断循环,AI的回答质量就会越来越好。
2.3 RLHF为什么能缓解幻觉?
因为人在打分的时候,可以专门关注”事实准确性”。
如果AI瞎编了一个答案,打分的人可以给低分。AI学会”避免低分”,就会减少瞎编。
2.4 RLHF的局限性
RLHF不是万能的,它有自己的问题:
问题一:人的偏好有差异
不同的人对”什么是一个好回答”可能有不同看法。张三觉得详细的回答好,李四觉得简洁的回答好。
问题二:打分的一致性难保证
让一个人评估1000个回答,前50个和后50个的评判标准可能不一致(疲劳效应)。
问题三:可能出现”奖励黑客”
AI可能学会”取悦打分的人”而不是”真的把事情做好”。
比如:
- AI发现:回答越长,打分越高 → AI开始罗里吧嗦
- AI发现:使用某些词汇能获得高分 → AI开始套模板
2.5 怎么用RLHF?(实操建议)
如果你在训练自己的AI,可以考虑:
# 伪代码示例:构建RLHF训练数据
training_data = []
# 对每个问题,生成多个回答
for question in questions:
answers = model.generate_multiple(question, num=5)
# 让人类评估员打分
scores = []
for answer in answers:
score = human_evaluator.rate(question, answer)
scores.append(score)
# 记录最好的和最差的
best_idx = scores.index(max(scores))
worst_idx = scores.index(min(scores))
training_data.append({
"question": question,
"chosen": answers[best_idx],
"rejected": answers[worst_idx]
})
# 用这些偏好数据训练奖励模型
reward_model.train(training_data)三、方法二:思维链——让AI”多想几步”
3.1 什么是思维链?
思维链(Chain-of-Thought,CoT)就是让AI”先想想再答”。
普通模式:
用户:北京人口多少?
AI:北京人口约2189万。
思维链模式:
用户:北京人口多少?
AI:让我想想...北京是中国的首都,根据最新人口普查...2023年北京市常住人口约为2189万人...这个数据应该来自北京市统计局官方网站。
3.2 思维链为什么有效?
原因一:把推理过程外化了
AI在”想”的时候,实际上也在构建一个推理链条。
如果推理链中有错误,这个错误会传导到最终答案。通过观察推理过程,可以发现错误。
原因二:给AI更多的”思考空间”
普通回答只有”结论”,思维链多了”推理过程”。
如果结论错了,但推理过程合理,说明问题可能在”推理链”之外(比如训练数据过时)。
原因三:减少”冲动回答”
AI有时候会”冲动”给出一个看似合理但实际上错误的答案。思维链让AI”冷静一下”,多想想。
3.3 思维链的实操技巧
技巧一:加一句”请分步思考”
prompt = """
问题:北京的人口是多少?
请分步思考:
1. 北京是中国的哪个城市?
2. 根据最新的人口数据...
3. 因此,北京的人口大约是...
"""技巧二:给个示例
Few-shot CoT——先给一个完整的思考示例,AI照着学:
示例:
问题:小明有10个苹果,给了小红3个,还剩几个?
思考过程:
- 小明一开始有10个苹果
- 他给了小红3个
- 10 - 3 = 7
- 所以小明还剩7个苹果
答案:7
现在请用类似的方式思考:
问题:[你的问题]
"""
技巧三:Self-Consistency(自洽性)
这个方法更高级:让AI用不同的方式思考同一个问题N次,然后看哪个答案出现的次数最多。
# 伪代码示例
question = "水的沸点是多少?"
# 让AI用不同的方式思考5次
answers = []
for _ in range(5):
thought = model.think_differently(question) # 每次用不同的随机种子
answer = extract_answer(thought)
answers.append(answer)
# 投票
from collections import Counter
final_answer = Counter(answers).most_common(1)[0][0]如果5次思考有4次都得出”100摄氏度”,说明这个答案比较可靠。
如果5次思考得出了3个不同的答案,说明AI对这个问题也不太确定。
3.4 思维链的局限性
局限性一:成本增加
多了”思考过程”,意味着更多的token,也就意味着更高的成本。
一道简单问题,普通回答50个token,思维链可能需要200个token。
局限性二:思考过程本身也可能幻觉
AI可能在”思考过程”里就编造了一些”推理依据”,然后基于这些假的依据得出一个假的结论。
局限性三:不是所有问题都适合
简单的事实性问题(比如”今天是几号?”),不需要思维链,反而增加成本。
四、方法三:RAG——让AI先查资料再回答
4.1 什么是RAG?
RAG的全称是”Retrieval-Augmented Generation”,翻译过来就是”检索增强生成”。
这个名字很直白:先检索,再生成。
4.2 RAG的工作原理
第一步:构建知识库
把你的文档、产品资料、FAQ等整理好,变成AI能查询的格式。
这一步通常是把文字切成小块,然后转成”向量”存入数据库。
第二步:用户提问时,先去知识库检索
用户问”我们的退货政策是什么?”
系统先把这个问题和知识库里的内容比对,找出最相关的几块。
第三步:把检索到的内容给AI
把”退货政策”相关的文档片段喂给AI,告诉它”根据这些资料回答”。
第四步:AI基于检索结果生成回答
AI不再”靠自己编”,而是基于检索到的真实资料来回答。
4.3 RAG为什么能缓解幻觉?
因为AI的回答有了”事实依据”。
它不是在自己”编”,而是在”转述”——把检索到的内容用自己的话重新表达。
4.4 RAG的问题
问题一:检索可能出错
如果检索没找到正确的内容,或者找到的内容相关性不高,AI还是可能瞎编。
问题二:检索到的内容可能过时
知识库里的内容如果过时了,AI基于过时内容生成的回答也是错的。
问题三:AI可能过度依赖检索内容
有时候AI会”机械地转述”,而不是真正理解检索内容然后回答。
4.5 RAG的进阶版本:CRAG
CRAG的意思是”Corrective RAG”——自我纠错的RAG。
普通RAG是”查到啥就用啥”,CRAG会先评估检索到的内容质量:
- 如果质量高 → 直接用
- 如果质量低 → 尝试外部搜索(比如联网搜索)
- 如果完全不对 → 放弃检索,用自己的知识但标注”不确定”
# 伪代码示例
async def crag_generate(question):
# 1. 检索
retrieved_docs = await knowledge_base.search(question)
# 2. 评估检索质量
quality = await assess_retrieval_quality(question, retrieved_docs)
if quality == "HIGH":
# 质量高,直接用
return await generate_from_docs(question, retrieved_docs)
elif quality == "MEDIUM":
# 质量一般,尝试补充搜索
external_results = await web_search(question)
combined_docs = retrieved_docs + external_results
return await generate_from_docs(question, combined_docs)
else: # quality == "LOW"
# 质量低,可能需要AI用自己的知识,但要标注不确定性
response = await generate_with_uncertainty_flag(question)
return response五、方法四:知识边界感知——让AI知道”我不懂”
5.1 问题在哪?
现在的AI有一个大问题:它很难说”我不知道”。
你问它一个完全超出它知识范围的问题,它不会说”我不清楚”,而是会努力”编一个”。
5.2 怎么让AI说”我不知道”?
方法一:Prompt引导
在prompt里明确告诉AI:
“如果问题超出你的知识范围,请直接说你不知道,不要编造。”
prompt = """
你是一个严谨的AI助手。
对于每个问题:
1. 如果你知道答案,给出准确的信息
2. 如果你不确定,说"我不确定这个问题的答案"
3. 如果你完全不知道,说"这个问题超出我的知识范围"
现在回答:
"""方法二:置信度检测
让AI回答的时候,同时输出一个”置信度”——“我觉得这个答案有90%的把握是对的”。
然后根据置信度决定怎么处理:
response = model.generate_with_confidence(prompt)
if response.confidence < 0.7:
print("⚠️ AI对这个答案不太确定,人工核实一下")
else:
print("✓ AI对这个答案比较有把握")方法三:不确定性量化
这个方法更技术一些:分析AI生成每个token时的”概率分布”。
如果AI对某个词的概率预测很”散”(entropy高),说明它对这个地方不太确定;如果很”集中”(entropy低),说明它比较确定。
5.3 OOD检测:识别”超纲题”
OOD是”Out-of-Distribution”的缩写,意思就是”超出分布”。
就是让AI能识别:“这个问题我好像没见过”。
怎么做到?
训练一个专门的分类器,喂给它一些”AI确定能答”和”AI确定不能答”的问题,让它学会区分。
实际使用时,先用这个分类器判断”这个问题是内行还是外行”:
- 内行 → AI正常回答
- 外行 → AI谨慎回答或说”不确定”
六、方法五:宪法AI——让AI自己批评自己
6.1 什么是宪法AI?
宪法AI(Constitutional AI)是Anthropic公司提出的一种方法。
它的核心思想是:给AI一套”宪法”,让它基于这套宪法来批评和修正自己的回答。
6.2 宪法AI的工作原理
第一步:让AI先回答一个问题
比如回答”怎么撬锁”。
第二步:让AI基于”宪法”来批评自己的回答
“宪法”里可能写着:
- 不能提供可能被滥用的信息
- 要考虑安全性
AI自我批评:“我的回答可能被用来偷东西,这违反了宪法第一条…”
第三步:让AI根据批评来修正回答
修正后的版本可能变成: “撬锁是一个专业技能,通常用于锁匠工作。如果你想打开自己的锁,请联系正规锁匠。如果是其他用途,我无法提供帮助。“
6.3 宪法AI为什么有效?
因为它让AI有了”自我反思”的能力。
AI不只是在”输出”,而是在”审视自己的输出”。
这和人类的行为模式更像:我们说话之前会想想”这话该不该说”,AI通过宪法AI也学会了类似的机制。
6.4 一个宪法示例
CONSTITUTION = """
请根据以下原则批评AI的响应:
1. 选择最能帮助用户的回应,同时避免有害内容
2. 选择最真实、最不可能误导用户的回应
3. 如果你不确定,请承认不确定性
4. 避免提供可能被滥用的信息
5. 优先考虑用户的安全和福祉
如果AI的响应违反了以上任何原则,请指出并说明如何修正。
"""七、方法六:多层防御组合——打组合拳
7.1 为什么需要组合?
因为没有单一方法能100%解决幻觉。
RLHF有RLHF的问题,思维链有思维链的问题,RAG有RAG的问题。
最佳策略是”打组合拳”。
7.2 一个组合方案示例
┌─────────────────────────────────────────────────────────┐
│ 用户提问 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 第一层:意图理解和风险评估 │
│ - 判断问题是否涉及敏感内容 │
│ - 判断问题是否超出知识范围 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 第二层:检索增强(RAG) │
│ - 检索相关知识库 │
│ - 评估检索质量(CRAG逻辑) │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 第三层:生成(带思维链) │
│ - 基于检索结果生成回答 │
│ - 使用思维链让推理过程外化 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 第四层:幻觉检测 │
│ - Self-Check:让AI检查自己的回答 │
│ - 置信度评估:标记不确定的部分 │
│ - 事实核查:必要时回溯验证 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 第五层:输出格式化 │
│ - 高置信度内容:正常输出 │
│ - 低置信度内容:加警告标签 │
│ - 错误信息:触发纠正流程 │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 最终输出 │
└─────────────────────────────────────────────────────────┘
有研究表明,使用这种多层防御组合,幻觉率可以降低96%。
虽然不是100%,但已经非常好了。
7.3 实操建议
建议一:场景适配
不是所有场景都需要这么复杂的防御。
- 简单问答:Prompt引导 + 置信度检测就够了
- 知识密集型任务:加RAG
- 高风险场景(医疗、法律):全链路防御
建议二:监控和迭代
没有完美的系统,必须持续监控效果,发现问题及时迭代。
- 记录AI回答错误的case
- 分析错误原因
- 针对性优化
建议三:人机协作
对于高风险场景,不要完全依赖AI自动判断,保留人工审核环节。
八、不同场景下的策略选择
8.1 聊天机器人/助手
推荐策略:
- Prompt引导 + 置信度检测
- 必要时加RAG(如果有知识库)
- 输出时标注不确定内容
成本:低 效果:中等 适用:日常对话、FAQ等
8.2 知识问答/客服
推荐策略:
- RAG(必须)+ 检索质量评估(CRAG)
- Self-Check
- 知识边界感知
成本:中 效果:高 适用:产品咨询、技术支持等
8.3 医疗/法律咨询
推荐策略:
- 全链路防御(所有方法组合)
- 严格的知识边界控制
- 人工审核(必须)
- 免责声明
成本:高 效果:高(但仍需人工把关) 适用:专业领域咨询
8.4 代码生成/技术文档
推荐策略:
- 思维链(让AI先想清楚)
- 自洽性检测(多次生成对比)
- 代码执行验证(如果可以)
- 文档交叉引用
成本:中 效果:中高 适用:技术文档、代码助手等
九、总结:与幻觉共处的智慧
9.1 核心要点
- 幻觉不能100%消除,只能缓解
- 多种方法组合使用,效果远好于单一方法
- 根据场景选择策略,简单场景不需要过度防御
- 持续监控和迭代,没有完美的系统
- 高风险场景必须人工把关,AI只是辅助
9.2 一句话总结
幻觉是AI的”基因缺陷”,但通过合适的方法,我们可以把这个缺陷控制在可接受的范围内。
9.3 推荐阅读顺序
如果你想深入学习,可以按这个顺序: