RAG 系统优化方法论(一):竞争对手的答案是最好的老师
副标题:如何构建 X/Y 对照集,从竞品答案反推出每一层的金标准
作者:James Xie
这是《RAG 系统优化方法论》系列的第一篇。上一个系列《生成式 AI 质量工程》讲的是防守——答案坏了怎么发现、怎么定位、怎么证明修好了。这个系列讲进攻:如何系统性地超过竞争对手。
进攻的第一课:竞品是你唯一拿得到的参考答案,但大多数人只拿它当比分牌。
季度评审会上,老板放了一张图:我们和主要竞品的端到端对比评测,同样的三百条法律问答测试集,对方的有用度评分比我们高 8 个点。
会议室安静了几秒,然后是我们都熟悉的流程:“我们差在哪?""看起来合同纠纷类目差得最多。""那是不是检索要加强?""我觉得是 prompt,人家的答案结构明显更好。""要不要看看他们用了什么模型?”
会议开了一小时,产出的结论只有两种:“加强”和”看看”。散会时没人说得清下一步具体改什么、谁来改、改成什么样算赢——因为那张对比图只有一个维度的信息:总分。它能告诉你输了,不能告诉你输在哪;能告诉你差 8 个点,不能告诉你这 8 个点分布在链路的哪几层。
我们的系统有十个环节:问题分类、问题拆解、问题理解、多路检索(向量、语义、图关系)、召回去重、rerank、结果过滤、面向问题的结果精简、答案生成、引用验证后处理。每个环节都有 LLM 或 ML 模型在参与。

竞品的系统对我们是个黑盒——看不见架构,拿不到中间状态,唯一能观测的输入输出是:同样一个问题,它的答案和我们的答案。
这篇讲怎么把这个黑盒的利用价值榨到极限:用 X/Y 对照集做归因分堆,再从竞品答案里反推出每一层的金标准。 做完这两件事,“我们差 8 个点”才会变成一张具体的施工图纸。最后还会正面回答一个绕不开的质疑:这套打法会不会变成刷题?
一、端到端评测是比分牌,不是施工图
先把端到端对比的极限说清楚。
用户是结果导向的,这没错。你问 AI 一个劳动纠纷问题,你不会关心它的检索用了几路、rerank 打了几分——答案有用就是有用,没用就是没用。所以竞品对比也只能端到端做:同一批问题,两家答案,盲评打分。这是公平的,也是必须的。
但端到端分数对优化决策的信息量几乎为零。总分差 8 个点,可能的解释有几十种:我们拆解漏了子问题,竞品没漏;我们检索回来了但 rerank 压错了,竞品排对了;材料一样但我们的生成忽略了一半,竞品全用上了;甚至材料、生成都一样,我们的引用拼错了,竞品没拼错。这几十种解释对应完全不同的改法,分布在完全不同的团队手里,工期从两天到两个月不等。
拿着比分牌开优化会,结果就是每个环节负责人都能编出一个”可能是我这层,也可能不是”的故事。故事没法排期,没法验收,更没法在下次评审会上交代。端到端评测回答”我们输了吗”,施工图要回答”我们该改哪一层、改成什么样”——从比分牌到施工图,中间隔着一整套归因方法。
二、构建 X/Y 对照集:只有对角线有信息量
施工图的第一块砖,是一个精心构建的对照集。
定义两个集合。X:同一批 query 里,我们答得差、竞品答得好的那些——query、我们的烂答案、竞品的好答案,三样东西绑在一起。Y 就是 X 里每条 query 对应的竞品答案本身,它是我们够得着的最好的”参考答案”。
构建时最重要的认知是:不是所有对比样本都有信息量。 把同一批 query 跑过两家系统,结果落在四个象限里:

- 我们好、竞品好:双赢区。没有信息量,跳过。
- 我们差、竞品差:双输区。这些是两家都解决不了的硬骨头,可能是问题本身无解或公开语料缺失。有价值,但那是产品线议题(要不要补数据、要不要收窄产品承诺),不是优化议题——先放一边。
- 我们好、竞品差:我们的优势区。它的用途不是庆祝,是防守。优势区样本和 X 是同一个对照集的两半:X 管进攻(追平差距),优势区管防守(每次改动的必考科目)。任何优化上线前,改动必须先在优势区样本上跑配对评测,win/tie/loss 的 loss 侧出现优势区样本,直接枪毙。进攻的时候最容易丢掉的就是已有的阵地——优化某一层的验收标准从来不是”X 变好了”,而是”X 变好了,且其他象限没有变坏”。前者是入场券,后者是准入门。
- 我们差、竞品好:这才是 X。每一条都是一个被证明”可解、而我们没解出来”的问题。竞品用同样的公开材料答出来了,说明答案存在,差距在链路里。
query 的来源优先用真实的:客服工单里用户真实问过的问题、产品日志里的高频问题(脱敏后)、销售演示时客户当场问倒我们的那些。合成 query 可以补充覆盖面,但主干必须是真问题——真实问题的分布决定了优化资源该投在哪,用拍脑袋编的题目优化系统,优化出来的是一个擅长回答”工程师以为用户会问的问题”的系统。
规模上不需要大。几十个类目、每类十几条高质量的 X,就足够支撑第一轮归因。这个集合以后持续滚动更新——竞品的答案会变,我们追平一批就要换一批,X/Y 不是一次性的资产,是要运营的资产。
三、先归因,再优化:X 要按最早异常边界分堆
拿到 X 之后,绝大多数团队的第一反应是直接开干:“挑一层,优化它。”
这是整个方法里最危险的岔路。X 里的五十条烂答案,瓶颈不在同一层。可能有二十条死在检索(该回来的材料没回来),十五条死在拆解(子问题漏了,后面全白搭),十条死在生成(材料都在,模型没用),五条死在后处理(引用拼错)。如果你拍脑袋选了拆解层去优化,那二十条检索瓶颈的样本不会有任何变化——你投入了两个月,X 里六成的问题原地不动,评审会上还是没法交代。
所以对 X 做的第一件事不是优化,是归因分堆。用到的正是上一个系列《不要从最终答案猜根因》里的方法:对 X 里的每条 query,打开 Request Summary,逐阶段看 Stage Outcomes,找到最早异常边界——链路上第一个打折扣的阶段。
分堆之后,X 变成一张瓶颈分布表:拆解层占多少、检索层占多少、生成层占多少。这张表直接决定资源分配——瓶颈占比最大的层,就是第一个要优化的 A。

注意这个结论经常和直觉相反。团队里嗓门最大的”模型不行”论,在分堆数据面前经常站不住,因为生成层背了大量的上游锅:检索漏了材料,生成只能硬编,烂答案算在了生成头上。上一季我们管这个叫”生成层是整条链路最大的背锅侠”。不看分堆表就投资源,约等于按嗓门大小排期。
先归因,再优化。顺序反了,优化就是抽奖。
四、答案反推材料:从 Y 里拆出每层的金标准
归因告诉我们”该改哪一层”,但还没告诉我们”改成什么样算对”。局部优化需要目标函数,目标函数需要金标准——这一层理想的输出长什么样。
金标准从哪来?标注团队手工标,一个月几千条,成本扛不住,而且标注员未必比竞品答得好。但别忘了我们手里有 Y——竞品在同一条 query 上的好答案。竞品的答案是黑盒,但黑盒的输出里藏着它的供应链。
从 Y 里能反推出至少三层金标准:

检索层的金标准:它引用了什么。 竞品答案引用的法条、判例、条文号,抽取出来,就是这条 query 的”应召回文档集合”。竞品的供应链和我们的是同一个公开语料世界——它引了《劳动合同法》第几条,这条法条就在我们的库里,问题只是我们的检索没把它送上去。有了”应召回集合”,检索层第一次有了可计算的目标:对 X 里的每条 query,我们的召回命中率、recall@k、NDCG 都可以对着这个集合算。优化的方向从”感觉检索要加强”变成”把这五十个应召回文档的命中率从 40% 提到 85%”。
拆解层的金标准:它覆盖了什么。 把竞品答案拆成论点单元,反推出它隐含覆盖的子问题清单。用户问”公司单方调岗我不去,算旷工吗”,好答案实际回答了三个子问题:调岗是否合法、不去是否构成旷工、员工如何救济。我们的拆解只出了一个子问题,拆解层的差距就被量化了——覆盖率 1/3 对 3/3。拆解优化也从”让拆解更好”这种空话,变成”子问题召回率从五成提到八成”。
生成层的参照系:它怎么组织的。 结构、详略、引用的织入方式。这一层不适合做硬指标(文风没有标准答案),但可以作为生成评测 rubric 的锚点:评测 prompt 里直接引用 Y 作为参照,Judge 打分的稳定性会好很多。
这套反推有个正式的名字,answer-conditioned relevance——以答案为条件的相关性标注。学术界做检索评测集时早就在用,我们只是把它用在了竞品身上。
五、金标准必须过一道人工校验
反推出来的金标准不能直接用,要先过一道关:竞品的答案不一定是真理。
它也会错,也会引用失效法条,也有幻觉。如果全盘照搬,你会把自己的检索层优化成”擅长召回竞品的错误”——追上了,追上了对方的坑。所以金标准入库前,需要法律背景的同事抽检:Y 引用的法条是否真实、是否现行有效、是否真的适用于这个 query。抽检不用全量,分层抽 20% 就够——抽检的作用是估计金标准的可信度,顺便把竞品答错的样本从 X 里剔出去(那些样本本来就不该学)。
抽检还有一个意外收获:你会发现竞品答案里有一部分”好”是话术层面的好——结构漂亮、语气自信,但内容有硬伤。这类样本教我们的是 rubric 的教训,不是检索的金标准:评测时千万别把”看起来专业”当成质量。上一个系列第三篇讲过 Judge 的这个偏好——偏爱长的、自信的、分点多的答案。竞品的”好答案”里混着这种应试型选手,人工校验就是把它们筛出去的那道工序。
校验过的金标准要版本化归档。竞品的系统在迭代,三个月后的 Y 和今天的 Y 不是同一个参照物。每次刷新对照集,金标准的版本号和日期必须钉在上面——这是上一个系列 Experiment Manifest 的纪律在这个系列的延续。
六、这会不会是刷题:X/Y 的边界在哪里
方法论讲到这,该正面回答那个尖锐的质疑了:盯着竞品的答案、对着几十条 X 优化,这和一个努力刷题但能力没长的孩子有什么区别?
区别真实存在,但不在”刷不刷”,而在有没有换卷子的制度。刷题的本质是把训练集分数当成能力。对应到这套方法里,堕落成刷题有三种具体形式:
一是过拟合 X。几十条样本,命中率从 40% 优化到 85%,可能只是学会了这几十条的解法,换个问法就现原形。二是过拟合竞品。Y 是金标准,意味着你在克隆竞品的答案,上限是追平,永远超不过,连对方的错误也一并学去。三是修复退化成打补丁:“用户问调岗就追加劳动法第 X 条”——这是背答案,不是长能力。
防刷题,靠五道制度性的防线。
第一道:分清 X/Y 的角色。 X/Y 是探针和门槛,不是训练目标本身。它的作用像回归测试集——通过不代表好,但不通过一定不行。拿它归因、拿它定方向、拿它设门槛,但不能拿它当唯一的验收标准。
第二道:留出集验证。 优化后的改动,除了跑 X,还必须跑一批同分布、但从未参与过优化过程的新鲜 query。X 上提升大、留出集上提升小,这个 gap 就是过拟合的量化指标,当场枪毙。X 上 41%→85%,留出集上 55%→78%,这才是真提升;留出集纹丝不动,就是学会了做题。竞赛训练就是这个道理:专项刷弱项没错,但要用没见过的模拟卷验收。
第三道:学机制,不学答案。 金标准的正确用法不是”让这几条 query 答对”,而是诊断系统性能力缺口。竞品引了我们库里没有的一类判例——那是数据资产的缺口,修法是扩充语料覆盖;竞品拆解覆盖三个子问题我们只出一个——那是拆解能力的通用问题,修法是改拆解策略。判断一个修复是不是刷题,有个简单的标准:它是”针对这批 case 的特判”,还是”一类问题的机制改进”。 前者进不了主干,只能进补丁层。
第四道:优势区同步回归。 防刷题只管”别假装进步”,还有另一个对称的风险:进步是真的,但把原来的优势弄丢了。所以每次改动的验收是双向的——X 上看提升,优势区(“我们好、竞品差”的样本)上看回退,两边都过才算过。优势区样本就挂在每次实验的配对集里,loss 侧一旦出现它们,改动不予放行。保持优势靠的不是小心,是把它写进准入门。
第五道:最终裁判在生产。 X 只是训练场,最后一道防线是上一系列的 Product 层指标——真实用户分布上的有用度、投诉率。改动上线后真实流量上的指标没变化,X 上的分数涨得再漂亮也是自娱自乐。和生产指标脱节的”优化”,才配叫刷题。

努力的孩子刷题不可怕,可怕的是没人给他换卷子。这套方法里,换卷子是制度化的:留出集、生产指标、X 的滚动更新——竞品在迭代,三个月前的 Y 会过期,这反而逼着你不能躺在一套题上睡觉。
结语:从”差 8 个点”到施工图纸
这篇的核心产物,五件东西:
- X/Y 对照集:同 query 配对,“我们差、竞品好”的对角线样本
- 四象限分流:双赢区跳过、双输区转产品线、优势区防守、对角线进攻
- 瓶颈分布表:X 按最早异常边界归因分堆,决定先优化哪一层
- 分层金标准:从 Y 反推的应召回文档集、子问题清单、生成参照系
- 防刷题五道防线:角色定位、留出集、机制性修复、优势区同步回归、生产终裁
回到开头那个会议室。同样的 8 个点差距,走一遍这套流程之后,评审会上的材料会变成这样:X 共 52 条,瓶颈分布是检索 24 条、拆解 15 条、生成 9 条、其他 4 条;检索层的应召回命中率目前 41%,竞品引用反推出的金标准在这;第一个优化对象是检索层的多路召回融合,目标命中率 80%,预计覆盖 X 里 46% 的样本,留出集同步验证,防过拟合。
“加强一下”变成了”改哪层、依据是什么、目标多少、覆盖多少样本、怎么防止自欺”。比分牌变成了施工图纸。
下一篇解决施工图纸上的下一个问题:优化拆解层、检索层时,用什么局部指标来衡量”这一层真的变好了”,以及为什么局部指标的提升经常传导不到最终答案——以及怎么让传导发生。
下一篇:《RAG 系统优化方法论(二):局部提升为什么传导不到最终答案——每层的 proxy 指标与单调性验证》。
🖼️ [封面图]: 极简数据主义风格,两个并排的黑色立方体,左侧立方体表面完整光滑(黑盒),右侧立方体被 X 光透视,内部显露出精密的发光齿轮结构,深邃黑背景配荧光青光线,冷峻高智力感,8k 分辨率