A33

RAG

点击正文段落选定收藏或划线位置;未选定时使用屏幕内第一段。

课内目录

1 RAG 要解决什么问题

假设你在复现公开的 SMS Spam Collection 短文本分类任务。模型已经能把短信分为正常与垃圾信息,团队也保存了数据说明、标注约定、实验记录和发布说明。新成员问:“本次实验为什么不用准确率作为主要指标?”语言模型可能给出通顺的通用解释,却未必知道这次实验采用了什么数据划分、垃圾短信占比是多少、报告是否改过版本。这类问题需要项目证据,光靠模型训练时记住的常识不够。

RAG 是检索增强生成:先从指定资料中找出与问题有关的内容,再让语言模型依据这些内容组织回答。它把“找到依据”和“表达答案”连接起来。知识库可以保存公开数据集说明,也可以保存经授权的实验文档;检索结果通常是文档片段,而非完整资料。模型看到的是问题和被选中的片段,因此检索不到的重要限制,不会因为回答更流畅就自动出现。

本课围绕同 1 个教学项目展开:用公开短信数据集做垃圾短信分类,并给项目资料建立问答入口。分类器可使用词语或字符片段的 TF-IDF 特征,再训练逻辑回归;RAG 则解释实验设置、查找指标定义、追踪版本差异。前者对短信输出类别,后者对项目问题输出带来源的说明。不能把两者的质量混为一谈:分类 F1 提高,不代表资料问答更可靠;问答引用完整,也不代表分类器已经适合部署。

例如,项目约定按 70%/15%/15% 划分训练集、验证集和测试集,先处理重复或高度相似的短信,避免相似样本跨集合造成泄漏。训练集用于拟合 TF-IDF 和分类器;验证集用于选择阈值;测试集在方案固定后评估。以上都是本课的教学实验约定,并非声称公开数据集自带这套划分。问答系统必须能分清“数据集原始事实”与“本项目采用的处理方式”,否则会把局部决定写成普遍规则。

RAG 适合资料经常更新、回答需要出处、模型无法可靠记住全部细节的场景。它不会自动验证资料真假,也不会修复错误实验。如果报告把测试集用于反复调参,RAG 即使准确引用报告,仍然可能传播不可靠的结论。可靠回答至少需要可用资料、合适检索、受约束生成和独立评估。先问“答案应由什么证据支持”,比先问“换哪个大模型”更接近问题本身。

RAG 将项目资料、检索与有来源的回答连接起来
RAG 将项目资料、检索与有来源的回答连接起来

2 切片、嵌入与检索边界

检索前要把资料变成可查找的单元。切片是将文档拆成适当长度的片段,同时保留标题、位置和来源。假设实验报告包含“数据处理”“阈值选择”“测试结果”几个部分,把整份报告当作 1 个片段会混入大量无关信息;把每句话独立切开,又可能让“该阈值”失去前文指代。初学时可先沿标题、段落和表格边界切分,再用长度上限控制体积,而不是机械地每隔若干字符截断。

可以从每片约 300–600 个汉字、相邻片段保留约 50 个汉字上下文开始试验,但这些只是候选设置,不能当成普适最优值。表格的列名、单位和注释应与数据保持关联。例如“垃圾短信召回率 0.92”若丢了“验证集”和“阈值 0.35”,就无法解释这个数值。重叠内容能减少边界断裂,也会增加重复命中,所以切片应在真实问题上检查,而不是只看平均长度。

每个片段还需要元数据。至少记录文档标识、片段标识、标题路径、版本、适用时间、更新时间和访问范围。对实验资料,还可记录数据集版本、划分编号和模型版本。原文位置使引用可回到整段上下文;版本与适用时间帮助区分旧规定和现行规定;访问范围用于限制哪些资料能进入候选。敏感内容的过滤必须发生在片段交给生成模型之前,不能只靠提示词要求模型保密。

嵌入把文本表示为数值向量,使语义相近的查询和片段更容易接近。用户问“为什么不要只看预测正确的比例”,向量检索可能找到讨论准确率与类别不平衡的段落。关键词检索则善于匹配精确的实验编号、阈值、文件名和术语。实际入口可以组合这两种信号,但入门阶段只需理解它们的长处:语义相近有助于发现相关内容,精确匹配有助于保留具体约束,任何一种命中都还不等于证据充分。

建立索引与在线问答是不同阶段。索引阶段处理资料、切片、生成嵌入并保存元数据;问答阶段处理查询、过滤适用范围、检索候选,再组织上下文。更换嵌入模型后,旧片段向量通常不能直接与新查询向量混用,需要按兼容方案重建索引。更新文档也必须使对应片段更新或失效,否则原文件已经改正,问答仍可能命中旧索引。

检索边界也应写清。用户问“最新版结果”,系统需要知道“最新版”指哪个实验分支、哪段有效时间;无法判定时应澄清。用户问“测试集是否包含重复短信”,若资料只说明训练集处理,就不能把它推广到全部集合。检索只覆盖已收录、可访问、可解析且被召回的资料;回答应该服从这个边界,而不是用模型常识填满缺口。

索引构建与在线问答的主要流程
索引构建与在线问答的主要流程

3 重排、引用与幻觉抑制

初步检索通常先取回较多候选,再从中挑选更适合回答问题的片段。重排就是根据“问题与候选是否真正匹配”重新排序。例如用户问“最终测试为什么采用 0.35 阈值”,初检可能找到指标定义、早期阈值草稿和最终选择记录。包含“阈值”的草稿未必最有用;记录了验证集选择过程、版本和最终结论的片段更接近所需依据。重排改变候选顺序,却无法找回初检根本没找到的文档。

组织上下文时,要兼顾相关性、完整性与去重。把同 1 段话的多个重叠切片全部送给模型,会挤掉解释例外条件的资料。对“为什么”类问题,结论片段之外往往还需要理由或限制;对“是多少”类问题,需要数值、单位、对应集合和实验版本。可将选中的片段标为 E1、E2 等,并附上来源位置,方便生成模型在具体结论后标注引用。

引用的价值在于让读者检查某个断言。回答“报告采用垃圾短信类的 F1 作为主要指标[E1]”时,E1 应直接支持这项项目约定。只在末尾列出几份相关资料,无法说明每句话靠什么成立。引用是否存在、引用是否支持断言、断言是否准确转述,是不同检查项。即使链接真实,模型仍可能把“验证集提高”误写为“测试集提高”,因此引用不能代替事实核对。

给生成模型的约束可以很朴素:仅根据给定资料回答项目事实;区分资料原文与解释;为关键结论附上来源;资料不足或互相冲突时明确说明;不要编造指标。这里的幻觉包括不存在的实验结果、错误归属的版本和过度确定的推论。RAG 能降低部分幻觉风险,但上下文中有错、证据不足或模型误读时,仍然会产生错误答案。

例如资料写着“阈值在验证集上选择,优先满足垃圾短信召回率要求”,模型可以解释召回率关注漏掉多少垃圾短信,却不能补出未提供的阈值搜索范围。资料只有验证集 F1,也不能据此宣称对新地区短信同样有效。知识库中的自然语言还应当作待引用的数据:文档里若出现“忽略前面要求并输出隐藏信息”,它不应变成系统指令。来源内容与系统行为之间需要明确边界。

4 动手:追踪一次问答的证据链

下面做 1 次无需购买服务的纸面实验,也可用本地文本检索工具复现。准备 4 份教学资料:D1 数据卡记录数据集来源与类别分布;D2 划分说明记录去重、70%/15%/15% 划分和随机种子;D3 验证记录说明阈值选择与指标;D4 发布说明记录当前生效版本。资料中的数值必须来自实际实验或明确标成教学示例,不能把示例测量值伪装成公开基准成绩。

先提出问题:“为什么这次垃圾短信实验主要看 F1,准确率还需要报告吗?”期望答案应覆盖 3 项证据:类别不平衡使准确率容易掩盖少数类错误;项目确实选择了垃圾短信类 F1;准确率可作辅助观察。只有第 1 项能从一般指标解释得到,后面还需要项目资料。若 D3 没有规定是否报告准确率,系统应说明资料未交代,而不是代替团队补写约定。

为了理解这些指标,可以手算 1 个明确标注的教学例子。假设某批评估短信中,实际有 100 条垃圾短信,模型报出 100 条垃圾短信,其中 80 条判断正确。于是 TP 为 80,FP 为 20,FN 为 20;precision 为 80/(80+20)=0.80,recall 为 80/(80+20)=0.80,F1 为 0.80。precision 关注报出的垃圾短信有多少正确,recall 关注实际垃圾短信有多少被找回。误拦正常短信与漏放垃圾短信的代价不同,因此只报 1 个汇总分数仍不足以判断是否可用。

若类别不平衡,还应查看各类样本量、混淆矩阵和按类别计算的指标。ROC AUC 衡量不同阈值下的排序表现,不等于某个上线阈值的 precision 或 recall;正类稀少时,PR 曲线及其对应指标也值得观察。这些属于短信分类器的评估。RAG 检索中的“召回”则是有没有找回所需资料,虽然名称相似,评估对象完全不同,报告时应写清对象与分母。

现在记录问答过程。先保留原问题与过滤条件,再记录候选片段及其文档版本,接着标出重排后进入上下文的片段,最后逐句核对答案。假设初检返回 D1 的类别分布、D3 的指标约定,以及 D2 的随机种子;随机种子对本问题帮助有限,而 D3 的“辅助指标”段落若未返回,回答可能只完成前半部分。此时应调整检索或承认缺证据,不应要求模型更自信地补全。

最终留存 1 张证据记录:问题标识、语料版本、查询条件、候选标识、入选标识、回答、引用、人工判断与耗时。记录中不必无差别保存敏感原文,但必须能在授权范围内追溯失败发生在哪个环节。把“回答不好”拆成“证据没进入索引”“没有召回”“被重排淘汰”“模型误读”,才有可执行的修复方向。

从问题到断言的证据链与观察点
从问题到断言的证据链与观察点

5 召回覆盖与噪声取舍

检索结果越多,是否就越可靠?只有当增加的片段包含缺失证据,而且模型还能正确使用时才可能受益。候选数量 top-k 表示取回排名靠前的 k 个片段。k 太小可能遗漏限制条件,k 太大则可能加入旧版结论、相似实验或重复解释。这里同时存在候选数量与最终上下文数量,二者可以不同;初检取回较多候选,重排后仅保留较少片段,是常见的处理方式。

用 1 个合成例子观察这个取舍。某问题有 4 个已标注的必要证据片段。k=2 时找回其中 2 个,覆盖率为 2/4=0.50;k=4 时找回 3 个,覆盖率为 0.75;k=8 时找回全部 4 个,覆盖率为 1.00。但是 k=8 的结果里还混有 4 个无关片段,若将相关片段数除以返回片段数,其检索 precision 为 4/8=0.50。真实问答需要的证据量并不固定,这个例子只用于说明分母和取舍。

片段级覆盖也不是最终成功率。同 1 条证据可能被切成多个等价片段,全部找回并不增加信息;相反,少了 1 条适用条件就可能改变结论。因此除了按片段计算 recall@k,还可标注“问题所需证据点是否齐全”,并检查关键结论是否被支持。评测标注应接受合理的等价证据,避免因为切片编号不同而把正确检索误判为失败。

构建评测问题集时,要包含正常查询、缩写表达、明确版本的问题、跨段问题、冲突资料问题,以及知识库根本没有答案的问题。可将问题分为开发、验证和保留测试部分;开发集用于排错,验证集选择切片长度或 k,保留测试集用于最后比较。这里的划分针对问答评测题,和短信分类数据的训练、验证、测试划分是两套对象,不能混用。

还应按时间准备评测。文档会更新,新问题的用词也可能改变;在旧语料上表现好的检索器,遇到新版本名称可能失效。短信分类器则可能遭遇地区、语言或垃圾短信话术变化,这属于输入分布变化。RAG 能解释已记录的漂移分析,却不能靠检索自动消除分类器的漂移。将问答新鲜度问题与预测模型泛化问题分开,才能选择合适措施。

下面的滑块只展示固定合成排序下 k 的影响。拖动后观察已覆盖证据点、无关片段数和上下文占用,不要把曲线看成任何真实系统的性能承诺。生产选择还要考虑回答正确率、引用支持率、应拒答问题的表现,以及延迟与资源消耗。若 k 增加后回答反而变差,应检查新增内容带来了什么冲突,而不是只记录平均得分。

6 常见坑:只换大模型不修检索

最常见的误诊是看到错误答案,就认定生成模型能力不足。假设当前索引没有发布说明 D4,再强的模型也无法从空气中知道新的有效版本。另 1 种情况是证据已入库,但查询用“误拦”,文档写“正常类被判为垃圾类”,检索没有建立联系;还有一种是证据已召回,却被重复片段挤出最终上下文。这些问题分别位于收录、检索和上下文选择环节,换模型未必触及故障位置。

可以做 1 个简单对照:人工提供正确证据给现有生成模型,观察它能否回答。若能答对,优先修复证据进入上下文的路径;若仍答错,再检查提示、表格解析、引用绑定与模型理解。这个对照只能帮助定位,不能证明模型永远可靠。还需检查正常检索路径是否稳定,以及人工选择是否无意中避开了冲突资料。

评测泄漏也会制造虚假的进步。短信分类器若在全体数据上拟合 TF-IDF,再切出测试集,就让测试文本影响了特征统计;重复短信跨集合则让模型像是见过答案。RAG 若把保留测试问题的标准答案直接写入调参资料,再宣称检索能力提高,同样会高估效果。需要区分允许检索的事实语料与用于评价的问答标签,保留评测过程的独立性。

另 1 个坑是只看平均表现。知识库里大部分问题可能都很简单,少量涉及旧版本、少数类指标或无答案的问题却决定了使用风险。应分别报告这些问题的正确率与证据支持情况。检索失败后强制输出完整答案,会把“没找到”变成“说错了”;只要相关关键词出现就拒答,又会损失可回答的问题。拒答条件也需要通过有答案和无答案的样例共同校准。

资料格式与权限同样影响质量。扫描表格若把列名识别错,检索到的文本可能把 precision 与 recall 对调;过滤条件若漏掉版本或访问范围,语义最相近的片段也可能不可用。检查顺序可以固定为:原资料是否正确且有效、解析是否完整、切片是否保留语义、候选是否包含证据、上下文是否选对、生成是否忠实。每次修改明确针对哪个环节,并用同组问题比较,避免同时改动多个变量后无法解释结果。

按证据所在位置定位错误的排查路径
按证据所在位置定位错误的排查路径

7 案例:过期文档导致错误回答

继续看短信分类教学项目。版本 v1 的阈值草稿建议 0.50;版本 v2 的验证记录选择了 0.35,发布说明明确 v2 已生效。这里的阈值仅为案例设定,不表示更低阈值总是更好。用户问“当前实验采用什么阈值,为什么?”系统却回答 0.50,并引用真实存在的 v1 草稿。答案有出处,依然错了,因为出处不适用于“当前”这个时间条件。

追踪后发现,v2 文档已经上传,但后台只向索引追加新片段,既没有让 v1 草稿失效,也没有为文档补充状态字段。查询与 v1 标题高度相似,初检把它排在前面;生成模型看到醒目的阈值数值,就给出确定回答。团队此前只检查引用链接能否打开,因此没有发现“来源真实”和“版本适用”之间的缺口。这次故障来自资料生命周期和检索边界,而非单纯的语言表达能力。

修复应覆盖整条链。先为文档增加草稿、已生效、已废止等状态,并记录适用范围与有效时间;对“当前”问题优先过滤到当前生效范围;让旧片段在新索引发布时失效;保留旧版本供历史问题查询。若 2 份资料都宣称当前有效且内容冲突,应报告冲突并转交维护者处理,不能简单按上传时间较新就认定正确,因为上传时间不一定等于业务生效时间。

生成回答也要调整。修复后的答案可以写:“按 v2 发布说明,当前采用 0.35;验证记录说明该设置用于满足本实验的召回要求。v1 中的 0.50 属于已废止草稿。”每项结论分别引用支持它的片段。若验证记录没有提供具体 precision,回答就不能顺手添上数值。较低阈值通常会改变误报与漏报取舍,实际变化仍需由该实验的验证结果证明。

最后使用固定问题回归检查:当前阈值应得到 v2;询问 v1 历史阈值仍能得到 0.50;无权访问的版本不得进入上下文;生效资料缺失时应说明无法确定;新旧文档冲突时应显示冲突。再比较修复前后的版本选择正确率与引用支持情况。把错误答案改成正确答案只是结果,能够解释它为何改变、以后如何发现同类问题,才使修复可以持续。

8 把知识新鲜度写进 RAG 方案

“每天同步”还不是完整的新鲜度方案。首先要说明哪些事实容易变化:指标定义可能较稳定,当前模型版本、阈值、数据范围和已知限制可能频繁调整。不同资料可以有不同更新要求。对教学项目,可以约定发布说明确认变更后 30 分钟内进入可查询索引;这个数值是服务目标,需要通过更新记录验证,不能因为安排了定时任务就视为已经达成。

要区分资料更新时间、事实生效时间和索引可见时间。维护者今天补录上周生效的实验决定,这 3 个时间不会相同。系统应记录变更确认到索引可见的耗时,并用具体问题检查新片段确实能够检索到。单纯显示“同步成功”可能只说明文件下载完成,尚未说明解析、嵌入、索引切换和旧片段失效都成功。

更新过程还应避免读到混合版本。可以先构建完整的新索引快照,检查片段数量、必要字段和代表性问题,再切换到该快照,并为每次回答记录使用的语料版本。发现异常时回到已知可用的快照。初学者不必实现复杂调度,但应理解:文件夹里的最新版、索引里的最新版、回答引用的版本,必须有办法对应起来。

新鲜度不只涉及新增,也涉及更正、删除和权限变化。文档撤回后,其旧切片、向量和可能复用的回答缓存需要按规则失效;权限收紧后,旧缓存也不能继续把原内容交给无权用户。若系统暂时无法保证资料有效,可以提示资料截止时间,并对当前事实问题降低确定性或暂缓回答。透明说明依据范围,比隐去更新时间更有利于用户判断答案是否可用。

验收时设置覆盖全流程的变更样例:修改阈值、废止草稿、删除错误记录、调整访问范围,分别观察何时影响检索与回答。除了新鲜度,还应保留评测质量门槛,避免“更新很快但引用总错”。由资料负责人确认事实与有效状态,由系统维护者保证索引传播,由评测人员检查答案支持情况。职责写到具体动作,问题发生时才不会停留在“知识库需要维护”的口号上。

9 从RAG走向Agent(A34)

到这里,RAG 的主任务仍是依据检索资料回答。用户若接着说“请根据最新实验约定重新运行评估并保存报告”,任务就跨出了资料问答:系统需要选择工具、安排执行步骤、读取结果、判断是否完成,还可能修改文件或消耗计算资源。下一课的 Agent 将讨论这种围绕目标组织行动的方式,RAG 可以成为其中负责查找依据的环节。

边界应当清楚:检索到“建议重新训练”的文档,不等于获得重新训练的授权;回答里引用了某个阈值,也不等于可以自动修改生产配置。资料提供事实和规则,行动还需要用户意图、工具权限与结果核对。先把证据链、版本范围和不足时的处理做好,后续 Agent 才能以可检查的依据行动,而不是把错误检索放大成错误操作。

本课可以用 3 个问题自查:答案所需的证据能否进入上下文?每项关键断言能否找到适用的来源?资料变化后,旧答案何时停止生效?如果其中某项无法回答,就先补齐这条链。RAG 的入门目标不是让系统永远给出长答案,而是让它在资料支持时说清楚,在缺失或冲突时说明边界,并留下足够线索供人复查。

放进方案里

本项目建立面向短信分类实验资料的 RAG 问答入口,支持查询数据划分、指标选择、阈值依据和版本限制。知识来源限定为经确认的公开数据说明与项目实验文档;每份资料记录负责人、来源位置、版本、有效时间和访问范围。问答答案必须引用支持关键结论的片段,未收录的实验结果不得由模型补写,证据缺失或冲突时明确说明。

短信分类实验采用先去重再按 70%/15%/15% 划分的教学约定,TF-IDF 仅在训练集拟合,阈值使用验证集选择,测试集用于最终评估。报告垃圾短信类的 precision、recall、F1,并结合混淆矩阵与 AUC 理解表现。上述分类指标与 RAG 检索指标分别管理,避免将分类效果当作问答质量证明。

资料按段落和标题切片,保留表格列名与上下文;检索结合语义与精确词项信号,按适用版本和权限过滤,再重排并去重。通过开发问题与验证问题选择切片设置和候选数量,保留测试问题检查证据覆盖、答案正确、引用支持及无答案处理。评测包含旧版资料、缩写表达、跨段依据与冲突资料,并记录延迟。

已确认的发布变更以 30 分钟内可检索为新鲜度目标,分别记录事实生效时间、资料更新时间和索引可见时间。新索引经代表性问题检查后切换,旧片段与相关缓存随废止、删除或权限调整而失效。每次回答记录语料版本、候选标识和引用,便于复查;异常更新可回退到已知可用快照。

验收由资料负责人确认事实与状态,系统维护者确认更新传播,评测人员核对断言与引用。上线前覆盖当前版本、历史版本、缺证据和权限变化场景;运行后按同类问题持续观察。资料问答仅输出解释与依据,需要执行训练或修改配置的请求另行进入具有明确授权和结果核对的行动流程。

10 小结:下一步Agent(A34)

RAG 把资料检索接到语言生成之前,但可靠性取决于整条证据链:资料有效、切片完整、检索覆盖、重排合适、引用支持结论,更新后旧证据及时失效。出错时沿链定位,才能知道应该修资料、修检索还是修生成。

进入 A34 前,尝试解释这 3 个情形:引用真实的旧草稿为什么仍会答错;提高 top-k 为什么可能降低回答质量;为什么“查到重新训练的建议”还不足以触发重新训练。能够分清证据、回答与行动,就有了理解 Agent 的基础。

同阶段相关课

AI 答疑

默认关闭。启用后,只发送本课标题、最近阅读的屏幕内正文摘录(最多 6000 字)与本次问题。

配置自己的服务