幻觉
- 1、引言
- 2、幻觉理论
-
- [2.1 定义与分类](#2.1 定义与分类)
- [2.2 产生机制解析](#2.2 产生机制解析)
-
- [2.2.1 数据与训练层面](#2.2.1 数据与训练层面)
- [2.2.2 模型架构与推理层面](#2.2.2 模型架构与推理层面)
- [2.3 AI幻觉的多维影响](#2.3 AI幻觉的多维影响)
-
- [2.3.1 技术系统影响](#2.3.1 技术系统影响)
- [2.3.2 社会与商业影响](#2.3.2 社会与商业影响)
- [2.4 消除幻觉策略](#2.4 消除幻觉策略)
-
- [2.4.1 策略一:数据与预训练阶段](#2.4.1 策略一:数据与预训练阶段)
- [2.4.2 策略二:微调与对齐阶段](#2.4.2 策略二:微调与对齐阶段)
- [2.4.3 策略三:推理与部署阶段](#2.4.3 策略三:推理与部署阶段)
- [2.5 代码示例](#2.5 代码示例)
-
- [2.5.1 检索增强生成(RAG)](#2.5.1 检索增强生成(RAG))
- [2.5.2 不确定性校准与置信度估计](#2.5.2 不确定性校准与置信度估计)
- [2.5.3 语义熵检测方法](#2.5.3 语义熵检测方法)
- 3、总结
1、引言
小屌丝 :鱼哥,怎么能消除幻觉
小鱼 :别白日做梦就行
小屌丝 :我说不不是这个幻觉
小鱼 :那你说的是哪个幻觉
小屌丝 :我是说在人工智能领域中的幻觉
小鱼 :那你不用人工智能产品,不就没有幻觉了
小屌丝 :我擦~

小屌丝 :但是,我如果我想继续使用人工智能产品,如何消除幻觉呢?
小鱼 :那你的知道什么是幻觉
小屌丝 :怎么说?
小鱼:慢慢说~
2、幻觉理论
2.1 定义与分类
AI幻觉是指AI系统生成的内容与客观事实、上下文信息或用户意图存在系统性偏差,且系统对这些错误内容表现出高置信度的现象。
根据表现形式,AI幻觉可分为以下几类:
- 事实性幻觉 :生成与客观事实不符的陈述
示例:声称"2023年诺贝尔物理学奖授予了约翰·史密斯" - 上下文不一致幻觉 :与对话历史或提供文档相矛盾
示例:用户要求"不包含奶制品的食谱",AI却推荐奶酪蛋糕 - 逻辑连贯性幻觉 :推理链条内部矛盾
示例:先声称"所有鸟类都能飞",后又承认"企鹅是不能飞的鸟类" - 源引用幻觉 :虚构参考资料、链接或数据
示例:"根据《自然》杂志2023年第5期的研究,每天喝10杯咖啡可延长寿命15年"
2.2 产生机制解析
2.2.1 数据与训练层面
- 训练数据偏差:互联网数据包含大量不准确或矛盾信息
- 分布外泛化:模型对未充分覆盖的主题进行过度推断
- 目标函数局限:语言模型优化下一个词预测,而非事实准确性
- 规模悖论:更大参数模型往往产生更自信的错误
2.2.2 模型架构与推理层面
- 自回归生成特性:错误在序列中累积放大
- 知识-能力混淆:模型混淆记忆与推理能力
- 概率采样机制:贪婪解码与随机采样均可能导致偏离事实
- 缺乏元认知:无法识别自身知识边界
2.3 AI幻觉的多维影响
2.3.1 技术系统影响
- 可靠性下降:用户对系统整体信任度降低
- 错误传播:错误信息被其他系统获取并放大
- 维护成本增加:需要额外验证机制和人工审核
- 反馈循环:错误输出被纳入训练数据,加剧问题
2.3.2 社会与商业影响
- 信息污染:AI生成的错误信息混入信息生态系统
- 专业权威弱化:用户难以区分专业建议与AI幻觉
- 决策风险:基于错误信息的商业决策可能带来重大损失
- 法律与伦理困境:当幻觉导致伤害,责任界定复杂

2.4 消除幻觉策略
2.4.1 策略一:数据与预训练阶段
- 高质量数据清洗:在预训练阶段,使用更干净、更准确、更少偏见的数据源。剔除低质量、矛盾和过时的信息,是减少幻觉源头的第一步。
- 知识增强预训练:在预训练语料中融入结构化知识(如知识图谱、维基数据),让模型从一开始就学习更精确的事实关联。
2.4.2 策略二:微调与对齐阶段
这是目前最主流和最有效的阶段,旨在让模型的"价值观"与人类对齐。
- 指令微调:使用大量高质量的"指令-回答"对对模型进行微调,教会模型如何遵循指令、理解意图,并生成更符合事实的回答。
- 人类反馈强化学习 :这是让模型学会"不说谎"的关键技术。
- 收集偏好数据:让人类标注员对模型针对同一问题的多个回答进行排序(哪个更好)。
- 训练奖励模型:用这些偏好数据训练一个奖励模型,使其能像人类一样判断回答的好坏(真实性、无害性、有用性)。
- 强化学习优化:使用PPO等RL算法,以奖励模型为"裁判",不断优化LLM的策略,使其生成能获得更高奖励(即更真实、更负责)的回答。
- 宪法AI:RLHF的变体,用一套预设的"宪法"(如"选择最无害的回答"、"避免生成虚假信息")来代替人类进行监督,让AI在自我批判中学习。
2.4.3 策略三:推理与部署阶段
在模型部署后,通过外部机制约束其行为。
- 检索增强生成 :这是目前最实用、最流行的抗幻觉技术。其核心思想是:不依赖模型的内部记忆,而是让模型在回答前先从可信的知识库中"查阅资料"。
- 检索:将用户问题转化为向量,在外部知识库(如公司内部文档、维基百科)中检索最相关的文本片段。
- 增强:将原始问题和检索到的文本片段一起作为上下文,输入给LLM。
- 生成 :要求LLM严格根据提供的上下文来回答问题。
这相当于给AI配了一个"事实核查员",极大地降低了其自由发挥、产生幻觉的空间。
- 提示工程:通过精心设计的提示词来引导模型。例如,在提示中明确加入"如果不确定,请回答'我不知道'"、"请仅根据以下信息回答"等指令。
- 工具使用:让模型学会调用外部工具(如计算器、搜索引擎、数据库API)来获取精确信息,而不是自己"猜"。例如,当被问到"今天北京的天气"时,模型应该调用天气API,而不是凭空捏造。

2.5 代码示例
2.5.1 检索增强生成(RAG)
RAG将外部知识检索融入生成过程,减少对参数化知识的依赖,是当前最有效的幻觉消除技术之一。
python
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_community.llms import HuggingFaceHub
class RAGSystem:
def __init__(self, model_name="google/flan-t5-large"):
# 初始化嵌入模型
self.embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2"
)
# 初始化LLM
self.llm = HuggingFaceHub(
repo_id=model_name,
model_kwargs={"temperature": 0.1, "max_length": 200}
)
# 创建空向量数据库
self.vector_db = None
self.qa_chain = None
def load_knowledge_source(self, urls):
"""从URL加载知识源"""
documents = []
for url in urls:
loader = WebBaseLoader(url)
documents.extend(loader.load())
# 分割文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
docs = text_splitter.split_documents(documents)
# 创建向量数据库
self.vector_db = FAISS.from_documents(docs, self.embeddings)
# 创建QA链
self.qa_chain = RetrievalQA.from_chain_type(
llm=self.llm,
retriever=self.vector_db.as_retriever(),
return_source_documents=True
)
def query_with_verification(self, question):
"""带验证的查询"""
if not self.qa_chain:
raise ValueError("知识源未加载。请先调用load_knowledge_source方法。")
result = self.qa_chain({"query": question})
# 添加验证步骤
verification_prompt = f"""
请严格核查以下回答是否基于提供的参考文档。如果回答包含超出文档范围的信息,请修正为仅包含文档支持的内容。
问题:{question}
原始回答:{result['result']}
参考文档:
"""
for i, doc in enumerate(result['source_documents']):
verification_prompt += f"文档 {i+1}: {doc.page_content[:300]}...\n"
verification_prompt += "\n修正后的回答(必须严格基于参考文档):"
verified_result = self.llm(verification_prompt)
result['verified_result'] = verified_result
return result
2.5.2 不确定性校准与置信度估计
通过量化模型不确定性,识别潜在幻觉,实现更安全的AI交互。
python
import torch
import numpy as np
from scipy.stats import entropy
from transformers import AutoModelForCausalLM, AutoTokenizer
class UncertaintyAwareGenerator:
def __init__(self, model_name="meta-llama/Llama-2-7b-chat-hf"):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16 if self.device == "cuda" else torch.float32
).to(self.device)
# 为生成设置pad_token
if self.tokenizer.pad_token is None:
self.tokenizer.pad_token = self.tokenizer.eos_token
def generate_with_uncertainty(self, prompt, max_new_tokens=50, num_samples=10):
"""通过多路径采样生成带不确定性估计的响应"""
inputs = self.tokenizer(
prompt,
return_tensors="pt",
padding=True,
truncation=True
).to(self.device)
outputs = []
entropies = []
for _ in range(num_samples):
with torch.no_grad():
output = self.model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.8,
top_p=0.95,
return_dict_in_generate=True,
output_scores=True
)
# 计算序列熵
sequence_entropy = self._calculate_sequence_entropy(output.scores)
entropies.append(sequence_entropy)
# 解码生成的文本
generated_text = self.tokenizer.decode(
output.sequences[0][inputs.input_ids.shape[1]:],
skip_special_tokens=True
)
outputs.append(generated_text)
# 计算输出一致性和平均不确定性
consistency_score = self._calculate_output_consistency(outputs)
avg_uncertainty = np.mean(entropies)
# 选择最一致的输出
best_output = max(set(outputs), key=outputs.count)
return {
'response': best_output,
'uncertainty': avg_uncertainty,
'consistency': consistency_score,
'all_samples': outputs,
'entropy_per_token': entropies
}
def _calculate_sequence_entropy(self, scores):
"""计算生成序列的熵"""
entropies = []
for score in scores:
probs = torch.softmax(score, dim=-1)
token_entropy = entropy(probs[0].cpu().numpy())
entropies.append(token_entropy)
return np.mean(entropies)
def _calculate_output_consistency(self, outputs):
"""计算多个输出之间的一致性"""
if len(outputs) <= 1:
return 1.0
# 使用嵌入相似度计算一致性
embeddings = self.embedding_model.encode(outputs)
mean_embedding = np.mean(embeddings, axis=0)
similarities = np.dot(embeddings, mean_embedding) / (
np.linalg.norm(embeddings, axis=1) * np.linalg.norm(mean_embedding)
)
return np.mean(similarities)
2.5.3 语义熵检测方法
通过概率判断模型是否出现幻觉,提供自动化检测能力。
python
import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer
class SemanticEntropyDetector:
def __init__(self, model_name="gpt2"):
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForCausalLM.from_pretrained(model_name)
self.model.eval()
def calculate_semantic_entropy(self, prompt, max_length=50):
"""计算语义熵,评估回答的不确定性"""
inputs = self.tokenizer(prompt, return_tensors="pt", truncation=True).input_ids
outputs = self.model.generate(
inputs,
max_length=max_length,
do_sample=True,
temperature=0.7,
return_dict_in_generate=True,
output_scores=True
)
# 计算生成序列的语义熵
total_entropy = 0
for i, score in enumerate(outputs.scores):
probs = torch.softmax(score, dim=-1)
entropy = -np.sum(probs * np.log(probs + 1e-10))
total_entropy += entropy
return total_entropy / len(outputs.scores)
def detect_hallucination(self, prompt, threshold=1.5):
"""检测幻觉,基于语义熵阈值"""
entropy = self.calculate_semantic_entropy(prompt)
is_hallucination = entropy > threshold
return {
'entropy': entropy,
'is_hallucination': is_hallucination,
'threshold': threshold,
'suggestion': "高熵值表示回答不确定性高,可能存在幻觉"
}
3、总结
人工智能幻觉是当前生成式AI技术固有的挑战,其根源在于模型基于概率进行推理的本质。它的影响广泛而深远,是AI走向大规模、高可靠性应用必须跨越的鸿沟。
我们已经看到,通过数据清洗、指令微调、RLHF对齐,特别是RAG、工具使用等推理时干预技术,可以非常有效地抑制幻觉。这些技术不是孤立的,而是需要组合使用,形成一个纵深防御体系。
我是小鱼:
- CSDN 博客专家;
- AIGC MVP技术专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 企业认证金牌面试官;
- 多个名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)评测一等奖获得者;
关注小鱼,学习【机器视觉与目标检测】 和【人工智能与大模型】最新最全的领域知识。