RAG,作为ai应用中的重要的一环,对于ai应用的效果起到重要的作用。尤其是内容型ai应用。
RAG的主要作用,或者说解决的问题,就是如何在ai应用中,给模型喂给正确的且合适的知识上下文;而模型的上下文是有限的,AI应用中遇到的场景却是无限的,天然就会有一个冲突:有限上下文与无限需求。
RAG优化最核心的关键在于两点:
- 如何良好的入库。 文档都是非结构化的,出库的用法,决定了入库的方法。
- 如何找到需要的文档片段。关键就是解决长文档的问题,因为模型的上下文不是无限长的。
- 如何把找到的文档,再精确的定位到最需要最适应问题的知识。
注意,最关键的是确定如何去使用知识。使用的方式,决定了分块、入库和取回的策略如何优化。
一、分块(或文档处理)策略优化
这块策略处于预处理文档,目标是将文档处理成更合适的结构。
传统上是直接用固定长度来进行切分,天然会有语义割裂的问题。
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选择动作
优势:可端到端利用标注或用户反馈优化整条管道;理论上能学到复杂策略
局限:需要奖励信号、训练循环与稳定性调参