【AI 大模型】RAG 检索增强生成 ⑧ ( 文本相似度排序 | Bi-Encoder 双编码器 | Cross-Encoder 交叉编码器 )


在这里插入图片描述





一、文本相似度排序




1、向量数据库查询弊端


在之前的 【AI 大模型】RAG 检索增强生成 系列博客中 ,

使用了 chromadb 向量数据库 , 给定一个查询语句 , 将其 转为文本向量 , 从 向量数据库 中查询 若干个 相似的文本 ;


向量数据库 通过 ANN 近似最近邻搜索 可以 快速返回与查询文本相似的前 n 个结果 , 但是该 向量检索方式 有一定 的 局限性 , 如 :

  • 向量模型的质量差 : 使用的 文本向量 模型 质量差 , 相应的 计算出的 文本相似度 质量差 ;
    • " sentence-transformers/all-MiniLM-L6-v2 " 模型 支持中文 , 但是对中文的优化程度较低 , 计算中文的相似度效果就很差 ;
    • " BAAI/bge-large-zh-v1.5 " 模型 是 专门为 中文优化的文本向量模型 , 中文语义理解能力强 , 支持成语、古汉语等复杂表达 , 计算中文语句的相似度就很准确 ;
  • 相似度计算简化 : 选择的 相似度计算方式 可能 无法准确反映语义相关度 , 如 : 单独选择 余弦相似度 或 欧氏距离 等方式计算相似度 , 忽略了 文本间的 上下文依赖、指代消解 等动态交互 信息 ;
    • 有的 文本向量模型 使用 余弦相似度 计算出来的 相似度很准确 , 但是有的 使用 欧式距离计算出来的相似度更准确 ;
  • 数据分布干扰 : 数据分布的问题导致近邻不一定最相关 , 高维空间中距离相近的向量可能在语义上并不相关 ;


2、二次排序的必要性


直接用 向量数据库 的查询结果的排序 可能不够准确反应 向量相似度 , 必须要进行 二次排序 ;

通过 二次排序 ( Re-Ranking ) 可以 对 Top-n 结果 进行精细化评分 ;

二次排序 的目标 : 使用 更高精度的 向量相似度计算模型 对 候选集进行重排 , 提升最终 排序结果 的准确率 ;


二次排序 可以解决如下问题 :

  • 粗粒度过滤 : 向量数据库 侧重 快速查询 , 但是查询出的 Top-n 候选集 中仍包含好很多噪声 ;
  • 语义深度匹配 : 向量数据库 查询出的 候选集 语意匹配都很浅 , 二次排序可以捕捉 句式差异、否定词、多义词等细粒度特征 ;
  • 任务适配性 : 二次排序可以 针对 垂直领域 优化相关性判断逻辑 , 如 : 法律领域 , 医学领域 , 农业领域 等 ;

2、相似度排序模型 - Bi-Encoder 双编码器、Cross-Encoder 交叉编码器 引入


进行 文本向量集 的 二次排序相似度排序模型 主要有 如下两种 :

  • Bi-Encoder 双编码器
  • Cross-Encoder 交叉编码器

二者 都可以 用于 句子 或 文本 的语义相似性 的计算 , 都 属于自然语言处理 ( NLP ) 领域 ;


3、Bi-Encoder 双编码器


Bi-Encoder 双编码器 需要 先 计算两个句子的 文本向量 , 然后 计算 两个文本向量的相似度 ;

  • 该方法 执行效率较高 , 适合大规模候选对的对比 , 如 : 文本检索 , 只是问答 , 论文查重 , 文本聚类 等场景 ;
  • Bi-Encoder 双编码器 适合处理 大量数据 的场景 , 如 : 百万级别的文本检索 ;
  • 该模型 的 计算精度较低 , 文本相似度排序 准确率 要低于 Cross-Encoder 交叉编码器 ;

在这里插入图片描述


4、Cross-Encoder 交叉编码器


Cross-Encoder 交叉编码器 查询文本 与 候选文本 拼接 后 , 再 输入到 单一 Transformer 模型 中 , 直接 输出相关性分数 ;

  • 通过 自注意力机制 , 动态捕捉 词级、句级 关联 , 直接输出 查询文本 与 候选文本 的 相关性 的 概率值 ;
  • 在 复杂语义的场景 , Cross-Encoder 交叉编码器 的 相似度 计算精度 高于 Bi-Encoder 双编码器 ;
  • Cross-Encoder 交叉编码器 适用于 少量候选句子的场景 , 如 100 个以内的文本相似度排序 ;
  • Cross-Encoder 交叉编码器 属于 sentence-transformers 库的一部分 , 由Hugging Face维护 ;

在这里插入图片描述


5、Bi-Encoder 双编码器 与 Cross-Encoder 交叉编码器 结合使用


工业级 相似度排序系统 采用两阶段流水线 ,

  • 首先 执行 召回阶段 任务 , 该阶段要求快速执行 ;
  • 然后 执行 精排阶段 任务 , 该阶段要求精确度高 ;

Bi-Encoder 双编码器 适合用于 大规模 向量本文 相似度计算 , Cross-Encoder 交叉编码器 适用于 小规模 文本相似度计算 , 后者计算更耗时 更准确 ;

实际的相似度排序系统设计常采用混合架构 , 先用 Bi-Encoder 快速筛选 候选集 , 再用 Cross-Encoder 对 TopN 结果进行精确重排序 , 兼顾效率与精度需求 :

  • 召回阶段 : 使用 Bi-Encoder 双编码器 进行大规模 计算 , 找出 TOP-N 候选集 ;

  • 精排阶段 : 使用 Cross-Encoder 交叉编码器 进行 准确的相似度计算 ;


6、Bi-Encoder 双编码器 与 Cross-Encoder 交叉编码器 对比


在这里插入图片描述

对比维度Bi-Encoder(双编码器)Cross-Encoder(交叉编码器)
计算效率✅ 高(预计算文本向量,检索时仅需向量相似度计算)❌ 低(需实时拼接文本对并完整推理,无法预计算)
交互建模能力❌ 弱(独立编码,仅通过向量相似度间接建模交互)✅ 强(通过注意力机制直接建模词级交互,捕捉细粒度语义)
适用阶段召回阶段(从海量候选集中快速筛选 Top K)精排阶段(对少量候选进行精准排序或分类)
典型任务语义检索、问答召回、大规模去重文本相似度判断、自然语言推理(NLI)、重排序
优点- 响应速度快
- 内存占用低
- 支持预计算和实时检索
- 精度高
- 建模复杂语义关系能力强
- 适合小规模精细化分析
缺点- 无法捕捉细粒度交互
- 对负样本敏感
- 精度受向量表示限制
- 计算成本高(复杂度 O ( n 2 ) O(n^2) O(n2)
- 无法处理大规模数据
- 实时性差
结构特点- 双塔结构,独立编码查询和文档
- 输出向量后计算相似度(如余弦相似度)
- 单编码器,输入为拼接的文本对
- 直接输出匹配分数或分类结果
响应速度⚡ 极快(依赖预计算,检索仅需毫秒级)🐢 慢(需实时计算每个文本对,百毫秒至秒级)
计算精度📉 中低(受限于向量表示的泛化能力)📈 高(通过交叉注意力捕捉细粒度语义差异)




二、Bi-Encoder 双编码器 用法实例




1、Bi-Encoder 双编码器 实现


Bi-Encoder 双编码器 是一种用于 处理 文本对 任务 的架构设计模式 , 其 核心思想是 :

  • 使用两个 独立编码器(通常共享参数)分别处理输入文本 ;
  • 通过 向量相似度(如余弦相似度)衡量语义关联 ;

在这里插入图片描述


Bi-Encoder 双编码器 是 架构设计 而非具体模型 , 该 架构 已被具体化为多种现成模型 :

  • Sentence Transformers 模型 , 其中提供了 很多预训练模型 ;
    • 之前使用过的 BAAI/bge-large-zh-v1.5 模型 就是 Bi-Encoder 双编码器 实现的一部分 ;
  • OpenAI 的 文本嵌入模型 ;

2、Bi-Encoder 双编码器 代码示例


一个 普通的 将文本转为 向量 并进行 文本相似度计算的 代码 , 就是使用了 Bi-Encoder 双编码器 架构设计思想的 代码示例 , 这种代码在之前的一系列博客中 , 使用了很多次 ;


如 : 在 【AI 大模型】RAG 检索增强生成 ⑦ ( 本地部署向量模型 | Sentence Transformers 工具库 | 从 Hugging Face 模型库 中查找模型 | BGE 模型 ) 四、使用 BAAI/bge-large-zh-v1.5 模型进行向量转化 1、向量转化示例 博客章节中的代码示例 , 就是一个 Bi-Encoder 双编码器 代码示例 ;

在上述代码中 , 使用 预训练的 Sentence Transformer 模型 " BAAI/bge-large-zh-v1.5 模型 " 作为 文本向量模型 , 将 文本 通过该模型 转为 向量特征表示 ,

将下面的 5 个句子 , 计算成了文本向量 ;

# 需要编码的句子列表
sentences = [
    "李彦宏称大模型成本每年降低90%",  # 科技类新闻
    "乌军大批直升机击落多架俄无人机",  # 国际争端类新闻
    "王力宏回应是否想找新伴侣",      # 娱乐新闻
    "饺子不知道观众怎么想出的藕饼cp",  # 影视相关话题
    "加沙停火协议关键时刻生变"       # 国际争端类新闻
]

每个文本向量的 维度 是 1024 维 , 也就是每个句子由 1024 个浮点数表示 ;

使用 5x1024 维 的向量 同时 作为 查询文本 和 候选文本 , 进行文本相似度对比 , 最终得到一个相似度矩阵 :

计算嵌入向量之间的相似性:
tensor([[1.0000, 0.2748, 0.3885, 0.1245, 0.1896],
        [0.2748, 1.0000, 0.1758, 0.1199, 0.4046],
        [0.3885, 0.1758, 1.0000, 0.3367, 0.2884],
        [0.1245, 0.1199, 0.3367, 1.0000, 0.2355],
        [0.1896, 0.4046, 0.2884, 0.2355, 1.0000]])

上述矩阵中 , 对角线上的是 本身 与 本身 向量相似度的计算 , 肯定是 最高值 1 ;

第二个文本 “乌军大批直升机击落多架俄无人机” 是 国际争端类新闻 , 第五个文本 “加沙停火协议关键时刻生变” 也是 国际争端类新闻 ;

相应的 第二行第五列 和 第五行第二列 就是 两个句子的 向量相似度计算 , 结果是 0.4046 , 这个相似度是除了与本身对比之外 , 是最高的相似度 ;





三、Cross-Encoder 交叉编码器 用法实例




1、Cross-Encoder 交叉编码器 实现原理


Cross Encoder 实现原理可 参考 https://www.sbert.net/examples/applications/cross-encoder/README.html 文档 ;

Cross-Encoder 交叉编码器 是一种 通过 联合建模输入对交互关系的深度学习模型 , 广泛应用于文本匹配、排序和问答等任务 ;

Cross-Encoder 直接对输入对进行 深度融合编码 , 而非独立编码 , 模型会将 两个句子 拼接后输入Transformer , 利用自注意力机制捕捉细粒度交互关系 ;


输入拼接 : 将 两个文本 拼接为统一序列 , 并添加特殊标记 [CLS][SEP] ;

[CLS] 文本A [SEP] 文本B [SEP]
  • [CLS] 用于聚合整体信息的标记 ;
  • [SEP] 分隔符 用于区分两个输入 ;

举例说明 : 比较 " 国际争端新闻 " 和 " 乌军大批直升机击落多架俄无人机 " 两个句子 , 需要进行文本拼接 , 拼接后的文本为

[CLS] 国际争端新闻 [SEP] 乌军大批直升机击落多架俄无人机 [SEP]

将上述文本输入到 Cross-Encoder 交叉编码器 中 ,


先进行 Transformer 编码 , 通过多层 Transformer 编码器处理 拼接后的文本序列 ;

  • 通过 自注意力机制 计算 文本A 和 文本B 中所有词之间的交互权重 ;
  • 特征融合 : 模型在每一层同时更新两个文本的表示 , 直接捕捉交叉语义 ;

然后 输出 分类 / 回归 结果 , 取 [CLS] 标记的向量作为整体表示 , 输入分类器预测相关性分数 ,

  • 对于二分类任务(如相关/不相关) , 使用Sigmoid输出概率 ;
  • 对于排序任务,直接输出回归分数 ;

2、安装包含 Cross-Encoder 交叉编码器的工具库 Sentence Transformers


Cross Encoder 是 Sentence Transformers 库的 组件之一 , 执行

pip install sentence-transformers

命令 , 安装 Sentence Transformers 库 , 参考 https://sbert.net/docs/installation.html 文档 进行安装 ;

参考 【AI 大模型】RAG 检索增强生成 ⑦ ( 本地部署向量模型 | Sentence Transformers 工具库 | 从 Hugging Face 模型库 中查找模型 | BGE 模型 ) 二、本地部署向量模型 1、安装 Sentence Transformers 博客 安装 Sentence Transformers 库 ;

Python 版本需要 3.9 以上 , 不达到该版本 安装会报错 ;

安装 Sentence Transformers 工具库 依赖的 PyTorch 版本需要 1.11.0 以上 , 执行下面的命令 , 可以指定安装的 PyTorch 版本 ;

# 根据系统选择对应命令(示例为CPU版本)
pip install torch==2.0.1

执行下面的命令 , 可指定安装的 Sentence Transformers 工具库 版本 ;

pip install sentence-transformers==2.2.2  # 指定版本

3、pip install 国内镜像源设置


如果 安装过程中 , 安装速度太慢 , 或者下载失败 , 可使用 -i 参数设置 国内镜像源 ;

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sentence-transformers

可设置的 国内镜像源如下 :

  • 清华大学镜像源 : https://pypi.tuna.tsinghua.edu.cn/simple
  • 阿里云镜像源 : https://mirrors.aliyun.com/pypi/simple/
  • 腾讯云镜像源 : https://mirrors.cloud.tencent.com/pypi/simple
  • 网易镜像源 : https://mirrors.163.com/pypi/simple/
  • 中国科学技术大学镜像源 : https://pypi.mirrors.ustc.edu.cn/simple/

4、Cross-Encoder 交叉编码器 代码示例 - 英文相似度排序


下面的代码是参考 https://sbert.net/docs/quickstart.html 文档中的代码修改而来的 ;

Hugging Face 模型库 无法访问 , 这里需要 设置 国内镜像源 :

import os
# 设置Hugging Face模型的下载镜像地址,核心配置用于加速模型下载
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"  

在本地部署 CrossEncoder 模型 代码如下 , 执行该代码会自动从 Hugging Face 模型库中下载 “cross-encoder/stsb-distilroberta-base” 模型到本地 ;

from sentence_transformers.cross_encoder import CrossEncoder

model = CrossEncoder("cross-encoder/stsb-distilroberta-base")

执行 如下代码 , query 是一个文本 , corpus 是文本列表 , 将 query 与每个 corpus 句子拼接成[SEP] 分隔的输入对 , 通过模型计算每个对的相似度 logits , 使用 sigmoid 将 logits 转换为 0-1 的相似度分数 , 按照相似度分数进行降序排列 ;

ranks = model.rank(query, corpus)

完整代码示例 :

import os
# 设置Hugging Face模型的下载镜像地址,核心配置用于加速模型下载
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"  

# 导入跨编码器模型(用于计算句子相似度的深度学习方法)
from sentence_transformers.cross_encoder import CrossEncoder

# 算法原理:
# CrossEncoder采用单塔架构,同时处理两个输入句子,通过交叉注意力机制进行深度交互
# 与Bi-Encoder双塔架构不同,CrossEncoder的计算公式为:score = sigmoid(W·Transformer([SEP]拼接输入))
# 其中[SEP]表示句子分隔符,W为分类层权重矩阵

# 1. 加载预训练的跨编码器模型(STS-B语义文本相似度任务专用)
# 模型名称:"cross-encoder/stsb-distilroberta-base"
# - distilroberta-base: 蒸馏压缩版的RoBERTa模型
# - STS-B: Semantic Textual Similarity Benchmark(语义相似度评估基准)
model = CrossEncoder("cross-encoder/stsb-distilroberta-base")

# 定义查询语句(需要计算相似度的目标句子)
query = "International conflict news" # 国际争端新闻

# 定义语料库(包含多个待比较的句子)
corpus = [
    "Li Yanhong says the cost of large models is reduced by 90% annually",  # 科技类新闻, 李彦宏称大模型成本每年降低90%
    "Ukrainian military shoots down multiple Russian drones with a flock of helicopters",  # 国际争端类新闻, 乌军大批直升机击落多架俄无人机
    "Wang Leehom responds to whether he wants to find a new partner",  # 娱乐新闻, 王力宏回应是否想找新伴侣
    "Jiaozi (director) doesn't know how audiences came up with the 'Oubing' CP",  # 影视相关话题, 饺子不知道观众怎么想出的藕饼cp
    "Gaza ceasefire agreement faces changes at a critical moment"  # 国际争端类新闻, 加沙停火协议关键时刻生变
]

# 2. 对语料库中的所有句子进行相似度排序
# rank()方法内部实现:
# 1. 将query与每个corpus句子拼接成[SEP]分隔的输入对
# 2. 通过模型计算每个对的相似度logits
# 3. 使用sigmoid将logits转换为0-1的相似度分数
# 4. 按分数降序排列,返回包含corpus_id和score的字典列表
ranks = model.rank(query, corpus)

# 打印排序结果(按相似度从高到低排列)
print("Query: ", query)
for rank in ranks:
    # 格式化输出:分数保留两位小数,对应语料库中的句子
    print(f"{rank['score']:.2f}\t{corpus[rank['corpus_id']]}")

# 3. 手动计算相似度分数的替代方法(展示底层实现细节)
import numpy as np

# 创建所有句子组合:[query, corpus_sentence]的二维列表
# 示例结构:[[query, corpus[0]], [query, corpus[1]], ...]
sentence_combinations = [[query, sentence] for sentence in corpus]

# 使用模型预测所有组合对的相似度分数
# predict()方法:
# 输入:二维列表,每个元素是文本对
# 输出:一维numpy数组,包含每个对的相似度分数
scores = model.predict(sentence_combinations)

# 对分数进行降序排序并获取对应的索引
# np.argsort(scores)返回升序排列的索引
# [::-1]进行倒序操作实现降序排列
ranked_indices = np.argsort(scores)[::-1]

# 打印原始分数和排序后的索引
print("Scores:", scores)
print("Indices:", ranked_indices)

"""
代码执行流程总结:
1. 模型初始化 -> 2. 构建输入数据 -> 3. 计算相似度 ->
4. 结果排序 -> 5. 输出可视化

性能说明:
- CrossEncoder计算复杂度为O(n),适用于中小规模语料库
- 对比Bi-Encoder的O(1)复杂度,CrossEncoder精度更高但计算量更大
- 推荐使用场景:1000句以内的精细相似度排序
"""

执行结果如下 :

Query:  International conflict news
0.12	Ukrainian military shoots down multiple Russian drones with a flock of helicopters
0.11	Gaza ceasefire agreement faces changes at a critical moment
0.01	Li Yanhong says the cost of large models is reduced by 90% annually
0.01	Wang Leehom responds to whether he wants to find a new partner
0.01	Jiaozi (director) doesn't know how audiences came up with the 'Oubing' CP
Scores: [0.00677924 0.11857065 0.0065942  0.0057603  0.10577792]
Indices: [1 4 0 2 3]

在这里插入图片描述


5、Cross-Encoder 交叉编码器 模型下载查看


在下面的代码中 , 执行时会自动下载 “cross-encoder/stsb-distilroberta-base” 模型 ;

from sentence_transformers.cross_encoder import CrossEncoder

model = CrossEncoder("cross-encoder/stsb-distilroberta-base")

下载地址为 https://huggingface.co/cross-encoder/stsb-distilroberta-base , 查看模型的介绍 如下 :

在这里插入图片描述

选择 " Files and version " 选项卡 , 可以查看文件内容 ;

在这里插入图片描述

WIndows 本地下载的 模型 在 C:\Users\octop.cache\huggingface\hub\models–cross-encoder–stsb-distilroberta-base 目录中 , 模型的具体文件目录为 C:\Users\octop.cache\huggingface\hub\models–cross-encoder–stsb-distilroberta-base\snapshots\9a05a97ddb424fc9aea3d768d0e2dab0a1276421 ;

在这里插入图片描述


6、Cross-Encoder 交叉编码器 使用 cross-encoder/stsb-distilroberta-base 模型 进行 中文相似度排序


使用 CrossEncoder 交叉编码器 加载 “cross-encoder/stsb-distilroberta-base” 模型 , 仅能对英文进行排序 , 如果对中文排序 , 得到的结果稀烂 ;

对下面的中文文本进行排序 , 将下面的中文拷贝到上述代码中 , 其它代码不变 ;

# 定义查询语句(需要计算相似度的目标句子)
query = "国际争端新闻"

# 定义语料库(包含多个待比较的句子)
corpus = [
    "李彦宏称大模型成本每年降低90%",  # 科技类新闻
    "乌军大批直升机击落多架俄无人机",  # 国际争端类新闻
    "王力宏回应是否想找新伴侣",      # 娱乐新闻
    "饺子不知道观众怎么想出的藕饼cp",  # 影视相关话题
    "加沙停火协议关键时刻生变"       # 国际争端类新闻
]

由于是错误代码 , 就不再贴出完整代码了 , cross-encoder/stsb-distilroberta-base 模型不适合进行 中文相似度排序 ;

执行结果 : 排序结果很差 , 与 " 国际争端新闻 " 相似度最高的文本居然是 " 王力宏回应是否想找新伴侣 " , 显然该模型根本不支持中文文本排序 ;

Query:  国际争端新闻
0.38	王力宏回应是否想找新伴侣
0.25	加沙停火协议关键时刻生变
0.24	李彦宏称大模型成本每年降低90%
0.19	乌军大批直升机击落多架俄无人机
0.17	饺子不知道观众怎么想出的藕饼cp
Scores: [0.2380584  0.19352856 0.37611857 0.17274071 0.25236368]
Indices: [2 4 0 1 3]

在这里插入图片描述


7、Cross-Encoder 交叉编码器 中文相似度排序 模型推荐 - hfl/chinese-roberta-wwm-ext 模型


这里推荐一个支持中文的相似度排序模型 " hfl/chinese-roberta-wwm-ext " 模型地址 https://huggingface.co/hfl/chinese-roberta-wwm-ext ;

这是 哈工大讯飞联合实验室(HFL) 训练的模型 ;

该模型是 基于原始 BERT-wwm 架构 的 微调版本 , 在 LCQMC 等中文语义匹配数据集上验证有效 ;


代码示例 :

import os
# 设置Hugging Face模型的下载镜像地址,核心配置用于加速模型下载
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

# 导入跨编码器模型(用于计算句子相似度的深度学习方法)
from sentence_transformers.cross_encoder import CrossEncoder

# 算法原理:
# CrossEncoder采用单塔架构,同时处理两个输入句子,通过交叉注意力机制进行深度交互
# 与Bi-Encoder双塔架构不同,CrossEncoder的计算公式为:score = sigmoid(W·Transformer([SEP]拼接输入))
# 其中[SEP]表示句子分隔符,W为分类层权重矩阵

# 1. 加载预训练的跨编码器模型(STS-B语义文本相似度任务专用)
# 模型名称:"hfl/chinese-bert-wwm-ext"
model = CrossEncoder('hfl/chinese-bert-wwm-ext', num_labels=1)

# 定义查询语句(需要计算相似度的目标句子)
query = "国际争端新闻"

# 定义语料库(包含多个待比较的句子)
corpus = [
    "李彦宏称大模型成本每年降低90%",  # 科技类新闻
    "乌军大批直升机击落多架俄无人机",  # 国际争端类新闻
    "王力宏回应是否想找新伴侣",      # 娱乐新闻
    "饺子不知道观众怎么想出的藕饼cp",  # 影视相关话题
    "加沙停火协议关键时刻生变"       # 国际争端类新闻
]

# 2. 对语料库中的所有句子进行相似度排序
# rank()方法内部实现:
# 1. 将query与每个corpus句子拼接成[SEP]分隔的输入对
# 2. 通过模型计算每个对的相似度logits
# 3. 使用sigmoid将logits转换为0-1的相似度分数
# 4. 按分数降序排列,返回包含corpus_id和score的字典列表
ranks = model.rank(query, corpus)

# 打印排序结果(按相似度从高到低排列)
print("Query: ", query)
for rank in ranks:
    # 格式化输出:分数保留两位小数,对应语料库中的句子
    print(f"{rank['score']:.2f}\t{corpus[rank['corpus_id']]}")

# 3. 手动计算相似度分数的替代方法(展示底层实现细节)
import numpy as np

# 创建所有句子组合:[query, corpus_sentence]的二维列表
# 示例结构:[[query, corpus[0]], [query, corpus[1]], ...]
sentence_combinations = [[query, sentence] for sentence in corpus]

# 使用模型预测所有组合对的相似度分数
# predict()方法:
# 输入:二维列表,每个元素是文本对
# 输出:一维numpy数组,包含每个对的相似度分数
scores = model.predict(sentence_combinations)

# 对分数进行降序排序并获取对应的索引
# np.argsort(scores)返回升序排列的索引
# [::-1]进行倒序操作实现降序排列
ranked_indices = np.argsort(scores)[::-1]

# 打印原始分数和排序后的索引
print("Scores:", scores)
print("Indices:", ranked_indices)

"""
代码执行流程总结:
1. 模型初始化 -> 2. 构建输入数据 -> 3. 计算相似度 ->
4. 结果排序 -> 5. 输出可视化

性能说明:
- CrossEncoder计算复杂度为O(n),适用于中小规模语料库
- 对比Bi-Encoder的O(1)复杂度,CrossEncoder精度更高但计算量更大
- 推荐使用场景:1000句以内的精细相似度排序
"""

执行结果 : 使用 " hfl/chinese-roberta-wwm-ext " 模型 对中文进行语义排序 准确率较高 ;

Query:  国际争端新闻
0.48	加沙停火协议关键时刻生变
0.46	乌军大批直升机击落多架俄无人机
0.32	王力宏回应是否想找新伴侣
0.27	李彦宏称大模型成本每年降低90%
0.27	饺子不知道观众怎么想出的藕饼cp
Scores: [0.27200806 0.45998368 0.31697848 0.26541045 0.4793131 ]
Indices: [4 1 2 0 3]

在这里插入图片描述

该模型下载后的存储地址为 C:\Users\octop.cache\huggingface\hub\models–hfl–chinese-bert-wwm-ext 目录 ;

在这里插入图片描述

<think>好的,我现在需要向用户介绍什么是rerank模型。用户之前已经询问过bce-embedding-base_v1模型,现在可能是在构建一个检索系统,想了解rerank模型的作用。首先,我应该回顾一下之前的问题,确保回答的连贯性。 用户可能对embedding模型和rerank模型的区别不太清楚。需要先解释rerank的基本概念,然后说明它在NLP中的应用场景。可能需要从信息检索的角度切入,比如在搜索引擎或问答系统中,先用检索模型得到大量候选结果,再用rerank模型进行精细排序。 接下来,要说明rerank模型的工作原理。可能需要提到它如何处理候选文档和查询的相关性,使用的技术比如交叉编码器Cross-Encoder),与双编码器Bi-Encoder)的区别。需要强调rerank模型的计算复杂度更高,但精度更好,适合在候选集较小的情况下使用。 还要列举一些常见的rerank模型,比如Sentence-BERT的交叉编码版本、Cohere的rerank模型,或者百度的可能产品。同时,给出使用场景的例子,比如RAG系统、推荐系统、问答系统等,帮助用户理解实际应用。 需要对比embedding模型和rerank模型的优缺点,比如效率与精度的权衡,这样用户可以根据需求选择合适的模型。最后,给出使用建议,比如在召回阶段用embedding快速筛选,再用rerank精细排序,这样结合两者优势。 要确保语言简洁,避免技术术语过多,必要时用例子说明。可能需要检查是否有错误,比如rerank模型是否都是基于交叉编码器,或者是否有其他结构。另外,是否需要提到具体的评估指标,比如MRR、NDCG等,但可能用户更关注应用层面,所以可以省略。 最后,确认回答结构是否清晰,分点是否明确,是否覆盖了定义、作用、原理、常见模型、应用场景以及与embedding模型的对比。可能需要补充一个代码示例,但考虑到不同框架,可能保持简洁,或提到使用现有库如sentence-transformers。 总结,需要组织信息,确保用户能够理解rerank模型的作用和如何使用,同时与之前介绍的embedding模型形成对比,帮助用户构建完整的检索系统流程。</think>**Rerank 模型**(重排序模型)是自然语言处理(NLP)中用于优化检索结果的关键组件,主要作用是对初步检索得到的候选结果(如文档、段落、答案等)进行精细化排序,以提升最终返回结果的准确性和相关性。以下是详细介绍: --- ### **1. 核心作用** 在典型的检索系统中(如搜索引擎、问答系统、推荐系统),通常分为两个阶段: 1. **召回(Retrieval)**:使用快速检索模型(如 BM25、Embedding 模型)从海量数据中筛选出数百/千条相关候选。 2. **重排序(Reranking)**:通过更复杂的模型对候选结果重新打分和排序,保留最相关的 Top-K 条结果。 **Rerank 模型的核心任务**: 在召回阶段的结果基础上,进一步计算查询(Query)与每个候选之间的细粒度相关性,消除召回阶段的噪声,提升结果精度。 --- ### **2. 工作原理** - **输入**:用户查询(Query) + 召回阶段返回的候选列表(例如 100 条文档)。 - **输出**:对候选列表重新打分,按相关性从高到低排序- **技术实现**: - 通常基于 **交叉编码器Cross-Encoder)**,直接建模 Query 和候选文本的交互(如拼接后输入模型,计算相关性分数)。 -双编码器Bi-Encoder,如 Embedding 模型)相比,计算量更大但精度更高,适合小规模候选集(百级以内)。 --- ### **3. 常见模型与工具** | 模型/工具 | 特点 | |--------------------------|----------------------------------------------------------------------| | **Cross-Encoder** | Sentence-BERT 提供的交叉编码器,适合短文本对(如 MS MARCO 数据集训练)。 | | **Cohere Rerank** | Cohere 公司的 API 服务,直接调用对候选结果重排序| | **BAAI/bge-reranker** | 北京智源研究院开源的 Rerank 模型,支持中英文。 | | **专属领域微调模型** | 基于业务数据(如客服对话、商品描述)微调的 Rerank 模型,针对性更强。 | --- ### **4. 典型应用场景** 1. **检索增强生成RAG)** -RAG 中,先通过 Embedding 模型召回相关文档,再用 Rerank 模型筛选出最相关的几条输入给大模型生成答案。 2. **搜索引擎优化** - 对初步检索的网页/商品/视频结果重排序,提升用户体验(如 Google 搜索的 BERT 重排序)。 3. **问答系统** - 从知识库中召回多个候选答案,通过 Rerank 模型选择最匹配的答案。 4. **推荐系统** - 对用户历史行为召回的推荐内容进行最终排序--- ### **5. 与 Embedding 模型的对比** | 特性 | Embedding 模型(Bi-Encoder| Rerank 模型(Cross-Encoder| |---------------------|--------------------------------------|--------------------------------------| | **计算方式** | 独立编码 Query 和候选,计算向量相似度 | 联合编码 Query 和候选,直接交互计算相关性 | | **速度** | 快(适合大规模召回) | 慢(适合百级候选重排序| | **精度** | 较低(无法捕捉细粒度交互) | 较高(捕捉词级、句级交互) | | **典型用途** | 第一阶段:海量数据快速召回 | 第二阶段:精细化排序 | --- ### **6. 使用示例(伪代码)** 以 `sentence-transformers` 库为例: ```python from sentence_transformers import CrossEncoder # 加载预训练 Rerank 模型 rerank_model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2") # 假设用户查询和召回结果 query = "如何学习机器学习?" candidates = [ "机器学习入门教程", "深度学习框架对比", "Python 编程基础", "机器学习模型调参技巧" ] # 生成 Query-Candidate 对并打分 pairs = [(query, candidate) for candidate in candidates] scores = rerank_model.predict(pairs) # 按分数排序 ranked_results = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True) # 输出:["机器学习入门教程", "机器学习模型调参技巧", ...] ``` --- ### **7. 注意事项** - **性能权衡**:Rerank 模型计算成本高,需限制候选数量(通常不超过 100 条)。 - **领域适配**:通用 Rerank 模型可能在垂直领域表现不佳,需针对性微调。 - **端到端优化**:可与召回模型联合训练,构建检索-排序一体化系统。 --- 通过结合 Embedding 模型(高效召回)和 Rerank 模型(精准排序),可以显著提升检索系统的整体效果,尤其在需要高相关性的场景(如问答、推荐)中价值突出。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值