一、引言:什么是BGE-M3?
2024年1月30日,智源研究院(BAAI)发布了BGE家族的新成员------BGE-M3。BGE-M3是首个集多语言(Multi-Linguality)、多粒度(Multi-Granularity)、多功能(Multi-Functionality)三大技术特征于一体的语义向量模型-。
M3代表着三大核心能力:
-
Multi-Linguality(多语言) :支持超过100种工作语言
-
Multi-Granularity(多粒度) :输入长度最高可达8192个token
-
Multi-Functionality(多功能) :同时支持稠密检索、稀疏检索和多向量检索三种功能
BGE-M3基于XLM-RoBERTa架构,参数量达5.69亿(569M) ,隐藏层维度为1024-。其最引人注目的特性是:一次推理可以同时输出三种向量表示-,无需额外开销。
本文将深入剖析BGE-M3的模型架构、训练方法,以及三种检索方式的完整算法计算过程,并配以具体的数值示例。
二、模型架构与核心技术
2.1 整体架构
BGE-M3基于XLM-RoBERTa-large架构-,其核心创新包括:
-
扩展位置编码:将最大位置从512扩展到8192,支持长文档处理
-
MCLS策略:通过多个CLS token增强长文本建模能力,无需额外微调
-
三头输出:在一次前向传播中同时输出稠密向量、稀疏向量和多向量三种表示
2.2 MCLS:长文本处理的创新策略
针对长文本微调面临的数据不足和计算资源限制问题-14,BGE-M3提出了MCLS(Multiple CLS) 方法。
核心思想 :在输入序列中每隔固定数量的token(实验中为每256个token)插入一个[CLS] token。每个CLS token从其相邻token捕获语义信息,最终通过对所有CLS token的隐藏状态求平均来获得文本的最终嵌入表示-。
2.3 前向传播的数学表示

三、稠密检索(Dense Retrieval)的算法计算过程
3.1 核心思想
稠密检索将整段文本压缩为单个稠密向量 ,通过向量相似度判断文本间的相关性。BGE-M3使用特殊token [CLS] 的归一化隐藏状态作为稠密向量表示-7。
3.2 向量生成

3.3 相似度计算

3.4 具体计算示例
假设查询文本为"如何学习Python ",文档文本为"Python是一门适合初学者的编程语言"。
Step 1:分别编码
经过Transformer编码和CLS提取,得到两个1024维的原始向量(数值仅为示意):
-
查询原始向量:hcl(s,q)=0.82,−0.15,0.37,0.51,−0.23,...
-
文档原始向量:hcl(s,p)=0.79,−0.13,0.35,0.48,−0.20,...
Step 2:L2归一化
计算各自的模长并进行归一化(假设归一化后):
-
查询稠密向量:eq=0.65,−0.12,0.29,0.40,−0.18,...
-
文档稠密向量:ep=0.63,−0.10,0.28,0.38,−0.16,...
Step 3:计算点积
sdense=0.65×0.63+(−0.12)×(−0.10)+0.29×0.28+0.40×0.38+(−0.18)×(−0.16)+...
假设计算结果为 sdense=0.87,表明两段文本在语义上高度相关。
四、稀疏检索(Sparse Retrieval)的算法计算过程
4.1 核心思想
稀疏检索生成一个高维稀疏向量 ,维度等于模型词表大小(BGE-M3词表约为250,002 )-20。向量中绝大多数位置的值为0,只有文本中出现的token对应的维度有非零权重-。BGE-M3通过神经网络学习权重,而非依赖BM25的统计公式。
4.2 Token级权重计算
BGE-M3在编码器输出之上添加了一个线性层 和ReLU激活函数来生成稀疏嵌入。

ReLU的作用:将所有负数置为0,这是向量"稀疏"的根本来源。正数表示该token与词表中某个词存在正相关关系,负数或零则被过滤掉。
4.3 最大池化聚合(Max Pooling)
4.4 相似度计算
4.5 具体计算示例
以文本"苹果公司发布了新款iPhone"为例。
Step 1:分词与编码
分词结果:["苹果", "公司", "发布", "了", "新款", "iPhone"]
经过Transformer编码后,每个token获得隐藏状态 ℎi。
Step 2:线性变换与ReLU激活
假设词表大小简化为10(实际为250,002),每个token经过线性层+ReLU后生成10维的权重向量:
| Token | 词0 (苹果) | 词1 (公司) | 词2 (iPhone) | 词3 (发布) | 词4 (新款) | 词5-9 |
|---|---|---|---|---|---|---|
| 苹果 | 2.1 | 0.0 | 0.8 | 0.0 | 0.0 | 0.0 |
| 公司 | 0.0 | 1.5 | 0.0 | 0.4 | 0.0 | 0.0 |
| 发布 | 0.0 | 0.0 | 0.0 | 1.2 | 0.0 | 0.0 |
| 了 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| 新款 | 0.0 | 0.0 | 0.0 | 0.0 | 0.9 | 0.0 |
| iPhone | 0.0 | 0.0 | 2.1 | 0.0 | 0.0 | 0.0 |
Step 3:最大池化聚合
对词表中每个词,取所有token中的最大值:
-
词"苹果"(ID=0):max(2.1,0.0,0.0,0.0,0.0,0.0)=2.1
-
词"公司"(ID=1):max(0.0,1.5,0.0,0.0,0.0,0.0)=1.5
-
词"iPhone"(ID=2):max(0.8,0.0,0.0,0.0,0.0,2.1)=2.1
-
词"发布"(ID=3):max(0.0,0.4,1.2,0.0,0.0,0.0)=1.2
-
词"新款"(ID=4):max(0.0,0.0,0.0,0.0,0.9,0.0)=0.9
-
其他词(ID=5-9):全部为0
Step 4:最终稀疏向量
以键值对字典形式表示:
python
sparse_vec = {
0: 2.1, # "苹果"
1: 1.5, # "公司"
2: 2.1, # "iPhone"
3: 1.2, # "发布"
4: 0.9 # "新款"
}
这个向量中绝大多数位置为0,只有少数位置有非零权重。
Step 5:相似度计算
假设查询为"苹果iPhone ",其稀疏向量为 {0: 1.8, 2: 2.0},则查询与文档的稀疏相似度为:

五、多向量检索(Multi-Vector / ColBERT风格)的算法计算过程
5.1 核心思想
多向量检索为文本中的每个token生成一个独立的向量 ,形成 N×d 的向量矩阵。这避免了传统稠密检索将整段文本压缩为单个向量带来的"信息瓶颈"问题。在计算相似度时,采用延迟交互(Late Interaction) 和MaxSim算法,实现token级别的精细匹配。
5.2 多向量生成
BGE-M3复用底层Transformer的参数,通过一个轻量级投影头将每个token的隐藏状态映射为独立的token向量:

5.3 晚期交互与MaxSim算法

5.4 具体计算示例
假设查询 q= ["cat", "dog"](2个token),文档 p= ["a", "cute", "cat"](3个token)。向量维度简化为4维。
Step 1:分别编码生成多向量矩阵

| Token | 维度0 | 维度1 | 维度2 | 维度3 |
|---|---|---|---|---|
| cat (q₁) | 0.9 | 0.1 | 0.3 | 0.2 |
| dog (q₂) | 0.2 | 0.8 | 0.1 | 0.4 |

| Token | 维度0 | 维度1 | 维度2 | 维度3 |
|---|---|---|---|---|
| a (p₁) | 0.1 | 0.2 | 0.8 | 0.1 |
| cute (p₂) | 0.3 | 0.4 | 0.2 | 0.7 |
| cat (p₃) | 0.8 | 0.1 | 0.3 | 0.2 |
Step 2:计算相似度矩阵(2×3)
| 相似度 | p₁ ("a") | p₂ ("cute") | p₃ ("cat") |
|---|---|---|---|
| q₁ ("cat") | 0.1×0.1+0.1×0.2+0.3×0.8+0.2×0.1 = 0.27 | 0.1×0.3+0.1×0.4+0.3×0.2+0.2×0.7 = 0.27 | 0.1×0.8+0.1×0.1+0.3×0.3+0.2×0.2 = 0.22 |
| q₂ ("dog") | 0.2×0.1+0.8×0.2+0.1×0.8+0.4×0.1 = 0.30 | 0.2×0.3+0.8×0.4+0.1×0.2+0.4×0.7 = 0.68 | 0.2×0.8+0.8×0.1+0.1×0.3+0.4×0.2 = 0.35 |
Step 3:应用MaxSim
-
对于 q₁("cat"),最大相似度为 max(0.27,0.27,0.22)=0.27
-
对于 q₂("dog"),最大相似度为 max(0.30,0.68,0.35)=0.68
Step 4:汇总得分

这个分数体现了查询中的每个词都在文档中找到了它最相关的匹配-25。
六、三种检索方式的对比与总结

在实际评测中,采用三种方式联合检索的BGE-M3(ALL)在三项评测中全面领先,而BGE-M3(Dense)稠密检索在多语言、跨语言检索中具有明显优势。
七、训练方法与数据
7.1 训练数据
BGE-M3的训练数据来自三个来源:
1. 无监督数据(Unsupervised Data) :从Wikipedia、S2ORC、xP3、mC4和CC-News等多语言语料库中提取。通过提取丰富的语义结构(如标题-正文、标题-摘要等)来构建文本对。无监督数据规模达到1.2亿文本对 ,覆盖194种语言 和2655种跨语言对应关系。
2. 微调数据(Fine-tuning Data) :来自标注语料库的高质量数据。英语数据集包括HotpotQA、TriviaQA、NQ、MS MARCO等;中文数据集包括DuReader、T2-Ranking、NLI-zh等。
3. 合成数据(Synthetic Data) :为解决长文档检索任务中数据不足的问题,从Wikipedia和MC4数据集中随机选择长文章,使用GPT-3.5生成问题,构成新的文本对。
7.2 训练流程
BGE-M3的训练分为多个阶段:
第一阶段:使用大量无监督数据对文本编码器进行预训练,其中仅训练稠密检索的基本形式。
第二阶段 :应用自知识蒸馏(Self-Knowledge Distillation) ,使用标注和合成数据对模型进行微调,建立三种检索功能。自知识蒸馏将不同检索功能的相关性分数整合为教师信号,以增强训练质量。基于集成学习原理,这些异构预测器可以组合成更强的预测器。
7.3 Efficient Batching策略
为了确保嵌入的区分性,BGE-M3优化了批处理策略:
-
训练数据按序列长度分组进行预处理,显著减少序列填充
-
通过梯度检查点(Gradient Checkpointing)和跨GPU广播进一步划分小批量
-
在长度为8192时,启用split-batch可使batch size增长超过20倍
八、混合检索的实际应用
BGE-M3的多功能性为混合检索 提供了天然支持。官方推荐在RAG系统中使用 "混合检索 + 重排序" 的pipeline:
第一棒(粗筛) :使用计算高效的稠密检索或稀疏检索,从海量文档中快速召回Top-K个候选集。
第二棒(精排) :将Top-K候选文档送入多向量(ColBERT)模块进行细粒度的晚期交互重排序。
最终的综合相关性分数为:

由于多向量方法的计算成本较高,通常先用稠密或稀疏方法检索候选结果,再用多向量方法进行重排序-7。
九、代码示例
使用FlagEmbedding库可以轻松调用BGE-M3的全部三种功能:
python
from FlagEmbedding import BGEM3FlagModel
# 加载模型,GPU推理建议开启use_fp16
model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True)
# 编码文本,同时返回三种向量
sentences = [
"BGE M3 is an embedding model supporting dense retrieval, "
"lexical matching and multi-vector interaction."
]
output = model.encode(
sentences,
return_dense=True, # 稠密向量
return_sparse=True, # 稀疏向量(词汇权重)
return_colbert_vecs=True # 多向量(ColBERT风格)
)
# 输出包含三种表示
print(output.keys())
# dict_keys(['dense_vecs', 'lexical_weights', 'colbert_vecs'])
# 访问稀疏向量(词汇权重)
sparse_weights = output['lexical_weights']
print(sparse_weights)
# 输出类似: {12345: 2.1, 67890: 1.5, ...}
十、总结
BGE-M3通过一次推理同时输出稠密向量、稀疏向量和多向量三种表示,实现了对语义理解、精确关键词匹配和细粒度交互的统一支持-。其核心创新可概括为:
-
多语言:支持100+种语言,在MIRACL和MKQA等基准上达到新的SOTA
-
多粒度:通过MCLS策略支持最长8192 token的输入
-
多功能:一站式集成稠密、稀疏、多向量三种检索方式
在算法层面,三种检索方式各有其数学原理和适用场景,通过混合检索可以充分发挥各自的优势。BGE-M3为RAG系统提供了一个真正意义上的通用语义向量模型底座,目前已向社区全面开源并支持免费商用许可。