1. 用实验把归因结论坐实
误差树给出假设, 对照实验负责检验. “可能是切分太小”需要通过固定其他条件、只改变切分来验证; “模型没有使用中间位置证据”需要把同一证据换位重放. 没有对照的案例分析适合发现问题, 不足以判断修复来自哪个改动.
实验设计还要区分离线能力和线上分布. 离线集提供稳定比较, 线上影子流量暴露真实查询长度、权限过滤和尾部延迟. 两边结果不一致时, 先比较输入分布和语料版本, 再讨论模型泛化.
1.1. 因子实验与交互效应
假设要比较两种切分 S0、S1 和两种检索器 R0、R1, 最小的 因子实验运行四个组合. 若答案准确率分别为 60%、66%、63%、75%, 切分 S1 在 R0 下贡献 6 个百分点, 在 R1 下贡献 12 个百分点; 检索器 R1 在 S0 下贡献 3 个百分点, 在 S1 下贡献 9 个百分点. 两个因素存在正交互, 只做 S0R0 与 S1R1 的前后比较会把 15 个百分点全部错误归给某一项.
完整因子实验成本较高, 可以用分层实验缩小范围. 语料与切分在参考证据覆盖上筛选, 检索器在固定片段上筛选, 随后对少量候选组合做端到端交叉. 关键是保留至少一个共同锚点, 让不同阶段的结果能连接.
位置实验也采用配对设计. 对每个有充分证据的样本生成三个上下文, 只改变目标证据位于开头、中间或末尾, 其余片段与 token 总数不变. 若 100 个样本准确数为 82、61、79, 中间位置存在明显损失. 直接把上下文缩短后准确率提升不能单独证明位置效应, 因为噪声量也同时变化.
查询改写实验保留原查询分支. 记录原查询独有命中、改写独有命中、共同命中和两边都漏的样本. 假设 200 个问题中改写新增 18 个成功, 同时让 12 个原本成功的查询漂移; 若并行融合能保留两边, 它可能优于完全替换. 只报告改写后 recall 会隐藏这 12 个回归的来源.
统计显著性之外还要判断实际意义. 在一万个问题上, 0.2 个百分点提升可能稳定存在, 但若需要双倍索引和更高尾部延迟, 产品价值有限. 反过来, 高风险问题簇样本很少, 一次权限或剂量错误也值得阻止发布, 不能因为缺乏大样本显著性而忽略.
1.2. 回归集和线上闭环
回归集由稳定代表样本、历史事故和新发现边界组成. 每个样本附最早失败层、参考证据组和加入原因. 当某类问题已经通过修复稳定解决, 样本仍保留, 防止后续模型或索引更新让旧错误复发.
线上反馈进入回归集前需要归一化. 用户点踩可能来自事实错误、表达冗长、引用打不开或期望不一致. 分析人员查看对应运行, 将问题归到语料、召回、选择、生成或界面. 只有能够形成明确验收条件的案例才进入自动回归; 纯偏好问题单独进入体验评测.
一个闭环例子从“某产品旧型号说明书被引用”开始. 运行记录显示新旧版本都在候选, 旧版因词项完全匹配排在前面. 根因落在缺失有效版本过滤, 语料本身已经覆盖新版本. 修复后加入两条回归: 当前问题只能命中新版, 历史日期问题应命中旧版. 这样既锁定修复, 又防止简单删除旧文档破坏历史查询.
监控指标需要与离线层级对应. 无结果率突然升高时检查连接器和过滤, 平均候选数变化时检查索引, 引用解析失败时检查版本与位置映射, 回答投诉增加但检索稳定时检查生成配置. 指标只用于提示调查方向, 最终归因仍依赖样本轨迹和重放实验.
基线、候选版和生产版使用同一评测报告模板. 报告列出语料快照、组件版本、各层指标、关键切片、硬约束、延迟和成本, 并附主要回归样本的运行差异. 这套记录让一次发布决定可以复查, 也让几个月后的新方案仍能与最初基线比较.
回归集需要控制增长方式. 相同根因的数百条线上失败可以保留少量代表样本, 再用切片统计覆盖其余分布; 权限、删除和高风险事实则保留每一种独立边界. 这样既维持运行速度, 也不会因为压缩样本而丢掉重要约束.
当数据分布明显变化, 旧基线继续保留, 同时建立面向新分布的评测版本. 两个版本并行报告一段时间, 可以区分系统退化与用户问题变化. 直接用新样本覆盖旧样本会让历史分数失去可比性.
每次结论都附对应运行与样本清单. 复查者能够从汇总指标回到候选、上下文和命题支持关系, 重新计算关键数字. 可追溯性让误差归因成为可重复实验, 也让后续扩展组件时仍保留共同参照.
最小可复现实验
四段基线
第一段使用稀疏检索, 给专有名词、编号和精确字面匹配一个可解释起点. 第二段换成精确稠密检索, 先不引入 ANN 近似误差. 第三段组合两路候选并重排. 第四段才加入生成、引用与拒答. 每次只改变一层, 否则最终答案变化无法归因.
检索数据至少保存 (query, corpus_snapshot, relevant_ids, relevance_grade). 多跳任务还需要相关证据集合, 无答案任务需要明确空集合. 训练、调参和测试应按来源、时间或问题簇隔离, 防止同一文档模板泄漏到不同集合. 如果相关性由多人标注, 应记录分歧与裁决, 因为含糊查询的标签本身可能不唯一.
手算一个证据集合
假设查询是「A 制度在 2026 年 4 月后是否允许远程审批」. 相关集合包含主条款 , 2026 年修订通知 和远程审批例外 . 若检索前五名为 , 单文档 hit 已成功, 但证据集合覆盖只有 . 生成器即使写出流畅答案, 也可能漏掉 中的例外. 这说明多跳和政策问题不能只报告「是否命中一篇相关文档」.
若上下文预算只能放两个片段, 选择器必须在 中作取舍, 此时应修改证据单位或采用结构化组合, 而不是盲目提高检索 top_k. 候选数增加只提高发现机会, 不扩大生成上下文. 这个小例子把召回、选择与生成三层分开, 后续所有复杂方法都应能回到同一套检查.
基线验收与常见偏差
指标必须对应层级
检索层用 Recall@k、Precision@k、MRR 与 nDCG; 多证据任务补充 evidence-set coverage. 生成层测任务正确率、命题支持率、引用正确率与覆盖率. 拒答需要分别统计无答案样本上的正确拒答和有答案样本上的错误拒答. 系统层记录 P50/P95/P99 延迟、token、调用成本、失败率、索引新鲜度和授权错误.
不能把这些指标平均成一个没有解释力的「RAG 分数」. Recall@100 上升可能同时增加重排成本, 上下文噪声和长尾延迟; 答案正确率上升也可能掩盖引用覆盖下降. 发布时应给每一层设门槛, 再根据任务损失选择主要优化方向.
一个可维护的请求记录
请求记录至少包含调用者与允许数据域、查询原文与所有改写、语料和索引版本、各路候选及分数、融合与重排结果、最终证据快照、模型和提示版本、回答、引用与拒答原因. 敏感正文不一定永久保留, 可以保存受控快照引用和哈希. 关键是错误出现时能够判断发生在哪一层.
当这组资产齐全后, 换 embedding、索引、重排器或生成模型才有意义. 新组件先在固定语料和固定查询上与旧基线配对比较, 再进入影子流量和线上实验. 没有快照与分层指标时, 「回答看起来更好」无法变成可重复结论.
从误差计数到修复收益
误差树还可以估计修复上限. 一百个失败中, 25 个源文档缺失, 20 个召回遗漏, 15 个选择丢弃, 30 个生成错误, 10 个引用错位. 如果只替换生成模型, 理论上直接影响的主要是 30 个生成错误; 即使全部修复, 总体最多改善 30 个点, 并且不能解决无权或过期文档. 这类上限估计帮助决定实验优先级, 也防止把所有失败交给最昂贵组件.
归因标签需要通过干预验证. 对“生成未使用证据”的样本, 把目标片段单独放在短上下文开头重放: 若仍然错误, 更可能是模型理解或任务指令问题; 若恢复正确, 再改变位置、冗余和冲突片段, 判断是位置效应还是噪声. 对“召回遗漏”, 用 exact dense、BM25 和人工关键词分别搜索, 可以区分 ANN 损失、表示问题与语料缺失.
离线提升还要换算到真实流量. 某改动只修复占流量 1% 的多跳切片, 切片准确率提高 20 个百分点, 总体期望收益约 0.2 个百分点; 若该切片是高风险合规查询, 仍可能值得采用. 报告同时给出切片频率、风险权重和资源成本, 而不是用总体平均替代产品判断.
回归集的稳定部分与探索部分分开. 稳定集锁定历史事故、权限边界和核心任务, 每次发布必跑; 探索集随新数据和新方法变化, 用于发现域外问题. 探索样本一旦形成明确任务契约和参考证据, 再进入稳定集. 这种流动避免稳定集不断被临时难题稀释, 也避免只优化固定题目. 样本量与反事实重放
配对版本比较重点统计“旧错新对”和“旧对新错”. McNemar 检验只使用这两格, 因为两边都对或都错不提供版本差异信息. 若两格为 28 和 8, 净改善明确; 若为 12 和 9, 小幅升分可能只是波动. 实验前还要规定最小有意义差异, 不能跑完后把任意正差解释为收益.
对同一问题构造原始上下文、移除参考证据、只保留参考证据、把参考证据移到中间四种输入. 移除后仍输出同一答案提示参数记忆; 只保留证据仍错误提示理解或契约问题; 位置变化导致错误则指向上下文利用. 四次运行固定提示、模型和解码参数.
冲突样本再构造旧版、新版和两版并存三种上下文. 输出应随单一版本变化, 两版并存时依据查询时间选择或陈述差异. 若三种输入结果相同, 生成器没有响应证据; 若并存时任意挑选, 冲突协议没有生效.
置信区间按问题重采样, 多次生成先在问题内汇总. 权限泄漏等硬错误不等待统计显著性, 单个确认案例已经违反门槛. 普通质量指标则同时报告差值、区间、切片频率与资源成本.
逐层误差预算
设语料覆盖率为 , 条件召回率为 , 候选进入上下文的条件概率为 , 给定充分上下文时答案正确率为 . 在简化独立链路下, 端到端可达率近似 . 若四项为 0.95、0.90、0.85、0.90, 乘积约 0.654. 即使每层单看都接近九成, 全链路仍只有约 65%. 该乘积用于暴露累积损失, 实际报告仍保留相关性和置信区间.
把召回从 0.90 提到 0.94, 其他项不变, 端到端期望从 0.654 升到 0.683, 约 2.9 个百分点. 把选择从 0.85 提到 0.93, 则升到约 0.716, 改善 6.2 个百分点. 在相同工程成本下, 后者具有更大理论空间. 若选择改进增加大量 token 并使生成率下降, 新的 要重新测量, 不能只用局部提升外推.
一百个问题的走查更直观: 95 个有参考证据入库, 其中 86 个进入候选, 73 个进入上下文, 66 个答对, 60 个全部核心命题受支持. 系统分别报告覆盖 95%、条件召回 , 条件选择 , 条件生成 , faithfulness . 总体答案准确 66%, 完整支持答案 60%. 每个分母都指向一个责任层.
实验按配对顺序执行. 切分实验固定检索模型, 检索实验固定快照, 重排实验重放同一候选, 生成实验重放同一上下文. 最终再跑完整链路, 检查组件交互. 若局部实验有效而端到端无收益, 对比中间分布: 新候选是否更长、更重复, 新排序是否把多跳互补证据挤掉, 新上下文是否触发截断.
预算还包含失败检测能力. 某层没有记录输入输出时, 其错误会被归到下游. 因此每次新增改写、路由或压缩组件, 同时增加对应指标和消融开关. 无法关闭或重放的组件不能参与可靠归因, 即使当前总体分数较高.
数值走查中的守恒关系
每层样本数应满足单调关系: 入库参考数不超过总问题数, 候选覆盖不超过入库参考数, 上下文覆盖不超过候选覆盖. 若报表出现上下文覆盖高于候选覆盖, 通常是分母不同、生成器补全或参考证据匹配规则不一致. 指标管线要为每个问题保存布尔标记, 汇总值从同一张明细表计算.
假设 200 个问题中 180 个有可用证据, 召回 160 个, 选择保留 140 个. 生成答对 150 个看似超过上下文覆盖, 其中至少 10 个来自参数记忆或替代证据. 再做命题支持评测, 若只有 125 个完全受上下文支持, 端到端 grounded accuracy 为 62.5%. “答对”与“有据答对”不能共享一个计数.
成本走查把每层延迟相加并保留并行关系. 两路召回分别 30 和 50 ms 并行执行, 融合 5 ms, 重排 120 ms, 生成 600 ms, 总关键路径约 ms, 不是 805 ms. 缓存只命中某一路时, 候选分布也可能变化, 所以延迟实验同时比较质量.
实验决策表列出假设、处理变量、固定变量、主要指标、保护指标和停止条件. 例如“结构切分提高条件完整率”固定语料与模型, 处理变量为切分器, 主要指标为证据组覆盖, 保护指标为 token 与更新成本. 若主要指标无提升或保护指标越界, 不进入下一轮端到端发布.
误差预算在每次发布后重新估计. 修复召回后, 原先隐藏的排序和生成错误会增加, 旧比例不能继续代表瓶颈. 新版在相同问题集上重新生成逐层漏斗, 与旧版按问题配对比较, 才能判断损失从哪一层转移.
线上样本进入预算前先校正采样偏差. 用户主动点踩的请求集中在明显失败, 随机 trace 更接近总体分布, 高风险审计样本则代表风险下限. 三类数据分别报告, 再按明确权重汇总, 避免把投诉率直接解释为错误率.
同一错误若影响多个指标, 明细表只记录一个最早失败点, 派生报表再展示后续影响. 这样既避免重复计数, 也保留“语料缺失最终导致无引用回答”这条因果链. 修复验证要求最早失败点消失, 同时检查下游是否暴露新的错误.