BAAI/bge-m3
模型介绍模型推理文件和版本Pull Requests讨论分析
下载使用量0

更多详情请参考我们的 GitHub 仓库: https://github.com/FlagOpen/FlagEmbedding

BGE-M3 (论文, 代码)

在本项目中,我们引入了 BGE-M3,其特点在于多功能性、多语言性和多粒度性。

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

RAG 检索管道的建议

我们推荐使用以下管道:混合检索 + 重排序。

  • 混合检索利用了各种方法的优势,提供了更高的准确性和更强的泛化能力。 一个经典的例子:同时使用嵌入检索和 BM25 算法。 现在,您可以尝试使用 BGE-M3,它支持嵌入和稀疏检索。 这使得在生成密集嵌入时,无需额外成本即可获得 token 权重(类似于 BM25)。 要使用混合检索,您可以参考 Vespa 和 Milvus。

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

新闻:

  • 2024/7/1: 我们更新了 BGE-M3 的 MIRACL 评估结果。要复现新结果,请参考:bge-m3_miracl_2cr。我们还在 arXiv 上更新了我们的 论文。

    详情

    之前的测试结果较低,因为我们错误地从搜索结果中移除了与查询具有相同 id 的段落。纠正此错误后,BGE-M3 在 MIRACL 上的整体性能高于之前的结果,但实验结论保持不变。其他结果不受此错误影响。要复现之前的较低结果,您需要在使用 pyserini.search.faiss 或 pyserini.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 的多种模式,参考此 notebook

规格

  • 模型
模型名称维度序列长度介绍
BAAI/bge-m310248192多语言;从 bge-m3-unsupervised 进行统一微调(密集、稀疏和 colbert)
BAAI/bge-m3-unsupervised10248192多语言;从 bge-m3-retromae 进行对比学习
BAAI/bge-m3-retromae--8192多语言;将 xlm-roberta 的最大长度扩展到 8192,并通过 retromae 进一步预训练
BAAI/bge-large-en-v1.51024512英语模型
BAAI/bge-base-en-v1.5768512英语模型
BAAI/bge-small-en-v1.5384512英语模型
  • 数据
数据集介绍
MLDR文档检索数据集,涵盖 13 种语言
bge-m3-databge-m3 使用的微调数据

常见问题

1. 不同检索方法的介绍

  • 密集检索: 将文本映射到一个嵌入,例如,DPR, BGE-v1.5
  • 稀疏检索(词汇匹配): 大小等于词汇表的向量,大多数位置设置为零,仅对文本中存在的 token 计算权重。例如,BM25, unicoil, 和 splade
  • 多向量检索: 使用多个向量表示文本,例如,ColBERT。

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

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

对于混合检索,您可以使用 Vespa 和 Milvus。

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

您可以按照此 示例 中的常见方法来微调密集嵌入。

如果您想微调 m3 的所有嵌入功能(密集、稀疏和 colbert),请参考 unified_fine-tuning 示例。

使用说明

安装方法:

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) # 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 ]]

你也可以使用 sentence-transformers 和 huggingface transformers 来生成稠密嵌入(dense embeddings)。

详细信息请参考 baai_general_embedding。

  • 稀疏嵌入(词法权重)
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)
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

计算文本对的得分

输入一系列文本对,您可以获得通过不同方法计算得出的得分。

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]
# }

评估

我们为 MKQA 和 MLDR 提供了评估脚本。

开源社区基准

avatar

BGE-M3 模型在本基准测试中表现最为出色(OAI 代表 OpenAI)。 更多详细信息,请参阅 文章 和 Github 仓库。

我们的成果

  • 多语言(Miracl 数据集)

avatar

  • 跨语言(MKQA 数据集)

avatar

  • 长文档检索

    • MLDR:
      avatar 请注意,MLDR 是我们通过 LLM 构建的一个文档检索数据集,包含 13 种语言,包括测试集、验证集和训练集。 我们使用了 MLDR 的训练集来增强模型的长文档检索能力。 因此,与 Dense w.o.long(不使用长文档数据集的微调)基线进行比较更为公平。 此外,这个长文档检索数据集将开源,以解决目前开源多语言长文本检索数据集的缺乏问题。 我们相信这些数据将对开源社区训练文档检索模型有所帮助。

    • NarritiveQA:
      avatar

  • 与 BM25 的比较

我们使用 Pyserini 实现了 BM25,测试结果可以通过这个 脚本 复现。 我们使用两种不同的分词器测试了 BM25: 一种是使用 Lucene Analyzer,另一种使用与 M3 相同的分词器(即 xlm-roberta 的分词器)。 结果显示,BM25 仍然是一个有竞争力的基线,特别是在长文档检索方面。

avatar

训练

  • 自知识蒸馏:将不同检索模式的多个输出作为奖励信号结合,以提高单一模式(尤其是稀疏检索和 multi-vec(colbert) 检索)的性能
  • 高效批量处理:在长文本上进行微调时提高效率。 小批量策略简单但有效,也可用于微调大型嵌入模型。
  • MCLS:一种在不进行微调的情况下提高长文本性能的简单方法。 如果您没有足够的资源在长文本上微调模型,该方法非常有用。

更多细节,请参考我们的 报告。

致谢

感谢开源数据集的作者们,包括 Miracl、MKQA、NarritiveQA 等。 感谢开源库,如 Tevatron、Pyserini。

引用

如果您发现这个仓库有用,请考虑给予一个星标 :star: 和引用。

@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}
}
# 专业翻译服务

## 服务概述
我们提供高质量的文本翻译服务,旨在满足不同领域的专业需求。无论是法律文件、医学报告还是技术手册,我们的团队都能确保翻译的准确性和流畅性。

## 服务特点
- **通俗易懂**:我们致力于将复杂的术语转化为易于理解的语言,确保信息传递的清晰性。
- **专业精准**:我们的翻译团队由行业专家组成,确保每个术语和表达都符合专业标准。
- **优雅流畅**:我们注重语言的美感,力求在保持专业性的同时,使文本读起来自然流畅。

## 服务流程
1. **需求分析**:与客户沟通,了解具体的翻译需求和目标。
2. **文本评估**:对原文进行详细分析,确定翻译的难度和所需时间。
3. **翻译执行**:由专业翻译人员进行文本翻译,确保质量。
4. **校对审核**:经过多轮校对和审核,确保翻译的准确性和一致性。
5. **交付反馈**:将最终翻译文本交付给客户,并收集反馈以持续改进服务。

## 适用领域
- **法律**:合同、法规、诉讼文件等。
- **医学**:研究报告、临床试验、药品说明书等。
- **技术**:用户手册、技术文档、专利文件等。

## 联系我们
如有任何疑问或需要进一步的信息,请随时联系我们的客户服务团队。