起点:一场价值百万的"幻觉"事故
第 1 章:起点:一场价值百万的"幻觉"事故
1.1 三月十五日:奥德赛的最后七十二小时
2024 年 3 月 15 日,一个看似普通的周五。北美某头部券商(行业内部称之为"北极星证券",管理资产规模超过 3200 亿美元,服务着近 12 万名高净值客户)在历经九个月的内部研发后,正式上线了新一代智能投顾系统——"奥德赛"(Odyssey)。这是该公司第一次将大语言模型(LLM)作为前台客户对话的核心组件,旨在为客户提供 7×24 小时的资产配置对比、组合诊断和税务优化建议。系统内部代号"Polaris-AI",由一支 47 人的团队基于当时市面上某主流闭源大模型进行微调(fine-tuning)后部署,光是合规审批和压力测试就耗费了 11 周。
上线仅 72 小时,灾难发生了。
一个在纽约长岛拥有三家牙科诊所的客户 Maria Santiago(化名)在周五上午 10:24 通过 App 发起了一次咨询。她问道:"请帮我对比一下这两只 ETF:Vanguard Total Stock Market ETF(VTI)和 iShares Core S&P 500 ETF(IVV)在过去十年的年化收益率、波动率和管理费。"
"奥德赛"在 4.7 秒内给出了一份堪称教科书级别的回答:双栏对比表、精确到小数点后两位的数字、附带的夏普比率计算、连行间距都对齐到像素级别。更让人信服的是,模型在回答末尾写道:"数据来源:彭博终端,截至 2024 年 3 月 14 日;本结论由本所高级量化分析师 Michael Chen 复核。"
Maria Santiago 是一名典型的繁忙专业人士。她没有打开彭博终端去验证,只是把这张表截图发给了自己的私人银行经理,附上一句:"基于这份数据,把我的 VTI 仓位的 40% 切换到 IVV。"银行经理同样没有验证——因为系统自带"内部分析师复核"的标识,在他们的工作流里,这等同于已审核内容。
问题在于:这份数据是模型编造的。
实际数据是:截至 2024 年 3 月 14 日,VTI 过去十年年化收益率约为 11.83%,IVV 约为 11.62%。模型给出的数字是 VTI 9.3%、IVV 12.7%——两组数据都错得离谱。波动率和管理费虽然没有大问题,但整个对比的"骨架"是假的。更致命的是,"Michael Chen"这个人根本不存在,复核记录也是模型在生成过程中"自然"补全的。
听起来误差似乎不算太大,对吗?但在财富管理行业,这种级别的数字偏差会直接重塑资产配置建议。Santiago 女士的 VTI 持仓约 1100 万美元,40% 即 440 万美元。事后回测显示,如果按错误数据执行切换并在十年内持有,由于复利效应,期末财富差异将达到约 87 万美元;如果她在两年内发现并反向操作,单交易摩擦成本就超过 6 万美元。
比数字错误更糟糕的是合规灾难。Santiago 女士在两周后通过邮件要求提供 Michael Chen 的原始复核报告,公司合规部门花了 48 小时才拼凑出真相:根本不存在这样一份报告,因为"Michael Chen"是模型虚构的,整个"数据来源"声明也是模型在自回归采样过程中为了"显得专业"而自动补完的。
最终,北极星证券被迫做出以下处置:
1. 在 3 月 18 日紧急下线"奥德赛"系统,全部 12 万客户回退到上一代规则引擎版本; 2. 由 CEO 署名向所有在窗口期内使用过该功能的 2847 名客户发送致歉信,并提供免费的独立投资组合审视服务; 3. 配合 SEC 投资者保护局的初步问询,提交长达 1800 页的事件复盘报告; 4. 计提预计 270 万美元的直接损失与合规成本(包括法律咨询、客户补偿、内部审计加班、SEC 问询应对,以及 Q2 全面铺开计划的延期损失); 5. 解雇了两位负责模型评估的工程团队负责人,并暂停了原定 Q2 面向零售客户的扩张计划。
事后复盘时,这家券商的 CTO 在一份仅限董事会的内部备忘录中写下了一句后来被多家媒体引用的话:
> "我们花了九个月训练一个比任何人类分析师都更会'说话'的模型,却忘了问它一件事:它是否会'说真话'。"
这就是"幻觉"(Hallucination)——大模型在生成内容时,以高度自信的语气说出完全错误、完全虚构、且无法被模型自身察觉的事实。它不是 bug,不是偶发的网络故障,而是当前自回归生成范式下的结构性特征。
如果你是这家公司的董事会成员,你一定会问:*为什么我们花了几百万美元微调一个模型,却得到一个会在客户面前一本正经胡说八道的系统?下一个项目,我们要怎么避免重蹈覆辙?*
这个问题的答案,就是本书的起点。
---
1.2 幻觉的数学必然性:从自回归目标函数出发
很多工程师第一次接触大模型时会有一个直觉:只要把模型做大、把数据做干净、把对齐(alignment)做充分,幻觉就应该会消失。但这个直觉是错的。要真正理解为什么,我们必须从大模型最底层的训练目标函数讲起。
现代大语言模型几乎都是用自回归(autoregressive)方式训练的。给定一段长度为 $n$ 的文本序列 $x_1, x_2, \ldots, x_n$,模型通过一个参数为 $\theta$ 的神经网络来估计条件概率分布:
$$P_\theta(x_i \mid x_1, x_2, \ldots, x_{i-1})$$
训练的目标是最小化整个序列的负对数似然:
$$\mathcal{L}(\theta) = -\sum_{i=1}^{n} \log P_\theta(x_i \mid x_{<i})$$
换句话说,模型在每一个位置上学习的,都是"在已知前文的情况下,下一个 token 应该是哪一个"。它没有学习"哪些 token 对应着真实世界的事实"——它学习的只是 token 与 token 之间的统计共现规律。
这种训练范式带来三个与幻觉直接相关的结构性问题:
第一,模型在采样时一定会做随机选择。 假设在某个位置上,模型对"苹果"和"橙子"的预测概率分别是 0.51 和 0.49。即使我们用比较保守的 temperature=0.7 采样,"橙子"被选中的概率依然有相当可观的数值。在工程实践中,没有任何一种推理参数设置能让模型"只输出正确答案"——因为正确答案本身在训练数据的统计意义上就不是唯一的。一个真实的事实可能在一亿篇文档里被描述成五种略有不同的措辞,而一个虚构的事实(比如"Michael Chen 是北极星证券的高级量化分析师")只要在训练语料里出现得足够密集(哪怕只是几百次),模型就会赋予它一个非平凡的概率质量。
第二,模型对"自己不知道"这件事没有内省能力。 一个理想化的知识系统应该在遇到超出自己知识范围的问题时回答"我不知道"。但自回归目标函数不包含这样的奖励信号。模型在训练时见到的几乎所有 token 序列都假设"下一个 token 是已知的、存在的",因此模型学到的是"无论前文是什么,我都能为下一个 token 赋予概率",而不是"前文超纲了,我应该停下来"。这就是为什么幻觉的标志性特征是高度自信的虚构——模型在编造一个不存在的分析师时,分配给"Michael"的概率可能比分配给一个真实但罕见的名字还要高。
第三,训练数据本身就包含大量错误、矛盾和虚构信息。 互联网级别的训练语料里充斥着过时数据、营销文案、AI 自己生成的二手内容、阴谋论、低质量问答。一个用交叉熵损失训练的模型,学到的是训练数据的"中位数世界",而不是"真实世界"。当被问到冷门事实或最新事件时,模型会在多个相互冲突的记忆之间做插值,插值的结果很可能在物理上或事实上不存在——这就是所谓的"知识插值幻觉"。
把上面三点综合起来,我们可以用一句话总结:
> 在自回归生成范式下,幻觉不是模型的偶发故障,而是概率分布在高熵位置上的必然采样结果。任何只通过改变训练数据或微调来"修补"幻觉的努力,本质上都是在和这个数学结构对抗。
这不是悲观主义,这是工程现实。承认这一点,我们才能开始寻找真正的解药。
---
1.3 RAG 的本质:在推理时重写概率分布
如果幻觉是结构性的,那么解药也必须是结构性的。检索增强生成(Retrieval-Augmented Generation, RAG)的提出,正是对上述数学困境的直接回应。
RAG 的核心思想可以用一句话概括:不修改模型参数,而是在推理时把外部知识作为条件注入到上下文里,从而重写模型在每个位置上的条件概率分布。
形式化地讲,传统 LLM 在生成时计算的是:
$$P_\theta(x_i \mid x_{<i})$$
而一个 RAG 系统在生成时计算的是:
$$P_\theta(x_i \mid x_{<i}, \mathcal{C}(q))$$
其中 $q$ 是用户查询,$\mathcal{C}(\cdot)$ 是检索器(retriever),它根据 $q$ 从外部知识库中提取出一组相关文档片段。把这些片段拼接到 prompt 的前缀里,模型在生成每一个 token 时,都会被迫"看到"这些上下文。
注意这里发生的关键变化:
- **条件变了**:从"只看前文"变成"看前文 + 检索到的知识";
- **概率分布被重塑了**:原本可能被分配给"Michael Chen"的概率质量,现在被转移到"VTI 十年年化收益率约为 11.83%"这样的真实片段上;
- **模型参数没动**:RAG 不需要重新训练,不需要梯度下降,不需要 GPU 集群跑上几周。所有的"知识更新"都发生在检索库这一侧。
这个差别是革命性的。我们可以把它和人类知识管理做一个类比:
> 一个医生如果只靠记忆看病(类似纯 LLM),他会受限于自己的训练年限和经验,并且会遗忘、会记错、会混淆不同病人。 > 一个医生如果在看病时实时查阅最新临床指南(类似 RAG),他就不再受限于自己的记忆——只要指南是新的、是正确的,他的诊断就建立在最新知识之上。 > 进一步地,如果指南错了或过时了,医生可以随时替换参考材料——而如果是基于记忆的医生,替换他的"参数"需要漫长的再培训。
这就是 RAG 的工程魅力:把"知识"从模型的参数记忆(parametric memory)外化到运行时可调用的上下文(contextual memory),从而实现知识的可热更新、可版本化、可审计。
这也解释了为什么 RAG 在 2023 年后突然成为企业 AI 落地的事实标准——它不是又一个学术玩具,而是一套与现有企业知识管理体系天然兼容的工程范式。企业的合规文档、操作手册、案例库、客户合同……这些本来就是以"文档"形式存在的,RAG 让模型第一次能够像人类员工一样,"带着这些文档上岗"。
但 RAG 不是银弹。"带着文档上岗"的医生,如果带错了指南、查错了章节、读错了上下文,一样会误诊。这正是为什么我们不能停留在"Naive RAG"的概念上,必须深入到检索质量、文档切分、重排序、引用生成、评估闭环等每一个工程细节。这也是本书第 2 章到第 14 章的全部任务。
---
1.4 启明工程的第一周:林岚的"不微调"原则
让我们把视角从大洋彼岸的事故现场切换到一个虚构的会议室。这间会议室位于上海浦东某写字楼 27 层,时间是 2024 年 9 月的一个周一早上九点。
"启明工程"是一家专注医疗 AI 的中型系统集成商(名字是虚构的,细节也是重构过的,但故事原型来自公开报道)。他们刚刚签下了一份价值 420 万元的合同:为某全国连锁医疗机构(旗下 89 家口腔诊所和 12 家医美机构,以下简称"医联体")构建一个"合规问答助手"。这个助手的任务是:当一线医生、咨询师、前台在日常工作中遇到合规疑问时(比如"种植牙广告里能不能用'最'字?""客户要求开发票但只做了初诊咨询该怎么处理?""新员工入职第一天能不能独立接诊?"),可以随时提问,并得到准确、权威、可追溯的回答。
合同里有一条红色条款:任何回答如果与最新法规或医联体内部规章相矛盾,启明工程需要承担直接经济责任,单次事故最高赔偿 50 万元,全年累计赔偿上限 500 万元。
这个数字不是开玩笑的。它意味着哪怕助手给错一次"种植牙广告能否使用'最'字"的答案,医联体就可能因为违反《医疗广告管理办法》被市场监管部门处罚几十万元,启明工程就要按合同赔付。
启明工程的首席架构师林岚是一个有 11 年后端经验、3 年 NLP 经验的老兵。她在第一次需求评审会上就明确表态:
> "我们不会用任何形式的 fine-tuning 来做这个系统。只做 RAG,而且是带强引用、强版本控制、强评估闭环的 RAG。"
会议室里安静了三秒。然后销售总监老周问了一个所有人都在想的问题:
> "林工,市面上大模型微调这么火,某某厂商的方案都做到 7B 全参微调了,效果据说比 RAG 好很多。我们为什么放着好走的路不走,非要啃 RAG 这块硬骨头?"
林岚没有直接回答。她在白板上画了一个 2×2 矩阵(横轴是"知识更新频率",纵轴是"出错责任归属"),然后指着右上角的格子说:
> "医联体的合规文档每月更新,监管法规每季度可能变化,医生用药习惯和广告法限制可能随时调整。在这个格子里,fine-tuning 是结构性错误的方案。"
她接着展开了三条具体的理由——这三条理由也是本书后续所有架构决策的根:
理由一:知识的时间敏感性。 医联体的合规手册 v3.2 在 2024 年 6 月发布,里面新增了"医美机构不得使用绝对化用语"等 17 项限制。如果用 v3.1 的数据微调,模型在 v3.2 发布的那一刻就过时了,而微调一个新版本需要 2-3 周的数据准备、训练、评估、上线。这 2-3 周的"知识真空期"会直接暴露在生产环境里,是合同不允许的。RAG 则只需要把新文档灌入检索库,几分钟内生效。
理由二:错误的可追溯性。 监管部门和医联体法务在事故复盘时一定会问:"这个回答的依据是什么?"如果系统回答"种植牙广告不能用'最'字",fine-tuning 模型能给出的最好答案是"我学过大量合规文档,其中提到过这个限制"——这是一个不可证伪的声明。法务无法验证,无法复核,无法签字。RAG 系统则可以直接把《医疗广告管理办法》第九条和医联体《品牌宣传规范》第 4.2 节的原文段落作为引用附在回答后面,每一条结论都有出处。
理由三:责任归属的明确性。 当事故发生时,启明工程需要能精确回答:"这个问题是检索器没找到文档,还是找到了但被模型误读,还是文档本身就有错误?"这是责任分配的前提,也是 RAG 系统天然支持的——因为 RAG 的每一步(检索、重排、生成、引用)都是可观测、可日志、可重放的。fine-tuning 系统则是一个黑箱,没人能解释"模型为什么会这样回答"。
林岚最后说了一句让会议室里所有人都安静下来思考的话:
> "Fine-tuning 让模型'记住'知识,但企业需要的不是'记住',而是'随时能查到、能验证、能追责'。这两件事在工程上是不同的能力。"
接下来的三周里,启明工程搭建了一个朴素但扎实的 RAG 原型:用 BGE-large-zh 做向量化、用 Milvus 做向量库、用 BM25 做关键词兜底、用 GPT-4 做生成、用 LangSmith 做全链路 trace、用自建的 golden set 做回归评估。系统上线 6 个月后,接住了 4.7 万次合规咨询,其中 312 次被发现"答错了",每一次都在 24 小时内定位到了具体原因(其中 71% 是文档本身存在歧义,22% 是检索召回不全,7% 是模型误读上下文),没有触发任何一次合同赔偿条款。
这个原型系统是有缺陷的——后续章节我们会逐个拆解它的不足。但作为起点,它做出了最重要的选择:把知识从模型参数里搬出来,放进一个可治理、可审计、可热更新的外部存储里。 这个选择,决定了后面所有的可能性。
---
1.5 何时必须使用 RAG:四个工程准则
林岚在白板上画的那个 2×2 矩阵,最终在启明工程内部演化成了判断"RAG 是否是正确路线"的四个工程准则。这四个准则不只适用于医疗行业,它们适用于任何严肃的企业知识问答场景。
准则一:知识更新频率高于"周"级。
如果一个场景的知识每年才更新一次(比如某些历史档案查询),那么 fine-tuning 配合定期重新训练是可行的。但如果知识每周、每天、甚至每小时都在变化(金融行情、医疗合规、电商价格、运营策略),那么 fine-tuning 永远追不上知识的变化速度,RAG 是唯一在工程上可解的方案。判断方法很简单:问业务方"如果知识库在今晚 12 点更新一次,你们能接受系统到明天下午才知道吗?"如果答案是"不能",RAG 就是必选。
准则二:来源的权威性必须可被外部验证。
如果业务方对"这个回答的依据是什么?"有强诉求(比如需要给监管、给客户、给法务一个明确交代),那么模型参数里的"软记忆"无法满足这个诉求。RAG 系统可以做到"每一个回答都附带一个可点击、可下载、可验证的引用源链接",fine-tuning 模型做不到。判断方法:问业务方"你们愿意在客户或监管面前出示模型生成回答的原始依据吗?如果依据是'模型内部参数',对方会接受吗?"
准则三:可证伪压力。
什么叫可证伪压力?就是说,如果系统给出了一个回答,业务方有强烈动机去"找反例"——比如法务会去查"这个回答是不是引用了已经废止的法规",医生会去查"这个回答是不是和最新的临床指南矛盾",合规会去查"这个回答是不是漏掉了某个适用条款"。在这种情况下,系统的每一个断言都必须是"可被独立验证的",而不是"听起来合理"。RAG 通过显式引用源文档满足可证伪性;fine-tuning 则把所有证据都揉进了模型参数里,让可证伪性变得极其困难。
准则四:风险归属必须清晰。
任何企业级 AI 项目最终都要回答一个问题:"如果系统答错了,谁负责?"如果这个责任无法被精确分配(比如只能笼统地说"模型有问题"),那么项目本身就不应该上生产。RAG 的每个组件都可以被独立审计和问责:检索器召回不全可以定位到具体 query 和 top-k 结果;重排器排序错误可以复现到具体特征;生成器误读上下文可以追溯到 prompt 模板和具体段落。fine-tuning 模型出错时,工程团队只能说"我们再训练一次试试"——这不是工程答案。
把这四个准则变成一个快速判断表:
| 准则 | 核心问题 | 倾向 RAG 的回答 | |---|---|---| | 更新频率 | 知识多久变一次? | 短于一周 | | 来源权威 | 是否需要出示原始依据? | 是 | | 可证伪压力 | 业务方会找反例吗? | 会 | | 风险归属 | 事故责任能分到具体环节吗? | 必须能 |
如果这四个问题的答案中有三个以上倾向 RAG,那