背景与问题

与检索前处理相对应,这是在完成检索后对检索出的相关知识块做必要补充处理的阶段。

比如,对检索的结果借助更专业的排序模型与算法进行重排序或老过速掉一些不符合条件的知识块等,使得最需要、最合规的知识块处于上文的最前端,这有助于提高大模型的输出质量。

  • 重排序 排序模型
  • Rag-fusion 算法
  • 上下文压缩过滤

重排序模型

利用排序模型对检索出的文档进行排序,做相关性排序。

from langchain_core.documents import Document

from models import get_ali_rerank
# 初始化阿里重排序模型
reranker = get_ali_rerank()
# 示例1:直接对字符串列表进行重排序
query = "孕妇感冒了怎么办"
#  待排序的文档列表(字符串格式)
documents = [
    "感冒应该吃999感冒灵",
    "高血压患者感冒了吃什么",
    "感冒了可以吃感康,但是孕妇禁用"
]
# 使用重排序模型计算文档与查询的相关性得分
# 返回:每个文档的得分列表(数值越高表示相关性越强)
# rerank--一种处理模式,特点:轻量级快速评分
scores = reranker.rerank(documents,query)
print(scores)
# 示例2:处理包含元数据的Document对象
documents = [
    Document(
        page_content="感冒应该吃999感冒灵",
        metadata={"source": "999感冒灵"},
    ),
    Document(
        page_content="高血压患者感冒了吃什么",
        metadata={"source": "高血压患者"},
    ),
    Document(
        page_content="感冒了可以吃感康,但是孕妇禁用",
        metadata={"source": "感康"},
    ),
]
# 返回:按相关性降序排列的新文档列表
# 输出:按相关性排序的新文档列表 特点:保留原始文档结构和元数据
scores = reranker.compress_documents(documents, query)
print(scores)

Rag-fusion 算法

RAG-Fusion 是一种搜索方法,通过使用多重查询生成和互惠排名融合(Reciprocal Rank Fusion)对搜索结果进行重新排序。在Multi Query的基础上,对其检索结果进行重新排序(即reranking)后输出Top-K个最相关文档,最后将这top-k个文档喂给LLM并生成最终的答案

问题-检索-获取结果-给结果得分-排序-获取前top-k

上下文压缩过滤

核心目的都是为了过滤掉检索出来的一些不相干的文档,精简输出给LLM的上下文。
实现思路:
使用某些基本的检索器检索不同的信息(如设置阈值) 使用压缩器/上下文过滤器(如langchain)

可能的问题:

  • 增加运行时间
  • 可能会丢失一些重要信息

部分langchain API:

  • CharacterTextSplitter 分块
  • EmbeddingsRedundantFilter 去重
  • EmbeddingsFilter 过滤
  • DocumentCompressorPipeline 创建文档压缩管道:先分割文档,然后过滤冗余文档,最后根据查询相关性过滤文档

参考