AI 幻觉及其解决方法
"The model confidently told me that Einstein failed math in school."
—— 这是个广为流传的"事实",也是个彻头彻尾的谎言。Einstein 从未不及格,但 AI 会一本正经地告诉你它是真的。
一、什么是 AI 幻觉(Hallucination)?
AI 幻觉,是指大型语言模型(LLM)以高置信度生成与事实不符、凭空捏造、或在逻辑上自相矛盾的内容的现象。
幻觉不是模型"不知道答案",而是模型不知道自己不知道,并在这种无知中自信地编造。
这个名称借用自心理学术语:就像人在某些状态下会感知到不存在的事物一样,AI 也会"看见"并"描述"不存在的知识。
二、幻觉的三大类型
1. 事实性幻觉(Factual Hallucination)
模型捏造了一个不存在或错误的事实。
典型案例:
- 用户向 ChatGPT 询问某律师的案件记录,模型返回了数条"真实案件",包括案号、日期、法庭,但全部是捏造的。该律师 Steven Schwartz 的代理律师将这些内容提交给了联邦法院,最终受到法官训诫。(2023年,美国联邦法院 Mata v. Avianca 案)
- Google Bard 在发布会演示视频中宣称詹姆斯·韦伯太空望远镜拍摄了系外行星的"第一张照片",但实际上首张系外行星照片由欧洲南方天文台于 2004 年拍摄,导致 Alphabet 股价当日下跌约 9%。
2. 上下文幻觉(Contextual Hallucination)
模型忽视或曲解了对话中已有的信息,生成与上下文矛盾的内容。
典型案例:
- 用户提供一份合同文本,要求模型总结"甲方的义务",模型却混淆了甲乙双方,总结出的条款正好相反。
- 用户说"我的应用运行在 ArkTS 上,只能使用
@ohos/net模块",但模型在生成代码时仍调用了 Node.js 的axios库。
3. 忠实性幻觉(Faithfulness Hallucination)
模型在翻译、摘要、改写时,改变了原文的意思,增添了原文不存在的细节。
典型案例:
- 要求总结一篇关于某药物副作用的医学论文,模型在摘要中添加了"该药物已获 FDA 批准用于儿童",而原文中并无此内容。
- 对一段英文新闻进行翻译时,模型将 "the suspect was questioned" 译为"嫌疑人已被逮捕",改变了关键法律含义。
三、为什么会产生幻觉?
3.1 训练目标的本质:预测,而非求真
LLM 的训练目标是预测下一个 token,最大化语言流畅性与连贯性。它学到的是"人类语料库中什么样的文字会跟在这段文字后面出现",而不是"这句话是否为真"。
真实性从来不是训练信号的一部分。
3.2 知识截断与覆盖盲区
模型的训练数据有截止日期(如 GPT-4 截至 2023 年底)。对于截止日期之后的事件,以及训练数据中本就稀少的领域(如小众编程框架、地区性法规、冷门学科),模型更容易幻觉。
ArkTS/ArkUI 的典型困境:
HarmonyOS 的 ArkTS 生态起步晚,开源文档和社区讨论量远少于 React Native 或 Flutter。几乎所有主流 LLM 对其的"知识"都极其有限。这意味着当你让模型生成 ArkTS 代码时,它很可能调用根本不存在的 API,例如:
// ❌ 幻觉代码:模型捏造的 API
import { NetworkManager } from '@ohos/network'
NetworkManager.fetchJson(url, options) // 此方法不存在
而真实的 HarmonyOS API 应当是:
// ✅ 真实代码
import http from '@ohos.net.http'
const httpRequest = http.createHttp()
httpRequest.request(url, options, (err, data) => { ... })
3.3 过度自信(Overconfidence)
模型没有可靠的内部"不确定性信号"。当被问到不确定的事情时,它不会说"我不知道",而是以相同的语气继续生成,因为"表达不确定"的语言模式在训练数据中本就不占主流。
3.4 对抗性提示与用户预期压力
如果用户强烈暗示某个答案,模型倾向于迎合。
案例:
用户:"听说李白活到了 90 岁,是吗?"
模型(可能回答):"是的,李白晚年隐居山林,享年约 90 岁。"
实际上李白卒于 762 年,享年 61 岁。但用户的"预设"影响了模型的输出。
四、如何消除(或减少)幻觉?
消除幻觉是当前 AI 工程的核心挑战之一。以下是从实践中提炼出的多层次策略。
策略一:提示工程(Prompt Engineering)
这是最低成本的干预手段,无需修改模型,只需优化你与模型"对话的方式"。
1.1 明确要求模型表达不确定性
如果你不确定某个事实,请明确说明"我不确定",
不要捏造细节。宁可回答"我不知道",也不要编造。
1.2 要求引用来源
请在每个关键事实后标注来源。如果你无法提供真实来源,
请说明该信息来自你的训练数据,可能需要用户自行核实。
1.3 分步推理(Chain-of-Thought)
让模型先列出推理步骤,再给出结论,可以显著减少事实性错误。
请一步一步分析这个问题,写出你的推理过程,最后再给出结论。
效果案例: 在 Wei et al. (2022) 的研究中,Chain-of-Thought 提示在数学推理任务上将错误率从 43% 降低到 8%。
1.4 负例约束(Negative Constraints)
对于 ArkTS 等框架特定场景,可以明确告诉模型哪些 API 不存在:
你正在生成 HarmonyOS ArkTS 代码。
禁止使用以下内容:
- axios、fetch(浏览器/Node.js API,ArkTS 不支持)
- React Native 或 Flutter 的组件
- 任何未在下方文档片段中出现的 @ohos.* 模块
只能使用以下 API:
[此处注入真实 API 文档片段]
策略二:检索增强生成(RAG, Retrieval-Augmented Generation)
RAG 是目前业界最主流的幻觉抑制方案之一。其核心思路是:不让模型凭记忆回答,而是先检索权威文档,再基于文档生成答案。
工作流程
用户问题
↓
向量检索(ChromaDB / Pinecone / Weaviate)
↓
召回相关文档片段(Top-K chunks)
↓
注入 Prompt:「根据以下文档回答问题:{chunks}」
↓
LLM 生成答案(限制在文档范围内)
典型案例
法律领域: 美国法律 AI 公司 Harvey AI 为顶级律所提供服务,其核心就是 RAG:将律所的案例库、合同模板作为检索源,确保模型引用的条款来自真实文件,而非凭空捏造。
ArkTS 开发场景: 将华为官方 API 文档(.d.ts 类型声明文件 + 官方示例)向量化后存入 ChromaDB,用户的每一次代码生成请求都先召回最相关的 API 定义,再注入 Prompt。这可以将"调用不存在 API"的概率从 ~60% 降至 ~10% 以下。
# 简化示例:RAG 检索流程
query = "如何在 ArkTS 中发起 HTTP 请求?"
docs = vectordb.similarity_search(query, k=3)
context = "\\n".join([doc.page_content for doc in docs])
prompt = f"""
你是 HarmonyOS ArkTS 开发助手。
请仅根据以下官方文档回答问题,不要使用文档以外的 API:
---文档---
{context}
---------
问题:{query}
"""
策略三:函数调用 / 结构化工具使用(Function Calling / Tool Use)
与其让模型"记住"所有 API,不如给模型一份明确的"工具清单",让它只能从清单中选择。
原理
通过 Function Calling,你告诉模型:"你有以下这些函数可以调用,每个函数有明确的签名和参数说明,生成代码时必须遵守这些签名。"
{
"name": "http_request",
"description": "发起 HTTP 请求(ArkTS @ohos.net.http)",
"parameters": {
"url": { "type": "string" },
"method": { "type": "string", "enum": ["GET", "POST", "PUT", "DELETE"] },
"header": { "type": "object" }
}
}
这样,模型就不会凭空发明 NetworkManager.fetchJson() 这样的幻觉 API,因为工具清单里根本没有它。
策略四:模型自我验证(Self-Consistency & Self-Reflection)
4.1 自洽性检验(Self-Consistency)
对同一问题采样多次答案,取多数答案作为最终输出。如果模型对同一问题的回答一致,置信度更高;如果不一致,说明该问题可能存在幻觉风险。
4.2 自我反思(Self-Reflection)
让模型对自己的回答进行二次审查:
请检查你上面的回答,找出其中可能不准确或你不完全确定的内容,
并对这些内容加上"[需核实]"标记。
局限性提示: 自我反思并不总是有效。模型对自己的错误往往缺乏感知,它可能以同样的自信宣称错误的答案是正确的。这个策略作为辅助手段,不应作为主要防线。
策略五:外部事实核查与知识图谱
对于高风险场景(医疗、法律、金融),可以在模型输出后加入外部核查层:
- 知识图谱验证: 将模型输出的实体(人名、时间、地点)与结构化知识库(Wikidata、医学数据库)对比,检测明显错误。
- 搜索引擎验证: 将关键事实送入搜索引擎,若找不到支撑来源,标记为"待核实"。
案例: 微软 Copilot 在必应搜索中集成了实时搜索验证层,每个事实性陈述后附带来源链接,允许用户核查。这不消除幻觉,但使幻觉变得可见。
策略六:微调(Fine-tuning)与 RLHF
对于拥有足够数据和算力的团队,可以通过:
- 监督微调(SFT): 在领域特定数据集上微调模型,让模型"记住"正确的领域知识。
- 基于人类反馈的强化学习(RLHF): 奖励准确、不确定时承认无知的输出,惩罚幻觉输出。
成本警示: 这是成本最高的策略。对于 ArkTS 这类训练数据稀少的场景,RAG 通常是更实际的选择——因为官方 API 文档随版本更新,微调数据会快速过时,而 RAG 的知识库可以随时更新。
五、各策略对比总览
| 策略 | 实现成本 | 效果上限 | 适用场景 | 局限性 |
|---|---|---|---|---|
| 提示工程 | ⭐ 低 | 中 | 通用 | 效果不稳定,依赖模型遵循指令的程度 |
| RAG | ⭐⭐ 中 | 高 | 知识密集型任务 | 依赖检索质量,长尾问题仍可能幻觉 |
| Function Calling | ⭐⭐ 中 | 高 | API/工具调用 | 需预先定义工具 schema |
| 自我验证 | ⭐ 低 | 低~中 | 辅助手段 | 模型对自身错误感知有限 |
| 外部知识核查 | ⭐⭐⭐ 高 | 高 | 医疗/法律/金融 | 需接入外部数据源 |
| 微调/RLHF | ⭐⭐⭐⭐ 极高 | 极高 | 垂直领域专业部署 | 成本高,知识更新困难 |
六、一个不应被忽视的事实
幻觉不会被彻底消除。
当前的 LLM 架构(基于 Transformer 的自回归预测)从根本上就不是一个"事实存储与检索"系统,而是一个"语言模式生成"系统。它的目标从来不是"说真话",而是"说听起来对的话"。
这并不意味着 LLM 没有价值——恰恰相反。但这意味着我们需要:
- 对每个高风险输出保持人工核查
- 在系统架构层面加入防幻觉机制(RAG、工具调用、外部验证)
- 教育最终用户理解 AI 的局限性,而不是盲目信任
"The model is not lying. It doesn't know what truth is."
—— Yann LeCun
参考
- Ji et al. (2023). Survey of Hallucination in Natural Language Generation. ACM Computing Surveys.
- Wei et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. NeurIPS.
- Lewis et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS.
- Mata v. Avianca, Inc., No. 22-cv-1461 (S.D.N.Y. 2023).
- HarmonyOS Developer Documentation: https://developer.huawei.com/consumer/cn/doc/
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)