"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 没有价值——恰恰相反。但这意味着我们需要:

  1. 对每个高风险输出保持人工核查
  2. 在系统架构层面加入防幻觉机制(RAG、工具调用、外部验证)
  3. 教育最终用户理解 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/

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐