更多详情请参考我们的 GitHub 仓库: https://github.com/FlagOpen/FlagEmbedding
在本项目中,我们引入了 BGE-M3,其特点在于多功能性、多语言性和多粒度性。
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/2/1: 感谢 Vespa 提供的优秀工具。 您可以轻松使用 BGE-M3 的多种模式,参考此 notebook
| 模型名称 | 维度 | 序列长度 | 介绍 |
|---|---|---|---|
| BAAI/bge-m3 | 1024 | 8192 | 多语言;从 bge-m3-unsupervised 进行统一微调(密集、稀疏和 colbert) |
| BAAI/bge-m3-unsupervised | 1024 | 8192 | 多语言;从 bge-m3-retromae 进行对比学习 |
| BAAI/bge-m3-retromae | -- | 8192 | 多语言;将 xlm-roberta 的最大长度扩展到 8192,并通过 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 | 英语模型 |
| 数据集 | 介绍 |
|---|---|
| MLDR | 文档检索数据集,涵盖 13 种语言 |
| bge-m3-data | bge-m3 使用的微调数据 |
1. 不同检索方法的介绍
2. 如何在其他项目中使用 BGE-M3?
对于嵌入检索,您可以使用与 BGE 相同的方法来使用 BGE-M3 模型。 唯一的区别是 BGE-M3 模型不再需要在查询中添加指令。
3. 如何微调 bge-M3 模型?
您可以按照此 示例 中的常见方法来微调密集嵌入。
如果您想微调 m3 的所有嵌入功能(密集、稀疏和 colbert),请参考 unified_fine-tuning 示例。
安装方法:
git clone https://github.com/FlagOpen/FlagEmbedding.git
cd FlagEmbedding
pip install -e .或者:
pip install -U FlagEmbeddingfrom 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.0from 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]
# }
BGE-M3 模型在本基准测试中表现最为出色(OAI 代表 OpenAI)。 更多详细信息,请参阅 文章 和 Github 仓库。


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

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

更多细节,请参考我们的 报告。
感谢开源数据集的作者们,包括 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. **交付反馈**:将最终翻译文本交付给客户,并收集反馈以持续改进服务。
## 适用领域
- **法律**:合同、法规、诉讼文件等。
- **医学**:研究报告、临床试验、药品说明书等。
- **技术**:用户手册、技术文档、专利文件等。
## 联系我们
如有任何疑问或需要进一步的信息,请随时联系我们的客户服务团队。