15种高级rag技术从预检索到生成全面提升rag效果

接入与开发

按预检索、检索、重排、生成四个阶段盘点高级 RAG 技术,给要优化效果的团队一份选型与落地清单。

知识库搭起来能跑,但答案经常答偏、漏召回、上下文塞爆——这是多数团队做 RAG 的第二道坎。这篇不重讲原理,而是把高级 RAG 技术按「预检索、检索、重排、生成」四个阶段摊开,告诉你每个阶段有哪些可选项、各自解决什么问题、什么时候不值得上,以及怎么用一小批用例验证改动到底有没有变好。

知识库搭起来能跑,但答案答偏、该召回的资料没召回到、上下文塞了一堆无关片段把模型带跑——这是多数团队做 RAG 的第二道坎。这篇不重讲原理,而是把常见的高级 RAG 技术按「预检索、检索、重排、生成」四个阶段摊开,告诉你每个阶段有哪些可选项、各自解决什么问题、什么时候不值得上,以及怎么用一小批固定用例验证改动到底有没有变好。

先给一句判断总纲:优化 RAG 不要四层一起动。先看失败样本长什么样,再决定改哪一层。资料里明明有却没捞出来,问题多半在预检索和检索;捞出来一堆但答偏,问题多半在重排和生成。一次只动一个环节,改完用同一份用例回测,才分得清是哪个改动起了作用。

预检索阶段:把资料和问题先收拾干净

这一层最容易被人跳过,但很多「检索不行」其实是资料没准备好。文档侧要做清洗、去重、去掉页眉页脚和目录噪声,切块按语义边界而不是按固定字数硬切;表格、扫描件、图片型文档单独走一条处理链路,否则向量化出来就是一堆没意义的碎片。查询侧则是把用户的口语化提问翻译成能命中资料库的说法。

查询改写
把「这玩意儿怎么退」改写成「退货流程 条件 时效」这类更贴近文档用词的说法
查询拆解
遇到「A 和 B 的差别以及各自适用场景」这种问题,拆成多个子查询分别检索再合并
多查询扩展
同一个意思生成几种不同表述各检索一遍,最后去重合并,提高覆盖率
语义切块
按段落、标题层级、条款边界切,保证一块讲完一件事,而不是一句话被拦腰截断
  • 失败样本集中在「资料里有但没召回」,优先改这一层;资料本身就没有,改检索纯属白费
  • 文档量小、问题又都很标准时,加查询改写只会拉长延迟,收益不明显
  • 改写后的查询要留痕,方便对比改前改后的召回差异
  • 表格和扫描件处理链路一旦单独建好,就别再混回普通切块流程

检索阶段:混着捞,别只靠一路召回

单靠向量检索,专有名词、编号、报错码这类东西经常捞不准;单靠关键词检索,同义改写和口语提问又接不住。常见做法是两路甚至多路召回并行,各自取一批候选,合并去重后再进下一步。召回数量先放大,给后面的重排留出可筛的空间,而不是一开始就把 top-k 卡得很死。

召回方式擅长处理容易漏掉什么情况下不值得再叠一路
向量检索语义相近、同义表述、口语提问精确编号、专有名词、罕见缩写资料本身措辞高度统一、问法也固定
关键词检索专有名词、编号、报错码、术语换一种说法就完全匹配不上用户提问几乎都用同一套词汇
结构化过滤时间、类别、部门、状态等字段需要理解语义的模糊提问字段本身混乱、没人维护、经常缺值
  • 分块粒度、嵌入模型、top-k 是这一层最常调的三个旋钮,一次只动一个
  • 改完务必用固定用例回测,别凭感觉觉得「好像准了一点」
  • 多路召回的合并策略要么按分数归一化,要么简单去重后靠重排兜底,别让某一路刷屏
  • 文档结构高度规整、字段可精确过滤时,结构化查询往往比向量召回更省事也更准

重排与生成阶段:把最相关的那几条塞进上下文

粗召回出来的几十条里,真正该进上下文的可能就几条,重排模型就是干这个的:把候选按相关性重新排一遍,决定最终递给模型的是哪几段。生成阶段重点不在模型多强,而在提示词约束够不够硬——要求只依据给定片段作答、给出引用出处、检索不到就明确说不知道。

  1. 先定上下文预算算清楚一次请求能塞多少字符,反推最多带几段,剩下的交给重排去砍
  2. 重排后再截断按重排分数取前几条,宁少勿滥,把低分的直接丢掉而不是凑数
  3. 提示词写死边界明确写「只依据以下片段回答」「找不到就回答不知道」「每条结论标出对应片段编号」
  4. 抽查引用是否真实随机抽生成结果,核对里面引用的片段是否真支持那句话,防止模型自己编来源
  • 上下文塞太多比塞太少更容易跑偏,无关片段会稀释模型注意力
  • 重排和生成是一对:重排没做好,提示词再严也救不回来
  • 问答对格式固定、答案就是原文抽取的场景,复杂生成约束可能不如直接返回片段来得稳

怎么验证改动有效:小用例集加固定对照

没有固定用例,所有优化都变成「感觉好像好了」。最低成本的做法是建一份几十条的小评测集,覆盖三类问题:该答对的、该说不知道的、需要综合多段的。每次改动都跑同一份,看命中率、答案是否贴原文、拒答是否合理这三个维度,而不是只盯着生成得像不像。

要看的指标怎么看变差时先怀疑什么
命中率该召回的片段有没有出现在候选里切块、查询改写、多路召回配置
答案贴合度回答是否能在给定片段里找到依据重排顺序、上下文是否被无关内容挤占
拒答合理性资料里没有时是否老实说不知道提示词约束、拒答阈值设置
  • 把每轮改动的配置记下来,方便回滚,也方便区分是数据变了还是模型换了导致的波动
  • 评测集要来自真实提问,别自己拍脑袋编,否则跑分好看线上没用
  • 线上抽样也要持续做,评测集只能防退化,不能替代真实分布
下一步想先把候选方案和成本摸清楚,再去定改造优先级,顺手把各家接口的当前数字核一遍。

常见问题

一定要把这些技术全上齐吗?

不用。多数团队的瓶颈集中在其中一两个阶段,先拿真实失败案例定位是「没召回」还是「召回错了」还是「生成跑偏」,再决定加哪一层,全上齐通常只是把延迟和成本堆上去。

预检索和重排哪个先做?

先看失败样本。资料里明明有却捞不出来,先做预检索的清洗、切块和查询改写;能捞出来但排得太靠后,才轮到重排。顺序搞反容易白花时间。

怎么知道优化真的有效?

固定一份几十条的用例集,覆盖答对、该拒答、多跳三类,每次改动跑同一份对比。只看几个示例答得漂不漂亮很容易误判,要同时看命中率和拒答是否合理。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。