课程目标
- 知道 bge-m3 模型是如何得到稀疏向量和稠密向量
- 知道 bge-reranker 模型的使用
一、bge-m3 模型
bge-m3 模型论文地址:


使用 bge-m3 模型对文本进行编码,可以得到稀疏向量和稠密向量,用于后续的混合检索,实际上 bge-m3 模型还能编码多维向量,实现多向量的检索。下面分别介绍这几种检索方式。
二、稠密向量检索
稠密向量是指,维度较低每个位置的上基本都有数值,通常也叫做低维稠密向量。bge-m3 模型编码以后默认长度为 1024 维。
输入 query 编码以后的向量为 $H_q$,使用 [CLS] 输出的向量作为全局向量来代表 query 的语义,于是有:
文档向量为 $e_p$,于是就可以计算这两个向量的距离:
$$s_{dense} = f_{sim}(e_q, e_p)$$其中 $f_{sim}$ 距离可以是余弦距离,内积,L2 等。

代码示例
from milvus_model.hybrid import BGEM3EmbeddingFunction
m3_path = "../rag_qa/models/bge-m3"
embedding_function = BGEM3EmbeddingFunction(model_name_or_path=m3_path,
use_fp16=False, device='cpu')
embed = embedding_function(["黑马JAVA", "黑马大模型"])
print(embed["dense"])
# [array([-0.03068057, 0.00156495, -0.04899885, ..., 0.04231707,
# 0.01612839, 0.0713326 ], shape=(1024,), dtype=float32),
# array([-0.01287245, -0.01234254, -0.06556936, ..., 0.04092151,
# -0.01335396, 0.05632111], shape=(1024,), dtype=float32)]
三、稀疏向量检索
稀疏向量是指维度很高,大多数维度上的数值为 0,只保留非零的数值和位置。
稀疏向量的表示
输入 query 编码以后的向量为 $H_q$,针对每个 token $i$ 需要计算对应的重要性,与 BM25 类似:
$$w_{qt} = \text{Relu}(W_{lex}^T H_q[i])$$其中 $W_{lex} \in \mathbb{R}^{d \times 1}$,计算出的 $w_{qt}$ 是一个数值,代表 token $i$ 的重要程度。
于是针对输入 p 来说,就可以计算 query 与 p 的稀疏向量的距离:
$$s_{lex} = \sum_{t \in q \cap p} (w_{qt} * w_{pt})$$
代码示例
from milvus_model.hybrid import BGEM3EmbeddingFunction
m3_path = "../rag_qa/models/bge-m3"
embedding_function = BGEM3EmbeddingFunction(model_name_or_path=m3_path,
use_fp16=False, device='cpu')
embed = embedding_function(["黑马JAVA", "黑马大模型"])
row = embed["sparse"][0]
print(row.col)
# array([ 6, 5958, 7320, 189950])
print(row.data)
# array([0.00417884, 0.24346864, 0.15046994, 0.28743052])
四、多向量检索

其中 $W_{mul}^T \in \mathbb{R}^{d \times d}$,是一个可学习的矩阵。
计算两个文档的距离如下:
$$s_{mul} = \frac{1}{N} \sum_{i=1}^{N} \max_{j=1}^{M} (E_q[i] \cdot E_p[j]^T)$$五、bge-reranker-large 模型
bge-reranker 模型包含两个模型分别是 base 和 large,分别是基于 XLM-RoBERTa-Base 和 XLM-RoBERTa-Large 模型。



总结
- bge-m3 模型:支持稠密向量、稀疏向量、多向量三种编码方式,适用于混合检索场景。
- 稠密向量:默认 1024 维,使用
[CLS]全局向量表示语义。 - 稀疏向量:高维稀疏表示,类似 BM25,保留 token 重要性。
- 多向量:通过可学习矩阵编码,支持更精细的匹配。
- 稠密向量:默认 1024 维,使用
- bge-reranker 模型:基于 XLM-RoBERTa,提供 base 和 large 两个版本,用于检索结果的重排序优化。