从《红楼梦》的视角看大模型知识库 RAG 服务的 Rerank 调优

背景介绍

在之前的文章 有道 QAnything 源码解读 中介绍了有道 RAG 的一个主要亮点在于对 Rerank 机制的重视。

从目前来看,Rerank 确实逐渐成为 RAG 的一个重要模块,在这篇文章中就希望能讲清楚为什么 RAG 服务需要 Rerank 机制,以及如何选择最合适的 Rerank 模型。最终以完整的《红楼梦》知识库进行实践。

至于为什么要用红楼梦,答案就是作为读了很多遍《红楼梦》的忠实粉丝,问题的答案是不是靠谱一眼就能判断,问题相关的片段也能快速定位,就像定位 bug 一样快。

Rerank 是什么

以有道 QAnything 的架构来看 Rerank 在 RAG 服务中所处的环节
在这里插入图片描述
可以看到有道 QAnything 中的 Rerank 被称为为 2nd Retrieval, 主要作用是将向量检索的内容进行重新排序,将更精准的文章排序在前面。通过向大模型提供更精准的文档,从而提升 RAG 的效果。

在目前的 2 阶段检索(Embedding + Rerank)设计下,Embedding 模型只需要保证召回率,从海量的文档中获取到备选文档列表,不需要保证顺序的绝对准确。而 Rerank 模型负责对少量的备选文档列表的顺序进行精调,优中选优确定最终传递给大模型的文档。

打个简单的比方,目前的 Embedding 检索类似学校教育筛选中的实验班,从大量的学生中捞出有潜质的优秀学生进行培养。而 Rerank 则从实验班中对学生进一步精细排序,选出少数能上清北的重点培养。

为什么不能一步到位

Embedding 检索时会获得问题与文本之间的相似分,以往的 RAG 服务直接基于相似分进行排序,但是事实上向量检索的相似分是不够准确的。

原因是 Embedding 过程是将文档的所有可能含义压缩到一个向量中,方便使用向量进行检索。但是文本压缩为向量必然会损失信息,从而导致最终 Embedding 检索的相似分不够准确。参考 Pipecone 对应的图示如下所示:

在这里插入图片描述

可以看到 Embedding 过程包含两步:

  1. 运行单个 Transformer 计算以创建查询向量。
  2. 将查询向量与具有余弦相似性的文档向量进行比较,获取相似文档。

而 Rerank 阶段不会向量化,而是将查询与匹配的单个文档 1 对 1 的计算相似分,没有向量化带来的信息损失,必然会得到更好的效果,对应的过程如下所示:

### 部署 Hugging Face bge-reranker-v2-m3 模型 为了成功部署 Hugging Face 的 `bge-reranker-v2-m3` 模型,可以遵循以下指南: #### 准备环境 确保安装了 Python 和 pip 工具。接着,在命令行工具中执行如下操作来创建并激活虚拟环境(推荐做法),这有助于管理依赖项。 ```bash python -m venv my_env source my_env/bin/activate # Linux 或 macOS 用户 my_env\Scripts\activate # Windows 用户 ``` #### 安装必要的库 通过 pip 来安装 Transformers 库和其他可能需要的包,比如 Torch 或 TensorFlow,具体取决于所选框架版本。 ```bash pip install transformers torch datasets ``` #### 加载模型 利用 Hugging Face 提供的 API 接口加载指定名称的空间中的预训练模型实例。对于 `bge-reranker-v2-m3` 而言,首次用将会自动从远程服务器下载对应的权重文件至本地缓存目录[^2]。 ```python from transformers import AutoModelForSequenceClassification, AutoTokenizer model_name = "BAAI/bge-reranker-v2-m3" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name) ``` #### 使用模型进行预测 定义一个简单的函数来进行输入处理和输出解析,以便能够方便地测试该重排序器的效果。 ```python def rerank(query, documents): inputs = tokenizer([query]*len(documents), documents, return_tensors="pt", padding=True, truncation=True) outputs = model(**inputs).logits.detach().numpy() scores = list(zip(outputs.flatten(), documents)) sorted_scores = sorted(scores, key=lambda x: x[0], reverse=True) for score, doc in sorted_scores[:5]: print(f"Score {score:.4f}: {doc}") # 测试例子 test_query = "example query text here." docs_to_rerank = ["document one content.", "another document's contents."] rerank(test_query, docs_to_rerank) ``` 上述代码片段展示了如何初始化模型以及编写基本的查询文档重排逻辑。实际应用时可根据需求整参数设置或集成到更大规模的应用程序当中[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易迟

高质量内容创作不易,支持下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值