目录

RAG优化3 召回优化

  • 本文介绍一些提高向量召回效果的方法

短文本全局信息增强

  • 目的是为切分后的短文本片段补充所属的长文本全局信息。

论文“DAPR:A Benchmark on Document-Aware Passage Retrieval“中全局信息有以下3种:

  1. 长文本前3句话。对于长文本来说,文本开头往往包含该段文本的主旨。
  2. 长文本标题。标题通常是对内容的概括。
  3. 长文本关键词。使用topicrank算法提取关键词。
  • 可以利用llm为长文本提供主旨句,并拼接到短文本前。

召回内容上下文扩充

  • 一般来讲,向量数据库召回的是短文本,直接召回长文本可能困难一点,但可以设计一些人工策略来扩充召回内容,打破“召回内容和输入LLM中的内容相等“
  • Langchain使用ParentDocumentRetriever,传入两个文本分割器parent_splitter和child_splitter。前者用于确定输入到llm中的父文本块的大小,而后者用于确定从向量数据库中召回的子文本块的大小。同时,还会存储子文本块与父文本块之间的映射关系。
  • 它通过维护切分后的短文本在全文中的位置关系,实现了在召回某个短文本后,将其前后各n个短文本也作为上下文输入LLM中的功能。

文本多向量表示

  • 构建向量数据库时,使用多种向量来表示同一段文本通常是有益的。假设有一段文本A,我们不仅可以使用完整的A来生成向量,还可以使用其子集,总结句等生成“补充向量”。在RAG过程中,当我们召回任意“补充向量”对应的文本后,并不直接将其输入大模型中,而是将文本A的内容作为输入。这种做法解耦了召回的内容和输入LLM的内容之间相等的关系。可利用如下3种文本生成“补充向量”。
  1. 文本切块:将原始成本进一步切块后生成向量存入数据库中,可以在召回时增强对更细粒度语义的关注,本质上是之前介绍的“父文本检索”策略。
  2. 文档的摘要:可通过LLM的能力生成摘要。
  3. 假设性问题:可利用大模型能力,并根据文本提出问题。“用问题召回问题”比“用问题召回答案”更加容易。

查询内容优化

  • 用户提出的问题口语化,语义模糊,无关内容过多等特点。与LLM相比,常用的向量化模型参数较少,理解能力有限。在对字向量进行压缩时,会有信息损失。因此,将模糊的问题向量化后召回的内容很可能与用户的真实意图不符合,从而影响RAG场景下LLM的最终回答效果。

  • 所以可以先用LLM对用户的原始提问进行改写和扩充,然后再进行相关内容召回。

  • langchain提供了multiqueryretriever,可以将用户的原始问题从不同角度改写成其他多种不同的提问方式,然后针对这些提问方式的多个问题同时进行文本召回,然后将这些召回结果取并集,再输入LLM中进行处理。

HYDE (Hypothetical Document Embedding)
  • 原理上:把根据问题找答案的非相似性检索转换为相似性检索。
  1. 用大模型根据用户问题生成K个假答案。
  2. 利用向量化模型,将生成的k的“假答案”和用户的问题转化为向量。
  3. 将问题向量和k个假答案向量取平均,当作最终的融合查询向量。
  4. 利用融合查询向量从向量数据库中召回相关的文本片段。

召回文本重排序

  • 在向量召回的基础上,使用需要更多计算资源但效果也更好的重排序模型,丛召回的候选文本中精选出与用户查询最相关的少部分文本。多级排序,这种思路既能保证召回效率,又能提高召回精度。
  • 最常见的重排序模型 基于Transformer编码器架构的交叉编码器。原理:将用户查询和一段候选文本同时输入模型,并预测它们之间的相关性分值。使用这种方法可以考虑用户查询和候选文本的上下文关系,因此具有更高精度。
  • 除此之外,LLM也可以用来做召回文本的重排序。

多检索器融合

  • 多模型集成。比如将稀疏检索器和稠密检索器相结合。稀疏检索器擅长根据关键词查找相关文本,而向量检索器则擅长根据语义信息查找相关成本,两者互补。

结合元数据召回

  • 提前在存储文本向量时同时记录每个向量相关的标签,就可以在召回时先根据标签信息过滤出所需的向量子集。描述向量的标签也可以称之为metadata 元数据。