当你向大模型询问一篇论文的具体出处,它可能会给出一个作者、期刊、页码都齐全的引用,但你去数据库里查,根本找不到这篇文献。这种自信满满地输出错误信息的现象,就是AI幻觉(Hallucination)。它不是偶发的bug,而是大语言模型工作原理带来的固有特征。要理解AI为什么会一本正经地胡说八道,需要从模型的生成机制说起。

一、从底层机制看:幻觉是大模型的先天属性
大语言模型的本质是一个“下一个词预测器”。它读到前面的一段文字后,会计算词表中每个词出现的概率分布,然后选出概率最高的词接在后面。这个过程里,模型没有“事实核查”环节,它只关心语言上的连贯性,不关心内容上的真实性。一个句子在语法上通顺、在风格上像专业表述,对模型来说就是“高质量输出”,哪怕内容完全是编造的。
更具体地说,模型内部存储的不是结构化的知识条目,而是海量文本中词语之间的统计关联。当模型被问到某个冷门知识点时,如果训练数据里相关内容稀少,模型就会基于相似的表述模式“补全”一个看起来合理的答案。举例来说,问模型某个小众物理概念的提出者,如果训练语料中没有明确记录,模型会倾向于生成一个常见的科学家名字组合,因为这在语言分布上是“高概率”的。这就好比一个人模糊记得某件事,讲故事时会把细节自动脑补完整,而且讲得绘声绘色。
还有一个关键点:模型对“我不知道”这个选项没有天然的偏好。在人类的认知里,承认无知是常态,但在模型的训练目标中,生成流畅、信息丰富的回答往往得到更高奖励。RLHF(基于人类反馈的强化学习)阶段如果标注者倾向于给信息量大的回答打高分,模型就会学到“宁可编一个也要答上来”的策略倾向。这种倾向叠加在概率生成机制上,幻觉就几乎不可避免。
二、幻觉的主要类型与常见触发场景
学术上通常把幻觉分为两类:事实性幻觉和忠实性幻觉。事实性幻觉指模型输出与客观世界不符,比如编造不存在的书籍、历史事件日期错误;忠实性幻觉指模型输出与用户提供的上下文或指令相悖,比如你给它一段文档让它总结,它却在总结里加入了文档中根本没有的内容。区分这两类很重要,因为它们的成因和应对手段不同。
实际使用中有几个幻觉高发场景值得警惕。第一是精确引用类任务:让模型给出论文引用、法律条文编号、API的具体参数名,它非常容易编造出格式完全正确但内容虚构的结果。第二是长尾知识:越是冷门的人物、事件、数据,训练语料覆盖越差,幻觉概率越高。第三是数学计算与逻辑推理:模型基于模式匹配做算术,多位数乘法经常出错。第四是要求模型扮演专家角色的场景,当提示词强调“你是某领域资深专家”时,模型会更积极地补全细节,幻觉率反而上升。
下面这段提示词就是一个典型的幻觉放大器:
你是一位精通中国古代史的历史学教授。 请详细介绍明朝万历年间一位名叫"林元章"的官员的生平事迹, 包括他的出生年份、科举名次、主要政绩和著作。
这段提示词预设了一个可能不存在的人物。大多数情况下,模型不会质疑前提,而是顺着编出一份完整的履历,连科举名次都能给你补上。这种行为在学术上叫“谄媚性顺从”,即模型倾向于迎合用户的预设而不是纠正它。
三、降低幻觉的实用方法
第一个手段是优化提示词。明确告诉模型允许回答“不知道”,并要求它标注不确定性。比如在提示词中加入“如果不确定,请直接说明,不要编造细节;对每条信息标注置信程度”。实测中这类约束对抑制编造行为有明显效果。同时避免开放式诱导,比如把“介绍这个领域的著名学者”改成“列出五位该领域学者,如果不足五位请说明”,给模型留出承认信息不足的出口。
第二个手段是RAG(检索增强生成)。幻觉的根源之一是模型只依赖参数内存储的静态知识,而RAG的做法是先从外部知识库检索相关资料,再把检索结果作为上下文交给模型生成回答。这样模型的任务从“凭记忆回答”变成了“根据给定材料回答”,事实准确性大幅提升。一个典型的RAG流程如下:
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
# 1. 文档切分
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.split_documents(raw_documents)
# 2. 向量化并存入向量库
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vector_store = FAISS.from_documents(docs, embeddings)
# 3. 检索top-k相关片段,作为上下文喂给模型
retrieved = vector_store.similarity_search(query, k=3)
context = "\n".join([d.page_content for d in retrieved])
# 4. 构造带约束的提示词
prompt = f"仅根据以下材料回答问题,材料中没有的信息请明确说不知道。\n\n材料:\n{context}\n\n问题:{query}"
注意最后一步的提示词约束:要求模型“仅根据材料回答”,这是RAG方案中最容易被忽略却最关键的一环。没有这条约束,模型仍可能脱离检索结果自由发挥,幻觉问题只解决了表面。
第三个手段是调整解码参数。temperature控制输出的随机性,取值越低,模型越倾向于选择概率最高的词,输出越保守稳定。对于事实问答、代码生成这类任务,建议把温度设为0到0.3之间;而对于创意写作、头脑风暴,可以适当调高。此外可以配合设置较低的top_p,或者开启部分模型提供的搜索、代码解释器等工具调用能力,让模型主动查证而不是硬答。
四、如何判断输出可信度
即便采取了上述措施,幻觉也无法降为零。实用的做法是建立自己的核验习惯:涉及精确引用的内容,务必到原始数据库验证;涉及数据的回答,要求模型给出推理过程,逐步检查中间步骤是否成立;对关键结论,可以换个问法多问几次,如果模型在不同问法下给出明显矛盾的答案,说明这部分知识在模型内部并不稳固,可信度要打折扣。
还可以利用模型的自我一致性。让模型先给出答案,再追问“请逐条检查上述内容中可能不准确的地方”,模型有一定概率识别出自己的幻觉并修正。这个方法不完美,但成本低,值得作为常规流程的一部分。核心心态是把大模型当成一个知识渊博但偶尔记混事情的助手,而不是权威的真理来源。它说的每一条重要信息,在进入你的工作成果之前,都应该经过独立验证。理解了幻觉的成因,你就掌握了与AI协作的正确姿势:善用它的语言能力和推理能力,同时对事实性内容保持必要的怀疑。