news 2026/4/18 11:15:19

3.2 重排序 (Reranker)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3.2 重排序 (Reranker)

目录

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. 核心概念:什么是重排序?

在典型的“检索-生成”两阶段流程中:

  1. 召回(Retrieval):使用快速的向量检索模型(如BGE-Embedding, 双塔模型)从海量文档库中初步筛选出Top-K(例如100个)最相关的候选文档。
  2. 重排序(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_embedding

2.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/157139026https://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. 训练方式与损失函数

重排序模型通常使用以下两种范式进行训练:

  1. 点式学习(Pointwise)
    • 将重排序视为一个回归或分类任务。
    • 输入一个(Query, Document)对,模型直接输出一个相关性分数(如0-1之间),或者预测一个相关等级(如“不相关/相关/高度相关”)。
    • 损失函数: 均方误差损失(MSE):
      交叉熵损失(Cross-Entropy):
    • 优点:简单直接。
  2. 列表式学习(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]
        总损失:
    • 优点:能学习到更好的全局排序能力,效果通常优于点式学习。

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等优秀开源模型的出现,使得这一技术变得触手可及,能有效提升问答系统、搜索引擎等应用的核心体验。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 6:27:35

BSHM镜像保姆级教程:轻松实现AI换背景

BSHM镜像保姆级教程:轻松实现AI换背景 你是否还在为电商主图换背景反复PS而头疼?是否想批量处理人像照片却苦于没有专业抠图工具?是否试过各种在线抠图网站,结果不是边缘毛糙就是细节丢失?别折腾了——今天这篇教程&a…

作者头像 李华
网站建设 2026/4/18 1:10:15

深入浅出ES6 Symbol类型:唯一标识符详解

以下是对您提供的博文《深入浅出ES6 Symbol类型:唯一标识符详解》的 全面润色与优化版本 。本次改写严格遵循您的全部要求: ✅ 彻底去除AI痕迹 :语言自然、口语化但不失专业,像一位有十年前端经验的技术博主在咖啡馆里跟你聊Symbol; ✅ 打破模板化结构 :删除所有…

作者头像 李华
网站建设 2026/4/18 10:07:17

Open-AutoGLM学习助手部署:单词打卡自动完成实战案例

Open-AutoGLM学习助手部署:单词打卡自动完成实战案例 1. 为什么需要一个“会看屏幕、能点手机”的AI学习助手? 你有没有过这样的经历:每天打开背单词App,机械地点击“已掌握”“再复习”“跳过”,手指点到发酸&#…

作者头像 李华
网站建设 2026/4/17 14:36:01

Open-AutoGLM实时性优化案例:缩短截图-推理-执行周期教程

Open-AutoGLM实时性优化案例:缩短截图-推理-执行周期教程 1. 什么是Open-AutoGLM?一个真正能“看懂手机屏幕”的AI助理框架 Open-AutoGLM不是又一个纸上谈兵的AI概念,而是智谱开源、已在真实安卓设备上跑通的端到端手机智能助理框架。它不依…

作者头像 李华
网站建设 2026/4/18 8:03:59

用测试脚本做了个开机提醒程序,附完整过程

用测试脚本做了个开机提醒程序,附完整过程 你有没有过这样的经历:早上急着出门,电脑还在后台跑着重要任务,却忘了设置提醒?或者远程服务器重启后,不确定某个关键服务是否已就绪?其实&#xff0c…

作者头像 李华
网站建设 2026/4/18 8:06:00

微调花了多少钱?成本估算参考

微调花了多少钱?成本估算参考 你是不是也经常看到“十分钟微调大模型”这类标题,心里嘀咕:听起来很酷,但真上手时,电费、显卡损耗、时间成本到底要多少?有没有一个靠谱的账本可以翻一翻? 这篇…

作者头像 李华