Browse this library

Chinese source article

1.2 · 最小基线与误差归因

建立可重放的最小 RAG 基线, 并按语料、召回、选择、生成和引用归因错误.

View original Markdown ↗

1. 为什么先做小系统

复杂流水线能提高某些样本的表现, 也会增加无法观察的交互. 查询改写可能改善召回却改变问题含义; 重排器可能提升前几位相关性却丢失互补证据; 更长上下文可能增加覆盖同时降低模型对中间位置的利用. 最小基线让这些变化拥有参照.

基线应小到能够人工检查一次完整运行. 选择几十到数百个代表性问题, 配套一批可确认版本的文档, 固定切分规则和一个检索器. 生成提示只规定依据证据回答、给出引用和证据不足时拒答.

1.1. 三条对照

无检索生成测量参数记忆. 只返回检索片段测量搜索结果能否直接支持任务. 检索后生成测量模型把证据转成回答的能力. 三条路径使用同一问题集, 才能识别增益来自哪一段.

若搜索片段已经缺少答案, 更强生成器只能让错误更自然. 若片段充分而回答仍错, 应检查上下文位置、指令和模型行为, 不应继续扩大召回数量.

三条对照可以用同一组 60 个问题做手算. 无检索生成答对 30 个, 搜索片段中有充分证据的有 45 个, 检索后生成答对 39 个. 参数记忆基线为 50%, 当前搜索给出的证据上限为 75%, 完整流水线为 65%. 这组结果说明检索已经增加了 15 个潜在可答样本, 生成器却只把其中 9 个转成正确答案. 第一轮优化应检查证据呈现与生成, 而非先替换 embedding.

只返回片段的评分需要人工或可靠的证据标注, 不能用语言模型是否答对代替. 若参考证据包含两个必要片段, 只命中其中一个仍判不充分. 对事实抽取任务, 可以让标注者在片段中圈出答案跨度; 对综合问题, 则标注支持命题的证据组. 这条对照给出了检索链的可达上限, 也是后续判断生成损失的分母.

1.2. 固定运行记录

每次运行保存语料快照标识、索引版本、查询文本、过滤条件、候选及分数、最终上下文、模型与提示版本、回答和引用. 这些信息使失败可重放, 也允许在不重新生成的情况下检查检索变化.

随机采样和非确定生成需要保存种子或多次结果. 单次偶然输出不适合判断小幅改动. 对候选排名则应保存完整 top-k, 避免只留下最终展示片段.

运行记录可以分成不可变输入、阶段输出和环境版本三类. 不可变输入包括原问题、身份范围和查询时间; 阶段输出包括改写查询、过滤条件、候选、重排和上下文; 环境版本包括语料快照、索引、模型、提示和代码版本. 只保存最终回答会让一次失败无法重放, 只保存日志文本又难以跨版本比较.

检索结果的每一项至少保存文档 ID、版本 ID、片段位置、原始分数、来源检索器和排名. 混合检索还要保存融合前名次. 假设文档 A 的 BM25 名次为 2、稠密名次为 40, RRF 常数 k=60k=60, 它的融合贡献为 1/(60+2)+1/(60+40)≈0.02611/(60+2)+1/(60+40)\approx0.0261. 文档 B 两路名次均为 8, 贡献为 2/(60+8)≈0.02942/(60+8)\approx0.0294, 因而 B 排在 A 前. 保留单路名次后, 这个结果可以直接复算.

2. 分层误差树

2.1. 语料与召回

先问参考证据是否存在于当前语料. 若不存在, 原因可能是连接器遗漏、解析失败、版本过滤或权限配置. 证据存在但未进入候选, 才属于检索表示、索引或查询问题.

召回错误需要观察不同 kk 下目标证据的位置. 目标在较大 kk 出现说明排序能力不足; 始终不出现说明词项、语义表示或过滤存在缺口. 这两个问题的修复方向不同.

对一组查询 QQ, 有至少一份参考证据的 recall@k 可写成 1∣Q∣∑q∈Q1[Dk(q)∩G(q)≠∅]\frac{1}{|Q|}\sum_{q\in Q}\mathbb 1[D_k(q)\cap G(q)\neq\varnothing]. 多跳任务需要完整证据组, 指标改为判断是否存在 Gi(q)⊆Dk(q)G_i(q)\subseteq D_k(q). 两个定义不能混用: 命中三跳问题中的一篇材料会提高单文档 recall, 却没有让问题可回答.

一个可复算例子包含五个查询, 目标文档首个名次为 1、2、8、未命中、4. recall@5 为 3/5=0.63/5=0.6, recall@10 为 4/5=0.84/5=0.8, MRR 将未命中记为 0, 得到 (1+1/2+1/8+0+1/4)/5=0.375(1+1/2+1/8+0+1/4)/5=0.375. 从 k=5k=5 增到 10 只救回一个样本, 还会给重排和上下文增加候选. 是否扩大 kk 要与后续收益和延迟共同判断.

语料覆盖率要先于 recall 解释. 若五个查询中有一个参考文档根本未进入快照, 在当前语料上的条件 recall@10 实际为 4/4=14/4=1, 端到端覆盖仍是 4/5=0.84/5=0.8. 前者评价检索器, 后者评价系统. 把缺失文档算作检索器错误会推动错误的模型改造, 把它完全排除又会掩盖用户实际失败, 因而两项同时报告.

2.2. 选择与生成

目标进入候选却未进入上下文, 需要检查重排、去重、预算和多样性选择. 目标已经进入上下文而回答未使用, 则查看证据位置、冲突片段、提示和生成模型.

回答正确但引用错位属于映射错误. 回答与引用必须分别评分, 因为模型可能凭参数记忆给出正确答案, 再附上主题相关但不支持命题的文档.

候选到上下文的损失可以用 context recall 表示. 设参考证据已经进入 DKD_K, 选择器输出 EE, 则只在候选成功样本上计算 1[E∩G≠∅]\mathbb 1[E\cap G\neq\varnothing]. 例如 100 个问题中 80 个在候选阶段成功, 最终上下文保留 60 个, 条件 context recall 为 75%, 端到端证据覆盖为 60%. 两个数分别指向选择器和全链路.

上下文到回答又分为答案正确和证据忠实. 若 60 个有充分上下文的问题中答对 48 个, 证据条件下的生成准确率为 80%. 但其中只有 42 个回答的全部核心命题可由上下文支持, 忠实率为 70%. 六个“答案对但证据不支持”的样本很可能来自参数记忆、数据泄漏或宽松答案匹配, 需要单独检查.

引用映射采用命题级评价. 假设回答有四个需要证据的核心命题, 三个附了可解析引用, 其中两个真正受到引用支持. 引用覆盖为 3/4=0.753/4=0.75, 引用 precision 为 2/3≈0.6672/3\approx0.667, 完整支持覆盖为 2/4=0.52/4=0.5. 只统计是否出现方括号会把三项都误报成成功.

3. 一次只改变一个责任面

3.1. 组件实验

比较 embedding 模型时固定语料、切分、查询和后续排序. 比较切分时尽量固定检索器与问题集. 比较生成模型时重放同一批上下文. 这类隔离实验不能覆盖最终用户体验, 却能解释组件差异.

端到端实验随后验证组件增益是否仍然存在. 某个检索器提高 recall@50, 但若延迟上升、重排器无法利用或最终答案无改善, 就不应直接替换生产方案.

离线缓存候选能够把检索实验与生成实验解耦. 比较两个重排器时, 对同一候选集合分别生成排序, 再把各自选出的上下文送入同一生成配置. 比较生成模型时, 直接重放同一批上下文. 这样每组实验只有一个主要变量, 代价是不能捕捉组件联合适配, 因而还需完整流水线验证.

实验表至少记录控制变量、处理变量、主要指标、保护指标和置信区间. 例如替换 embedding 的主要指标是按问题簇的 recall@20, 保护指标包括权限过滤后候选数、P95 搜索延迟和索引内存. 如果总体 recall 从 0.82 升到 0.84, 但编号类查询从 0.91 降到 0.70, 平均提升不能支持发布.

随机生成的比较可以对同一问题运行多次, 或固定 temperature 为 0 并接受服务端仍可能存在的非确定性. 对成对结果使用 bootstrap 重采样问题集合, 得到差值区间. 若 95% 区间跨过 0, 当前样本量不足以声称稳定提升. 这不意味着方案无效, 只说明现有实验区分不了它与随机波动.

3.2. 误差样本簇

逐条看错误容易被个例牵引. 更稳妥的方法是按实体名、编号、跨文档、多跳、时间、否定、表格和无答案等属性聚类, 观察改动影响哪些样本簇. 每个簇保留成功与失败例子.

基线的成果包括一套可以定位变化来源的参照系, 不能缩减为一个总分. 当系统扩展到混合检索、代理循环或训练适配时, 这套参照仍然负责回答“新增复杂度解决了哪类错误”.

误差簇的属性来自任务和材料, 不宜只按模型输出表面分类. 一个错误可以同时属于“旧版本”“数字”“表格”三个切片. 使用多标签后, 可以看到某次解析器更新同时修复表格与数字问题, 而不是把收益错误归给检索器. 样本量较小的切片保留原始计数, 避免百分比制造精度假象.

每个簇至少保留一个典型成功、一个典型失败和一个边界样本. 成功样本揭示系统已经依赖的条件, 失败样本暴露缺口, 边界样本防止修复过度. 例如给编号查询增加精确匹配权重, 可能修复错误码搜索, 也可能让普通数字年份压过语义相关文档. 同时观察三类样本才能看出副作用.

错误归因允许多级标签, 但要指定最早失败点. 文档缺失以后产生的召回、上下文和答案失败都是后果; 根因标签落在语料覆盖. 目标文档存在且进入候选, 却被旧版本挤出上下文, 最早失败点在版本过滤或选择. 这种规则避免同一错误在每层重复计数.

4. 从基线进入迭代

4.1. 优先修上游硬错误

语料遗漏、权限泄漏和版本错误优先于排序调参. 上游硬错误会污染所有下游实验, 还可能制造虚假的高分. 处理完硬错误后检查召回覆盖, 接着处理排序与上下文, 生成表达放在下游优化.

这个顺序会随现有能力变化. 若任务已经有成熟搜索, 主要瓶颈可能直接落在证据选择或引用. 误差树提供观察顺序, 并不规定每个项目采用相同组件.

优先级可以用影响范围、风险和修复确定性共同排序. 权限泄漏即使只影响一个样本也具有高风险; 解析器把所有表格列顺序打乱具有大影响范围; 某个罕见问法的查询改写不佳则可排后. 这种排序比单看错误数量更适合生产系统.

修复后要回放完整回归集, 因为上游改动会改变下游输入分布. 重新切分可能提高目标片段完整性, 同时增加平均长度并挤占上下文; 提高稀疏权重可能修复编号查询, 同时降低释义问题排名. 每次修复都记录它解决的样本簇和新增的退化样本.

硬错误修复不等于追求绝对完美后才继续. 可以在隔离的干净快照上并行研究下游方法, 但生产发布的验收顺序仍然先检查权限、版本和删除. 实验环境与生产门槛的区别需要在记录中明确.

4.2. 停止条件

迭代需要明确预算和停止条件, 例如目标问题簇的召回达到要求、引用错误低于阈值、延迟处于服务目标内. 没有停止条件时, 系统容易不断叠加模型和查询步骤.

达到基线目标后再引入混合检索、重排或训练方法. 每新增一个环节, 都要求新的可观测输入输出和消融对照, 否则复杂度无法被验证.

停止条件可以采用受约束优化表达: 在权限与删除测试全部通过的前提下, 最大化关键问题簇质量, 同时满足 P95 延迟 ≤L\leq L, 单请求成本 ≤C\leq C. 一个方案把答案准确率从 78% 提到 79%, 却让 P95 延迟从 1.2 秒升到 4.8 秒, 若服务目标 L=2L=2 秒, 它没有达到发布条件.

边际收益也用于停止. 连续扩大候选 kk 时, 记录新增参考证据数、重排时间和最终答案改善. 若 kk 从 50 增到 100 只让 recall 增加 0.3 个百分点, 端到端答案无变化, 重排延迟却翻倍, 当前任务没有继续扩大的依据. 这一结论只适用于相同语料与问题分布, 数据变化后重新测量.

基线版本在后续迭代中永久保留. 新系统出现回归时, 同一问题可以重放到基线、上一生产版和候选版, 形成三方比较. 参照系一旦随新方案覆盖, 团队就只能看到相邻版本差异, 无法判断复杂度长期累积是否真的带来净收益.

对照实验与误差预算展开组件交互、证据换位、逐层条件概率和延迟手算.