モデル概要
モデル特徴
モデル能力
使用事例
🚀 BGE-M3 (論文, コード)
このプロジェクトでは、多機能性、多言語対応、多粒度性という3つの特性を兼ね備えたBGE-M3を紹介します。
- 多機能性:埋め込みモデルの3つの一般的な検索機能、すなわち密検索、多ベクトル検索、および疎検索を同時に実行できます。
- 多言語対応:100以上の言語をサポートします。
- 多粒度性:短い文から最大8192トークンの長いドキュメントまで、さまざまな粒度の入力を処理できます。
詳細については、私たちのGitHubリポジトリを参照してください:https://github.com/FlagOpen/FlagEmbedding
🚀 クイックスタート
このセクションでは、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) # 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 ]]
高度な使用法
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]
# }
✨ 主な機能
- 多機能性:埋め込みモデルの3つの一般的な検索機能、すなわち密検索、多ベクトル検索、および疎検索を同時に実行できます。
- 多言語対応:100以上の言語をサポートします。
- 多粒度性:短い文から最大8192トークンの長いドキュメントまで、さまざまな粒度の入力を処理できます。
📦 インストール
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 ]]
高度な使用法
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
📚 ドキュメント
RAGにおける検索パイプラインの提案
ハイブリッド検索 + 再ランキングのパイプラインをおすすめします。
-
ハイブリッド検索は、さまざまな方法の長所を生かし、より高い精度と強力な汎化能力を提供します。 代表的な例として、埋め込み検索とBM25アルゴリズムの両方を使用する方法があります。 現在、BGE-M3を使って、埋め込み検索と疎検索の両方を行うことができます。 これにより、密な埋め込みを生成する際に追加のコストなしでトークンの重み(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の複数のモードを簡単に使用できます。
仕様
モデル
モデル名 | 次元数 | シーケンス長 | 説明 |
---|---|---|---|
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で使用される微調整データ |
FAQ
1. 異なる検索方法の説明
- 密検索:テキストを単一の埋め込みにマッピングします。例: DPR, BGE-v1.5
- 疎検索(語彙マッチング):語彙サイズのベクトルで、大部分の位置がゼロに設定され、テキストに存在するトークンにのみ重みを計算します。例:BM25, unicoil, splade
- 多ベクトル検索:複数のベクトルを使用してテキストを表現します。例: ColBERT
2. 他のプロジェクトでBGE-M3を使用する方法
埋め込み検索の場合、BGEと同じアプローチでBGE-M3モデルを使用できます。 唯一の違いは、BGE-M3モデルではクエリに指示を追加する必要がないことです。
ハイブリッド検索の場合、Vespa と Milvus を使用できます。
3. BGE-M3モデルを微調整する方法
この例 の一般的な手順に従って、密な埋め込みを微調整できます。
M3のすべての埋め込み機能(密、疎、およびColBERT)を微調整したい場合は、統一微調整の例 を参照してください。
🔧 技術詳細
評価
オープンソースコミュニティのベンチマーク
BGE-M3モデルは、このベンチマークでトップのパフォーマンスを発揮しました(OAIはOpenAIの略)。
詳細については、記事 と GitHubリポジトリ を参照してください。
私たちの結果
-
多言語(Miraclデータセット)
-
クロス言語(MKQAデータセット)
-
長文書検索
-
MLDR:
MLDR は、LLMを介して構築したドキュメント検索データセットで、13の言語をカバーし、テストセット、検証セット、およびトレーニングセットを含んでいます。 MLDRのトレーニングセットを使用して、モデルの長文書検索能力を強化しました。 したがって、
Dense w.o.long
(長文書データセットなしでの微調整)とのベースラインを比較する方が公平です。 また、この長文書検索データセットは、現在のオープンソースの多言語長文検索データセットの不足を解消するためにオープンソース化されます。 このデータは、オープンソースコミュニティがドキュメント検索モデルをトレーニングするのに役立つと考えています。 -
NarritiveQA:
-
-
BM25との比較 Pyseriniを使用してBM25を実装し、このスクリプト でテスト結果を再現できます。 BM25を2つの異なるトークナイザーを使用してテストしました: 1つはLucene Analyzerを使用し、もう1つはM3と同じトークナイザー(すなわち、xlm-robertaのトークナイザー)を使用しました。 結果は、BM25が依然として競争力のあるベースラインであり、特に長文書検索で有効であることを示しています。
トレーニング
- 自己知識蒸留:異なる検索モードからの複数の出力を報酬信号として組み合わせ、単一モードのパフォーマンスを向上させます(特に疎検索と多ベクトル(ColBERT)検索に有効)。
- 効率的なバッチング:長文の微調整時の効率を向上させます。 小バッチ戦略は簡単ですが効果的で、大規模な埋め込みモデルの微調整にも使用できます。
- MCLS:微調整せずに長文でのパフォーマンスを向上させる簡単な方法です。 長文でモデルを微調整する十分なリソースがない場合、この方法は有用です。
詳細については、レポート を参照してください。
📄 ライセンス
このプロジェクトはMITライセンスの下で公開されています。
引用
このリポジトリが役に立った場合は、スターを付けていただき、引用していただけると幸いです。
@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}
}
謝辞
Miracl、MKQA、NarritiveQAなどのオープンソースデータセットの作成者に感謝します。 また、Tevatron、Pyserini などのオープンソースライブラリにも感謝します。







