Sentence Transformers 2.2 : 使用方法 : 検索 & 再ランク付け (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/27/2022 (v2.2.2)
* 本ページは、UKPLab/sentence-transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
Sentence Transformers 2.2 : 使用方法 : 検索 & 再ランク付け
意味検索 では、クエリー、センテンスとパラフラフに対する埋め込みを計算するために SentenceTransformer を使用する方法と、これを意味検索に使用する方法を示しました。
複雑な検索タスク、例えば、質問回答検索に対しては、検索は 検索 & 再ランク付け (Retrieve & Re-Rank) を使用して大幅に改良できます。
検索 & 再ランク付けのパイプライン
上手く動作する情報検索 / 質問回答検索のためのパイプラインは以下になります。すべてのコンポーネントがこの記事で提供されて說明されます :
検索クエリーが与えられたとき、クエリーに潜在的に関連する e.g. 100 の可能性のあるヒットの巨大なリストを取得する検索システムを最初に使用します。検索のためには、例えば ElasticSearch によるような語彙検索か、bi-エンコーダによる密な検索を利用できます。
けれども、検索システムは検索クエリーとそれほど関連がないドキュメントを取得するかもしれません。そのため、2 番目のステージでは、与えられた検索クエリーに対するすべての候補の関連性をスコアづけする 交差エンコーダ に基づいて re-ranker を使用します。
出力はユーザに提示できるヒットのランク付けされたリストになります。
検索: Bi-エンコーダ
候補セットの検索については、語彙検索 (e.g. ElasticSearch) を使用するか、このレポジトリで実装されている bi-エンコーダを使用できます。
語彙検索はドキュメントコレクションにおける検索単語の逐語的な (literal) 一致を探し求めます。それは同義語、頭字語 (acronyms) やスペリングのバリエーションは認識しません。対照的に意味検索 (or 密検索) は検索クエリーをベクトル空間にエンコードして、ベクトル空間で近いドキュメント埋め込みを検索します。
意味検索は語彙検索の欠点を乗り越えて同義語や頭字語を認識できます。意味検索を実装する様々なオプションについては 意味検索の記事 をご覧ください。
Re-Ranker: 交差エンコーダ
retriever は数百万のエントリを持つ大規模なドキュメントコレクションに対して効率的でなければなりません。しかし、それは無関係な候補を返すかもしれません。
交差エンコーダに基づく re-ranker はユーザに対する最終的な結果を大幅に改良できます。クエリーと可能性のあるドキュメントが transformer ネットワークに同時に渡され、それからこれは (ドキュメントが与えられたクエリーに対してどのくらい関係するかを示す) 0 と 1 の間の単一のスコアを出力します。
交差エンコーダの利点は、それらはクエリーとドキュメントに渡りアテンションを実行するため、より高いパフォーマンスを持つことです。
数千や数百万の (query, document)-ペアをスコア付けすることはかなり遅いです。そのため、retriever を使用して例えば 100 の可能性のある候補のセットを作成し、それからそれらは交差エンコーダにより再ランク付けされます。
サンプルスクリプト
- retrieve_rerank_simple_wikipedia.ipynb [ Colab 版 ] : このスクリプトは、ユーザ質問 / 検索クエリーに対する答えを提供するために、ドキュメントコレクションとして小さい Simple English Wikipedia を使用しています。最初に、すべての Wikipedia 記事をパラグラフに分割してそれらを bi-エンコーダでエンコードします。新しいクエリー / 質問が入力された場合、それは同じ bi-エンコーダによりエンコードされて、最も高いコサイン類以度を持つパラグラフが検索されます (意味検索参照)。次に、検索された候補が交差エンコーダ re-ranker によりスコア付けされて、交差エンコーダからの最も高いスコアを持つ 5 つのパッセージがユーザに提示されます。
- in_document_search_crossencoder.py : パラグラフの小さいセットしか持たない場合には、検索のステージを持ちません。これは例えば単一ドキュメント内で検索を実行したい場合に当てはまります。このサンプルでは、ヨーロッパに関する Wikipedia 記事を取りそれをパラグラフに分割します。それから、検索クエリー / 質問とすべてのパラグラフは交差エンコーダ re-ranker を使用してスコア付けされます。クエリーに最も関連性のあるパッセージが返されます。
事前訓練済み Bi-エンコーダ (検索)
bi-エンコーダはパラグラフと検索クエリーに対して独立に埋め込みを生成します。それをこのように使用できます :
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('model_name')
docs = ["My first paragraph. That contains information", "Python is a programming language."]
document_embeddings = model.encode(docs)
query = "What is Python?"
query_embedding = model.encode(query)
埋め込みを比較する方法の詳細は、意味検索をご覧ください。
以下に基づいた事前訓練モデルを提供しています :
- MS MARCO: 500k real user queries from Bing search engine. See MS MARCO models
事前訓練済み交差エンコーダ (Re-Ranker)
For pre-trained models, see: MS MARCO Cross-Encoders
以上