高级 RAG 技术

前置知识:检索增强 RAG

相比于朴素 RAG,高级 RAG 在预检索过程(Pre-Retrieval Process) 和 后检索过程(Post-Retrieval Process) 两个阶段引入了一些改进措施,提高检索质量

  • 预检索过程的重点是索引优化与查询优化;前者目的是提高被索引内容的质量,包括检索粒度、索引结构优化、元数据附加、对齐优化和混合检索等操作;后者目的是优化用户的原始问题表述,比如查询重写、查询转换和查询扩展等技术
  • 后检索过程的重点是相关上下文的有效整合;比如重排序,将最相关的信息排在考前的位置;或者上下文压缩,筛选和强调关键信息,压缩待处理上下文的长度

索引优化

检索粒度 Retrieval Granularity

  • 粗粒度检索单元可以提供更多与问题相关的信息,但可能包含冗余内容
  • 细粒度检索单元会增加检索负担,并且不能保证语义完整性和信息充分性
  • 检索单元粒度从细到粗一般包括词元(Token)、短语(Phrase)、句子(Sentence)、命题(Proposition)、文本块(Chunks)和文档(Document)
  • 检索粒度尽量保持原子性,每个单元应该封装一个相对简洁独立的事实片段
  • 检索粒度需要根据下游任务进行调整,例如在推荐任务中检索物品 ID 或句子对

分块策略 Chunking Strategy

  • 最常用的方法是将文档分割成固定数量的 token(例如 100、256、512)
  • 较大的 token 块上下文信息更多,但噪声也更多,处理时间长,成本高;较小的 token 块上下文信息可能不完整,但噪声更小
  • 分块策略会导致句子内部信息被截断,因此需要优化递归分割和滑动窗口方法,此外还需要额外合并检索信息,建立全局信息实现检索分层
  • Small2Big:短句(Small)作为检索单元,短句前后(Big)作为上下文提供给 LLM

元数据附加 Metadata Attachments

  • 数据块可以添加元数据,比如页码、文件名、作者、类别和时间戳
  • 元数据可以作为额外的过滤条件,感知信息的时效性,缩小检索范围
  • 元数据可以从原始文档中解析,也可以认为人为构建,比如增加段落摘要或引入假设性问题(基于 LLM 生成文档可以回答的假设性问题,并通过假设性问题与原始问题之间的相似度,对检索过程进行优化)

索引结构优化 Structural Index

  • 为文档建立层级结构的索引,是提高信息检索效率的有效方法
  • 层级结构索引:文件是父节点,数据块是子节点,每个节点都存储摘要信息
  • 知识图谱索引,为不同的概念和实体建立联系,提高知识检索的准确率,确保 LLM 的上下文一致性,改善整个 RAG 系统的效率,降低 LLM 出错的概率
  • KGP 是一种多文档知识图谱索引的构建方法;节点由文档段落或结构(比如页面或表格),节点之间的边则根据语义相似度来构建

查询优化

查询扩展 Query Expansion

  • 将单个查询扩展为多个查询可以丰富查询的内容,提高最终查询结果的相关性
  • 方法 1:利用 LLM+Prompt 直接生成多次查询,查询可以并行执行
  • 方法 2:对问题进行分析规划和拆解,生成必要的子问题来作为子查询
  • 方法 3:链式验证 Cove,用 LLM 根据初步回答制定验证问题来进行核实

查询转换 Query Transformation

  • 利用转换后的查询,替代用户的原始查询来检索数据块
  • 方法 1:引导 LLM 进行查询重写; 也有专门的小型语言模型(比如 RRR)来进行查询重写;淘宝利用 BEQUE 查询重写方法显著提高了长尾查询的召回率
  • 方法 2:利用 LLM+Prompt 根据原始查询生成后续的检索查询;HyDE 利用后退提示将原始查询,抽象为一个高层次的概念问题,其检索结果会作为上下文补充

查询路由 Query Routing

  • 根据不同的查询类型,将其路由到不同的 RAG 管道,适合多场景 RAG 系统
  • 路由方式 1:根据元数据进行关键字/实体的识别和过滤,缩小搜索范围
  • 路由方式 2:利用查询文本对应的语义信息进行路由;也可以结合元数据

上下文管理

重排序 Reranking

  • 对文档块进行重新排序,确保最相关的信息排在最前面
  • 基于规则的重排序:依赖预定义的指标,比如多样性、相关性和最大重新排序率(MRR)
  • 基于模型的重排序:比如 SpanBERT、Cohere rerank 或通用 LLM

上下文压缩 Context Selection/Compression

  • 避免冗余上下文信息对结果产生干扰,增强 LLM 对关键信息的感知
  • 方法 1:直接利用小型语言模型来检测和移除不重要的词元,实现快速压缩
  • 方法 2:根据“过滤-重排序(Filter-Reranker)”的方式,先引入额外的过滤器(比如小型语言模型)减少文档数量,在用 LLM 进行重排序;或者直接用 LLM 进行检索文档的评估和过滤

检索增强

迭代检索 Iterative Retrieval

  • 根据初始查询和已有结果,反复搜索知识库,进行结果的迭代优化;该方式能提高知识库的覆盖率,增强最终结果的稳定性,但可能存在无关信息积累等问题
  • 典型方法 ITER-RETGEN:实现“检索增强结果”和“结果增强检索”的协同

递归检索 Recursive Retrieval

  • 基于历史检索结果递归优化查询,主要目的是提高搜索结果的深度和相关性
  • 典型方法 IRCoT,利用1_study/DeepLearning/上下文工程/思维链 CoT 技术 来指导检索,并用检索结果优化 CoT
  • 典型方法 ToC,创建一个澄清树,系统地优化查询中的模糊部分,逐步明确用户需求;适合信息高度专业或细微的复杂搜索场景
  • 递归检索在特定场景下回结合多跳检索技术,来挖掘图结构数据的深层信息

自适应检索 Adaptive Retrieval

  • 让 LLM 主动确定最佳的检索时机和内容,从而改善 RAG 系统的效率和性能
  • 方法 1:借助 LLM 的主动判断能力,可以额外引入自我反思或少样本提示
  • 方法 2:基于强化学习框架,通过奖励设置来训练模型找到最佳的检索策略
  • 方法 3:实时监控文本生成结果的置信度,来自动控制检索时机,比如 Flare
  • 其他:引入反思预测、自然语言推理(NLO)模型、专家评分来规范模型行为

其他优化

  • 嵌入表示 Embeding,用于语义相关性的评估,对检索效果影响较大;对于检索文档与预训练语料差异比较大的场景(比如医疗/法律),微调 Embeding 能很好地缓解数据层面的领域差异;常用微调方法:LLM-Embedde、REPLUG
  • 混合检索,利用不同方式的相关性特征(比如稀疏向量和 embedding)进行互补,增强检索的性能;比如稀疏向量检索可以增强 Embeding 的零样本检索能力,而 Embeding 也能提高稀有实体的查询鲁棒性
  • 外部适配器 Adapter,用于特定功能的针对性强化;UPRISE 训练了额外的提示检索器用于领样本任务的提示检索;AAR 引入一个通用适配器来适应多个下游任务;PRCA 添加来一个奖励驱动适配器,来增强特定任务的性能

本文内容主要参考自一篇 RAG 综述论文

往年同期文章