有关更多详细信息,请参阅我们的 github 存储库: https://github.com/FlagOpen/FlagEmbedding

在这个项目中,我们引入了BGE-M3,它以其多功能性、多语言性和多粒度性而著称。

  • 多功能:可以同时执行嵌入模型的三种常见检索功能:密集检索、多向量检索和稀疏检索。
  • 多语言:可支持100多种工作语言。
  • 多粒度:它能够处理不同粒度的输入,从短句子到最多 8192 个标记的长文档。

RAG 中检索管道的一些建议

我们建议使用以下管道:混合检索+重新排序。

  • 混合检索结合了多种方法的优点,具有更高的准确率和更强的泛化能力。 一个经典的例子:同时使用嵌入检索和 BM25 算法。
    现在,您可以尝试使用BGE-M3,它同时支持嵌入和稀疏检索。 这允许您在生成密集嵌入时获得令牌权重(类似于 BM25),而无需任何额外成本。 使用混合检索可以参考VespaMilvus

  • 作为跨编码器模型,重排序器表现出比双编码器嵌入模型更高的准确性。检索后利用重排序模型(例如bge-rerankerbge-reranker-v2 )可以进一步过滤所选文本。

 消息:

  • 2024年7月1日:我们更新了BGE-M3的MIRACL评估结果。要重现新结果,您可以参考: bge-m3_miracl_2cr 。我们还更新了 arXiv 上的论文

     细节

    之前的测试结果较低是因为我们错误地从搜索结果中删除了与查询具有相同 id 的段落。
    纠正这个错误后,BGE-M3在MIRACL上的整体性能高于之前的结果,但实验结论保持不变。其他结果不受此错误影响。要重现之前较低的结果,您需要在使用pyserini.search.faisspyserini.search.lucene搜索段落时添加--remove-query参数。

  • 2024/3/20:**感谢 Milvus 团队!**现在您可以在 Milvus 中使用 bge-m3 的混合检索: pymilvus/examples /hello_hybrid_sparse_dense.py

  • 2024/3/8:感谢@Yannael实验结果。在该基准测试中,BGE-M3 在英语和其他语言上均取得了顶级性能,超越了 OpenAI 等模型。

  • 2024/3/2:发布统一微调示例数据

  • 2024年2月6日:我们发布了MLDR (涵盖13种语言的长文档检索数据集)和评估管道

  • 2024/2/1:**感谢 Vespa 提供的优秀工具。**跟随这款笔记本,您可以轻松使用BGE-M3的多种模式

 规格

  •  模型

  •  数据

 常问问题

1. 不同检索方式介绍

  • 密集检索:将文本映射到单个嵌入中,例如DPRBGE-v1.5
  • 稀疏检索(词汇匹配):大小等于词汇量的向量,大多数位置设置为零,仅计算文本中存在的标记的权重。例如,BM25、 unicoilspade
  • 多向量检索:使用多个向量来表示文本,例如ColBERT

2.如何在其他项目中使用BGE-M3?

对于嵌入检索,您可以采用与 BGE 相同的方法的 BGE-M3 模型。唯一的区别是 BGE-M3 模型不再需要向查询添加指令。

对于混合检索,您可以使用VespaMilvus

3.如何对bge-M3模型进行微调?

您可以按照本中的常见内容来微调密集嵌入。

如果你想微调m3的所有嵌入函数(dense、sparse和colbert),可以参考unified_fine-tuning示例

 用法

 安装:

git clone https://github.com/FlagOpen/FlagEmbedding.git
cd FlagEmbedding
pip install -e .

 或者:

pip install -U FlagEmbedding

生成文本嵌入

  •  密集嵌入
1
from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation sentences_1 = ["What is BGE M3?", "Defination of BM25"] sentences_2 = ["BGE M3 is an embedding model supporting dense retrieval, lexical matching and multi-vector interaction.", "BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document"] embeddings_1 = model.encode(sentences_1, batch_size=12, max_length=8192, # If you don't need such a long length, you can set a smaller value to speed up the encoding process. )['dense_vecs'] embeddings_2 = model.encode(sentences_2)['dense_vecs'] similarity = embeddings_1 @ embeddings_2.T print(similarity) # [[0.6265, 0.3477], [0.3499, 0.678 ]]

您还可以使用句子转换器和拥抱脸转换器来生成密集嵌入。详细信息请参阅baai_general_embedding

  • 稀疏嵌入(词汇权重)
1
from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation sentences_1 = ["What is BGE M3?", "Defination of BM25"] sentences_2 = ["BGE M3 is an embedding model supporting dense retrieval, lexical matching and multi-vector interaction.", "BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document"] output_1 = model.encode(sentences_1, return_dense=True, return_sparse=True, return_colbert_vecs=False) output_2 = model.encode(sentences_2, return_dense=True, return_sparse=True, return_colbert_vecs=False) # you can see the weight for each token: print(model.convert_id_to_token(output_1['lexical_weights'])) # [{'What': 0.08356, 'is': 0.0814, 'B': 0.1296, 'GE': 0.252, 'M': 0.1702, '3': 0.2695, '?': 0.04092}, # {'De': 0.05005, 'fin': 0.1368, 'ation': 0.04498, 'of': 0.0633, 'BM': 0.2515, '25': 0.3335}] # compute the scores via lexical mathcing lexical_scores = model.compute_lexical_matching_score(output_1['lexical_weights'][0], output_2['lexical_weights'][0]) print(lexical_scores) # 0.19554901123046875 print(model.compute_lexical_matching_score(output_1['lexical_weights'][0], output_1['lexical_weights'][1])) # 0.0
  •  多向量 (ColBERT)
1
from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True) sentences_1 = ["What is BGE M3?", "Defination of BM25"] sentences_2 = ["BGE M3 is an embedding model supporting dense retrieval, lexical matching and multi-vector interaction.", "BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document"] output_1 = model.encode(sentences_1, return_dense=True, return_sparse=True, return_colbert_vecs=True) output_2 = model.encode(sentences_2, return_dense=True, return_sparse=True, return_colbert_vecs=True) print(model.colbert_score(output_1['colbert_vecs'][0], output_2['colbert_vecs'][0])) print(model.colbert_score(output_1['colbert_vecs'][0], output_2['colbert_vecs'][1])) # 0.7797 # 0.4620

计算文本对的分数

输入文本对列表,即可得到不同方法计算出的分数。

1
from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True) sentences_1 = ["What is BGE M3?", "Defination of BM25"] sentences_2 = ["BGE M3 is an embedding model supporting dense retrieval, lexical matching and multi-vector interaction.", "BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document"] sentence_pairs = [[i,j] for i in sentences_1 for j in sentences_2] print(model.compute_score(sentence_pairs, max_passage_length=128, # a smaller max length leads to a lower latency weights_for_different_modes=[0.4, 0.2, 0.4])) # weights_for_different_modes(w) is used to do weighted sum: w[0]*dense_score + w[1]*sparse_score + w[2]*colbert_score # { # 'colbert': [0.7796499729156494, 0.4621465802192688, 0.4523794651031494, 0.7898575067520142], # 'sparse': [0.195556640625, 0.00879669189453125, 0.0, 0.1802978515625], # 'dense': [0.6259765625, 0.347412109375, 0.349853515625, 0.67822265625], # 'sparse+dense': [0.482503205537796, 0.23454029858112335, 0.2332356721162796, 0.5122477412223816], # 'colbert+sparse+dense': [0.6013619303703308, 0.3255828022956848, 0.32089319825172424, 0.6232916116714478] # }

评估

我们提供MKQAMLDR的评估脚本。

来自开源社区的基准

[注意:请根据上面内容,做到下面操作
avatar

BGE-M3 模型基准测试表现

BGE-M3 模型在最近的基准测试中取得了最佳成绩,超越了 OpenAI(OAI)的相关模型。以下是我们的成果概述:

多语言支持(Miracl 数据集)

我们的模型在多语言环境下表现出色,特别是在 Miracl 数据集上。这表明 BGE-M3 在处理不同语言的文本时具有很高的准确性和可靠性。

参考资源

我们的成果

  • 多语言支持:BGE-M3 模型在 Miracl 数据集上的表现证明了其在多语言处理方面的强大能力。 以上信息提供了 BGE-M3 模型在基准测试中的优异表现和多语言处理能力的概述。
    avatar
    ](https://hf-mirror.com/BAAI/bge-m3/blob/main/imgs/miracl.jpg)

  • 跨语言(MKQA 数据集)


avatar

  •  长文档检索

    •  MLDR:
      [
      avatar
      aaaaaaa 我们构建了一个名为 MLDR 的文档检索数据集,该数据集覆盖了13种语言,并且包含了测试集、验证集以及训练集。MLDR 数据集的创建旨在通过使用其训练集来提升模型在长文档检索上的能力。 为了确保评估的公正性,在对比实验中我们选择将经过 MLDR 训练集微调后的模型与Dense wolong(即未采用长文档数据集进行微调的基线模型)进行比较。 此外,我们计划将此多语言长文本检索数据集开源,以填补目前在这方面开放资源的空缺。我们相信这将为开源社区提供宝贵的数据支持,促进更多高质量文档检索模型的发展。
      avatar
      我们利用Pyserini来实现BM25,并且可以通过该脚本重现测试结果。我们使用两种不同的分词器测试 BM25:一种使用 Lucene Analyzer,另一种使用与 M3 相同的分词器(即 xlm-roberta 的分词器)。结果表明 BM25 仍然是一个有竞争力的基线,特别是在长文档检索方面。
      avatar
      本研究介绍了一种基于自知识蒸馏和高效批处理技术的训练方法,旨在提高长文本微调时的效率。该方法通过组合不同检索模式的多个输出作为奖励信号,以增强单一模式的性能,特别适用于稀疏检索和多向量(colbert)检索。此外,还提出了一种无需微调即可提高长文本性能的简单方法MCLS,对于资源有限的用户来说非常有用。更多详细信息请参阅我们的报告。
@misc{bge-m3,
      title={BGE M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings Through Self-Knowledge Distillation}, 
      author={Jianlv Chen and Shitao Xiao and Peitian Zhang and Kun Luo and Defu Lian and Zheng Liu},
      year={2024},
      eprint={2402.03216},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}