BGE、FlagEmbedding



一、关于 BGE

BGE-M3,是一个具有多功能、多语言和多粒度特性的文本检索模型。



关于 FlagEmbedding、FlagOpen、BAAI

FlagEmbedding 专注于检索增强llm领域,目前包括以下项目:


FlagOpen 是 BAAI 大模型技术相关项目。FlagOpen 官网:https://flagopen.baai.ac.cn/

关于 BAAI 和 FlagOpen 可参考 : https://blog.csdn.net/lovechris00/article/details/136898918


相关新闻

  • 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的多种模式

二、FlagEmbedding 项目


BGE-M3


BGE-M3 是第一个具有多功能、多语言和多粒度特性的文本检索模型。

  • 多功能:可以同时执行三种检索功能:单向量检索、多向量检索和稀疏检索。
  • 多语言:支持100多种工作语言。
  • 多粒度:它能够处理不同粒度的输入,从短句子到长达8192个词汇的长文档。

在本项目中,为了提高单一检索模式的性能,提出了一种新的自知识蒸馏方法。 我们优化了批处理策略,支持大批处理大小,这可以在对长文本或大型语言模型进行向量微调时简单使用。 我们还构建了一个用于文档检索的数据集,并提出了一个简单的策略来提高长文本的建模能力。 训练代码和微调数据将在不久的将来开源。


Visualized-BGE

https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/visual

在这个项目中,我们发布了Visualized-BGE。 通过引入image token embedding,Visualized-BGE可以被用来编码混合图文数据。它可以被应用在广泛的多模态检索任务中,包括但不限于:多模态知识检索,多模态查询的图像检索等。


LongLLM QLoRA

https://github.com/FlagOpen/FlagEmbedding/tree/master/Long_LLM/longllm_qlora

我们通过 QLoRA 微调将 Llama-3-8B-Instruct 的上下文长度从 8K 扩展到 80K。 整个训练过程非常高效,在一台8xA800 (80G) GPU 机器上仅需要8个小时。 该模型在NIHS、主题检索和长上下文语言理解等广泛的评估任务中表现出卓越的性能; 同时,它在短上下文中也很好地保留了其原有的能力。 如此强大的长文本能力主要归因于GPT-4生成的仅3.5K合成数据,这表明LLM具有扩展其原始上下文的固有(但在很大程度上被低估)潜力。 事实上,一旦有更多的计算资源,该方法可以将上下文长度扩展更长。


Activation Beacon

https://github.com/FlagOpen/FlagEmbedding/tree/master/Long_LLM/activation_beacon

由于有限的上下文窗口长度,有效利用长上下文信息是对大型语言模型的一个巨大挑战。 Activation Beacon 将 LLM 的原始激活压缩为更紧凑的形式,以便它可以在有限的上下文窗口中感知更长的上下文。 它是一种有效、高效、兼容、低成本(训练)的延长LLM上下文长度的方法。 更多细节请参考技术报告代码


LM-Cocktail

模型合并被用于提高单模型的性能。 我们发现这种方法对大型语言模型和文本向量模型也很有用, 并设计了”语言模型鸡尾酒“方案,其自动计算融合比例去融合基础模型和微调模型。 利用LM-Cocktail可以缓解灾难性遗忘问题,即在不降低通用性能的情况下提高目标任务性能。 通过构造少量数据样例,它还可以用于为新任务生成模型,而无需进行微调。 它可以被使用来合并生成模型或向量模型。 更多细节请参考技术报告代码


LLM Embedder

https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/llm_embedder

LLM-Embedder向量模型是根据LLM的反馈进行微调的。 它可以支持大型语言模型的检索增强需求,包括知识检索、记忆检索、示例检索和工具检索。 它在6个任务上进行了微调:问题回答,对话搜索,长对话, 长文本建模、上下文学习和工具学习。 更多细节请参考./FlagEmbedding/llm_embedder/README.md


BGE Reranker

https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/reranker

交叉编码器将对查询和答案实时计算相关性分数,这比向量模型(即双编码器)更准确,但比向量模型更耗时。 因此,它可以用来对嵌入模型返回的前k个文档重新排序。 我们在多语言数据上训练了交叉编码器,数据格式与向量模型相同,因此您可以根据我们的示例 轻松地对其进行微调。 更多细节请参考./FlagEmbedding/reranker/README.md

我们提供了新版的交叉编码器,支持更多的语言以及更长的长度。使用的数据格式与向量模型类似,但是新增了prompt用于微调以及推理。您可以使用特定的层进行推理或使用完整的层进行推理,您可以根根据我们的示例 轻松地对其进行微调。 更多细节请参考./FlagEmbedding/llm_reranker/README.md


BGE Embedding

https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/baai_general_embedding

BGE Embedding是一个通用向量模型。 我们使用retromae 对模型进行预训练,再用对比学习在大规模成对数据上训练模型。 你可以按照我们的示例 在本地数据上微调嵌入模型。 我们还提供了一个预训练示例 。 请注意,预训练的目标是重构文本,预训练后的模型无法直接用于相似度计算,需要进行微调之后才可以用于相似度计算。 更多关于bge的训练情况请参阅论文代码.

注意BGE使用CLS的表征作为整个句子的表示,如果使用了错误的方式(如mean pooling)会导致效果很差。


C-MTEB

https://github.com/FlagOpen/FlagEmbedding/tree/master/C_MTEB

中文向量榜单,已整合入MTEB中。更多细节参考 论文代码.


三、FlagEmbedding 模型列表

ModelLanguageDescriptionquery instruction for retrieval [1]
BAAI/bge-m3Multilingual推理微调多功能(向量检索,稀疏检索,多表征检索)、多语言、多粒度(最大长度8192)
LM-CocktailEnglish微调的Llama和BGE模型,可以用来复现LM-Cocktail论文的结果
BAAI/llm-embedderEnglish推理微调专为大语言模型各种检索增强任务设计的向量模型详见 README
BAAI/bge-reranker-largeChinese and English推理微调交叉编码器模型,精度比向量模型更高但推理效率较低 [2]
BAAI/bge-reranker-baseChinese and English推理微调交叉编码器模型,精度比向量模型更高但推理效率较低 [2]
BAAI/bge-large-en-v1.5English推理微调1.5版本,相似度分布更加合理Represent this sentence for searching relevant passages:
BAAI/bge-base-en-v1.5English推理微调1.5版本,相似度分布更加合理Represent this sentence for searching relevant passages:
BAAI/bge-small-en-v1.5English推理微调1.5版本,相似度分布更加合理Represent this sentence for searching relevant passages:
BAAI/bge-large-zh-v1.5Chinese推理微调1.5版本,相似度分布更加合理为这个句子生成表示以用于检索相关文章:
BAAI/bge-base-zh-v1.5Chinese推理微调1.5版本,相似度分布更加合理为这个句子生成表示以用于检索相关文章:
BAAI/bge-small-zh-v1.5Chinese推理微调1.5版本,相似度分布更加合理为这个句子生成表示以用于检索相关文章:
BAAI/bge-large-enEnglish推理微调向量模型,将文本转换为向量Represent this sentence for searching relevant passages:
BAAI/bge-base-enEnglish推理微调base-scale 向量模型Represent this sentence for searching relevant passages:
BAAI/bge-small-enEnglish推理微调small-scale 向量模型Represent this sentence for searching relevant passages:
BAAI/bge-large-zhChinese推理微调向量模型,将文本转换为向量为这个句子生成表示以用于检索相关文章:
BAAI/bge-base-zhChinese推理微调base-scale 向量模型为这个句子生成表示以用于检索相关文章:
BAAI/bge-small-zhChinese推理微调small-scale 向量模型为这个句子生成表示以用于检索相关文章:

四、RAG retrieval pipeline 中的使用建议

我们建议使用以下管道:混合检索+重新排序(hybrid retrieval + re-ranking)。

  • 混合检索结合了多种方法的优点,具有更高的准确率和更强的泛化能力。
    一个典型的例子:同时使用嵌入检索和 BM25 算法。
    现在,您可以尝试使用BGE-M3,它同时支持嵌入和稀疏检索。这允许您在生成密集嵌入时获得 token 权重(类似于 BM25),而无需任何额外成本。
    使用混合检索可以参考VespaMilvus
  • 作为跨编码器模型,重排序器 表现出比双编码器嵌入模型更高的准确性。检索后利用重排序模型(例如bge-rerankerbge-reranker-v2)可以进一步过滤所选文本。


五、BGE-M3 Specs

  • 模型
型号名称方面序列长度介绍
BAAI/bge-m310248192多语言; 来自 bge-m3-unsupervised 的统一微调(dense, sparse, 和 colbert)
BAAI/bge-m3-unsupervised10248192多语言; bge-m3-retromae 的对比学习
BAAI/bge-m3-retromae8192多语言;将xlm-roberta的 max_length 扩展到 8192 并通过Retromae 进一步预训练
BAAI/bge-large-en-v1.51024512英文模型
BAAI/bge-base-en-v1.5768512英文模型
BAAI/bge-small-en-v1.5384512英文模型
  • 数据
数据集介绍
MLDR文献检索数据集,涵盖13种语言
bge-m3-数据微调 bge-m3 使用的数据

六、常问问题

1. 不同检索方式介绍

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

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

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

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


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

按照这个例子里常见的内容 来微调密集嵌入:https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/finetune

如果你想微调m3的所有嵌入函数(dense、sparse和colbert),可以参考 unified_fine-tuning 示例:https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/unified_finetune


七、用法

安装

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

或者:

pip install -U FlagEmbedding

1、生成文本 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"]

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 。


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

2、计算文本对的分数

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

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的评估脚本

更多信息见:https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/BGE_M3


九、训练

  • 自知识蒸馏:将不同检索模式的多个输出组合作为奖励信号,以增强单一模式的性能(特别是对于稀疏检索和多向量(colbert)检索)
  • 高效批处理:提高长文本微调时的效率。小批量策略简单但有效,也可以用于微调大型嵌入模型。
  • MCLS:一种无需微调即可提高长文本性能的简单方法。如果您没有足够的资源来微调长文本模型,那么该方法很有用。

了解更多详情可参阅:https://arxiv.org/pdf/2402.03216.pdf


2024-05-01(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值