RAG 管道怎样留下可定位证据
一句话收获:中间证据使错误可以定位到知识管道中的具体层。
这个场景在解决什么问题
RAG(检索增强生成,Retrieval-Augmented Generation)不是"把文档丢进向量库、让模型读一读"就完事。真正的问题是:当模型答错了,你知道错在哪一层吗? 是资料没准入?还是检索没命中?还是过滤漏了越权片段?还是引用时张冠李戴?
这个场景的目标(goal)是:实现资料准入、解析、检索、过滤、重排、装载与引用。观察点(observation)是:让一次错误回答逆向穿过完整知识管道——也就是用一次失败,把每一层的证据都翻出来看,从而定位到具体是哪一层出了问题。
它值得单独学,因为它把 RAG 从"黑盒"变成"可追溯的管道":每一层都留下中间证据,错误才能被定位,而不是笼统地怪"检索不好"。
先理清这条判断链(文字版)
一次回答错了,不要急着改 Prompt,先沿着知识管道从前往后、或从后往前逐层看证据:
- 先看资料准入与解析——这份资料有没有登记来源、版本、权限,标题表格位置有没有保留,草稿和旧版有没有混进来。
- 再看混合检索——稠密、稀疏、结构化三条路径各自命中什么,候选从哪来、查询条件是什么。
- 然后看权限与版本过滤——高相似旧版和越权片段有没有在"喂给模型之前"就被拦下。
- 最后看引用反查——关键结论能不能回到原文,条件、范围、例外对不对得上,回答的验收有没有闭合整条知识链。
逐层详解
第 1 步:资料准入与解析
原文:登记来源、版本、权限和状态,保留标题、表格和原文位置。
白话:一份资料进系统前,得先"登记户口"——它从哪来、是哪个版本、谁能看、现在是草稿还是正式生效;解析时还不能把结构弄丢,标题、表格、原文在第几页第几行都要留着,方便以后回溯。
类比:像档案馆收档案,不是把纸塞进库房就完事,要先登记"来源、编号、密级、状态",还得保留原始页码和目录,否则以后查起来一团乱。
举例:你的 Agent 要给客服团队做知识库,导入一份《退款政策 v3》。系统要记下:来源是法务共享盘、版本 v3、权限限客服和法务、状态是"已发布";解析时保留"退款时效""例外条款"这些标题和表格的行列位置,而不是只抽成一段乱文本。
为什么重要:知识资格和结构先于向量索引。也就是说,先搞清楚"这份资料有没有资格进来、结构完不完整",再谈把它转成向量去检索。顺序不能反,否则垃圾进、垃圾出。
怎么验证(证据点):
- 来源登记:能查到这份资料从哪个权威源头来。
- 版本当前:确认当前生效的是最新版本,不是旧版。
- 解析可抽查:能随机抽一段,核对标题、表格、位置有没有保留对。
别踩的坑(边界):解析成功不证明资料应当生效。解析器能把一份草稿完美地转成文本,不代表这份草稿该被 Agent 当答案用——"能解析"和"该生效"是两回事。
落地检查:草稿和旧版不进入现行候选。落地时要有一条硬规则:状态不是"已发布"、或版本已过期的资料,一律不进入当前检索候选集,只留档。
第 2 步:混合检索
原文:稠密、稀疏和结构化路径形成统一候选。
白话:检索不能只靠一条路。稠密检索(用向量算语义相似)、稀疏检索(用关键词/精确符号匹配)、结构化检索(按字段、范围过滤),三条路各自捞一批候选,最后合成一个统一的候选集合。
类比:像找人,光看"长得像不像"(语义)会漏掉名字完全相同的人,光查"姓名精确匹配"(符号)又会漏掉换了叫法的人,再加一条"按部门、城市筛"(结构化)才靠谱。三条路合起来才不容易漏。
举例:用户问"华东区的退货时限是多少"。稠密路径能匹配到语义相近的"退货时间""退款期限",稀疏路径能精确命中"退货时限"这四个字,结构化路径能把范围锁定在"华东区"这个字段。三条路的结果合成一批候选,再往下走。
为什么重要:语义、精确符号和范围过滤各有作用。语义擅长"意思相近",符号擅长"一字不差",范围擅长"只在这个圈子里找",单靠任何一种都会漏。
怎么验证(证据点):
- 命中路径:能说清某条候选是稠密、稀疏还是结构化路径捞上来的。
- 候选来源:每条候选来自哪个索引、哪个库。
- 查询条件:这次查询实际用了什么条件、什么过滤。
别踩的坑(边界):候选并集不是最终上下文。三条路的结果拼在一起,只是"候选",不是最终喂给模型的东西,中间还要过滤、去重、重排。
落地检查:还要过滤、去重和重排。落地时候选并集之后必须再接一段处理:过滤掉不该进的、去重掉重复的、按相关性重排,才能进入下一步。
第 3 步:权限与版本过滤
原文:高相似旧版和越权片段在装载前被拒绝。
白话:检索出的候选里,如果有"相似度很高但是旧版"的、或者"当前用户没权限看"的片段,要在真正装进模型上下文之前就拦掉,而不是让模型先看到再指望它自己克制。
类比:像门禁安检,不该进的人要在门口拦下,不能放进办公室再指望他自觉不看机密文件。
举例:检索发现一条"退款政策 v2"和当前 v3 语义几乎一样,但 v2 已经被 v3 取代;还有一条是法务专用的内部条款,当前登录的是普通客服。这两条都应该在"装载给模型"这一步之前就被拒绝,模型根本不该看到它们。
为什么重要:模型不应先看到再被要求克制。让模型先读到越权内容、再在 Prompt 里叮嘱"别泄露",是不可靠的——内容一旦进了上下文,就有泄露风险,最稳的办法是根本不让它进。
怎么验证(证据点):
- 拒绝原因:每条被拦的候选,能说清是因为"旧版"还是"越权"还是别的原因。
- 身份范围:过滤时依据的当前用户身份/权限范围是什么。
- 现行版本:确认留下的都是当前生效版本。
别踩的坑(边界):相似度高不能覆盖准入规则。一条内容语义再贴近问题,只要它越权、或是旧版,就必须拦,不能因为"相似度高、很像答案"就放行。
落地检查:过滤位于模型调用之前。落地时要确认过滤逻辑的执行时机在"调用大模型"之前,而不是在之后补救,这是硬性的位置要求。
第 4 步:引用反查
原文:关键结论回到原文,确认条件、范围和例外。
白话:模型给出关键结论后,要把这个结论反向指回它依赖的原文片段,核对"条件、适用范围、例外情况"是不是真的支持这个结论,而不是文件名对得上就算完。
类比:像写论文查文献,不是"我列了一篇参考文献"就代表观点有据,得真的回去看这篇文献里有没有那句话、条件一不一致。
举例:Agent 回答"退款时限 7 天",验收时要反查:这条结论对应原文哪个片段?原文说的是"签收后 7 天内"还是"下单后 7 天内"?有没有"生鲜除外"这样的例外?如果原文条件是"未拆封",而结论漏了这个条件,就算引用文件名对,结论也不成立。
为什么重要:引用要支持具体结论。引用的意义不是"我引用了某个文件",而是"这个文件里的具体内容真的支撑了我这句话",否则引用只是装饰。
怎么验证(证据点):
- 片段支持:引用的片段内容确实支持该结论。
- 原文可回查:能一键回到原文的准确位置。
- 版本一致:引用片段所属版本与当前生效版本一致。
别踩的坑(边界):文件名存在不代表结论 grounded。文件确实存在、确实被引用了,不代表结论真的被它支撑(grounded 指结论有据可依),不能把"文件名在"当成"结论对"。
落地检查:回答验收闭合知识链。落地时最终验收要能把"结论 → 引用片段 → 原文 → 版本"这条链完全闭合,任何一环断了都算不合格。
落地可行性小结
本场景涉及的核心技术栈:RAG(检索增强生成)、向量检索 / 稠密检索、关键词 / 稀疏检索、结构化字段过滤、权限过滤、版本管理、引用溯源(citation)。
真实落地要检查的事:
- 资料准入表要保留字段:来源、版本、权限范围、状态(草稿/已发布/已归档)、原文位置(页码/段落/表格坐标)。
- 混合检索要有明确的"候选来源标记",否则事后无法定位是哪条路径捞上来的。
- 过滤必须写死在"模型调用之前",用代码或检索条件实现,不能靠 Prompt 叮嘱模型"别泄露"。
- 引用反查要在回答结构里强制带出处(citation),并校验版本一致性。
常见坑:
- 只做了向量检索,缺稀疏/结构化路径,导致精确符号(订单号、条款号)查不准。
- 版本混用:旧版和现行版都在库里,检索命中旧版导致答错。
- 把"解析成功"当"资料已生效",草稿混进候选集。
- 引用只挂文件名,不校验片段内容和版本,导致"看起来有据、其实没据"。
回顾
- RAG 不是黑盒,是"准入 → 检索 → 过滤 → 装载 → 引用"的管道,每层都要留证据。
- 一次错误回答能逆向穿过整条链,定位到具体是哪一层先出的错。
- 权限与版本过滤必须在模型调用之前,不能靠模型自己克制。
- 引用反查的验收标准是"结论能回到原文、条件范围例外对得上、版本一致"。
- 中间证据是错误定位的前提,没有证据就只能瞎猜、笼统甩锅。