目录
1. 核心概念:什么是重排序?
2. Cross-Encoder 模型:重排序的利器
2.1 整体架构
2.2 输入表示层 (Input Representation)
2.3 Transformer 编码器层
2.4 输出层与目标函数
1.[CLS] 标记的特殊作用
2.分类/回归头
2.5 与双塔模型的对比
3. 训练方式与损失函数
4. BGE-Reranker 介绍
5. 实践步骤:如何在RAG中集成重排序
6. 优势与考量
总结
1. 核心概念:什么是重排序?
在典型的“检索-生成”两阶段流程中:
- 召回(Retrieval):使用快速的向量检索模型(如
BGE-Embedding, 双塔模型)从海量文档库中初步筛选出Top-K(例如100个)最相关的候选文档。 - 重排序(Reranking):使用一个更强大但更耗时的模型,对召回阶段得到的Top-K个候选文档进行精细化评分和重新排序,筛选出最相关的Top-N(例如3-5个)文档,再交给大模型生成最终答案。
为什么需要重排序?
- 向量检索的局限性:第一阶段的向量检索(双塔模型)追求速度,文档和查询被分别编码为向量,通过向量相似度(如余弦相似度)快速匹配。这种“独立编码”方式无法捕捉查询和文档之间深层次的、细粒度的语义交互,可能导致排序不够精准。
- 精度提升:重排序模型(通常是Cross-Encoder)虽然慢,但它能对“查询-文档”对进行深度交互和联合编码,更准确地判断两者的相关性,从而将真正最相关的文档排到最前面,提升最终答案的质量和减少大模型的幻觉。
2. Cross-Encoder 模型:重排序的利器
Cross-Encoder是实现精排的核心架构。
2.1 整体架构
它将查询(Query)和文档(Document)拼接成一个完整的序列,输入到Transformer编码器(如BERT、RoBERTa)中。 模型通过自注意力机制,让查询和文档的每一个词元(Token)进行充分的、双向的交互,从而理解它们之间复杂的语义关系。
输入: [CLS] Query [SEP] Document [SEP] ↓ 嵌入层 (Embedding Layer) ↓ Transformer 编码器堆叠 (12-24层,BERT/RoBERTa等) ↓ [CLS] 标记的隐藏状态 ↓ 分类/回归头 (Head) ↓ 输出: 相关性分数2.2 输入表示层 (Input Representation)
(1)序列构建
格式:[CLS] 用户查询 [SEP] 候选文档文本 [SEP]
例如:[CLS] 机器学习是什么 [SEP] 机器学习是人工智能的一个分支... [SEP]
(2)三重嵌入组合(同bert)
# 伪代码表示 final_embedding = token_embedding + segment_embedding + position_embedding2.3 Transformer 编码器层
Cross-Encoder 使用标准的 Transformer 编码器堆叠,通常为12或24层。
https://blog.csdn.net/qq_54708219/article/details/148997862?spm=1011.2415.3001.5331https://blog.csdn.net/qq_54708219/article/details/148997862?spm=1011.2415.3001.5331https://blog.csdn.net/qq_54708219/article/details/157139026
https://blog.csdn.net/qq_54708219/article/details/157139026
2.4 输出层与目标函数
1.[CLS] 标记的特殊作用
- 序列的第一个 token
[CLS]的最终隐藏状态作为整个序列的聚合表示 - 经过 Transformer 的多层处理,
[CLS]编码了查询和文档交互的全局信息
2.分类/回归头
h_[CLS] = 最后一层Transformer的[CLS]隐藏状态 (维度: 768) 分数 = W·h_[CLS] + b # 线性变换不同任务形式:
- 二分类:
sigmoid(分数)→ 相关概率 - 回归:直接使用分数或经过缩放
- 多级分类:
softmax(W·h_[CLS] + b)→ 多个相关性等级
2.5 与双塔模型的对比
特性 | 双塔模型(Bi-Encoder) | 交叉编码器(Cross-Encoder) |
编码方式 | 查询和文档分别独立编码为向量。 | 查询和文档拼接后联合编码。 |
速度 | 极快。适合从百万级文档库中快速召回。 | 很慢。需要对每个查询-文档对单独计算,适合对少量候选做精排。 |
精度 | 相对较低,损失了细粒度交互信息。 | 非常高。能捕获深层次的语义相关性。 |
典型应用 | 大规模召回/检索阶段。 | 小规模(如Top-100)重排序阶段。 |
3. 训练方式与损失函数
重排序模型通常使用以下两种范式进行训练:
- 点式学习(Pointwise):
- 将重排序视为一个回归或分类任务。
- 输入一个
(Query, Document)对,模型直接输出一个相关性分数(如0-1之间),或者预测一个相关等级(如“不相关/相关/高度相关”)。 - 损失函数: 均方误差损失(MSE):
交叉熵损失(Cross-Entropy): - 优点:简单直接。
- 列表式学习(Listwise):
- 更接近实际应用场景。模型一次性看到针对同一个查询的一组候选文档,学习如何为它们进行相对排序。
- 常用损失函数:
- RankNet/ListNet:
学习文档对之间的偏序关系:
s_i = model(query, doc_i) # 更相关的文档
s_j = model(query, doc_j) # 较不相关的文档
i 比 j 更相关的概率: - 对比学习损失(如InfoNCE):
对于一个查询,有一个正样本和多个负样本
拉大正样本(相关文档)和负样本(不相关文档)得分的差距:
正样本:s_pos = model(query, doc_pos)
负样本:s_negs = [model(query, doc_neg) for doc_neg in neg_docs]
总损失:
- RankNet/ListNet:
- 优点:能学习到更好的全局排序能力,效果通常优于点式学习。
BGE-Reranker等先进模型通常采用列表式对比学习进行训练,使用难负例挖掘技术,使其在区分高度相似的文档方面表现优异。
4. BGE-Reranker 介绍
BGE-Reranker是智源研究院推出的开源重排序模型系列,是基于Cross-Encoder架构、专为中文和英文优化的大规模预训练重排模型。
- 特点:
- 强大性能:在MTEB中文重排榜等多个权威评测中名列前茅。
- 多尺寸:提供
BAAI/bge-reranker-base,BAAI/bge-reranker-large,BAAI/bge-reranker-v2-m3等多种尺寸,满足不同精度和速度需求。 - 易用性:与Transformers库和FlagEmbedding库无缝集成,几行代码即可调用。
- 多语言:在中文和英文上均表现优异。
5. 实践步骤:如何在RAG中集成重排序
以下是典型的集成步骤:
# 伪代码示例 from transformers import AutoModelForSequenceClassification, AutoTokenizer import torch # 1. 召回阶段 query = "如何学习机器学习?" retrieved_docs = vector_store.similarity_search(query, k=100) # 使用向量库召回Top-100 # 2. 加载重排序模型 model_name = "BAAI/bge-reranker-large" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name) model.eval() # 3. 对召回结果进行重排序 pairs = [[query, doc.page_content] for doc in retrieved_docs] # 构建(Query, Doc)对 with torch.no_grad(): inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt', max_length=512) scores = model(**inputs, return_dict=True).logits.view(-1, ).float() # 获取相关性分数 # 4. 根据新分数重新排序 reranked_indices = scores.argsort(descending=True) # 按分数降序排列 final_top_k_docs = [retrieved_docs[i] for i in reranked_indices[:5]] # 选取新的Top-5 # 5. 将精排后的文档输入给LLM生成答案 context = "\n".join([doc.page_content for doc in final_top_k_docs]) prompt = f"基于以下上下文:\n{context}\n\n请回答:{query}" final_answer = llm.generate(prompt)6. 优势与考量
优势:
- 显著提升相关性:能将最相关文档的排名大幅提升,是提升RAG答案质量性价比最高的手段之一。
- 降低大模型负担和幻觉:给大模型更精准的上下文,减少其胡言乱语或依赖错误信息的可能。
- 模块化设计:与召回和生成阶段解耦,可以独立优化和升级重排序模型。
考量与挑战:
- 计算开销:Cross-Encoder需要对每个
(Query, Doc)对进行前向计算,当k较大时(如100),会显著增加延迟。需要在精度和速度间权衡。 - 上下文长度限制:Transformer有最大长度限制(如512),长文档可能需要截断或分块处理,可能损失信息。
- 训练数据:高质量的
(Query, Relevant Doc, Irrelevant Doc)三元组数据对模型效果至关重要。
总结
引入Cross-Encoder 模型进行重排序,是构建高性能RAG系统的关键优化步骤。它通过查询和文档的深度语义交互,弥补了快速向量检索在精度上的不足,像一道“质检关卡”,确保最终输入给大模型的上下文是最相关、最可靠的。BGE-Reranker等优秀开源模型的出现,使得这一技术变得触手可及,能有效提升问答系统、搜索引擎等应用的核心体验。