抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

AI幻觉(Hallucination)是大语言模型最令人头疼的问题之一。模型会自信地编造不存在的事实、虚假的引用、错误的代码。本文详细介绍AI幻觉的成因、识别方法以及多种有效的缓解策略。

什么是AI幻觉

定义

AI幻觉是指大语言模型生成看似合理但实际上错误或虚构的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─────────────────────────────────────────────────────────────────┐
│ AI幻觉示例 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 用户:"《红楼梦》的作者是谁?" │
│ 正确回答:曹雪芹 │
│ │
│ 用户:"张三发表过哪些论文?" │
│ 幻觉回答:"张三在2020年发表了《深度学习新范式》, │
│ 被引用超过500次..." ← 完全编造的 │
│ │
│ 用户:"Python的reverse_list函数怎么用?" │
│ 幻觉回答:"使用reverse_list(lst)即可..." │
│ ← Python并没有这个内置函数 │
│ │
└─────────────────────────────────────────────────────────────────┘

幻觉的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌─────────────────────────────────────────────────────────────────┐
│ 幻觉类型分类 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 事实性幻觉(Factual Hallucination) │
│ ├── 编造不存在的事实 │
│ ├── 错误的日期、数字、名称 │
│ └── 例:"爱因斯坦在1921年获得诺贝尔化学奖" │
│ │
│ 2. 忠实度幻觉(Faithfulness Hallucination) │
│ ├── 回答与给定上下文不符 │
│ ├── 曲解或忽略原文信息 │
│ └── 例:总结文章时添加原文没有的内容 │
│ │
│ 3. 引用幻觉(Citation Hallucination) │
│ ├── 编造虚假的论文、书籍引用 │
│ ├── 错误的作者、期刊、年份 │
│ └── 例:"根据Smith et al. (2023)的研究..." ← 不存在 │
│ │
│ 4. 代码幻觉(Code Hallucination) │
│ ├── 使用不存在的API或函数 │
│ ├── 错误的语法或参数 │
│ └── 例:调用库中不存在的方法 │
│ │
└─────────────────────────────────────────────────────────────────┘

幻觉产生的原因

1. 训练数据的局限性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌─────────────────────────────────────────────────────────────────┐
│ 训练数据问题 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 数据截止日期 │
│ ├── 模型只知道训练数据截止前的信息 │
│ ├── 无法获取最新事件、数据 │
│ └── "2024年奥运会在哪?" → 可能回答错误 │
│ │
│ 数据质量 │
│ ├── 训练数据本身可能包含错误 │
│ ├── 互联网上的错误信息被学习 │
│ └── 小众领域数据稀少,学习不充分 │
│ │
│ 数据偏差 │
│ ├── 某些观点或信息过度代表 │
│ └── 模型可能倾向于生成"流行"但不准确的答案 │
│ │
└─────────────────────────────────────────────────────────────────┘

2. 模型架构特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LLM本质是概率模型:

输入序列 ──▶ 计算下一个token的概率分布 ──▶ 采样生成

"法国的首都是" ──▶ P(巴黎)=0.95, P(马赛)=0.03, P(里昂)=0.01...

问题:模型追求"流畅"和"合理",而非"真实"

┌──────────────────────────────────────────────────────────┐
│ 模型不会说"我不知道" │
│ │
│ 输入:"量子纠缠与意识的关系是什么?" │
│ │
│ 理想回答:"这是一个有争议的话题,目前没有科学共识..." │
│ │
│ 幻觉回答:"量子纠缠已被证明是意识产生的基础, │
│ 根据Penrose-Hameroff理论..." ← 过度自信 │
│ │
└──────────────────────────────────────────────────────────┘

3. 解码策略影响

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 不同解码策略对幻觉的影响

# 贪心解码(Greedy)
temperature = 0
# 总是选择概率最高的token
# 幻觉风险:中等,但可能陷入重复

# 高温度采样
temperature = 1.0
# 增加随机性,可能选择低概率token
# 幻觉风险:高,更容易产生不准确内容

# 低温度采样(推荐)
temperature = 0.3
# 在确定性和多样性之间平衡
# 幻觉风险:较低

# Top-P采样
top_p = 0.9
# 从累积概率前90%的token中采样
# 可以减少极低概率的荒谬输出

检测AI幻觉

人工检测方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌─────────────────────────────────────────────────────────────────┐
│ 幻觉检测清单 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ☐ 具体事实核查 │
│ ├── 日期、数字、名称是否正确 │
│ ├── 引用的论文/书籍是否存在 │
│ └── 使用搜索引擎验证 │
│ │
│ ☐ 逻辑一致性检查 │
│ ├── 前后是否矛盾 │
│ ├── 是否符合常识 │
│ └── 推理过程是否合理 │
│ │
│ ☐ 来源验证 │
│ ├── 要求模型提供来源 │
│ ├── 检查来源是否真实存在 │
│ └── 验证内容是否与来源一致 │
│ │
│ ☐ 专家审查 │
│ ├── 专业领域内容需领域专家验证 │
│ └── 不盲信模型的专业回答 │
│ │
└─────────────────────────────────────────────────────────────────┘

自动检测方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 方法1:自我一致性检查(Self-Consistency)
def check_consistency(question: str, num_samples: int = 5) -> dict:
"""多次采样,检查答案一致性"""
answers = []
for _ in range(num_samples):
response = llm.generate(question, temperature=0.7)
answers.append(response)

# 分析答案一致性
# 如果答案差异很大,可能存在幻觉
return {
"answers": answers,
"consistency_score": calculate_similarity(answers)
}

# 方法2:知识库验证
def verify_with_knowledge_base(claim: str, knowledge_base) -> bool:
"""使用可信知识库验证声明"""
# 检索相关文档
relevant_docs = knowledge_base.search(claim)

# 使用NLI模型判断是否支持该声明
for doc in relevant_docs:
if entailment_model.check(doc, claim) == "entailment":
return True
return False

# 方法3:置信度评估
def estimate_confidence(question: str, answer: str) -> float:
"""评估回答的置信度"""
prompt = f"""
问题:{question}
回答:{answer}

请评估这个回答的可信度(0-1),并说明理由:
- 是否基于可验证的事实
- 是否存在不确定或模糊的表述
- 是否有潜在的错误风险
"""
return llm.generate(prompt)

幻觉检测工具

工具 类型 特点
SelfCheckGPT 自我一致性 无需外部知识库
FactScore 事实验证 细粒度事实检测
RAGAS RAG评估 忠实度评估
TruthfulQA 基准测试 评估模型真实性

减少幻觉的策略

1. RAG(检索增强生成)

最有效的减少幻觉方法之一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌─────────────────────────────────────────────────────────────────┐
│ RAG减少幻觉原理 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 传统方式: │
│ 用户问题 ────────────────────▶ LLM ──▶ 回答(可能幻觉) │
│ │ │
│ │ 完全依赖模型记忆 │
│ ▼ │
│ 容易编造 │
│ │
│ RAG方式: │
│ 用户问题 ──▶ 检索文档 ──▶ 文档+问题 ──▶ LLM ──▶ 回答 │
│ │ │
│ │ 基于检索到的事实 │
│ ▼ │
│ 有据可依 │
│ │
└─────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 构建RAG系统
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# 关键:在Prompt中强调基于文档回答
prompt_template = """
你是一个专业的问答助手。请严格基于以下参考资料回答问题。

重要要求:
1. 只使用参考资料中的信息回答
2. 如果资料中没有相关信息,请明确说"根据提供的资料,我无法回答这个问题"
3. 不要编造或推测资料中没有的内容
4. 如果不确定,请表达不确定性

参考资料:
{context}

问题:{question}

回答:
"""

qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o", temperature=0),
retriever=retriever,
chain_type_kwargs={"prompt": prompt_template}
)

2. Prompt工程

通过精心设计的Prompt减少幻觉:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 策略1:明确要求诚实
honest_prompt = """
请回答以下问题。

重要:
- 如果你不确定答案,请说"我不确定"
- 如果问题超出你的知识范围,请说"我没有这方面的信息"
- 不要编造事实、数据或引用
- 区分"事实"和"观点"

问题:{question}
"""

# 策略2:要求提供来源
sourced_prompt = """
请回答问题,并提供信息来源。

格式要求:
- 回答:[你的回答]
- 来源:[信息来源,如果是你的推断请注明]
- 置信度:[高/中/低]

问题:{question}
"""

# 策略3:分步推理(Chain of Thought)
cot_prompt = """
请一步一步思考这个问题:

问题:{question}

请按以下步骤回答:
1. 分析问题需要哪些信息
2. 列出你确定知道的相关事实
3. 识别你不确定或不知道的部分
4. 基于确定的事实给出回答
5. 说明回答中的不确定性
"""

# 策略4:对比验证
verification_prompt = """
问题:{question}

第一步:直接回答问题
第二步:列出答案中的关键事实声明
第三步:对每个声明评估:
- 这是我确定知道的吗?
- 还是我在推测?
第四步:修正不确定的部分,给出最终答案
"""

3. 低温度采样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from openai import OpenAI

client = OpenAI()

# 减少幻觉:使用低温度
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": question}],
temperature=0.1, # 低温度,更确定性的输出
top_p=0.9 # 限制采样范围
)

# 对比不同温度的效果
"""
temperature=0.1 → 更保守,更准确,但可能重复
temperature=0.5 → 平衡,适合大多数场景
temperature=1.0 → 更有创意,但幻觉风险高
"""

4. 自我反思(Self-Reflection)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def generate_with_reflection(question: str) -> str:
"""生成回答并进行自我验证"""

# 第一步:生成初始回答
initial_answer = llm.generate(f"""
问题:{question}
请直接回答。
""")

# 第二步:自我反思
reflection = llm.generate(f"""
问题:{question}
初始回答:{initial_answer}

请检查初始回答:
1. 有没有可能不准确的事实?
2. 有没有过度自信的表述?
3. 有没有编造的内容?

列出可能存在的问题:
""")

# 第三步:修正回答
final_answer = llm.generate(f"""
问题:{question}
初始回答:{initial_answer}
发现的问题:{reflection}

请基于发现的问题,给出修正后的回答。
对于不确定的部分,请明确表示不确定。
""")

return final_answer

5. 多模型交叉验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def cross_verify(question: str) -> dict:
"""使用多个模型交叉验证"""

models = ["gpt-4o", "claude-3-opus", "gemini-pro"]
answers = {}

for model in models:
answers[model] = generate_answer(model, question)

# 分析一致性
verification_prompt = f"""
问题:{question}

不同模型的回答:
{json.dumps(answers, ensure_ascii=False, indent=2)}

请分析:
1. 各模型回答的一致性如何?
2. 哪些部分是一致的(更可信)?
3. 哪些部分有分歧(需要验证)?
4. 综合各模型,最可靠的答案是什么?
"""

return {
"answers": answers,
"analysis": llm.generate(verification_prompt)
}

6. 结构化输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 使用结构化输出减少幻觉
from pydantic import BaseModel, Field
from typing import Optional, List

class FactClaim(BaseModel):
claim: str = Field(description="事实声明")
confidence: float = Field(description="置信度 0-1")
source: Optional[str] = Field(description="信息来源")

class Answer(BaseModel):
summary: str = Field(description="简要回答")
facts: List[FactClaim] = Field(description="回答中的事实声明")
uncertainties: List[str] = Field(description="不确定的部分")

# 强制模型输出结构化内容
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": question}],
response_format={"type": "json_object"},
# 或使用 function calling 强制结构化输出
)

特定场景的策略

代码生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 代码幻觉常见问题:
# 1. 使用不存在的API
# 2. 错误的参数顺序
# 3. 版本不匹配

# 缓解策略:
code_prompt = """
请为以下任务编写Python代码:{task}

要求:
1. 只使用标准库或明确指定的第三方库
2. 对于每个使用的函数/方法,确保它确实存在
3. 如果不确定某个API是否存在,请说明
4. 提供代码后,说明需要安装哪些依赖

环境信息:
- Python版本:3.10
- 可用库:{available_libraries}
"""

# 生成后验证
def validate_code(code: str) -> dict:
"""验证生成的代码"""
try:
# 语法检查
ast.parse(code)

# 静态分析
# 检查导入的模块是否存在
# 检查调用的函数是否存在

return {"valid": True}
except SyntaxError as e:
return {"valid": False, "error": str(e)}

学术引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 引用幻觉是最严重的问题之一

citation_prompt = """
请回答问题:{question}

关于引用的要求:
1. 不要编造论文、书籍或作者
2. 如果需要引用,只引用你100%确定存在的内容
3. 如果不确定来源,使用"据研究表明"等模糊表述
4. 最好注明"此信息需要进一步验证"

如果这个问题需要具体引用才能回答,请说明:
"回答这个问题需要查阅相关文献,我无法提供可靠的引用。"
"""

数值计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 数值幻觉:编造统计数据、计算错误

math_prompt = """
问题:{question}

请按以下步骤计算:
1. 列出计算公式
2. 代入数值
3. 展示每一步计算过程
4. 给出最终结果

注意:
- 如果没有足够的数据,请说明缺少什么
- 不要编造数据
- 对计算结果进行合理性检验
"""

系统级解决方案

幻觉防护流水线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌─────────────────────────────────────────────────────────────────┐
│ 幻觉防护流水线 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 用户输入 │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 问题分类 │ 判断问题类型,选择合适策略 │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ RAG检索 │ 获取相关参考文档 │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ LLM生成 │ 基于文档和Prompt生成回答 │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 事实检查 │ 自动验证关键事实 │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 置信度评估 │ 标记不确定内容 │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ 最终输出(带置信度标记) │
│ │
└─────────────────────────────────────────────────────────────────┘

实现示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class HallucinationGuard:
def __init__(self, llm, retriever, fact_checker):
self.llm = llm
self.retriever = retriever
self.fact_checker = fact_checker

def generate_safe_response(self, question: str) -> dict:
# 1. 检索相关文档
docs = self.retriever.invoke(question)
context = "\n".join([d.page_content for d in docs])

# 2. 生成回答
prompt = f"""
基于以下参考资料回答问题。
如果资料不足,请说明。

参考资料:{context}
问题:{question}
"""
answer = self.llm.generate(prompt)

# 3. 提取事实声明
claims = self.extract_claims(answer)

# 4. 验证每个声明
verified_claims = []
for claim in claims:
verification = self.fact_checker.verify(claim, docs)
verified_claims.append({
"claim": claim,
"supported": verification.supported,
"confidence": verification.confidence
})

# 5. 生成带标记的回答
return {
"answer": answer,
"claims": verified_claims,
"overall_confidence": self.calculate_confidence(verified_claims),
"sources": docs
}

最佳实践总结

技术层面

策略 效果 适用场景
RAG检索增强 需要事实准确的场景
低温度采样 所有场景
自我反思 中高 复杂问题
结构化输出 需要可验证的回答
多模型验证 高风险决策

Prompt层面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌─────────────────────────────────────────────────────────────────┐
│ Prompt最佳实践 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 明确要求诚实 │
│ "如果不确定,请说'我不确定'" │
│ │
│ 2. 要求来源 │
│ "请提供信息来源,如果是推测请注明" │
│ │
│ 3. 分步推理 │
│ "请一步一步思考,列出推理过程" │
│ │
│ 4. 置信度表达 │
│ "请用高/中/低表示你对答案的确信程度" │
│ │
│ 5. 边界说明 │
│ "如果问题超出你的知识范围,请说明" │
│ │
└─────────────────────────────────────────────────────────────────┘

使用层面

1
2
3
4
5
6
7
8
9
10
11
12
┌─────────────────────────────────────────────────────────────────┐
│ 用户最佳实践 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ☐ 不盲信AI输出,尤其是事实性内容 │
│ ☐ 对关键信息进行交叉验证 │
│ ☐ 要求AI表达不确定性 │
│ ☐ 使用RAG为AI提供可靠知识源 │
│ ☐ 对于专业领域,结合人工审核 │
│ ☐ 保留怀疑态度,建立验证习惯 │
│ │
└─────────────────────────────────────────────────────────────────┘

总结

AI幻觉不可完全消除

1
2
3
4
幻觉是LLM的本质特性,而非bug:
- 模型是概率模型,不是知识库
- 追求流畅性可能牺牲准确性
- 训练数据本身就不完美

缓解策略优先级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. RAG(最有效)
└── 给模型提供可靠的参考资料

2. Prompt工程(简单有效)
└── 要求诚实、提供来源、分步推理

3. 低温度采样(简单)
└── 减少随机性,增加确定性

4. 自我验证(中等复杂度)
└── 让模型检查自己的输出

5. 多模型验证(复杂但可靠)
└── 交叉验证,取长补短

最重要的原则

人机协作:把AI当作助手而非权威,关键决策需要人工验证。

1
2
3
AI生成 ──▶ 人工审核 ──▶ 验证关键事实 ──▶ 最终采纳

不是:AI生成 ──▶ 直接使用

AI幻觉是当前LLM技术的固有局限,但通过合理的策略组合,我们可以将其影响降到最低,构建更可靠的AI应用。