BGE-M3 是一个多功能、多语言、多粒度的嵌入模型,具有以下特点:
多功能性 (Multi-Functionality): BGE-M3 同时支持三种常见的检索功能,包括密集检索、多向量检索和稀疏检索。
多语言性 (Multi-Linguality): 支持100多种语言,具有广泛的应用场景。
多粒度性 (Multi-Granularity): 能够处理从短句到8192个token的长文档输入,满足不同任务的需求。
检索流程的建议:
我们建议使用“混合检索+重排序”的方式进行检索。
混合检索 (Hybrid Retrieval) 利用多种方法的优势,提升检索准确率和泛化能力。经典的混合检索方案包括结合嵌入检索与BM25算法,现在你可以使用支持密集与稀疏检索的 BGE-M3,在生成密集嵌入的同时获得类似 BM25 的词元权重。可以参考 Vespa 和 Milvus 实现混合检索。
重排序 (Re-Ranking) 模型通过交叉编码器的方式,比双编码器模型具有更高的准确率。例如,在检索后使用 bge-reranker 或 bge-reranker-v2 进一步筛选文本。
最新动态
- 2024年7月1日: 更新了 BGE-M3 在 MIRACL 评测中的结果,并发布了bge-m3_miracl_2cr代码复现指南。
- 2024年3月20日: Milvus团队帮助实现了 BGE-M3 在 Milvus 中的混合检索,相关代码可以参考
pymilvus/examples/hello_hybrid_sparse_dense.py
。 - 2024年3月8日: 在最新的基准测试中,BGE-M3 在英语及多种语言中表现优异,超越了诸如 OpenAI 的模型。
- 2024年2月6日: 发布了MLDR(覆盖13种语言的长文档检索数据集)和评测流程。
技术规格
模型名 | 维度 | 序列长度 | 介绍 |
---|---|---|---|
BAAI/bge-m3 | 1024 | 8192 | 多语言,基于统一的微调(密集、稀疏、ColBERT) |
BAAI/bge-m3-unsupervised | 1024 | 8192 | 对比学习训练,来自 bge-m3-retromae |
BAAI/bge-large-en-v1.5 | 1024 | 512 | 英文模型 |
BAAI/bge-base-en-v1.5 | 768 | 512 | 英文模型 |
BAAI/bge-small-en-v1.5 | 384 | 512 | 英文模型 |
不同检索方法的介绍
- 密集检索: 通过将文本映射到单一嵌入向量进行检索,例如 DPR、BGE-v1.5。
- 稀疏检索(词汇匹配): 通过计算文本中出现的词元权重,常用模型如 BM25、unicoil、splade。
- 多向量检索: 使用多个向量来表示文本,例如 ColBERT。
如何在其他项目中使用 BGE-M3
- 对于嵌入检索,可以按照 BGE 的用法使用 BGE-M3,只是 BGE-M3 不再需要为查询添加指令。
- 对于混合检索,可以使用 Vespa 和 Milvus。
BGE-M3 使用教程
-
安装:
git clone https://github.com/FlagOpen/FlagEmbedding.git cd FlagEmbedding pip install -e .
或直接安装:
pip install -U FlagEmbedding
-
生成密集嵌入:
from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True) sentences = ["What is BGE M3?", "Definition of BM25"] embeddings = model.encode(sentences, batch_size=12, max_length=8192)['dense_vecs']
-
生成稀疏嵌入:
from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True) output = model.encode(sentences, return_dense=True, return_sparse=True) lexical_weights = output['lexical_weights'] print(model.convert_id_to_token(lexical_weights))
-
生成多向量嵌入:
from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True) output = model.encode(sentences, return_dense=True, return_sparse=True, return_colbert_vecs=True) print(model.colbert_score(output['colbert_vecs'][0], output['colbert_vecs'][1]))
-
文本对评分:
sentence_pairs = [[i,j] for i in sentences_1 for j in sentences_2] scores = model.compute_score(sentence_pairs, max_passage_length=128, weights_for_different_modes=[0.4, 0.2