RAG 答错了,
怎样找到第一次偏离
用一个带版本、角色和数量限制的产品问答,沿改写、检索、重排、上下文和生成走一遍。每一步都看实际产物,再用最小探针区分缺证据、传递丢失和答案越界。
先带走这三个判断
90 秒 · 排障实验
- 先固定问题与参考依据,再沿实际产物追查。改写文字没写版本,不代表结构化过滤一定丢了版本。
- 找到最后一个正确产物和第一个错误产物。缺证据、传递丢失与答案越界,对应不同修复。
- 每次只改一项做受控对照。修好当前题后,再看相邻版本、角色和数量的反例。
文章目录
排障实验 · demo-trace-001
同一条错答,逐步看产物
构造记录浏览器;这里不会重跑真实模型。“恢复条件”只展示受控实验的预期对照。
问题:v2 管理员能把筛选后的 200 条记录一次导出 CSV 吗?
参考 B:管理员、非归档记录、CSV、单次最多 100 条。
1 / 6 · 约束保留
- 输入
- 原问题:v2 / 管理员 / 筛选记录 / CSV / 单次 200 条。
- 本步产物
- 检索文本:记录批量导出与单次上限。结构化条件保留 v2;按已认证身份排除无权阅读的 D。
- 下一步看什么
- 核对文本与实际过滤参数,不只看改写句子。
完整记录与实验边界
- 改写与过滤:检索文本:记录批量导出与单次上限。结构化条件保留 v2;按已认证身份排除无权阅读的 D。
核对文本与实际过滤参数,不只看改写句子。 - 召回:候选 B、C。A 只适用于 v3;D 无权读取;E 已被 B 明确替代。
B 已在候选里,当前瓶颈不在“完全没有召回”。 - 重排:B 第 1,C 第 2。保留 B 的完整片段,交给上下文装配。
这是最后一个完整保留 100 条上限的产物。 - 上下文:截断后:管理员可批量导出非归档记录为 CSV。
只恢复 B 的完整条件,保持查询、候选和顺序不变。 - 生成:错误答案:支持批量导出,200 条也可以。
缺少额度时应说不能确认;即使早期已出错,生成也不能把未知补成允许。 - 页面:页面原样展示错误答案,引用显示 B;引用存在仍不能证明当前答案受支持。
检查页面是否改写或截断答案。本构造记录中,错误已在上游发生。
这里刻意同时保留“上下文丢条件”和“生成越界”两个事实。恢复完整证据是一个可检验假设;真实复测仍须保留实际产物,并验证模型是否按证据回答。
先把问题和依据说清楚
我们固定一个构造问题:“产品 v2 中,管理员能否把筛选后的记录一次批量导出成 CSV?一次 200 条可以吗?”产品能力、文档和数值都为说明方法而设,不对应真实系统。这个问题包含两个判断:有没有这项能力,200 条是否在单次允许范围内。只回答“支持批量导出”,并没有完成第二个判断。
对象是产品中的记录,版本是 v2,功能角色是管理员,输出格式是 CSV,操作范围是筛选结果,数量条件是单次 200 条。这些条件构成这次回答的边界。假设实际请求身份已验证,可以读取管理员指南;问句里自称管理员,本身不能获得额外的文档访问权。功能角色描述产品能力,实际身份决定材料能否被读取,两者需要分别判断。
为这次诊断建立一个小的文档集合。它既有明确依据,也有看起来很像答案的干扰项。这样可以观察系统怎样选择,而不必把一次错误归因于整个知识库。
| 文档 | 内容与适用范围 | 本次可否作为依据 |
|---|---|---|
| A:新版说明 | v3,单次可导出 1000 条 | 允许读取,但不回答 v2 的问题 |
| B:正式管理员指南 | v2,管理员可批量导出非归档记录为 CSV,每次最多 100 条 | 身份有权读取,直接支撑本题 |
| C:格式说明 | v2,单条记录可导出 CSV | 主题相关,未说明批量能力 |
| D:试验草稿 | v2,试验额度为 200 条,仅特定维护者可读 | 本次无权读取,不能进入上下文 |
| E:旧版说明 | v2,旧额度为 20 条,已明确被 B 替代 | 可用于追溯,不是当前生效依据 |
在这个设定里,完整答案应保留四个事实:管理员、非归档记录、CSV、单次最多 100 条。因此 200 条不能一次导出。若筛选结果包含归档记录,B 没有为这部分提供支持。至于能否拆成多次、怎样维持筛选结果一致,都需要另外的依据,不能顺手补成操作承诺。
文档 B 是我们在构造实验中已知的参考依据,不意味着真实排障总能预先知道正确文档。真实来源若互相冲突,或缺少生效关系,先承认参考答案尚未确定。不能仅凭发布时间较新,就自动判定一份说明覆盖另一份。
改写与过滤怎样传递
改写的作用是让检索更容易找到材料,同时保留回答边界。它可以把问句拆成“管理员批量导出”和“单次数量上限”两个检索意图,但不能把“200 条是否可行”当成已知事实,也不能把 v2 自动换成最新版本。改写越流畅,越需要检查它是否仍在问同一件事。
约束不一定全部写在检索文本里。文本可以是“记录批量导出 CSV 及单次上限”,版本和授权范围则由结构化过滤携带。因此,看见改写文本没有 v2,不能直接定罪。需要同时核对意图解析、过滤条件,以及检索器实际收到的参数;中间对象里有版本,最后调用却没带过去,偏差发生在传递边界。
硬过滤与排序偏好也不同。给 v2 文档增加一些权重,仍可能让 v3 排在前面;明确只允许 v2,则不应返回 A。授权约束需要在检索链路的访问边界执行,并在后续阶段保留,不能先把 D 交给模型,再靠页面隐藏。缺少可靠授权或版本元数据时,不能把未知偷偷解释成“允许”或“通用”。
现在构造第一个偏差:改写只保留“产品批量导出”,实际检索参数也不含版本,A 被选中。原问题是最后一个已确认正确的产物,接下来要区分是解析时丢失,还是解析正确、组装调用时丢失。最小探针是比对这三个相邻产物,而不是先替换模型。
可做一个受控反事实:保持资料、检索文本和其他配置不变,只恢复 v2 过滤。如果 A 消失、B 进入候选,说明版本传递是有效的调查方向;仍需查清之前为什么缺失。一次改变同时重写查询、换模型又扩大候选数,即使答案恢复,也很难知道是哪项改变起作用。
下文把链路拆开,是为了观察这些转换。RAG 的原始工作把检索得到的外部材料与生成模型结合;它提供了基础背景,不直接规定这里的版本、权限或诊断流程。背景阅读:Retrieval-Augmented Generation 论文
召回缺失怎样验证
召回的输入不是一个孤立句子,而是检索意图、有效过滤、可搜索资料和索引状态。输出应能解释这次返回了哪些候选:原文片段、来源、适用范围,以及必要的检索分数。分数用于比较候选,不是“这句话支持答案”的概率。不同检索方式的分数也不能脱离定义直接相加或比较。
假设本次只返回 C,模型最终答“支持批量导出”。首先可以确认,现有材料不足以支撑这句话;还不能确认 B 是怎么缺席的。它可能不存在于当前知识集合,可能尚未索引,可能被错误元数据过滤,也可能已参与检索、却排在返回数量之外。这些原因对应不同修复,不能统称为“召回差”。
如果已经知道 B 的存在,最小探针是通过合法身份直接验证 B 是否可读、是否为当前生效版本,再核对它是否进入索引及其过滤元数据。原文可读而索引中缺失,应先检查资料到索引的过程;索引中存在但授权字段错误,应修复映射;这些都不是换一个相似度模型能直接解释的问题。
若 B 在正确过滤后的索引里,也能被定向找到,却没有进入这次候选,可以固定同一查询分别观察不同检索方式,或适度扩大返回范围。目的不是让更多文档永久进入生成,而是确定 B 在何处被遗漏。只有在已经检查的来源、身份和版本范围内,才可以说“没有找到明确支持”;这不等于整个产品不存在该能力。
另一项反事实是在离线诊断中,把已验证且有权使用的 B 加入固定候选,其他条件不变。如果后续恢复正确答案,缺少证据是一个瓶颈;它没有单独证明原因是语义检索算法。人工补入文档也不能成为绕过授权的线上捷径。
资料不足时,合适的回答是说明目前不能确认,并指出缺少批量能力或数量上限的依据。找到“导出 CSV”只能回答格式的一部分。要断言“不支持”,同样需要明确的否定依据或完整、适用的能力定义;没有命中肯定材料,不会自动变成否定材料。
重排究竟改变了什么
重排接收已召回的候选,改变它们的优先级,随后通常只保留一部分。它无法把根本没进入输入的 B 找回来。如果 A 已经违反 v2 过滤,应该先修复更早的边界,而不是期待重排顺便替版本错误兜底。
设想 B 和 C 都在候选中。C 的标题直接包含“导出 CSV”,B 的标题却是“记录处理与限制”。如果排序主要偏向词语相近,C 可能领先;但本题真正需要的是批量能力、角色与单次上限。排序目标应考虑候选是否有助于回答这些子问题,不能只看是否谈到同一主题。标题匹配可以帮助发现材料,不能代替原文的支持关系。
诊断时比较同一批候选在重排前后的身份、顺序和保留情况。B 在前一步存在,重排后被淘汰,才能把调查集中到排序目标与保留规则;如果重排结果仍有 B,却没进入最终上下文,证据不是在这里丢的。某些流程在重排期间追加检索,此时输入集合已改变,实验不能再称作只改变排序。
可固定候选集合,把 B 人工移到前面,其余生成条件保持一致,再观察上下文和答案。如果关键限制因此保留下来,排序与后续预算之间的关系值得继续检查。若 B 始终进入上下文而答案仍越界,继续调名次可能只是回避下一层的问题。
需要多份文档共同回答时,排名第一也不等于证据完整。一份说明能力,另一份说明额度,保留前者丢弃后者仍会答漏。排序实验应检查所需事实是否一起被保留,而不是只庆祝某个参考文档上升了几名。
上下文与答案的边界
上下文组装接收选中的材料,在有限预算内整理成模型实际看到的内容。这个产物可能不同于检索页面展示的原文。诊断必须检查实际送入的片段,而不是根据“B 已命中”推断它完整进入了生成。来源和适用条件也要随内容传递,不能只留下一个失去范围的句子。
例如 B 的第一句写“支持批量导出”,下一句才写“仅管理员可用,每次最多 100 条”。按字符直接剪裁可能留下前半句。另一个常见结构是:版本写在章节标题里,数值写在表格单元格里,非归档条件写在表下注释里。片段看似完整,实际上已经失去解释它所需的标题、列名或条件。
最小检查是沿来源定位到被选片段,把原文与实际上下文逐项对齐,确认角色、版本、数量、对象范围有没有保留。修复可以是改变切片边界、附带必要标题,或减少重复材料;单纯加大预算会增加成本,也未必阻止下一次恰好把限制剪掉。
一个有用的反事实,是在固定生成配置下补回被丢失的限定句。如果答案恢复,说明上下文供给值得修复;仍不能只凭这一回断言提示词完全可靠。更完整的片段可能暂时掩盖生成阶段的不稳定,邻近问题仍需检验。
当完整 B 已经进入上下文,答案却说“所有用户都能一次导出 200 条”,第一次已观察到的越界就在生成。相似度说明材料与问题接近,支持关系则要求材料能推出这项具体主张。把“管理员”改成“所有用户”,把“100”改成“200”,不是换一种自然表达,而是扩大了结论。
回答需要按主张核对。对能力可以肯定,对 200 条可以否定,对归档记录或分批操作可能仍无法确认。这种分开回答,比整句笼统拒答更准确,也比把部分依据扩展成全面支持更稳妥。忠于材料并不保证材料本身正确,来源有效性仍是前面需要验证的条件。
最后再比对原始答复与页面。如果原始答复完整保留额度,但页面摘要只留下第一句“支持”,偏差发生在呈现。继续改模型无法解释这次限定条件为何消失;应检查摘要、截断或字段展示的转换,并让必要条件与结论共同呈现。
三类根因与最小探针
贯穿案例可以归出三类调查方向。第一类是问题约束在传递中改变:问 v2 却检索 v3。第二类是证据供给不足:B 在来源、召回、排序或上下文的某处缺席。第三类是已有依据被错误使用:完整条件已送入,答案却扩大范围。它们可能同时发生,一次运行找到一个缺陷,不等于后面的阶段都可靠。
“第一次偏离”需要相邻的实际产物支撑。版本解析正确、调用过滤缺失,可以定位这段传递;B 在召回中存在、重排输出中消失,可以定位淘汰边界;上下文完整、原始答复越界,可以定位生成。若只看到原问题和最终答案,中间阶段都缺失,最多提出假设,不能给其中一层定罪。
证据还要对应同一次运行。拿后来更新的文档解释较早的答案,或用另一次查询的候选替代当时结果,会制造一个看似连贯、实际不成立的因果故事。应保留足以区分运行和来源修订的标记,诊断记录只取必要材料,并继续受授权约束。
| 当前未知 | 下一步最小探针 | 可以收窄到什么 |
|---|---|---|
| 版本在哪一步丢失 | 对齐解析结果与实际过滤参数 | 理解缺失或传递缺失 |
| B 是否可被检索 | 合法身份定向核对原文、索引与元数据 | 来源、索引或过滤边界 |
| B 是否被排序淘汰 | 比较同一候选集合的输入与输出 | 排序或保留规则 |
| 限制是否进入生成 | 对齐原文片段与实际上下文 | 切片或组装边界 |
| 条件在生成还是展示时消失 | 比较原始答复与页面内容 | 生成或呈现边界 |
最小探针的价值,是用有限观察排除一批解释。若定向核对仍无法确认 B 是否存在,就把资料完整性记为未知,先确定可检查的来源范围,不要无边界扩大搜索。下面三个短场景摘出不同变化,便于练习同一方法。
① 问 v2,引用了 v3
改写变成“产品批量导出能力”,实际检索参数也没有版本约束,最终引用了 v3 的说明。原始问题仍然正确,约束在改写或检索参数组装时开始丢失。
- 最后正确
- 原始问题明确指定 v2。
- 第一次偏离
- 版本不再出现在改写或实际过滤条件中。
- 先验证
- 比对改写文本、结构化版本字段、实际检索参数和候选文档适用范围。
改写文本没有 v2,不足以独自定罪:版本可能保留在独立过滤条件里。
② 命中了导出文档,但没有回答批量问题
检索返回 本次候选 C:v2 的“导出文件格式”说明,只写可以导出 CSV,没有说明能否批量导出。主题相关,仍不足以支持“可以”或“不可以”。
- 最后正确
- 问题及适用版本约束仍然完整。
- 第一次偏离
- 现有材料不足,尚不能把根因归到某个检索阶段;若据此断言支持,偏差已进入结论。
- 先验证
- 核对原文与范围,再比较候选、重排结果和最终上下文,看明确说明是否在某一步消失。
没有检索到不等于不存在。当前能说的是“现有证据不足以确认”。
③ 证据有条件,答案省掉了条件
假设原文写明“v2 支持管理员批量导出非归档记录为 CSV,每次最多 100 条”,上下文完整保留了这句话,但模型答成“v2 支持所有用户批量导出”。
- 最后正确
- 上下文保留角色、记录范围、格式与数量边界。
- 第一次偏离
- 原始模型答复扩大了适用人群。
- 先验证
- 逐项核对上下文、原始答复与页面显示;若答复正确而页面漏掉条件,就定位呈现阶段。
合适的答案应保留角色、记录范围、格式与数量边界,并说明单次 200 条超过上限,不把有条件的支持改成普遍支持。
让指标对应各自的层
整体回答正确率能描述结果,却不直接说明该改哪一层。对这个案例,召回应看支持批量能力和额度的证据是否进入候选;排序应看这些证据是否在有限保留范围内;上下文应看关键限定是否完整留下;生成应看每项结论是否受到依据支持。指标对应不同问题,不能用一个统一通过率替代。
证据覆盖需要明确的参考集合。若 B 是已验证的依据,可以观察它是否被召回,也可以按“批量、管理员、CSV、100 条、非归档”这些必要事实检查覆盖。文档命中和事实完整不是同一个指标:命中了 B,却只拿到第一句,前者可能满足,后者仍不完整。
排序指标要固定候选和保留数量;否则扩大候选数后命中增加,不足以说明排序变好。还应观察多份互补依据是否被共同留下,以及无效、重复材料占用了多少位置。对本来没有合法明确依据的问题,不应强求召回一个肯定答案,应单独评估它是否准确说明了证据边界。
生成忠实性关注“答案是否被实际上下文支持”。答案碰巧说对了 100 条,而上下文根本没有额度,不能因此判为有依据;反过来,模型忠实复述了一份过期材料,也不意味着业务答案正确。忠实性、来源适用性和最终正确性应分别报告。
授权违规、跨版本误用和必要条件丢失值得单独观察,不能被平均分淹没。评估还需要看参考标注是否可靠:两份生效说明互相冲突时,先解决标注依据。样本不足或未实际运行,就报告验证范围与未知项,不编造覆盖率或改善幅度。
固定回放与邻近反例
修复前先固定可比较的输入:原问题、实际身份范围、来源修订、索引状态、候选预算、上下文预算和生成配置。外部资料持续变化时,应在合规范围内保存必要的诊断快照;无法固定的部分明确记录。只固定一句问话,却让文档和配置同时改变,前后差异很难归因。
先重放被定位的转换。例如修复版本传递,可以直接检查 v2 是否进入实际过滤、A 是否被排除;修复切片,可以检查 B 的限定句是否一起保留。这种确定性的核对比先观察最后一句答案更接近改动本身,但它只证明该边界,不代表整条链路已经正确。
随后做固定输入的端到端回放,比较候选、上下文、原始答复与呈现。生成有随机性时,一次正确回答不足以说明稳定,应在同一配置下做有限重复,并分别记录约束违背与正确完成。若结果波动,继续检查波动发生在哪个产物,不把最漂亮的一次挑出来当验收。
邻近反例只改变一个关键条件:改问 v3,检查不会被强制锁到 v2;把单次 200 条改成 50 条,检查不会一概否定;改问普通成员,检查答案保留功能角色差异;改问归档记录,检查不会沿用非归档依据;移除 B,检查不会靠记住示例继续肯定。实际身份变化时,文档授权范围也须重新计算。
还可以保留 B、加入标题更相似但无明确支持的 C,观察证据是否仍被选中;保留正确内容、移动限制到表下注释,检查上下文组装是否仍完整。这些变化检验修复的是规则,还是只适配一段措辞。反例本身仍是构造测试,不能替代真实场景验收。
回归按层推进:先检查约束与数据传递,再检查检索和组装,再检查生成与页面。已有通过的检查无需无条件重复扩大;新增改动、失败或未解决的疑点,才决定下一批检查。对照原有典型问题,确认局部修复没有让其他版本、角色或无依据问题退化。
报告把三件事分开:已经定位的缺陷、已经通过的修复验证、尚未证明的总体效果。若验证只覆盖这些固定问题,就准确说明这个范围;如果要声称整体改善,需要事先定义样本、指标与对照条件,再实际执行,而不是把局部成功直接外推。
代价、停止与结论
每项修复都有代价。扩大召回范围会增加检索、重排和上下文压力;更细的切片可能增加片段数量;更长的上下文增加生成成本,也可能带来重复与冲突;更严格的版本过滤依赖准确元数据,错误映射又会减少有效覆盖。需要同时记录正确性、延迟、成本与维护负担,而不是默认越多越好。
成本控制应围绕已定位的瓶颈。若问题是过滤参数漏传,优先修复传递;没有必要为所有查询引入复杂重排。若关键限制被剪掉,先改善片段完整性;没有必要立即把全部文档塞进上下文。额外复杂度需要对应一个已观察的缺口和可验证的收益假设。
停止扩展并不要求证明系统永远不会出错。可以预先约定一个边界:本次缺陷有相邻产物证据,针对性检查和有限回放通过,邻近反例未暴露同类错误,授权约束保持,代价在可接受范围内,剩余未知已列明。达到这个边界,就可以结束本轮调查,转入后续观察。
如果新增探针只是重复同一结果,没有区分新的根因假设,继续扩大记录和样本可能收益很小。若目标证据始终无法确认、资料冲突没有解决,或成本超过约定范围,也应暂停扩张并明确需要什么外部条件。未知可以成为下一项工作的输入,不能被写成已经修复。
由工程实践中的判断整理,使用通用场景说明方法;示意架构、案例和数值不代表某个系统的生产验收或效果数据。
先找最后一个正确产物和第一个错误产物,再做一次只改一项的验证。
读完,留一句在书桌上
仅保存在当前浏览器。