第 1 章 为什么需要 RAG:大模型的知识困境与破局之道 / Why RAG: The Knowledge Crisis of LLMs and How to Solve It
第 1 章 为什么需要 RAG:大模型的知识困境与破局之道
> Why RAG: The Knowledge Crisis of LLMs and How to Solve It
如果你正在企业里评估大模型(LLM, Large Language Model)的落地路径,几乎一定会在第一次 PoC(Proof of Concept,概念验证)阶段就被同一个问题绊倒:模型一边流畅地说着人类语言,一边却会把张三的药方开到李四身上,或者把 2023 年才生效的法规当成 2020 年的版本引用。这个看似矛盾的"既聪明又糊涂",并不是某个产品的 bug,而是当前所有基于 Transformer 架构的自回归语言模型的结构性局限。本章要回答的核心问题是:通用大模型为何在真实业务中常常给出错误或过时的答案?RAG 又是如何系统性地解决这一问题的? 我们会从知识截止、幻觉、缺乏私有数据这三大原生缺陷出发,结合医疗、法律、金融行业的真实事故,揭示 RAG(Retrieval-Augmented Generation,检索增强生成)为何成为企业级 LLM 应用的事实标准。
1.1 一个让 CTO 失眠的真实故事:LLM 在企业落地的"翻车"现场
2023 年底,美国某大型连锁医疗集团在内部知识库中部署了一个基于 GPT-4 的问答助手,目的是让医生在问诊时快速查询药品相互作用信息。系统上线第三周,一位执业药师向模型提问:"Is it safe to prescribe Warfarin together with the new antibiotic the patient just received?"(华法林能否与患者刚服用的新抗生素同开?)模型用了 200 个英文 token 给出了 7 条"专业建议",其中第 4 条写着:"*Based on current guidelines, no significant interaction has been reported.*"(根据现行指南,未报告显著的相互作用。)然而临床药师在第二天复核时发现,这种组合实际上会显著增加国际标准化比值(INR),属于强相互作用禁忌。最终医院被迫下架该功能,启动内部审计,并向全体医生发函提醒"Do not rely on AI assistant for drug-interaction checks"(不要依赖 AI 助手进行药物相互作用检查)。
这个案例并不是孤例。PwC 在 2024 年初对北美 700 家企业的调查中,62% 的受访 CTO 表示,他们的大模型 PoC 在"事实准确性(factuality)"环节失败,远超"推理能力不足(4%)、响应速度慢(8%)"等其他原因。换句话说,企业落地 LLM 时遇到的第一只拦路虎,几乎总是同一个:模型不知道自己不知道什么。这正是本章要彻底拆解的问题。
为什么会出现这种情况?我们需要把视角从"用户问问题"切换到"模型如何产出答案"的工程链路。LLM 在生产一段回答时,本质上执行的是下面这个流程:
``` 用户问题 (Prompt) ↓ 分词 / Tokenization ↓ 上下文窗口 (Context Window) 中的 Token 序列 ↓ Transformer 自回归采样下一个 Token ↓ 循环 N 次,直至 EOS 或 max_new_tokens ↓ 解码为自然语言 ```
整个流程中,模型能够"看到"的信息只有两处:一是提示词(system + user prompt)里显式传入的 token;二是模型自身在参数(即"权重")里"记住"的内容。前者由你控制,后者则在预训练(pre-training)完成的瞬间就基本冻结了。关键洞察是:LLM 是一个"快照式(Snapshot-based)"系统,而非一个实时知识库。 这意味着所有 LLM 都天然具有三个我们必须正视的局限:知识截止(Knowledge Cutoff)、幻觉(Hallucination)、缺乏私有/实时数据。我们一一展开。
1.2 LLM 的三大原生局限
1.2.1 知识截止:模型是一台被时间冻结的"时间机器"
知识截止(Knowledge Cutoff) 指的是模型在预训练时所能"看到"的最后一个时间点。此后任何新出现的事实、事件、文档都不会进入模型的参数化记忆中。例如 GPT-4 的主要训练数据截止于 2023 年 10 月,Llama 3.1 截止于 2023 年 12 月,Claude 3.5 Sonnet 截止于 2024 年 4 月。这意味着用户在 2025 年问 "What is the latest CWE top 25 list?" 时,模型往往只能给出 2023 年的版本,而 2024 年的修订版对它来说完全是"未知领域"。
更糟糕的是,知识截止并不是一道陡峭的断崖,而是一条平滑的遗忘曲线。OpenAI 在 GPT-4 的技术报告中坦承:"*The model exhibits poor performance on events that occurred close to but before the cutoff, with rapidly degrading accuracy for events with date stamps.*"(模型对临近截止日期的事件表现较差,对带时间戳的事件,准确率迅速下降。)换句话说,模型对"接近截止日期"的内容最不确定,因为这些内容只被部分语料覆盖,且不同来源之间常常相互矛盾。
实践中的危害:
- **法律合同风险**:某 SaaS 公司让 GPT-4 协助审阅 GDPR 合规条款,模型援引的是 2018 年的版本,遗漏了 2023 年生效的 AI Act 补充条款,导致合规报告被打回。
- **金融研报失真**:在 2024 年美联储议息会议之后立即让模型总结"鲍威尔最新表态",模型往往给出 2023 年最后一次会议的发言摘要,因为这是它的最后一个"高置信数据点"。
- **安全漏洞引用**:让模型列出"2024 年披露的 Apache Log4j 新 CVE",它会幻觉出一个虚假的 CVE 编号以"填补"它不知道的部分。
我们用一张图把这种衰减关系可视化。设横轴为时间(以月份为单位),纵轴为模型对该月份事件的"置信且正确"概率(P(correct)),则 P(correct) 在远离截止点时相对平稳,在接近截止点(最后 6–12 个月)开始下降,在截止点之后骤降到接近 0:
$$ P(\text{correct}) \approx \begin{cases} p_0 & \text{if } t \ll t_{\text{cutoff}} \\ p_0 \cdot e^{-\lambda(t_{\text{cutoff}} - t)} & \text{if } t \in [t_{\text{cutoff}} - \Delta, t_{\text{cutoff}}] \\ \approx 0 & \text{if } t > t_{\text{cutoff}} \end{cases} $$
其中 $\lambda$ 是任务相关的遗忘系数,$\Delta$ 是"近截止点"窗口(经验上约 6 个月)。这个简化模型告诉我们:距离截止时间越近,准确率呈指数级衰减;一旦越过截止,准确率几乎归零。 任何依赖 LLM 提供"最新事实"的应用,都必须用外部知识源来弥补这条曲线。
1.2.2 幻觉:模型用流畅的语言"无中生有"
如果说知识截止是"看不到",那么幻觉(Hallucination) 就是"凭空捏造"。OpenAI 在 2023 年的安全指南中把幻觉定义为:"*a phenomenon where the model generates content that is nonsensical or unfaithful to the provided source content.*"(模型生成与提供的源内容不一致或无意义的文本的现象)。幻觉之所以危险,是因为输出文本在形式上完全自然(语法正确、句法连贯、术语规范),但在事实上却无中生有,这让它比显式的"我不懂"更难被识别。
学术界通常把幻觉分为两类,本书采用 2024 年主流综述(如 Huang et al., *A Survey on Hallucination in Large Language Models*)提出的分类:
| 类型 | 英文 | 定义 | 例子 | |---|---|---|---| | 内在幻觉 | Intrinsic Hallucination | 输出与 prompt 中已提供的上下文相矛盾 | 用户给了一段合同摘要:"乙方违约需支付 50 万违约金",模型却回答"需支付 500 万" | | 外在幻觉 | Extrinsic Hallucination | 输出引入了 prompt 上下文之外、且无法被任何已知事实支持的信息 | 用户问"iPhone 15 的发布价格是多少",模型回答"5999 元,支持 5G",但实际发售价格为 5999 元起但某具体机型规格被编造 |
为什么模型会幻觉? 根本原因在两个层面:
1. 训练目标的局限:LLM 的训练目标是"给定前文,最大化下一个 token 的对数似然(log-likelihood)"。这个目标只奖励"流畅",不奖励"真实"。模型在缺乏确切信息时,会倾向于沿"最像答案"的方向生成,而不是"承认不知道"。 2. 概率采样的本质:自回归采样是逐 token 的随机过程。即使 ground truth 概率最高,模型仍可能以非零概率抽取到次优 token,累积起来就会形成事实错误。温度(temperature)越大,越鼓励模型"冒险",幻觉率越高。
代码实验 1:亲手感受幻觉
下面这段 Python 代码可以让你在 30 秒内亲眼看到幻觉。只需要 OpenAI API Key(其他厂商的 API 几乎完全相同)。我们使用一个经过多家三方机构证伪的虚构实体来测试模型:
```python import os from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
提示中故意暗示了一个"真实人物"的名字
prompt = "Tell me about Dr. Elena Petrov, the AI safety researcher who published the 2024 paper on emergent deception in LLMs."
resp = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], temperature=0.7, )
print(resp.choices[0].message.content) ```
运行后,你会看到模型给出一段"煞有介事"的描写:博士毕业院校、合作者、论文标题、DOI……全部惟妙惟肖。但实际上这个名字在 arXiv、Google Scholar 中都检索不到任何对应论文。这种"虚构但合理"的幻觉是最具迷惑性的,因为它的语言风格和真正的论文介绍几乎无法区分。
我们再做一个对比实验:把 `temperature` 调到 `0.0`,提示保持不变:
```python resp = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": prompt}], temperature=0.0, # 关闭随机性 ) ```
即使 temperature=0,模型仍可能"幻觉"出细节(虽然确定性提高),这说明幻觉不是单纯由采样随机性导致的,而是训练语料中"对模糊事实的填空倾向"被模型学到并保留下来了。
为什么不能靠"让模型谨慎"消除幻觉?
常见的反直觉做法是告诉模型"如果你不确定请说不知道"(即"epistemic humility"提示)。虽然这能在一定程度上降低外在幻觉率,但在多步推理或开放领域问答中,会显著降低任务完成度——模型会过度拒绝回答本来可以回答的问题。这一点我们在第 4 章会用 RAGAS 框架做系统评测。
1.2.3 缺乏私有/实时数据:模型是一个"通用大脑"而非"私人助理"
第三个局限最容易被初学者忽视,但对企业来说恰恰是致命的:LLM 是一个完全不知道你公司内部文档的系统。它的训练语料是 Common Crawl、Wikipedia、GitHub 公开仓库、Reddit 等公开来源。它们没有读过你的:
- 内部产品手册、API 文档;
- 客户合同与支持工单;
- 公司域名下的会议纪要、Wiki;
- 财务、HR、研发等敏感部门的政策文件;
- 实时变化的数据(库存、股价、订单状态)。
这就引出了企业落地 LLM 时的一个根本矛盾:
> 模型是通用的,但知识是个体的。
让我们用一个更"工程化"的视角来理解这件事。设 $\mathcal{D}_{\text{public}}$ 为模型预训练语料,$\mathcal{D}_{\text{private}}$ 为企业内部数据集合。模型 $M_\theta$ 在 $\mathcal{D}_{\text{public}}$ 上做了极大似然估计:
$$ \theta^* = \arg\max_\theta \sum_{(x, y) \in \mathcal{D}_{\text{public}}} \log P(y \mid x; \theta) $$
但当用户问的问题 $x$ 涉及 $\mathcal{D}_{\text{private}}$ 时,模型能做的只有"插值"或"生成看起来像答案的 token",而不是"查表"。这等价于让一个记忆力超群但只读过公开教材的医学生,去回答一位病人的私人病历——他没有办法"看见"那份病历。
真实案例:法律科技公司的痛点
国内某头部法律 SaaS 公司在 2023 年尝试用通用 LLM 直接服务律所客户。客户最常问的两类问题是:
1. "我们律所 2022 年办理的某类案件平均结案时长是多少?" 2. "请帮我审阅这份起诉状,依据我们律所的内部写作规范提出修改建议。"
对这两类问题,通用 LLM 的回复分别是:
1. "根据公开数据,中国民事案件平均审理周期为 174 天……"(完全没有该律所的真实分布);
2. "建议在事实与理由部分增加证据清单……"(基于通用法律写作教学,而非该所 50 页的内部规范)。
这两个回复在通用意义上是合理的,但在该客户场景下完全无用。结果:上线两个月后,律所律师的真实采用率不足 4%,项目被叫停。
---
至此,我们完整揭示了 LLM 的三大原生局限:知识截止让模型看不到"现在",幻觉让模型敢说"错的",缺乏私有数据让模型说不出"你的"。它们既独立存在又相互叠加,构成企业级 LLM 应用必须正面应对的"知识三角困境"。任何试图绕开这三点的产品,最终都会在第一个真实业务场景下原形毕露。
> 本节要点: > - LLM 是"快照式"系统,参数化记忆在预训练完成时即冻结。 > - 知识截止是一条平滑的遗忘曲线,越接近截止点越容易失真。 > - 幻觉分内在与外在两类,本质来自训练目标奖励"流畅"而非"真实"。 > - 企业私有数据对模型而言几乎完全"不可见"。
1.3 RAG 范式的诞生:用外部记忆打破模型的"金鱼脑"
现在我们知道问题是什么了,那么解法是什么?2020 年,Facebook AI(现 Meta AI)的研究员 Patrick Lewis 等人在 NeurIPS 上发表了一篇题为 *Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks* 的论文,首次正式提出 RAG(Retrieval-Augmented Generation)这一架构。论文的核心论点只有一句,却奠定了接下来 5 年 LLM 工程化的主航道:
> *Large language models perform well on a variety of tasks, but their knowledge is frozen at pre-training. We augment them with a non-parametric memory accessed via a dense retriever, and condition generation on this retrieved context.*(大模型在很多任务上表现良好,但知识在预训练后就冻结了。我们用一个可通过稠密检索器访问的"非参数化记忆"来增强它,并把生成条件化在该检索上下文上。)
换句话说:RAG 给 LLM 装上了一个外挂的、可热更新的、可被精确控制的知识库。 每一次用户提问,系统都先去知识库中检索最相关的若干段文档,再把这些文档连同原始问题一起喂给 LLM,让模型"带着参考资料"作答。
让我们用一段代码直观理解 RAG 的最简形态:
```python
1. 假设我们有一个文档检索器 retriever
它接受 query,返回最相关的 top-k 文档片段
def retrieve(query: str, k: int = 3) -> list[str]:
真实实现里这是 BM25、向量检索或混合检索
第 3 章我们会详细展开
return doc_store.search(query, k=k)
2. 把检索结果拼进 prompt
def build_prompt(query: str, docs: list[str]) -> str: context = "\n\n---\n\n".join(docs) return f"""You are a helpful assistant. Use the context to answer. If the answer is not in the context, say "I don't know".
Context: {context}
Question: {query}
Answe