dalaoyang技术手记

RAG 答错了,
怎样找到第一次偏离

用一个带版本、角色和数量限制的产品问答,沿改写、检索、重排、上下文和生成走一遍。每一步都看实际产物,再用最小探针区分缺证据、传递丢失和答案越界。

先带走这三个判断

90 秒 · 排障实验

  1. 先固定问题与参考依据,再沿实际产物追查。改写文字没写版本,不代表结构化过滤一定丢了版本。
  2. 找到最后一个正确产物和第一个错误产物。缺证据、传递丢失与答案越界,对应不同修复。
  3. 每次只改一项做受控对照。修好当前题后,再看相邻版本、角色和数量的反例。
直接看构造案例
文章目录

排障实验 · demo-trace-001

同一条错答,逐步看产物

构造记录浏览器;这里不会重跑真实模型。“恢复条件”只展示受控实验的预期对照。

问题:v2 管理员能把筛选后的 200 条记录一次导出 CSV 吗?
参考 B:管理员、非归档记录、CSV、单次最多 100 条。

1 / 6 · 约束保留

输入
原问题:v2 / 管理员 / 筛选记录 / CSV / 单次 200 条。
本步产物
检索文本:记录批量导出与单次上限。结构化条件保留 v2;按已认证身份排除无权阅读的 D。
下一步看什么
核对文本与实际过滤参数,不只看改写句子。
完整记录与实验边界
  1. 改写与过滤:检索文本:记录批量导出与单次上限。结构化条件保留 v2;按已认证身份排除无权阅读的 D。
    核对文本与实际过滤参数,不只看改写句子。
  2. 召回:候选 B、C。A 只适用于 v3;D 无权读取;E 已被 B 明确替代。
    B 已在候选里,当前瓶颈不在“完全没有召回”。
  3. 重排:B 第 1,C 第 2。保留 B 的完整片段,交给上下文装配。
    这是最后一个完整保留 100 条上限的产物。
  4. 上下文:截断后:管理员可批量导出非归档记录为 CSV。
    只恢复 B 的完整条件,保持查询、候选和顺序不变。
  5. 生成:错误答案:支持批量导出,200 条也可以。
    缺少额度时应说不能确认;即使早期已出错,生成也不能把未知补成允许。
  6. 页面:页面原样展示错误答案,引用显示 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 是我们在构造实验中已知的参考依据,不意味着真实排障总能预先知道正确文档。真实来源若互相冲突,或缺少生效关系,先承认参考答案尚未确定。不能仅凭发布时间较新,就自动判定一份说明覆盖另一份。

改写与过滤怎样传递

从问题到页面的 RAG 诊断链路
每一个箭头都是值得检查的转换边界。放大图表

改写的作用是让检索更容易找到材料,同时保留回答边界。它可以把问句拆成“管理员批量导出”和“单次数量上限”两个检索意图,但不能把“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 是否存在,就把资料完整性记为未知,先确定可检查的来源范围,不要无边界扩大搜索。下面三个短场景摘出不同变化,便于练习同一方法。

RAG 诊断的四个最小探针
固定条件,一次核对一个转换边界。放大图表

① 问 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,观察证据是否仍被选中;保留正确内容、移动限制到表下注释,检查上下文组装是否仍完整。这些变化检验修复的是规则,还是只适配一段措辞。反例本身仍是构造测试,不能替代真实场景验收。

回归按层推进:先检查约束与数据传递,再检查检索和组装,再检查生成与页面。已有通过的检查无需无条件重复扩大;新增改动、失败或未解决的疑点,才决定下一批检查。对照原有典型问题,确认局部修复没有让其他版本、角色或无依据问题退化。

报告把三件事分开:已经定位的缺陷、已经通过的修复验证、尚未证明的总体效果。若验证只覆盖这些固定问题,就准确说明这个范围;如果要声称整体改善,需要事先定义样本、指标与对照条件,再实际执行,而不是把局部成功直接外推。

代价、停止与结论

每项修复都有代价。扩大召回范围会增加检索、重排和上下文压力;更细的切片可能增加片段数量;更长的上下文增加生成成本,也可能带来重复与冲突;更严格的版本过滤依赖准确元数据,错误映射又会减少有效覆盖。需要同时记录正确性、延迟、成本与维护负担,而不是默认越多越好。

成本控制应围绕已定位的瓶颈。若问题是过滤参数漏传,优先修复传递;没有必要为所有查询引入复杂重排。若关键限制被剪掉,先改善片段完整性;没有必要立即把全部文档塞进上下文。额外复杂度需要对应一个已观察的缺口和可验证的收益假设。

停止扩展并不要求证明系统永远不会出错。可以预先约定一个边界:本次缺陷有相邻产物证据,针对性检查和有限回放通过,邻近反例未暴露同类错误,授权约束保持,代价在可接受范围内,剩余未知已列明。达到这个边界,就可以结束本轮调查,转入后续观察。

如果新增探针只是重复同一结果,没有区分新的根因假设,继续扩大记录和样本可能收益很小。若目标证据始终无法确认、资料冲突没有解决,或成本超过约定范围,也应暂停扩张并明确需要什么外部条件。未知可以成为下一项工作的输入,不能被写成已经修复。

由工程实践中的判断整理,使用通用场景说明方法;示意架构、案例和数值不代表某个系统的生产验收或效果数据。

先找最后一个正确产物和第一个错误产物,再做一次只改一项的验证。

读完,留一句在书桌上

回书桌看看

仅保存在当前浏览器。

图表

窄屏可在图内横向滑动查看细节。