CrossEncoderMmarco : 質問文と回答文の類似度を計算する機械学習モデル

Kazuki Kyakuno
axinc
Published in
10 min readMay 7, 2024

質問文と回答文の類似度を計算する機械学習モデルであるCrossEncoderMmarcoのご紹介です。CrossEncoderMmarcoを使用することで、RAGにリランクの仕組みを導入し、精度を改善することが可能です。

CrossEncoderMmacroの概要

CrossEncodcerMmacroは、マルチリンガルのデータセットであるmMARCOを使用して学習された、質問文と回答文を入力とし、類似度を計算するための機械学習モデルです。

TokenizerにはXMLRobertaを使用しており、SentenceTransformerやE5と互換性があります。

ベースモデルとして、Microsoftの開発したMiniLMv2を使用しています。MiniLMv2は10 億以上の訓練ペアの大規模で多様なデータセットで事前学習されています。

MS MARCOとmMARCOについて

MS MARCO(Microsoft MAchine Reading COmprehension)はMicrosoftが2016年に提供を開始した、Bingにおける匿名化された10万の質問と、人間が生成した回答を含む、英語のデータセットです。その後、データセットは拡張され、現在は100万の質問と回答と、Passage Rankingデータセットが追加されています。

mMARCOはMS MARCOのPassage RankingデータセットをGoogle翻訳で多言語に拡張したマルチリンガルのデータセットです。14言語に対応しています。

RAGにおけるベクトル検索とリランク

CrossEncoderMmarcoは、RAGにおけるベクトル検索の後段で使用されます。

従来のベクトル検索によるRAGでは、通常のベクトル検索で候補を10件などに絞り込み、ChatGPTで処理して回答を得ます。

CrossEncoderMmarcoによるリランクを併用したRAGでは、通常のベクトル検索で候補を100件などに絞り込んだ後、CrossEncoderMmacroによるリランクで並び替え、最終的な10件をChatGPTで処理して回答を得ます。

これにより、より高精度なRAGが実現可能です。

CrossEncoderによるリランキング(出典:https://www.sbert.net/examples/applications/retrieve_rerank/README.html

CommandR+を開発したCohereも、リランクのためのAIモデルをクラウドで提供しています。リランクを導入することで、通常のベクトル検索よりも精度が向上します。

Rerankの精度改善効果(出典:https://cohere.com/blog/rerank-3
CommandR+を使用したRAGのシステム例(出典:https://lightning.ai/lightning-ai/studios/rag-using-cohere-command-r?section=featured

通常のベクトル検索(BiEncoder)との違い

BiEncoderとCrossEncoder(出典:https://www.sbert.net/examples/applications/cross-encoder/README.html

一般的なベクトル検索で使用されるBiEncoderでは、質問文と回答文を個別にTransformerに与えて、ベクトル表現を求め、類似度を計算します。具体的に、質問文だけ、回答文だけからEmbeddingを計算し、Embedding間のL2距離やコサイン距離を計算します。質問文と回答文は独立して処理されるため、TransformerのAttentionは、質問内、回答内のみで計算されます。また、質問と回答の関連性は、Embeddingの低次元空間に変換された後に類似度計算されます。

対して、CrossEncoderでは、質問文と回答文をまとめてTransformerに与えて、類似度を計算します。質問文と回答文をまとめて処理するため、TransformerのAttentionは、質問と回答の両方から計算されます。そのため、単純なEmbeddingよりも精度が高くなります。また、質問と回答の関連性は、高次元空間で距離計算されます。

Bi-EncoderではQueryとSentenceが独立でAttentionが計算されるが、Cross-Encoderの場合はQueryとSentenceをまとめてAttentionが計算されるため、計算量が多い

CrossEncoderは、事前計算ができないため、BiEncoderよりも計算負荷が高くなります。その分、CrossEncoderは、BiEncoderよりも精度が高くなります。

例えば、通常のEmbeddingでは、「ベルリンには何人が住んでいますか」「ベルリンには何人が住んでいますか。」などの、句読点の有無でEmbeddingが微妙に揺らぎ、その結果、RAGで検索されるTOPKの中の順番が揺らぐという問題があります。

CrossEncoderMmarcoを使用してリランクすると、このような揺らぎは発生せず、常に安定した順番で文章を取得することが可能です。

ailia SDKでCrossEncoderMmarcoを使用する

ailia SDKでCrossEncoderMmarcoを使用するには下記のようにします。qに質問文、pに回答文を指定することで、関連度を数値で出力します。関連度は値が大きいほど、関連性が高いことを示しています。

$ python3 cross_encoder_mmarco.py -q "How many people live in Berlin?" -p "Berlin has a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers."
$ python3 cross_encoder_mmarco.py -q "How many people live in Berlin?" -p "New York City is famous for the Metropolitan Museum of Art."
$ python3 cross_encoder_mmarco.py -q "ベルリンには何人が住んでいますか?" -p "ベルリンの人口は891.82平方キロメートルの地域に登録された住民が3,520,031人います。"
$ python3 cross_encoder_mmarco.py -q "ベルリンには何人が住んでいますか?" -p "ニューヨーク市はメトロポリタン美術館で有名です。"
Output : [array([[10.761541]], dtype=float32)]
Output : [array([[-8.127746]], dtype=float32)]
Output : [array([[9.374646]], dtype=float32)]
Output : [array([[-6.408309]], dtype=float32)]

ax株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。ax株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。

--

--

Kazuki Kyakuno
axinc
Editor for

CTO — ax Inc. , Managing Director — AXELL