RAG优化方法整理

4 阅读17分钟

RAG,作为ai应用中的重要的一环,对于ai应用的效果起到重要的作用。尤其是内容型ai应用。

RAG的主要作用,或者说解决的问题,就是如何在ai应用中,给模型喂给正确的且合适的知识上下文;而模型的上下文是有限的,AI应用中遇到的场景却是无限的,天然就会有一个冲突:有限上下文与无限需求。

RAG优化最核心的关键在于两点:

  1. 如何良好的入库。 文档都是非结构化的,出库的用法,决定了入库的方法。
  2. 如何找到需要的文档片段。关键就是解决长文档的问题,因为模型的上下文不是无限长的。
  3. 如何把找到的文档,再精确的定位到最需要最适应问题的知识。

注意,最关键的是确定如何去使用知识。使用的方式,决定了分块、入库和取回的策略如何优化。

一、分块(或文档处理)策略优化

这块策略处于预处理文档,目标是将文档处理成更合适的结构。

传统上是直接用固定长度来进行切分,天然会有语义割裂的问题。

1. 语义分块

核心思路:按句子级嵌入相似度切分,而非固定字符数。当相邻句子语义相似度低于阈值时在此处切块,从而保留语义完整性。

其关键点是,找到整篇文档中的语义断点,让语义上相似的,也就是说是在说同一件事情。

实现方法

  • 文档按句子先处理好一个序列
  • 对每个句子计算嵌入向量,然后计算相邻句子的嵌入相似度
  • 根据相似度序列找“语义断点”——相似度突降处即为语义边界
  • 断点计算方法:百分位法(低于某百分位作为断点)、标准差法(低于均值-标准差的位置)、四分位距法(低于Q1-1.5*IQR作为断点)

优势:保留语义完整性,避免在语义不连贯处切分

局限:需要计算嵌入,阈值设置依赖调参


2. 切块大小评估

简单来说,事先评估一个合适的切块大小。

核心思路:对多种切块大小(如128、256、512字符)分别做检索与生成,用忠实度(回复是否紧扣上下文)和相关性(是否答到点上)等指标对比,数据驱动选出最优切块参数。

实现方法

  • 按不同大小切块并建索引
  • 对每种大小执行检索-生成流程
  • 用评估指标对比,选出最优chunk size

优势:避免拍脑袋定参数,有评估依据,适合新语料或新场景调参

局限:需要标注或可自动评估的测试集,评估有计算成本。

我认为这种方法最大的局限性在于文档是多变的,即便是同一个文档,使用同样的切块大小可能也是有问题的。因此我认为这个方法的可用性很有限。


3. 命题分块

这是我认为最合理也是最有效的分块方法之一,并且可以在这个分块的思路上延申出其他更加符合场景的方法。

一份文档应该包含多个命题及观点,抽取这些观点来作为检索的原子,语义上独立且完整。这种方法,等同于将文档解析成知识点。

核心思路:不按字符或句子切块,而是把文本拆成原子化、自包含的“命题”(一句一事实,可独立理解)。用命题来做检索单元。

实现方法

  • 先实施基本的分块,或者按语义切分的分块,这样就不必一次让llm处理太多
  • 用LLM将文本块拆成多条原子命题,这里要注意具体需要抽取的内容,例如可以是事实、数据等等,可以根据
  • 每条命题表达单一事实、自包含、可独立理解
  • 以命题为单元建索引与检索,也可以将多条命题整合一起存

优势:检索粒度细,适合事实型、实体型问题;命题可复用、可组合

局限:建库需对每块做命题抽取,成本高;命题过多时索引与检索开销增大


二、处理优化(入库优化)

将文本分块儿以后,如何入库、哪些入库,也是提升rag效果的关键一环。合理的入库可以提供足够的信息来让检索召回率更高。

简单来说,这一步决定到底存哪些、怎么存。

4. 摘要提取

提供额外的摘要信息。摘要提供的信息密度可以更高。

一般来说在做召回时,问题的长度也不会太长,因此这样的方式可以显著提高相似度。同时,也可以提供多种的摘要,支持更多的检索重写策略。

核心思路:用LLM为每个文本块生成简短描述性摘要,建索引时同时存「块文本嵌入」和「摘要嵌入」。检索时用查询分别与文本、标题算相似度。

实现方法

  • 合理分块后为每块生成一句摘要
  • 同时嵌入块文本和摘要
  • 检索时综合文本相似度和标题相似度排序

优势:标题浓缩主题,对概括性、概念型查询更友好;可与现有向量检索无缝结合

局限:预处理阶段要为每块调用LLM生成标题,成本和存储增加


5. 文档增强RAG(问题生成)

核心思路:为每个文本块用LLM生成若干“该块能回答的问题”,把「问题+对应块」一并写入向量库。用户查询时,既匹配块内容,也匹配这些预生成问题。

实现方法

  • 为每块生成多条能回答的问题
  • 问题与块一起入向量库
  • 检索时query可匹配问题或块

优势:显著缓解query(问句)与document(陈述)之间的表述差异,提高召回

局限:建库时每块要生成多条问题,成本和存储都增加;问题质量依赖模型与prompt


三、查询词优化

这部分主要是在查询阶段,对问题进行处理,优化查询得到的效果。

6. 查询转换和重写

这是一种很常见且能够大幅提升效果的方法。核心痛点在于,需要的问题与真正需要的文档在语义和内容上并不是直接匹配的,使用向量和关键字都比较难准确检索。

对问题进行转换往往是一种合理且必须的手法。

例如:用户问“今天的天气如何?”,语义相似度可能只能检索到“今天的天气晴朗”等描述性结果,而关键字检索则只能检索到“今天的天气真差”等与问题关键字直接相关的结果。

但真实需要的答案,则是这个问题的反面:今天的天气的具体数据。转换后,则可能变为:2025xx日天气信息。这样便能直接与数据库中的信息匹配上。

核心思路:在检索前对用户原始查询做变换,使检索更准或更全。可以使用llm或者专用的小型模型来做都可以。

实现方法(三种策略):

  • 查询重写:把模糊、口语化查询改写成更具体、更贴近文档表述的形式
  • 回退提示(Step-back) :生成一个更宽泛的“背景问题”,先检索背景再结合原问题一起查询
  • 子查询分解:把多子问题的复杂查询拆成2~4个简单子查询,分别检索再合并

优势:不改索引即可提升检索表现,尤其适合表述不规范或复杂的用户问句

局限:多一次(或多次)LLM调用,延迟与成本增加;重写/分解质量依赖prompt


7. 假设文档嵌入(HyDE)

这个方案也着力在问题与真实答案的差距上。

通过借用llm的能力,去生成一个可能答案,再用这个答案去用相似度查询数据库。这样一来,查询与真实需要的文档之间的相似度差异就大幅降低。

核心思路:用户查询往往很短,与长文档在嵌入空间里距离较远。HyDE先用LLM根据问题生成一段“假设的”答案文档(风格、长度接近真实文档),再用这段假设文档的嵌入(而非原始query的嵌入)去检索真实文档。

实现方法

  • 根据query生成假设答案文档
  • 用假设文档的嵌入去检索
  • 用真实检索结果生成最终答案

优势:能把短/抽象问句补成伪文档,大幅提升检索相关性;不用重建索引

局限:多一次LLM生成与嵌入调用;假设文档若偏离真实风格,可能引入噪声

四、检索策略

这部分发力在检索时通过不同的方法去将准确且需要的块检索出来。

传统方法,主要是通过向量相似度进行检索。但实操下来,所谓的语义相似度局限性相当大,关键问题在于:所谓的语义相似,其实只是程序上的语义相似,跟我们常人在实际场景上理解的相似度,并不是一回事。

这部分处在如何操作数据库的这部分,即,如何处理得到的结果。

8. 上下文增强检索

这个方法相对简单粗爆,效果也不错。简单来说,就是单个文本块可能被截断,那在取的时候,就把前后一起带出来就行。

核心思路:检索到最相关的块后,同时带上其前、后相邻块一起作为上下文,避免“孤岛片段”缺少前文/后文而导致理解不全。

实现方法

  • 先按相似度找到top-k块
  • 对每个块扩展其前后若干块并拼接
  • 返回的是“中心块+前后文”的连续窗口

优势:实现简单,无需改索引;能明显改善需要前后文才能理解的内容

局限:会引入与问题无关的相邻块,可能增加噪声和token消耗


9. 融合检索(多路召回)

这个方案也很粗爆,但业内很多人的标准,但是实践效果我觉得很差。原因在于,实际的词匹配跟向量匹配根本就不是一回事,方案都不同。即便对结果使用加权组合,那也是白搭。

对于词检索,明显是需要重写的。

核心思路:向量检索(语义相似)与BM25(词匹配)同时做,对两路分数分别归一化后按alpha加权融合。。

实现方法

  • 向量检索:语义相似度匹配
  • BM25检索:关键词精确匹配
  • 两路分数Min-Max归一化
  • 按权重融合:final_score = α × norm_vector + (1-α) × norm_bm25

优势:语义与关键词互补,召回更全面稳定

局限:需要维护两套索引,调参(α值)需评估


10. 图检索(graph RAG)

这个方案适用于构建好知识图谱,且查询相关的场景适且于实体和关系的事实的。

其结果本质是,将相关实体周边的有关系的实体全抽取出来给出上下文。

核心思路:从每个文本块中抽取概念/实体,以块为节点、以共享概念+语义相似度为边权建知识图谱。检索时先命中部分节点,再通过图上的边扩展关联节点,从而把跨多块的相关信息一并拉取。

实现方法

  • 为每个chunk抽取概念/实体建节点
  • 根据共享概念与嵌入相似度建边
  • 检索时可沿边扩展关联块

优势:能利用“概念共现”“实体关系”做关联扩展,适合概念密集、关系复杂的领域

局限:建图与概念抽取成本高;图规模大时遍历与索引设计更复杂


11. 分层检索

这个方案适且于检索的范围较大情况,是一种优化手段。但实际效果,也取决于搜索优化和分块时的分层构建。

核心思路:建两层索引——摘要层(如每页/每章一个摘要)和详细层(页内细粒度块)。检索时先查摘要层锁定相关范围,再只在对应页内查详细块。

实现方法

  • 第一层:页/章摘要向量库
  • 第二层:页内详细块向量库
  • 先搜摘要定范围,再在范围内搜块

优势:适合超长文档、十亿级规模;先筛范围再精查,延迟与算力更可控

局限:摘要质量与粒度影响第一层召回;相关分布在多页时需合理设置参数


12. 多模态检索RAG

核心思路:从PDF等文档中同时提取文本与图像,用视觉模型为每张图生成文本描述(caption),将「正文+图像描述」统一嵌入并写入同一向量库,实现“以文搜文+以文搜图”的联合检索。

实现方法

  • 按页从PDF抽取文本块和图像
  • 用多模态模型为图像生成文字描述
  • 文本+caption一起入向量库统一检索

优势:突破纯文本限制,支持图文混合检索

局限:依赖视觉模型能力,图像描述质量影响检索效果


五、检索结果优化

13. 上下文压缩

针对上下文作处理,其本质仍然是从获得的文本块儿中去抽取真实有效的信息。 其实跟在入库前处理是同样的道理。但这种后处理方式会增加延迟,只能是对于没有进行前置处理信息的弥补措施。

核心思路:检索得到多块文本后,不直接全部塞给LLM,而是先对每块做“压缩”:只保留与当前查询强相关的内容,去掉无关句子或整段。

实现方法(三种策略):

  • 选择(Selective) :从原文中筛选与查询相关的句子,保持原句、原序:一般来说可以选择某种颗粒,例如句子,段落。然后用向量来快速滤出强相关句子。这种方式最适合需要强引用的场景,例如法律。
  • 摘要(Summary) :针对查询写一段只含相关信息的摘要
  • 抽取(Extraction) :按查询抽取关键事实或结构化信息

优势:显著减少无关上下文,降低幻觉与token消耗;可与任意检索方式组合

局限:每块都要过一次LLM,延迟与成本增加;过度压缩可能丢细节

14. 重排序(Reranking)

重排序是一种很有效的提升rag质量的技术,可以从候选结果中找到尽可能与问题相关的内容。其依赖于重排模型,这是一种类似大模型但更轻量的技术。

重排序模型一般是cross-encoder,这种模型的训练简单来说,是把两段文本同时输入,来判别相关性。这与单纯使用向量来计算相似度是不一样的。

核心思路:两阶段检索——先用向量(或BM25)快速召回一批候选文档,再用更精细的模型对「查询-文档」对打分并重排,只保留最相关的若干条送入生成。

实现方法

  • 第一阶段:向量/BM25粗检索,得候选列表
  • 第二阶段:用LLM或专用reranker对「查询-文档」打相关性分
  • 按分数重排,取top-k

优势:在不扩大首阶段召回量的前提下显著提升top-k精度

局限:第二阶段要对每条候选调用模型,延迟和成本随候选数增加


15. 相关段落提取(RSE)

核心思路:不为单块打分后简单取top-k,而是为连续块序列算“价值和”:每块价值=相似度-惩罚项,再用最大子数组(Kadane)思想找价值和最大的连续段落。返回的是一整段连贯文本,而不是零散块。

实现方法

  • 把相似度转为价值:相关块为正,不相关块减去惩罚后为负
  • 用Kadane算法找连续最大和区间
  • 根据区间把对应块拼成完整段落

优势:上下文连贯、边界更自然,适合需要“一整段话”才能答好的问题

局限:依赖块顺序与相似度曲线质量;实现和调参略复杂


六、系统级优化

16. 反馈回路RAG

这个方案适用于场景多且大,并且每次给出的文档会类似的情况。

主要是通过历史的回答和评分,对文档给出一些分数。

核心思路:把用户对回复的评分/反馈纳入闭环:记录「查询–回复–评分」,判断历史问答对与场景是否相关,根据历史问答对的评分来动态调整文档相关性得分。

实现方法

  • 反馈收集:记录用户评分/点赞/纠错
  • 对于新问题,匹配历史场景,获取当时场景下的评分数据
  • 相关性调整:按历史反馈修正检索分数

优势:可持续利用真实用户信号,使系统越用越准

局限:依赖高质量、足量反馈;反馈噪声或冷启动会影响调整效果


17. 自适应检索

这个其实就是路由器模式。

核心思路:先对用户查询做类型分类(事实型、分析型、观点型、情境型),再根据类型选用不同检索策略,实现“因问施策”。

实现方法

  • 用LLM将查询归为四类之一

  • 按分类结果调用对应检索策略:

    • 事实型 → 偏精确匹配
    • 分析型 → 多召回再压缩
    • 观点型/情境型 → 各自对应策略

优势:同一套系统可兼顾多类问题,检索更有的放矢

局限:分类与各策略设计依赖领域知识;分类错误会传导到检索


18. Self-RAG

与deep research或者ReAct模式相同。本质是借用llm能力来对材料的完备性进行检查。

核心思路:在「检索→生成」全流程中插入多个反思与决策点:是否要检索、检索到的文档是否相关、生成的回复是否被上下文支撑、回复是否实用等。

实现方法(六个关键组件):

  • 检索决策:判断是否需要检索
  • 文档检索:需要时做向量检索
  • 相关性评估:评估文档与查询是否相关
  • 回复生成:基于相关上下文生成
  • 支持评估:评估回复是否被上下文充分支持
  • 效用评估:对回复的整体实用性打分

优势:可减少无谓检索与幻觉,输出更可控、可解释

局限:多次LLM调用,延迟与成本高;依赖各环节prompt设计


19. 强化学习增强RAG

这个方案会比较复杂,实际是借用强化学习的理念来设计rag策略。

核心思路:把RAG流程看成强化学习:状态(当前query、已选上下文、历史回复与奖励)、动作(重写query、扩展/过滤上下文、生成回复)、奖励(如生成回复与标准答案的语义相似度)。用策略网络根据状态选动作,用奖励迭代优化。

实现方法

  • 状态建模:query、已选上下文、历史回复与奖励
  • 动作空间:rewrite_query、expand_context、filter_context、generate_response
  • 奖励函数:回复与标准答案的嵌入余弦相似度
  • 策略网络:epsilon-greedy选择动作

优势:可端到端利用标注或用户反馈优化整条管道;理论上能学到复杂策略

局限:需要奖励信号、训练循环与稳定性调参