FlagEmbedding项目BGE-M3多模态嵌入模型详解
概述
FlagEmbedding项目中的BGE-M3是一个功能强大的多模态嵌入模型,它支持三种不同的检索方式:稠密检索(Dense Retrieval)、稀疏检索(Lexical Matching)和多向量交互(Multi-Vector Interaction)。这种多功能的特性使其在各种信息检索场景中都能表现出色。
环境准备
在开始使用BGE-M3之前,需要安装必要的Python包:
pip install -U transformers FlagEmbedding accelerate
这些包包括:
- transformers:Hugging Face提供的Transformer模型库
- FlagEmbedding:包含BGE-M3模型的专用库
- accelerate:用于加速模型推理
模型架构
BGE-M3的基础模型是XLM-RoBERTa-large,这是一个多语言版本的RoBERTa模型。它包含以下主要组件:
- 词嵌入层:将输入token映射为1024维向量
- 24层Transformer编码器:每层包含自注意力机制和前馈网络
- 池化层:用于生成句子级别的表示
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-m3")
raw_model = AutoModel.from_pretrained("BAAI/bge-m3")
多功能检索方式
1. 稠密检索
稠密检索使用[CLS]token的归一化隐藏状态作为整个句子的嵌入表示:
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True)
embeddings = model.encode(sentences, max_length=100)['dense_vecs']
计算相似度时,可以使用内积或其他相似度函数:
similarity = embeddings_1 @ embeddings_2.T
2. 稀疏检索
稀疏检索通过线性层和ReLU激活函数生成token级别的权重:
output = model.encode(sentences, return_sparse=True)
lexical_weights = output['lexical_weights']
相似度计算基于共现term的权重乘积:
score = model.compute_lexical_matching_score(weights1, weights2)
3. 多向量交互
多向量方法利用整个输出嵌入进行细粒度匹配:
output = model.encode(sentences, return_colbert_vecs=True)
colbert_vecs = output['colbert_vecs']
相似度计算采用ColBERT的"late-interaction"方法:
score = model.colbert_score(vecs1, vecs2)
混合排序策略
BGE-M3的强大之处在于可以结合三种检索方式的优势:
- 先用稠密或稀疏方法进行初步检索
- 然后对候选结果使用混合分数重新排序
混合分数计算公式:
final_score = (dense_score + lexical_score + colbert_score) / 3
实际应用建议
- 长文本处理:可以通过设置max_length参数控制输入长度以提升效率
- 精度与效率权衡:
- 稠密检索:平衡效率与精度
- 稀疏检索:适合term匹配重要场景
- 多向量:精度最高但计算成本高
- 混合使用:初步检索+重排序是最佳实践
BGE-M3的多功能性使其成为信息检索领域的强大工具,开发者可以根据具体场景灵活选择最适合的检索方式或组合策略。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考