搜「RAG 技术大比拼」的人,通常不是想知道谁的论文分数高,而是卡在同一个坎上:手头这堆方案听着都行,到底给自己的业务选哪一个。这篇不给排名,也不写死数字,而是给一套按场景收敛的判断顺序——先从数据形态和问题类型出发筛掉一半,再用检索方式、链路复杂度、维护成本逐层排除,最后落到一份能拿去开会的最小验证清单。
搜「RAG 技术大比拼」的人,多半不是想知道谁的论文分数高,而是卡在同一个坎上:手头这堆方案听着都行,到底给自己的业务选哪一个。方案本身没有高下,脱离你的数据、你的问题、你的运维人力去谈优劣,讨论就变成了论坛口水。
这篇不给排名,也不写死任何数字,而是给一套按场景逐步收敛的判断顺序:先从数据形态和问题类型出发筛掉一半选项,再用检索方式、链路复杂度、维护成本逐层排除,最后落到一份能拿去开会的最小验证清单。你会得到的是筛子,不是答案表。
为什么这类对比从来选不出一个「最佳」
很多人期待一张总排行榜,但 RAG 的真实情况是:方案的优劣高度依赖数据形态、问题类型和更新频率。一个在客服问答里跑得很顺的链路,搬到法务合同审查上可能第一步就崩。所以看任何对比文章,先问一句「它是在什么数据上比出来的」,比看结论本身更重要。
还有一层是论文口径和工程口径的差别。论文看的是指标高低,工程看的是延迟、稳定性、失败时能不能查出来、以及长期维护要占几个人。同一套方案在几十篇文档的小试验里表现不错,量一上来可能先崩在检索延迟或并发上。
第一步:先用数据形态砍掉一半选项
选型的第一刀不该砍在检索算法上,而该砍在数据上。你的资料是干净纯文本、还是图文混排、还是大量结构化表格,这三类对应的可选项集合差别很大。扫描件和复杂表格往往在解析这一步就决定了后面能不能用,而不是检索环节。
| 数据形态 | 先要解决的环节 | 容易踩的坑 |
|---|---|---|
| 干净纯文本 | 切分粒度与索引策略 | 切得太碎,上下文丢一半;切得太大,召回不准 |
| 图文混排 / 扫描件 | 解析与版面还原 | 解析丢字,后面再好的检索也救不回来 |
| 结构化表格 / 数字 | 字段化与查询改写 | 把表格当纯文本切,行列关系全乱 |
| 频繁更新的文档 | 增量写入与版本管理 | 全量重建成本高,删改内容残留 |
数据量和更新频率是同一刀的第二半。是全量重建索引,还是支持增量写入,这一步选错后面很难补。文档每天都在变、还要能删掉旧内容,那索引方案从一开始就得按增量设计,别等到上线后才发现只能推倒重来。
第二步:你的问题长什么样,决定检索怎么做
数据决定能选什么,问题决定要怎么检。把常见问题粗分成三类:事实型单点问答(问一个具体事实)、跨文档归纳(要综合好几处内容)、需要多轮追问(得顺着上下文继续问)。这三类对召回深度和排序环节的要求明显不同,用同一套配置硬扛,往往某一类体验会明显掉队。
问题里带着没有现成答案的推理成分时,纯检索的路子会露怯,比如「根据这几份合同的条款,我们下季度该怎么调整」——答案不在任何一段原文里。这类要提前想好把检索嵌进多步流程,而不是指望一次召回解决。
- 抽二三十条真实问题,按上面三类打标,别用想象的样例
- 统计每类问题的占比,占比最高的那类优先满足
- 把答不上来的问题单独存一份,它们决定你要不要加复杂链路
- 术语拿不准的去 /ai-dict 对照,别自己造词,不然后面沟通全是歧义
检索与重排:加不加那一层,看的是错答代价
检索这块的取舍其实是一条三段路:只用向量召回;加上关键词召回做混合;再在上面压一层重排。每加一层,成本和延迟往上走,稳定性通常也在往上走。不是越复杂越好,而是要看你的错答代价撑不撑得起这一层。
- 先只跑向量召回用真实问题集跑一遍,把答错的标出来,看错在「没召回到」还是「召回到了但排太后」
- 补关键词召回如果错在专有名词、编号、缩写上,混合召回往往能救一批,再跑同一批问题对比
- 判断要不要加重排正确片段稳定排在靠后位置时,重排作用最大;如果错在压根没召回到,加重排也没用
- 量代价重排会带额外延迟和调用成本,响应敏感的场景要拿实际耗时说话,别凭感觉
判断标准很直接:答错一句无所谓、用户自己会核对,那能省就省;答错要返工、要走流程、要担责,那就值得加。反过来,如果你的问题基本都是唯一答案的精确匹配,重排的边际收益会很小,这时候把钱花在解析质量上更划算。
链路复杂度:多一步推理,多一份维护账
单次检索拼装的简单链路,出问题时一眼能看出是哪一环坏了:是没召回、是拼错了、还是模型没答好。而多步循环的链路,排查成本陡增,因为每一步都可能引入偏差,而且偏差会往下传。团队只有一两个人维护时,能减一步就减一步。
- 简单链路
- 一次召回加一次生成,出问题定位快,适合人力紧张、问题类型单一的团队
- 多步链路
- 拆问题、多轮检索、再汇总,上限更高,但每一步都要单独的日志和测试
- 成本账
- 每多一步模型调用都会推高账单,按量级估算可到 /tools/model-cost-calculator 核对当时的数字
- 人力账
- 复杂链路的长期成本不在开发,在于每次改动都要回归测试,得有人长期盯
一个务实的做法是:先用最简单的链路把端到端跑通,把答错的问题收集起来。如果错题集中在「需要多步推理」这一类,再考虑加复杂度,而不是一上来就照着最复杂的架构搭。加复杂度要有明确的、被数据支撑的理由。
一张按顺序过一遍的选型清单
把前面的判断收敛成一张可以照着走的清单。顺序很重要:先定约束,再排除,最后才做对照测试。约束没定就挑方案,等于没有筛选条件。
- 先写死业务约束:可接受的响应时间、每月预算上限、能投入的维护人力,这三项先落到纸上
- 按数据形态排除:解析不了的、索引方式不支持的,直接划掉
- 按问题类型排除:占比最高的那类问题满足不了的,划掉
- 按错答代价判断要不要加重排和复杂链路
- 对剩下的两三个候选,用同一批文档、同一批问题做对照,别换着来
落地前的小规模验证怎么做
选型定了不等于能上线,中间还隔一次小规模验证。这一轮的目的不是证明方案有多好,而是尽早暴露「答非所问」「答得对但语气不对」「该引用的原文没引」这类真实问题。圈出真实文档的一个子集和一批真实问题,做一次端到端跑通。
- 圈定验证集从真实文档里挑一个有代表性的子集,配一批真实问题,规模不用大,但要真
- 跑端到端从解析、切分、索引到回答整条路走一遍,先看有没有明显答非所问
- 记录对照每次改动前后,同一批问题的表现都要记下来,形成可回看的对照,别靠印象判断
- 留反馈入口上线后留一条收集答错问题的通道,下一轮优化就有靶子
验证时要盯的不是单个答案好不好,而是失败有没有规律。如果错误集中在某类文档或某类问题上,说明是配置问题;如果错误随机分布,可能是解析或切分环节没打好底。这两类的修法完全不同。
什么情况下这套判断不适用
前面这套顺序默认了「你确实需要检索增强」。但有些场景下,检索这一层本身就是多余的,硬套流程只会浪费人力。下面几种情况要先想清楚再动手。
- 公开通用知识占绝大多数、几乎没有私有资料:检索增强价值有限,先把提示词写好可能就够
- 强合规要求、数据不能外发的场景:可选项会被硬性砍掉一大截,得先解决部署形态再谈检索
- 知识总量极小、一页纸装得下:直接塞进上下文比搭一套检索链路划算
- 问题几乎都是同一类且答案唯一:先把解析和切分做扎实,比堆检索层更见效
还有一点要提醒:这套判断是给「从零选型」用的。如果你已经在跑一套方案,痛点很具体,那不该重走一遍选型,而该直接定位是哪一环出的问题。选型和排障是两条路,别混着走。
下一步把候选方案的数量、各自的延迟表现和成本量级摊在一起看,再决定动手写哪个。站内的工具目录里有延迟测试和成本估算入口,先用数字把选择收敛一下。→常见问题
这些方案里有没有一个默认的起步选择?
没有普适默认项,但有个务实的起步姿势:先用最简单的单路向量召回把链路跑通,拿真实问题测一遍,看错在哪。错在召回漏了再加关键词,错在排序再加一层重排。一次到位往往选错方向,反而是最费时间的做法。
方案效果好不好,我该怎么量?
别只凭几段对话的观感下判断。准备同一批真实问题和对应文档,改一次方案跑一遍,把答案对错记下来做前后对照。关键是每轮换方案时,问题集和文档子集保持不变,否则对比出来的差异说明不了任何问题。
链路越复杂是不是效果越好?
不一定,而且通常会先付出代价。每多一步检索或模型调用,都会带来延迟增长、成本上升和排查变难。效果有没有提升得实测,维护成本却是确定的。人手少的团队优先选能一眼看懂、坏了能立刻定位的结构。
有没有必要一开始就上很重的方案?
多数情况没必要。先把数据整理、分块、基础召回这些基本面做扎实,收益往往比换更花哨的方案更明显。等基础链路稳定、并且能明确说出瓶颈具体卡在哪一环,再针对那一环升级,改动范围也小。