RAG优化3 召回优化
目录
- 本文介绍一些提高向量召回效果的方法
短文本全局信息增强
- 目的是为切分后的短文本片段补充所属的长文本全局信息。
论文“DAPR:A Benchmark on Document-Aware Passage Retrieval“中全局信息有以下3种:
- 长文本前3句话。对于长文本来说,文本开头往往包含该段文本的主旨。
- 长文本标题。标题通常是对内容的概括。
- 长文本关键词。使用topicrank算法提取关键词。
- 可以利用llm为长文本提供主旨句,并拼接到短文本前。
召回内容上下文扩充
- 一般来讲,向量数据库召回的是短文本,直接召回长文本可能困难一点,但可以设计一些人工策略来扩充召回内容,打破“召回内容和输入LLM中的内容相等“
- Langchain使用ParentDocumentRetriever,传入两个文本分割器parent_splitter和child_splitter。前者用于确定输入到llm中的父文本块的大小,而后者用于确定从向量数据库中召回的子文本块的大小。同时,还会存储子文本块与父文本块之间的映射关系。
- 它通过维护切分后的短文本在全文中的位置关系,实现了在召回某个短文本后,将其前后各n个短文本也作为上下文输入LLM中的功能。
文本多向量表示
- 构建向量数据库时,使用多种向量来表示同一段文本通常是有益的。假设有一段文本A,我们不仅可以使用完整的A来生成向量,还可以使用其子集,总结句等生成“补充向量”。在RAG过程中,当我们召回任意“补充向量”对应的文本后,并不直接将其输入大模型中,而是将文本A的内容作为输入。这种做法解耦了召回的内容和输入LLM的内容之间相等的关系。可利用如下3种文本生成“补充向量”。
- 文本切块:将原始成本进一步切块后生成向量存入数据库中,可以在召回时增强对更细粒度语义的关注,本质上是之前介绍的“父文本检索”策略。
- 文档的摘要:可通过LLM的能力生成摘要。
- 假设性问题:可利用大模型能力,并根据文本提出问题。“用问题召回问题”比“用问题召回答案”更加容易。
查询内容优化
-
用户提出的问题口语化,语义模糊,无关内容过多等特点。与LLM相比,常用的向量化模型参数较少,理解能力有限。在对字向量进行压缩时,会有信息损失。因此,将模糊的问题向量化后召回的内容很可能与用户的真实意图不符合,从而影响RAG场景下LLM的最终回答效果。
-
所以可以先用LLM对用户的原始提问进行改写和扩充,然后再进行相关内容召回。
-
langchain提供了multiqueryretriever,可以将用户的原始问题从不同角度改写成其他多种不同的提问方式,然后针对这些提问方式的多个问题同时进行文本召回,然后将这些召回结果取并集,再输入LLM中进行处理。
HYDE (Hypothetical Document Embedding)
- 原理上:把根据问题找答案的非相似性检索转换为相似性检索。
- 用大模型根据用户问题生成K个假答案。
- 利用向量化模型,将生成的k的“假答案”和用户的问题转化为向量。
- 将问题向量和k个假答案向量取平均,当作最终的融合查询向量。
- 利用融合查询向量从向量数据库中召回相关的文本片段。
召回文本重排序
- 在向量召回的基础上,使用需要更多计算资源但效果也更好的重排序模型,丛召回的候选文本中精选出与用户查询最相关的少部分文本。多级排序,这种思路既能保证召回效率,又能提高召回精度。
- 最常见的重排序模型 基于Transformer编码器架构的交叉编码器。原理:将用户查询和一段候选文本同时输入模型,并预测它们之间的相关性分值。使用这种方法可以考虑用户查询和候选文本的上下文关系,因此具有更高精度。
- 除此之外,LLM也可以用来做召回文本的重排序。
多检索器融合
- 多模型集成。比如将稀疏检索器和稠密检索器相结合。稀疏检索器擅长根据关键词查找相关文本,而向量检索器则擅长根据语义信息查找相关成本,两者互补。
结合元数据召回
- 提前在存储文本向量时同时记录每个向量相关的标签,就可以在召回时先根据标签信息过滤出所需的向量子集。描述向量的标签也可以称之为metadata 元数据。