跳到主要内容
OSSpark

搜索文章

2582 字
13 分钟

从人工查资料理解 RAG:知识库问答到底多做了什么

目录

本文使用虚构制度说明原理,不包含真实公司规定或系统运行结果。

模型能理解问题,为什么仍然答不出来#

“培训环境的账号应该找谁申请,审批后多久能开通?”

一个通用语言模型可能理解申请、审批和开通的含义,却不知道这家公司采用哪一份制度。要回答这个问题,需要的不是更流畅的措辞,而是包含申请流程和开通时限的资料。

人也一样。新同事来问,我们会打开制度,找到相关段落,确认适用环境,再把分散的信息整理成回答。RAG,也就是检索增强生成,把这段查找与提供资料的过程接入了模型问答:应用先检索内容,再把问题和选出的证据交给模型生成回答。Microsoft 的 RAG 概念说明描述了这一基本过程。

理解这条链路,可以先从人怎样查资料开始。

先用两份资料回答一个问题#

假设有三份制度,以下内容全部为虚构示例:

资料内容适用范围
A:账号申请流程向培训负责人提交申请,由培训负责人审批培训环境
B:账号开通说明审批通过后,由管理员在 1 个工作日内开通培训环境
C:权限申请说明向信息安全负责人申请,审批后 3 个工作日内开通生产环境

问题里有两件事:找谁申请,以及审批后多久开通。A 回答前一件,B 回答后一件,C 虽然也在讲账号申请,却属于不同环境,不能拿来回答。

基于 A、B,可以组织出这样的示例答案:

向培训负责人提交申请,由培训负责人审批。依据:资料 A。审批通过后,由管理员在 1 个工作日内开通。依据:资料 B。

这句话的依据很具体。如果没有读到 B,就不能补上时限;如果误用了 C,回答可能写得很完整,却把生产制度套到了培训问题上。

人完成了查找、筛选、合并和标注出处。程序要做的工作也可以沿着这些步骤理解。

001:培训账号问题需要申请流程 A 和开通时限 B,生产规则 C 因不适用被排除,问题与 A、B 原文共同进入模型输入

图 001:一个问题可以需要多条证据。A 支持申请与审批,B 支持开通前提与时限;C 虽然也讲账号,却不适用于培训环境。依据本文虚构案例自绘。

提问之前,先让资料变得可查#

资料最初可能是长文档、表格或说明页面。应用要先解析出内容和结构,再把它们组织成适合查找的单元,并保留来源位置、版本和适用条件。

这就是切片要解决的问题。一份手册可能同时包含账号申请、浏览器设置和设备借用。用户只问账号,系统需要定位其中有关的段落,而不是每次把整本手册都交给模型。

但切得越碎,也不一定越好。看这句示例规则:

培训账号审批通过后,由管理员在 1 个工作日内开通。

“审批通过后”是时限的前提。如果一片只留下前提,另一片只留下“1 个工作日内开通”,取回后一片时就可能把计时起点弄丢。读者会误以为提交申请后就开始计时。

002:完整取回规则时保留审批前提,拆分后只取回时限所在片段时可能丢失计时起点;多个小片段也可共同补齐上下文

图 002:需要检查的是规则的条件有没有保留。小片段若一并取回并进入输入,也可以补齐上下文。依据本文虚构案例自绘。

因此,切片需要同时考虑长度和完整性。按标题、段落或完整事项切分,可以利用文档结构;是否需要重叠、相邻段落补充,则要结合资料和检索结果判断。Microsoft 的切片说明也列出了固定长度与按内容结构切分等方法。

片段还应关联适用环境等信息。A、B 属于培训环境,C 属于生产环境,这个差别不能靠相似度分数代替。元数据必须有原文或明确管理规则作为依据,不能让模型猜一个标签就当真。

向量帮助找资料,原文仍然要取回来#

用户可能问“多久能登录”,资料里写的是“账号开通时限”。两种说法没有完全相同的字面形式,却可能指向同一件事。

在向量检索方案中,Embedding 模型把问题和资料编码成数字表示,应用通过比较这些表示查找候选片段。问题与资料的编码需要兼容;例如,DPR 研究采用了双编码器框架,不能把所有方案都简化成必须共用完全相同的编码器。

余弦相似度是比较向量的一种方法,可以借助箭头方向形成直觉:方向越接近,余弦值越大。下图来自 Spring AI 文档,用二维向量说明方向关系。

003:Spring AI 文档中的三组二维向量方向示意,从接近方向到较大夹角分别标注 Similar、Unrelated、Opposite

图 003:向量方向的二维示意。来源:Spring AI 项目文档 Understanding Vectors,上游许可为 Apache License 2.0,直接引用原图,未修改。

图中的 A、B 是向量符号,与前文制度 A、B 没有对应关系。几何方向也不能直接解释为文本事实互相矛盾;真实文本向量通常不止二维,图中不是实际模型的编码结果。

检索找到候选后,应用还要通过片段关联取回原文。最后交给生成模型阅读的是问题和文字证据。向量在这里承担查找工作,并没有替代制度正文。

这也解释了为什么分数高仍然可能选错:C 和问题都包含账号、申请、审批、开通等内容,可能具有较高相关性,但适用范围不对。相关程度与能否用于回答,是两项检查。

向量检索只是可选实现之一。RAG 也可以使用关键词检索,或组合多种检索方式。是否采用向量数据库,不是识别这条问答流程的唯一标准。

找到资料之后,还要决定模型实际读到什么#

候选列表并不会自动成为模型输入。应用还需要检查权限和范围、筛选候选,再按照输入预算组装证据。

flowchart TD
D[解析资料并保留来源] --> C[组织可检索片段]
C --> I[建立检索索引]
Q[用户问题] --> R[检索候选]
I --> R
R --> F[检查权限 范围与证据覆盖]
F --> P[把问题和证据组成输入]
P --> G[生成回答并标注出处]
G --> V[对照原文核验]
图 004:从资料准备到检索、输入组装、生成和核验,分别检查每一步是否保留了所需证据。

假如只允许取一条候选,A 被选中而 B 没有被选中,系统就只有申请流程,没有时限。如果 B 已经被检索出来,却因输入预算不足而没有放进去,模型依然缺少这部分依据。

所以,“找到了 B”和“模型读到了 B”需要分别确认。输入容量、候选数量和片段长度都会影响证据是否完整,不能只看检索列表里有没有某个关键词。

有引用的回答,也要回到原文检查#

应用可以要求模型根据资料作答、标注出处,并在资料不足时说明缺失。但要求写进提示,并不意味着结果会自动正确。

核验示例答案时,至少要问:申请对象是否由 A 支持,开通时限是否由 B 支持,“审批通过后”这个条件有没有保留,引用的是否为正确环境和版本。

如果用户进一步问“账号什么时候自动过期”,A、B 都没有规定期限。此时说明资料未覆盖这个事实,比从其他账号制度里拼出一个期限更有依据。

引用提供了检查入口,不能替代检查本身。RAG 增加了本次回答可使用的资料,也增加了从答案回到证据的路径;资料选错、输入遗漏或生成偏离,仍然会造成错误。

理解这条链路,再看技术名词#

从人工查资料出发,解析和切片是在整理可查内容,检索是在找候选,过滤是在确认范围与权限,输入组装是在决定本次交给模型读什么,生成是在组织回答,引用核验是在检查每项事实的依据。

这套流程没有要求我们先记住一长串组件名称。先看清回答需要哪些事实,以及这些事实怎样进入模型输入,再去选择具体的检索方法和工具,才容易判断每个部件究竟解决了什么问题。

参考资料#