大模型 RAG 二次重排序的重要性:为什么需要 rerank?

最近秋招发放Offer已高一段落。

不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。

最近,我们又陆续整理了很多大厂的面试题,帮助一些球友解惑答疑,分享技术面试中的那些弯弯绕绕。

喜欢本文记得收藏、关注、点赞。更多实战和面试交流,文末加入我们

技术交流

在这里插入图片描述


在两阶段检索系统中,第一阶段的嵌入模型负责从庞大的数据集中快速检索出一组与查询相关的候选文档。嵌入模型通过将文档和查询转换为向量表示,计算它们之间的相似度,进而筛选出可能相关的文档。由于嵌入模型能够将复杂的文本信息压缩成固定长度的向量,因此这一过程非常高效,尤其适用于处理大规模数据集。

然而,嵌入模型在压缩文本信息时会丢失部分上下文信息,导致它的准确率不如重新排序器。为了解决这一问题,在第二阶段,我们使用重新排序器对嵌入模型筛选出的候选文档进行精细排序。重新排序器通常基于更加复杂的深度神经网络模型,能够更好地理解文档与查询之间的上下文关联,从而提供更高的排序精度。

为什么要使用重新排序器?

既然嵌入模型已经能够提供初步筛选结果,为什么还需要额外的重新排序器呢?答案在于准确性。嵌入模型在转换文本时不可避免地会丢失信息,尤其是在面对复杂的查询和文档时,它无法完全捕捉到两者之间的微妙差异。这是因为嵌入模型必须将文档的所有可能含义压缩为一个向量,而这个向量只能表达某种通用的平均含义,无法针对特定的查询做出精准的响应。

相比之下,重新排序器可以避免这种信息丢失。重新排序器直接处理查询和文档的原始信息,可以更精细地分析文档内容如何与查询相关联,从而提供更准确的排序结果。由于重新排序器是在收到用户查询后运行的,因此它可以结合查询的上下文对文档进行更为精准的分析,而不是依赖于嵌入模型的平均化表示。

Reranker与embedding模型的区别

尽管Reranker和Embedding模型都用于信息检索系统,它们的定位和功能却是不同的。

Embedding模型主要用于初步筛选文档。它将文本转换为向量表示,并计算这些向量之间的相似度,从而筛选出一组可能相关的候选文档。Embedding模型的优势在于它的计算效率高,适合处理大规模数据集。

Reranker则用于对Embedding模型筛选出的候选文档进行精细排序。Reranker通常基于复杂的深度神经网络,能够更好地理解文本的上下文和细微差异,从而提供更高的排序精度。

简单来说,Embedding模型负责“找出一批可能相关的候选文档”,而Reranker负责“在这些候选文档中找出最相关的,并将它们按相关性排序”。

Reranker能否直接用于检索?

理论上,Reranker可以直接用于检索,但在实际应用中并不常见。这是因为Reranker的计算复杂度较高,直接使用它对整个数据集进行排序会导致极高的计算成本,难以满足实时性要求。因此,通常我们会先用Embedding模型进行初步筛选,将文档集合缩小到一个合理的范围,然后再使用Reranker进行精细排序。

代码示例:使用Reranker对候选文档重新排序

以下是一个简单的Reranker实现示例(基于阿里魔塔开源的gte),展示了如何使用模型对候选文档进行重新排序。

import torch
import torch.nn.functional as F
from modelscope import AutoModelForSequenceClassification, AutoTokenizer

# 初始化模型和分词器
model_name_or_path = "iic/gte_passage-ranking_multilingual-base"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForSequenceClassification.from_pretrained(model_name_or_path, trust_remote_code=True)
model.eval()

# 示例数据
query = "中国的首都在哪儿"
documents = [
    "中国的首都在哪",
    "北京。",
    "上海是中国的一个主要城市。"
]

def reranker(query, documents):
    with torch.no_grad():
        # 创建 (query, document) 对
        pairs = [[query, text] for text in documents]
        # 对输入对进行分词
        inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt', max_length=8192)
        # 通过模型计算得分
        scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
        
        # 将得分转换为百分比形式的概率
        probabilities = F.softmax(scores, dim=0) * 100
        
        # 将文档与其对应的概率结合
        ranked_results = list(zip(documents, probabilities.tolist()))
        
        # 根据概率降序排序结果
        ranked_results.sort(key=lambda x: x[1], reverse=True)
        return ranked_results

# 运行 Reranker 并输出排序结果
ranked_documents = reranker(query, documents)
print(ranked_documents)

这段代码中,我把结果输出为根据rerank计算的相似度百分比,3条数据大约运行了1.2s,花费时间还是比较久的,结果如下:

[('中国的首都在哪', 90.24225616455078), ('北京。', 6.394253730773926), ('上海是中国的一个主要城市。', 3.363481044769287)]

总结

结合Embedding模型和Reranker的优势,实现了效率和准确性的平衡。Embedding模型负责快速筛选候选文档,而Reranker则通过更细致的分析对这些文档进行精准排序,虽然其的计算开销较高,但它在提升排序准确性方面的作用不可忽视。

03-17
### 实现重排序Reranking)功能的关键要素 #### 1. Reranking 的定义与作用 重排序Reranking)是指在初步检索阶段获取候选集之后,通过更复杂的模型进一步优化这些候选项的顺序。这一过程通常发生在精排或最终排序阶段,目的是提升用户体验并提高系统的性能指标,如点击率 (CTR) 或相关性得分。 在搜索引擎或推荐系统中,Reranking 是一个重要的环节,它能够利用更多的上下文信息和高级特征来调整初始排序的结果[^1]。 --- #### 2. 常见的 Reranking 方法分类 根据不同的建模方式,Reranking 可分为以下几类: - **Pairwise 方法** Pairwise 方法的核心思想是比较两个文档之间的相对优劣关系,并基于这种比较构建学习目标函数。这种方法假设如果某个文档 \( d_i \) 对于查询 \( q \) 更加相关,则它的排名应该高于另一个文档 \( d_j \)[^2]。 - **Listwise 方法** Listwise 方法则更加关注整个列表的整体质量,而不是单独考虑每一对文档的关系。这类方法试图最小化预测排名列表与真实排名列表之间的差异。 - **Pointwise 方法** Pointwise 方法是最简单的一种形式,其中每个文档被独立打分,而不涉及与其他文档的对比操作。尽管其实现较为简便,但在某些场景下可能无法捕捉到全局最优解。 --- #### 3. 使用机器学习模型进行 Reranking 现代 Reranking 技术广泛依赖于深度学习框架下的各种神经网络结构。以下是几种主流的技术方案及其特点: - **BERT-based 模型** BERT 系列预训练语言模型因其强大的自然语言理解能力而成为当前最流行的解决方案之一。例如,在 reranker-base 和 reranker-large 版本中,分别实现了较高的 MRR@10 性能表现[^4]。具体来说,可以采用如下代码加载预训练权重: ```python from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("castorini/bge-reranker-base") model = AutoModelForSequenceClassification.from_pretrained("castorini/bge-reranker-base") ``` - **双塔模型** 这种架构由两部分组成——左侧负责处理用户输入(query),右侧用于编码待评估项(document)。两者经过嵌入层映射至同一向量空间后再计算相似度分数。由于其高效性和可扩展性强的特点,在工业界应用十分普遍。 - **交叉交互模型** 不同于双塔模式仅限于浅层次融合的方式,此类设计允许 query-doc pair 数据间存在深层次交互效应。典型代表有 Duet、KNRM 等变体版本。 --- #### 4. 谷歌的实际案例分析 关于实际应用场景中的实现细节,可以从谷歌的相关研究得到启发。虽然官方并未明确认定 CTR 或 dwell time 是否直接参与核心算法决策流程,但从间接证据来看,它们确实会对最终呈现效果产生影响[^3]。因此,在开发自己的 rerank 功能时,除了传统意义上的显式反馈外,还应充分重视隐式信号的价值挖掘工作。 --- ### 结论 综上所述,要成功部署一套高效的 rerank 子模块,需综合考量多方面因素,包括但不限于数据准备情况、算力资源分配状况以及业务需求优先级设定等方面的内容。只有这样才能确保产出既满足理论预期又能适应现实环境变化的理想成果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值