第8章 让 AI 查资料:知识库问答与检索增强生成
本章导读
第7章已经说明,AI 在信息不足时可能生成流畅但缺少事实依据的回答。沿用一个校园服务场景:如果直接询问“本校食堂三楼有什么招牌菜”,模型可能按常见食堂菜单补全一段听起来合理、但与真实情况不符的回答。问题在于,AI 没有本校实时资料,但它并不一定主动说明不知道。
本章要解决的问题是:能不能给 AI 接入一份真实资料,让它先检索资料再回答?
这种“先查资料、再回答”的工程做法在工业界有个正式名字,叫检索增强生成(retrieval-augmented generation, RAG)。它的核心思想是:与其让 AI 仅凭参数记忆回答,不如让系统先从指定资料中检索证据,再让 AI 围绕证据组织答案。对本章来说,最重要的不是背下英文缩写,而是形成一个判断:RAG 可以降低无依据回答的风险,但不能替代人的核查。
《荀子》说:君子生非异也,善假于物也。 会借助工具,不是把判断交出去,而是知道何时查资料、怎样引用证据、如何回到原文核对。
学习目标
- 知识目标:
- 能用自己的话解释什么是检索增强生成(retrieval-augmented generation, RAG),以及它和直接问 AI 的本质区别。
- 能说出 RAG 三个步骤——检索 → 拼接 → 生成——分别在做什么。
- 能力目标:
- 能在课程 Notebook 中使用一个最小迷你知识库,并通过对照实验比较 AI 在开/关检索两种状态下的回答差异。
- 能要求 AI 在答案里附上出处引用,并对照原文核查每一条引用是否真实。
- 素养目标:
- 建立答案要能被追溯到来源的工作习惯——这是第7章证据链底线的真正工程落地。
- 知道什么内容可以放进知识库、什么内容不能放(版权、隐私、未授权资料)。
先修要求与环境清单
- 已学完第7章,理解 AI 在信息不足时可能生成缺少依据的内容,以及“流畅 ≠ 正确”这条底线。
- 软件准备:课程统一配置的本地大模型服务(课程环境已预置);一个文本编辑器。
- 配套资源:
notebooks/ch08_rag_qa.ipynb,已预置迷你知识库(食堂菜单、图书馆制度、社团章程三套样例)和对照实验提问清单。本章不需要你写 Python 代码。
知识准备:先认识这些词
在动手之前,先把本章会反复出现的几个概念建立起来。
- 知识库(knowledge base)
- 一句话说明:你提前准备好的、AI 在回答之前可以查阅的一份资料合集。
- 直观解释:像图书馆里的《校园服务手册》《校历》《食堂周菜单》;不需要把它们背下来,需要时检索对应内容即可。
- 应用场景:智能客服背后的常见问题库、医院的用药指南库、学校的政策制度库。
- 检索(retrieval)
- 一句话说明:AI 在回答问题前,先到知识库里找出最相关的几段内容。
- 直观解释:查询宿舍作息时,不必读完整本《校园服务手册》,而是定位到作息管理章节。AI 也需要类似的定位过程。
- 常见误区:以为检索就是全文搜索。其实现代检索可以按意思找,不一定要包含原词。
- Top-K
- 一句话说明:检索系统每次只取最相关的前 K 段资料。
- 直观解释:像搜索结果只先看前几条。K 太小可能漏资料,K 太大又会带来噪声。
- 本章要求:只需要知道 K 表示取几段,不需要计算排序算法。
- 切片 / 分块(chunking)
- 一句话说明:把长文档切成若干段,方便检索时定位到具体那一段。
- 直观解释:相当于把一本书拆成一段段短材料;检索时不必处理整本书,只需找到相关片段。
- 应用场景:所有用 RAG 的系统都要先把资料切块。
- 检索增强生成(retrieval-augmented generation, RAG)
- 一句话说明:让 AI 先查资料、再回答的工程方法。
- 直观解释:让 AI 基于资料回答;它仍然要组织语言,但答案的事实部分必须来自给定资料。
- 关键区别:AI 自身参数没有变化,只是回答之前多了一步检索资料。
- 引用出处(citation)
- 一句话说明:AI 对关键信息标明来自资料的哪一段。
- 直观解释:像论文里的[1][2]标注,或者维基百科条目末尾的参考文献。
- 关键价值:没有出处的回答,看上去再可信也只是观点;有出处只是核验的起点,还要回到原文检查。
- 证据链(evidence chain)
- 一句话说明:一个结论能被追溯到的、看得见的来源。
- 直观解释:第7章已经讲过——任何高风险结论必须有证据链。RAG 就是把证据链做成工程系统。
- 拒答
- 一句话说明:资料中没有答案时,AI 应明确说明“资料中未提到”,而不是凭常识补全。
- 直观解释:会拒答不是能力差,而是系统守住证据边界的表现。
8.1 问题与现象:AI 不知道,就让它先去查
8.1.1 校园菜单问答案例
假设小李询问 AI:本校食堂三楼有什么招牌菜?如果没有提供真实菜单,AI 可能生成一套听起来合理的菜品清单;但真实情况可能是三楼主要提供面食。
现在我们换一种做法。这次小李先把一份真实的食堂菜单放入课程 Notebook 的迷你知识库中:
【迷你知识库片段】
食堂一楼:早餐窗口,包子 2 元 / 豆浆 1.5 元 / 茶叶蛋 1.5 元……
食堂二楼:套餐窗口,三菜一汤 12 元……
食堂三楼:面食专区,牛肉面 10 元 / 麻辣烫 8 元 / 拉条子 9 元……
接着他对 AI 提问:
请根据上面这段菜单回答:我们学校食堂三楼有什么招牌菜?每一项都要注明来自菜单的哪一行。
AI 这次的回答就完全变了:
根据您提供的菜单,食堂三楼是面食专区,主要有:牛肉面(10 元)、麻辣烫(8 元)、拉条子(9 元)。【来源:第 3 行】
差别在哪里?AI 还是同一个 AI,模型参数没有变化。变化在于:回答之前,它获得了真实菜单。真正的 RAG 系统会把“找资料”这一步交给检索器完成:用户提问后,系统先从知识库中找出相关片段,再把片段交给 AI 组织回答。这样回答才更容易回到可检查的资料上。
8.1.2 这件事为什么重要?
实际任务中有大量这类 AI 仅依靠参数记忆答不出来的问题:
相关内容见表8-1。
表8-1 问题与为什么直接问 AI 不可靠记录表
| 问题 | 为什么 AI 答不出来 |
|---|---|
| 我们专业的实训守则是怎么写的? | AI 没有你们学校的文件 |
| 图书馆这周日开吗? | 这是动态信息 |
| 奖助申请的具体流程? | 每所学校规则不同 |
| 我家附近这家医院的挂号时间? | AI 没有具体机构的运营信息 |
让 AI 直接回答这类问题,容易生成缺少依据的内容。如果让系统先检索对应资料再回答,答案通常会更短、更有边界,也更容易核查。但这仍不代表它一定正确,后面还要检查资料来源和引用真实性。
【思考 1】 有人问:如果我有一份完整的《校园服务手册》PDF,是不是直接全部粘贴到对话框里问 AI 就行了?为什么还要专门建立“知识库”和“检索”? 请你用第7章学过的两条性质来回答他(提示:与注意力和中间迷失有关)。
思考提示:直接全粘贴有两个主要问题:① 注意力会被稀释,关键信息被淹没;② 重要条款可能位于文档中间,被模型漏掉。RAG 的“先检索、再回答”恰好是只把最相关的几段提供给 AI,降低这两类风险。
8.2 原理与分析:RAG 是怎么工作的?
相关结构如图8-1 所示。
8.2.1 RAG 三步走
RAG 听上去复杂,但拆开就是三个动作。
第一步:检索(retrieval) * 用户提了问题(比如食堂三楼有什么菜)。 * 系统先到知识库里去找——哪几段资料和这个问题最相关? * 入门实验通常只取出最相关的 2~3 段;真实系统会根据任务设置 Top-K,例如取前 3 段或前 5 段,不是把全部资料都塞进去。
第二步:拼接(augmentation) * 把这几段资料和用户的问题一起,组装成一个新的提示词。 * 这个新提示词大概长这样: ```text 请根据下面这段资料回答用户的问题,禁止使用资料以外的信息。
【资料】(这里是检索到的相关段落)
【问题】食堂三楼有什么菜?
如果资料中没有答案,请回答:资料中未提到该信息。 ```
第三步:生成(generation) * 把这个拼接好的提示词发给 AI,让它只根据资料生成答案。 * 同时要求 AI 在每个关键信息后面注明出处;资料中没有的内容,应明确说明“资料中未提到”,不要自行补全。
注意:这三步里模型参数没有变化。我们没有重新训练它、没有改它的内部参数,而是在生成前增加了“检索证据”和“按证据回答”的约束。
8.2.2 为什么要把文档切片?
设想你有一份 80 页的《校园服务手册》。如果直接整本传给 AI,会遇到第7章学过的两个问题:注意力稀释和中间迷失。
更稳妥的做法是先切片:把这本手册按章节、段落或语义完整的小段切成若干资料块。本章实验中,每块大约 200~500 字,这只是课程样例,不是固定标准。每次用户提问时,系统只取出最相关的几块送给 AI。
- 块切得太大 → 检索来的内容里夹杂大量无关信息(噪音多)
- 块切得太小 → 一个完整意思被切散(信息断裂)
实践中常用的做法是按章节、按段落,或按语义完整的一小段切。切得好不好,会直接影响 RAG 系统的回答质量;但它不是唯一因素,资料版本、检索方式和提示词约束也会影响结果。
8.2.3 知识库从哪儿来?
这是最容易被忽略的问题。一个 RAG 系统能不能用,很大程度取决于知识库里放了什么。常见的来源:
相关内容见表8-2。
表8-2 来源与例子记录表
| 来源 | 例子 | 适用场景 |
|---|---|---|
| 官方文档 | 学校制度、产品手册、政策文件 | 高频且权威的查询 |
| 历史 FAQ | 客服话术、常见问题库 | 客服类应用 |
| 专业资料 | 教材、行业标准、操作规程 | 专业问答 |
| 业务数据 | 课程表、菜单、库存表 | 动态查询 |
关键原则:知识库的质量决定 RAG 的上限。放入知识库的资料如果本身过时、错乱、来源不可靠,AI 检索后给出的回答同样会出错;这时问题往往出在资料来源、检索结果或引用核查流程,而不只是模型本身。
8.2.4 引用出处:让答案能被查证
RAG 最有价值的一点不只是可能减少编造,而是答案可以被追溯。
- 你看到一段回答;
- 它后面带着【来源:菜单第 3 行】;
- 你可以立刻翻到第 3 行进行核对。
第7章已经说明:没有证据链的结论,再流畅也只是观点。RAG 就是把这条底线变成系统层面的工程能力,让关键信息有机会查回到出处。但“有机会查回”不等于“已经正确”,最后仍要人工核对。如果查不回原文,所谓出处就只是格式装饰。 *** ## AI 协同实践:让 AI 先查资料再回答
实践目标:通过同一个问题在无检索和有检索两种状态下的对比,观察 RAG 带来的差别,并练习引用核查。
预计时间:25 分钟左右。
第 1 步:认识迷你知识库
课程 Notebook 已预置一份迷你知识库——大约 10 段虚构的校园资料,覆盖三个主题:
相关内容见表8-3。
表8-3 主题与内容片段记录表
| 主题 | 内容片段 |
|---|---|
| 食堂菜单 | 一楼早餐 / 二楼套餐 / 三楼面食 三段菜单 |
| 图书馆制度 | 开馆时间 / 借阅规则 / 续借流程 三段制度 |
| 社团章程 | 入会流程 / 活动经费 / 退会规则 三段章程 |
打开 Notebook,运行加载知识库单元格,你会看到这 10 段资料整齐展示出来。每一段都已经切好块,并标好了编号(第 1 段、第 2 段……),方便后面引用。
第 2 步:先关掉检索问 AI
课程 Notebook 已提供前 5 个库内有答案的测试问题,第 6 个库内无答案的问题将在第 4 步单独测试:
- 我们学校食堂三楼有什么主食?
- 借阅者一次最多借几本书?
- 图书馆周末开几个小时?
- 我想退出社团,需要做什么?
- 我可以在社团活动里申请多少经费?
先把检索关掉(Notebook 里的开关),直接把这些问题发给 AI。把回答记到对照表无检索那一栏。
通常会观察到:AI 容易按一般校园制度生成看似合理、但与知识库不一致的答案。
第 3 步:打开检索再问一次
把检索打开,让系统在每次提问前先去知识库里找最相关的几段。系统会自动把找到的段落和问题拼成新提示词,类似这样:
请根据下面这段资料回答用户的问题,禁止使用资料以外的信息。
回答时请在每个关键信息后面注明来自第几段。
如果资料中未提到,请固定回复“资料中未提到该信息”,不要自行推断。
【资料】
(这里自动填入检索到的 2~3 段)
【问题】我们学校食堂三楼有什么主食?
把同样的 5 个问题再问一遍,记到对照表有检索那一栏。
观察重点 * AI 的回答是不是变短了?(因为它只应回答资料里写过的话) * 是不是出现了【来源:第 X 段】这样的标注? * 有没有问题它明确说“资料中未提到”?这反而是好事——这正是第7章说的承认不知道。
第 4 步:故意问知识库里没有的问题
在打开检索的状态下,再问一个知识库里没有的问题:
学校游泳馆几点开门?
观察 AI 这次会: * (A) 明确说明资料中没有提到游泳馆相关信息; * (B) 仍然给出一个貌似合理但缺少依据的答案; * (C) 把别的资料生搬硬套过来。
把结果记到对照表。这一步检验的是 RAG 的拒答能力:一个质量较高的 RAG 系统,应该在资料里没有找到答案时明确说明“资料中未提到”,而不是回退到参数记忆自行补全。
第 5 步:核对每一条引用
最后这一步特别关键:AI 标注的“来源:第 X 段”不一定真实对应原文。
把 AI 给出的引用至少抽查 3 条,并尽量挨条对照原文: * 它说来自第 3 段,第 3 段真的有这句话吗? * 引用的内容有没有被改动?有没有把两段拼成一段? * 是否存在强行对应:资料里说的是 A,AI 答了 B,却仍然标注了一个出处?
把核对结果填到引用核查表。这是本章最重要的一项训练——有出处只是工程上的第一步,能不能被人验证才算闭环。RAG 不是把判断交给机器,而是让判断有证据可查。
验证与证据:用对照表记录实验
RAG 对照表
相关内容见表8-4。
表8-4 测试编号与问题记录表
| 测试编号 | 问题 | 无检索回答(v1) | 有检索回答(v2) | v2 出处 / 拒答情况 | 是否仍需人工核查 |
|---|---|---|---|---|---|
| 1 | 食堂三楼有什么主食 | ||||
| 2 | 借阅者最多借几本书 | ||||
| 3 | 图书馆周末开几小时 | ||||
| 4 | 退出社团流程 | ||||
| 5 | 社团活动经费 | ||||
| 6 | 游泳馆开放时间(库内没有) |
引用核查表
相关内容见表8-5。
表8-5 测试编号与 AI 标注来源记录表
| 测试编号 | AI 标注的来源 | 翻到原文核对结果 | 引用是否真实 |
|---|---|---|---|
| 1 | 第 X 段 | ||
| 2 | 第 X 段 | ||
| … |
引用真实性等级: * A 完全对应:原文确实有这句话。 * B 部分对应:原文有相关内容,但 AI 有改动、简化或合并。 * C 虚假引用:原文根本没有这段,或引用编号不存在。
原理小结(100~200 字)
围绕两个问题写一段:
- 把前 5 道题里无检索和有检索的差别放在一起看,你能用一句话总结 RAG 到底改善了什么吗?
- 第 6 题(库内没有的问题)AI 的表现怎么样?这一步为什么比前 5 题更能反映 RAG 系统的真实质量?
伦理、安全与边界
知识库里能放什么、不能放什么
RAG 把回答质量从 AI 的参数转移到了知识库内容,这意味着知识库的合法性、准确性、安全性都成为系统建设者的责任。
可以放的: * 已公开且允许使用的制度文件、校规、课表 * 自己编写或合法授权的学习资料 * 行业公开发布的标准、政策文件
不可以放的: * 未脱敏的真实数据:学习者姓名、学号、手机号、家庭住址、成绩明细 * 没有授权的版权材料:教材原文章节、付费数据库内容、他人的内部文档 * 未经核实的内部信息:道听途说的政策传言、群聊里的小道消息
数据来源决定一切
第7章我们说流畅 ≠ 正确。在 RAG 系统里这句话要升级成:
有出处 ≠ 正确——你还要看那个出处本身可不可靠。
如果把网上随手搜来的不可靠博客放进知识库,AI 引用得再规整,引用的也是不可靠资料。一个 RAG 系统能不能用,关键在于知识库的来源审查。
实操守则: 1. 优先官方来源——学校官网、政府发布、行业标准。 2. 每条资料标出版本和日期——便于以后追责和更新。 3. 定期复核——制度会变,菜单会变,旧资料要及时换掉。
引用不等于真实:别被格式骗了
最后一条,也是本章最隐蔽的陷阱:AI 标出来的【来源:第 3 段】不一定真的对应第 3 段。
它有可能: * 引用的段落编号是对的,但内容是改写的; * 引用编号是虚假的(指向不存在的段落); * 把两段内容糅在一起标了一个出处。
这就是本章要求做引用核查的原因:有出处只是开始,能不能被独立核对才算闭环。任何高风险场景(医疗、安全、财务、对外发布),都必须由人对引用做最终核验。
【思考 2】 一位实习生用 RAG 知识库系统整理一份《评优办法》摘要。AI 给出的回答结构清楚,每条都标了【来源:第 X 段】。这位实习生想直接打印提交。请回答:他还应该多做哪两件事,才能提高这份摘要的可靠性?
思考提示:① 把 AI 标注的每个来源翻回原文逐条核对,防止虚假引用;② 检查知识库里的《评优办法》是不是最新版本,如果是旧版,引用再准确也会导致结论错误。
总结与思考
本章核心判断
- RAG 的本质是基于资料作答:AI 自身参数没有变化,变化在于回答之前多了一步检索资料。
- 三步走:检索 → 拼接 → 生成。
- 出处是 RAG 的重要价值,它让答案有机会被追溯、被核验、被修正。
- 检索可能漏掉真正相关片段,也可能找来不相关片段,所以仍要做引用核查。
- 知识库的质量决定 RAG 的上限,模型能力再强也无法弥补不合格资料带来的问题。
- 有出处 ≠ 正确——出处本身要审查,引用本身要核对;RAG 是降低幻觉风险的工程方法,不是消除风险的魔法。
基础题(理解层面)
- 用自己的话解释检索增强生成(RAG)是什么。它解决了第7章哪两个问题?
- RAG 的三个步骤分别是什么?请说说每一步在做什么。
- 为什么把一份长文档切片再用,比直接整篇交给 AI 效果更好?
迁移题(专业场景)
- 假设你所在专业要做一个实训室设备使用问答助手。请回答:
- 你会把哪些资料放进知识库?哪些绝对不能放?
- 当用户询问“某设备坏了怎么报修”时,你希望这个助手最终采用什么回答格式?请画出格式(含必要的出处字段)。
风险题(伦理与边界)
- 一位实习生用 RAG 助手整理了一份奖学金评定办法摘要,AI
标注的每一条都有【来源:第 X 段】。负责人想直接公开发布。请回答:
- 这件事可能出什么问题?至少说出两种风险。
- 在发出去之前应当增加哪两步核验?请写一条简短的工作流程。
本章交付物
请按下面清单提交本章过程证据包:
本章讨论的是文本资料的检索与核验。后续内容将进一步进入图像、截图和专业影像等多模态资料场景,继续讨论 AI 输出与人工核验之间的边界。