46.6kデモを予約するログイン無料で始める

リランカーとは何か、そしてリランカーはどのように情報検索を強化するのか?

再ランカーは、情報検索システムにおいて、検索結果の重要な第2段階の評価を行う特別なコンポーネントである。

#はじめに

より正確で関連性の高い検索結果を求めるニーズは、[情報検索]と機械学習の著しい進歩につながっている。これらのイノベーションの中で、検索結果を洗練させ、推薦の質を向上させる強力なツールとして登場したのがリランカーである。この記事では、リランカーの背後にあるコンセプトを探求し、検索と Retrieval Augmented Generation (RAG)アプリケーションを強化するために、広く採用されている オープンソースのベクトルデータベースである Milvusとリランカーを統合する方法を示す。

リランカーとは何か、なぜ重要なのか?

リランカーは、情報検索システムにおいて、検索結果の重要な第2段階評価を行う特別なコンポーネントである。潜在的に関連性のあるアイテムの初期セットが検索された後、リランカーはこれらの結果を再評価し、並び替えるために介入し、最も関連性の高いアイテムをリストのトップに押し上げることを目指す。

リランカーの重要性は、最初の検索結果を洗練させる能力にあり、従来の一段階検索手法の限界に対処している。より洗練されたアルゴリズムを適用することで、リランカーは微妙な関連性のシグナルを捉え、複雑なクエリをより効果的に処理し、最終的にはより正確で文脈に適した結果を提供することができる。なぜリランカーが不可欠なのかを理解するためには、まずワンステージ検索がどのように機能するのか、そしてその本質的な限界を検証することが重要である。

従来の一段階検索とその限界

従来の1段階検索とは、通常、検索プロセスが1段階で完了する情報検索システムを指す。このアプローチでは、システムは中間段階を経ることなく、与えられたクエリとの関連性に基づいて、大規模なコーパスから関連文書やアイテムの最終セットを直接検索する。

このような一段階システムは、膨大なデータセットを素早くスキャンし、関連文書のランク付けされたリストを返すことができるアルゴリズムに依存している。最も広く使われているワンステージ検索技術には、TF-IDF、BM25、ベクトル類似度検索がある。これらを分解して、どのように機能するかを見てみよう。

TF-IDF (項頻度-逆文書頻度)

TF-IDFは、コーパスに対する文書中の単語の重要度を評価する。TF-IDFは2つの指標を組み合わせたもので、用語頻度(TF)は用語が文書に出現する頻度を測定し、逆文書頻度(IDF)はコーパス全体で用語がどれだけ重要かを測定する。TF-IDFスコアは、特定の文書にとって重要だが、すべての文書に共通するわけではない用語を特定するのに役立つ。この手法は、キーワードベースの検索(完全キーワード検索とも呼ばれる)に有効である。

BM25 (ベストマッチング25)

BM25はTF-IDFを拡張したもので、確率的検索モデルのファミリーに属する。用語頻度の飽和と文書の長さの正規化を考慮することで、TF-IDFのいくつかの制限に対処している。TF-IDFは確率的な枠組みを使い、クエリー用語の出現率と文書全体の分布に基づいて文書をランク付けする。このモデルは、様々なタイプのクエリを処理する際の頑健性と有効性で知られており、情報検索システムでよく使われる。

ベクトルベース検索(ベクトル類似検索とも呼ばれる)

ベクトルベース検索またはベクトル類似検索は、関連文書を ベクトル埋め込みと呼ばれる高次元空間の数値表現として検索する。これらのベクトルはデータの様々な 意味的な側面を捉えている。そして、 余弦類似度やユークリッド距離 のような類似度尺度を用いて、クエリーベクトルと文書ベクトルを比較し、関連文書を検索する。この方法によって、より洗練された検索戦略が可能になる。特に、学習されたスパースモデルや密な埋め込みモデルのようなニューラルネットワークベースのモデルなど、最新の機械学習技術と組み合わせると効果的である。

一段階検索システムの限界

一段階検索法が効果的であるとしても、いくつかの課題がある。

1.**最初の関連性は高いが、順位付けが不十分である:一段階検索では、システムは関連文書を検索するかもしれないが、必ずしもクエリに対する真の関連性に従ってランク付けされるとは限らない。このようなことが起こりうるのは、最初の段階では精度よりもスピードが優先されることが多いからである。リランカーは上位N個の文書をより徹底的に分析し、より深い意味解析を用いて並び替えを行い、最も関連性の高い文書が結果の上位に表示されるようにすることができる。

2.検索結果のノイズを減らす:一段階の検索では、多少関連性はあるが、ユーザーの意図と完全に一致しない文書というノイズが発生する可能性がある。リランカーはこれらをふるいにかけ、関連性の低い文書をリストの下に追いやったり、完全に削除したりすることで、より焦点の絞られた結果を導き出すことができる。

3.複雑なクエリーの処理:ニュアンスの異なる理解や複数のファセットを含むクエリは、1段階の検索プロセスにとっては困難である。この問題は、ベクトルベースの検索システムではなく、従来のTF-IDFやBM25の手法で顕著に見られる。リランカー、特にディープラーニングモデルに基づいたリランカーは、クエリ内やクエリと文書間の複雑な関係をより良く捉えることができ、全体的な検索性能を向上させることができる。

おわかりのように、検索プロセスの第2段階としてリランカーを組み込むことで、ほとんどの制限に対処することができる。このアプローチは、リランカーがクエリと検索された文書を直接比較することで、検索システムのパフォーマンスを向上させるからである。リランカーがどのように機能するのか、深く掘り下げて詳しく見てみよう。

リランカーはどのように機能するのか?

リランカーの基本的な考え方は、まず関連する可能性のある文書を幅広く検索し、次にこの文書群を絞り込んで、最も関連性の高い結果に優先順位をつけるというものだ。下の図は、ベクトルベースの検索とリランカーのパイプラインの例です:

図1-検索と再ランク付けのパイプライン(画像は筆者による)](https://assets.zilliz.com/Fig_1_Retrieval_and_re_ranking_pipeline_Image_by_author_a0e7a69a94.png)

上記の検索と再ランク付けのパイプラインでは、Document Collectionは、システムがコンテンツにアクセスして検索することができる大規模な文書のコーパスを表しています。検索バイエンコーダは、検索クエリとドキュメントを密なベクトルにエンコードするニューラルネットワークモデルである。検索候補コンポーネントは、エンコードされたクエリとドキュメントの表現を使用して、ドキュメントコレクションを検索し、最も関連性の高い候補ドキュメントを取得します。Re-Ranker Cross-Encoderは特殊な機械学習モデルで、検索クエリと各候補文書との関係を文脈に即して評価します。最後に、Ranked Hits** コンポーネントは、クロスエンコーダによって割り当てられた関連性スコアに基づいて、最も関連性の高い検索結果のランク付けされたリストを提示します。

パイプラインがどのように機能するのか、さらに深く掘り下げてみましょう:

再ランキング**に関わるステップ

1.検索クエリ/質問:

  • このプロセスは、ユーザーが検索クエリや質問をシステムに入力することから始まる。このクエリは、大規模な文書コレクションの中から特定の情報を見つけようとするユーザーの試みを自然言語で表現したものである。

2.検索バイ・エンコーダ:

  • クエリとドキュメントのエンコーディング**:バイエンコーダーモデルは検索クエリーを密なベクトルに変換する。コレクション全体の文書ベクトルも同じバイエンコーダーモデルを使って事前に計算され、Milvusのようなベクトルデータベースにオフラインで保存される。

3.候補の検索:

  • 初期検索**:ベクトル検索コンポーネントは、符号化されたクエリーベクトルと事前に計算された文書ベクトルとの類似度を計算する。類似度スコアに基づいて、関連する可能性の高い候補文書群を検索する。これらの文書は再ランク付け段階の入力となる。

4.再ランカー・クロスエンコーダー:

  • コンテキスト評価**:クロスエンコーダーモデルは、クエリとドキュメントの完全なコンテキストを考慮することで、各クエリとドキュメントのペアを評価する。これは最初の検索ステップよりも深く詳細な分析を含む。

  • 再ランク付けクロスエンコーダはこの詳細な評価に基づいて、候補文書に新しい関連性スコアを割り当てる。その後、文書はクエリとの真の関連性を反映するように並び替えられる。

5.ランク付けされたヒット:システムはユーザーに文書のリストを提示する。ドキュメントは関連性の高い順に並べられ、最も適切な結果が一番上に表示され、ユーザーに最も有益な情報を提供する。

今回取り上げた例は、リランカーの仕組みを理解していただくためのものですが、すべてのリランカーが同じというわけではありません。

リランカーの種類

リランカーは主に2つのタイプに分類されます:スコアベースのリランカーとニューラル・リランカーです。それぞれの違いを見てみましょう。

スコアベースのリランカー

スコアベースの再ランカーは、数値方程式を使って重要度を再計算することで、最初の検索結果を絞り込みます。2つの一般的なアプローチがある:

  • 重み付け再ランカー**:この方法は、密なベクトル検索と疎なベクトル検索のような異なる検索パスから同じアイテムの重み付けされたスコアを組み合わせることによってスコアを再計算する。最終的なスコアは、各パスの貢献の重要性を反映する。

  • RRF (Reciprocal Rank Fusion):RRFも複数の検索パスの結果を統合する。RRFは各アイテムに最初の検索結果からの逆順位スコアを割り当て、これらのスコアを合計して新しいランキングを作成する。例えば、あるアイテムがある経路で2位、別の経路で5位だった場合、最終的なスコアは1/2+⅕となり、このスコアが結果における新しい位置を決定するのに使われる。

ニューラル・リランカー

ニューラル・リランカーは、ディープ・ラーニング・モデルを活用して、従来の手法よりも効果的に意味的な関係と文脈情報を捕捉する。主なアプローチは以下の通り:

  • BERTベースのリランカー**:BERT (Bidirectional Encoder Representations from Transformers)は、文の左側と右側の両方を見ることによって文中の単語の文脈を理解する、事前に訓練された言語モデルです。BERTベースのリランカーは、クエリと文書の関係を理解するために、このモデルを微調整する。クエリと文書が提供する完全なコンテキストを考慮することで、文書の関連性を評価し、より正確なリランキングを実現する。

  • 大規模な言語モデルから学習されたリランカー**:T5 (Text-to-Text Transfer Transformer)やGPT (Generative Pre-trained Transformer)のような他の変換器ベースのモデルは、リランキングタスクに適応した事前に訓練されたLLMである。これらは、文書の関連性を正確に判断するのに役立つ深い文脈埋め込みを生成する。

リランカーの長所と短所

リランカーは検索品質に大きな改善をもたらしますが、実世界のシステムに実装する際に考慮すべきトレードオフもあります。

リランカーの利点:

1.関連性の向上:再ランカーは、より複雑な特徴や関係を考慮することで、検索結果の関連性を大幅に向上させます。

2.文脈の理解:特にニューラル・リランカーを使用することで、システムはクエリの背後にある文脈や意図をよりよく理解することができる。

3.適応性:多くのリランキング・モデルは、特定のドメインやユーザーの嗜好に合わせて微調整したり、適応させたりすることができる。

リランカーの短所

1.待ち時間の増加:処理ステップが追加されるため、検索システム全体の応答時間が長くなる。

2.計算オーバーヘッド:再ランカー、特にニューラル・モデルは計算コストが高く、より多くのリソースを必要とする。

3.オーバーフィッティングの可能性:正しく設計され訓練されていない場合、リランカーは訓練データの特定のパターンに過剰適合する可能性があり、汎化に悪影響を及ぼす可能性がある。

リランカーがどのように機能するのかを深く理解したところで、リランカーがどのようにRAG(Retrieval Augmented Generation:検索拡張世代)を向上させるのかに特化して見ていこう。

リランカーはどのようにRAGを改善するのか?

検索拡張生成(RAG)は自然言語処理におけるアプローチで、知識ベースから関連文書を検索することと、大規模な言語モデルを使用してより正確で文脈に基づいた応答を生成するためにそれらを使用することを組み合わせたものである。

図2-リランキングなしのRAGプロセス](https://assets.zilliz.com/Fig_2_RAG_process_without_reranking_02d7166802.png)

RAGシステムでは、クエリはまずベクトルにエンコードされ、事前に計算された文書ベクトル埋め込みを含むMilvusのようなベクトルデータベース内で検索される。データベースはトップkのマッチ文書を返し、それが大規模言語モデル(LLM)のコンテキストとして使われる。LLMはクエリと検索された文書を組み合わせて詳細な応答を生成し、その結果、正確で文脈に関連した応答が得られる。 このアプローチは、検索された結果がすべてLLMのコンテキストウィンドウに収まるような小さな文書に対しては有効である。しかし、大規模なデータセットを扱う場合、すべての検索結果がLLMのコンテキストウィンドウに収まらないため、潜在的な情報損失やレスポンスの質の低下につながる。

この問題に対処するには、LLMに入力する前に、上位k個のマッチ文書を絞り込んで優先順位をつけるリランカーを採用する必要がある。

図3-リランカーを使用したRAGプロセス](https://assets.zilliz.com/Fig_3_RAG_process_with_reranking_employed_90a6f4e0b8.png)

リランカーは、最初に検索された文書群を再評価し、クエリとの関連性に基づいて並び替え、最も適切な情報のみがLLMのコンテキストウィンドウに含まれるようにする。このステップにより、限られた文脈空間を最大限に利用し、生成される応答の精度と一貫性を高める。

リランカーがどのようにRAGを向上させるかを理解するために、ベクターデータベースとしてMilvusを使用した実例を見てみよう:

Milvus を利用したRAGシステムで検索結果を改善するためにリランカーを利用する。

Milvusはオープンソースのベクトルデータベースであり、10億スケールのベクトルデータを扱うために特別に設計されています。類似検索、推薦システム、RAG(Retrieval Augmented Generation)などのタスクに不可欠な高次元ベクトル埋め込みデータの効率的な保存、インデックス付け、検索を容易にします。

Milvusは特にRAGシステムにおいて有益であり、ユーザクエリと関連性の高い文書を検索する。リランカーの有効性は最初の検索の質に依存するため、これはリランキング・プロセスにおいて極めて重要である。検索された文書の初期セットが低品質であれば、最良のリランカーであっても良い結果を提供するのに苦労するかもしれない。

Milvusと一般的な再ランキングモデルの統合

Milvusは、最初の検索結果を洗練させ、より高い関連性と精度を保証するいくつかの高度なリランキングモデルと統合しています。以下は、Milvusがサポートする一般的なランキングモデルの一部です:

  • オープンソースリランカー**:Milvusは、BAAI/bge-reranker-v2-m3、cross-encoder/ms-marco-MiniLM-L-6-v2、ms-marco-MiniLM-L-6-v2を含む、BERTまたは他のアーキテクチャのニューラルネットワークで訓練されたオープンソースのクロスエンコーダーモデルの豊富なセットと統合しています。

  • Cohere Reranker**](https://milvus.io/docs/rerankers-cohere.md):Cohereリランカーは、Cohereの大規模な言語モデルを使用して、最初の検索結果のそれぞれとクエリの関連性のスコアを計算します。これらのモデルはAPIキーを必要とし、クエリとドキュメント間の意味的関係を理解することによって、検索結果にアクセスし、絞り込むことができる。

  • Voyage rerankers:API経由でアクセス可能なVoyageモデルは、関連性の複数の要素を考慮することで、検索結果の精度を高める。Milvusのようなベクトルデータベースと簡単に統合できる](https://zilliz.com/blog/voyage-ai-embeddings-and-rerankers-for-search-and-rag)。

  • Jina AI rerankers**](https://milvus.io/docs/rerankers-jina.md):Jina AI再ランク付けモデルは、情報検索アプリケーションにおける高速な応答時間のために最適化されている。JinaBERTアーキテクチャを使用しており、これはALiBiの対称双方向バリアントで強化されたBERTアーキテクチャのバリアントである。このアーキテクチャは、長いテキストシーケンスのサポートを可能にする。これらのモデルはAPIを通じて利用可能であり、Milvusとシームレスに統合される。

これらのモデルの使用方法については、こちらのガイドをご覧ください。

以下のセクションでは、pymilvus[model](milvusのクライアントライブラリ)でサポートされているモデルと、まだサポートされていないモデルを使って、リランキングステージを構築する方法を紹介します。

RAG検索結果を改善するためのMilvusとリランキングモデルの統合に関するステップバイステップガイド

このセクションでは、Milvusを利用したRAGパイプラインを構築し、Milvusが返す検索結果をリランキングによって改善する方法を説明します。完全なコードはこのノートブックもご覧ください。

環境のセットアップ

まずPython IDEを起動し、必要なライブラリをインストールします。


pip install pymilvus[model] torch transformers

pymilvusライブラリは Milvus ベクタデータベース、 torch は PyTorch の機能、 transformers` は埋め込みモデルとリランキングモデルを提供する。

ライブラリをインストールしたら、コンピュータ上でMilvusインスタンスが動作していることを確認してください。Milvusがインストールされていない場合は、このガイドに従ってインストールと実行を行ってください。これでコーディングできる環境が整いました。

必要なパッケージのインポート

ライブラリを環境にインストールしたら、それらの機能を呼び出して使用するために、それらをプロジェクトにインポートする必要があります。


# 必要なパッケージをインポートする

from pymilvus import MilvusClient, DataType

from pymilvus.model.dense import SentenceTransformerEmbeddingFunction

Milvusサーバとの接続には MilvusClient を、コレクションスキーマの作成には DataType を、ドキュメントのベクトル化には SentenceTransformerEmbeddingFunction を使用する。

Milvusクライアントの初期化とコレクションの作成

ライブラリをインポートしたら、次はMilvusサーバに接続し、コレクションを作成する。


# Milvusクライアントの初期化

client = MilvusClient(uri="./milvus.db")

コレクション名 = "reranking_collection"

# コレクションが存在する場合は削除する

if client.has_collection(collection_name):

    client.drop_collection(collection_name)

# コレクションスキーマの定義

schema = client.create_schema(

    auto_id=True、

    enable_dynamic_field=True、

)

# スキーマにフィールドを追加する

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)

schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535)

schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=384)

# コレクションを作成する

client.create_collection(

    collection_name=コレクション名、

    schema=schema、

    description="ドキュメント検索用のコレクション例"

)

URIでクライアントを初期化することで、Milvus インスタンスへの接続が確立され、ベクターデータベースとのやり取りや操作が可能になります。最初の操作は、指定したスキーマを使用してコレクションを作成することです。上のコードでは、コレクションスキーマには3つのフィールドがあります:id 、 text 、 vector である。idフィールドは整数で、主キーの役割を果たす。text フィールドは可変長の文字列であり、 vector フィールドは 384 次元の浮動小数点数ベクトルである。次元は使用する埋め込みモデルの次元と一致させるべきである。

インデックスの作成

コレクションを作成したら、インデックスを作成する必要があります。これにより、検索時間が大幅に改善されます。


# データを挿入する前にインデックスを作成する

インデックスを作成する

    "field_name":「vector"、

    「index_type":「IVF_FLAT"、

    「metric_type":"L2",

    "params":{"nlist":128}

}]

client.create_index(collection_name, index_params)

print("新しいインデックスが正常に作成されました。")

ここでは、 IVF_FLAT インデックスタイプと L2 距離メトリックを使用して vector フィールドにインデックスを作成する。nlist` パラメータは、インデックス作成処理で使用するクラスタの数を決定し、検索の速度と精度に影響を与える。

エンベッディングの生成と Milvus への挿入

インデックスを作成したら、次は文書を準備し、それらの文書と埋め込みデータをMilvusに挿入します。


# 埋め込み関数を初期化する。

ef = SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")

# 埋め込みを生成するデータ

docs = [

    "ジョン・マッカーシーは人工知能分野のパイオニアである。彼は1955年に『人工知能』という言葉を作った。"、

    「1956年に開催されたダートマス会議は、学問分野としての人工知能の創設イベントと広く考えられている、

    「アラン・チューリングは、チューリング・マシンの研究で人工知能の理論的基礎を築いたとされる、

    「1956年、ジョン・マッカーシーは、マービン・ミンスキー、ナサニエル・ロチェスター、クロード・シャノンらとともにダートマス会議を主催した、

    「人工知能(AI)は、1956年、ジョン・マッカーシー、マービン・ミンスキー、ナサニエル・ロチェスター、クロード・シャノンが主催したダートマス会議で正式に学問分野として創設された。この会議はAIの誕生と広く考えられている、

]    

# エンベッディングの生成

embeddings = ef.encode_documents(docs)

# エンベッディングをMilvusに挿入する

データ = [

    {"text": docs[i], "vector": embeddings[i].tolist()}.

    for i in range(len(embeddings))

]

client.insert(collection_name=collection_name, data=data)

上記のコードでは、all-MiniLM-L6-v2モデルを用いて埋め込み関数を初期化しています。次に、ドキュメントのリストを定義し、それらの埋め込みを生成します。これらの埋め込みは対応するテキストと共にMilvusコレクションに挿入されます。

コレクションの読み込みと初期検索の実行

Milvusにドキュメントがあるので、次のステップはコレクションをロードし、メモリに格納し、クエリを実行することです。


# コレクションをメモリにロードする

client.load_collection(collection_name)

# 検索を実行する

query = "1956年のダートマス会議の主催者は?"

query_embedding = ef.encode_queries([クエリ])[0].

search_params = {検索パラメータ

    "metric_type":"L2",

    「params":{"nprobe":10}

}

search_results = client.search(

    コレクション名=コレクション名、

    data=[query_embedding.tolist()]、

    anns_field="vector"、

    search_params=search_params、

    limit=3、

    output_fields=["テキスト"]。

)

# 検索結果を表示する

print("最初の検索結果:")

for hit in search_results[0]:

    エンティティ = hit['entity']

    print(f "Text: {entity['text']}")

    print(f "距離: {ヒット['距離']}")

    print("---")

上のコードは、コレクションをメモリにロードし、1956年のダートマス会議の主催者に関するクエリを使って検索を実行する。そして、クエリの埋め込みを生成し、コレクションを検索する。これが最初の検索結果です。後で再ランク付けした後、検索結果が改善されているかどうかを知るのに役立つでしょう。

図4- リランク前のMilvusの初期検索結果](https://assets.zilliz.com/Fig_4_Initial_results_of_querying_Milvus_before_reranking_49e46d6a64.png)

検索結果はすべてクエリに関連していますが、ご覧のように、最初の結果は1956年のダートマス会議の主催者について述べていません。しかし、2つ目の検索結果はそうです。したがって、リランカーは結果を切り替え、クエリに直接答えるものである上記の2番目の結果を1番目として返すことを期待します。

Milvus支援再ランカー・モデルを使った検索結果の再ランク付け

先ほど説明したモデルを使って、どのように検索結果を改善できるか見てみましょう。


from pymilvus.model.reranker import BGERerankFunction

# BGE rerank関数を初期化する。

reranker = BGERerankFunction(model_name="BAAI/bge-reranker-v2-m3", device="cpu")

# 検索結果から文書を抽出

initial_docs = [result['entity']['text'] for result in search_results[0]] # 検索結果から文書を抽出する。

reranked_results = reranker(query, initial_docs)

# ランク付けされた検索結果を表示する

print("nReranked Search Results:")

for i, doc in enumerate(reranked_results):

    print(f "Rank {i + 1}: {doc}")

    print("---")

このコードでは、 BGE モデルの使用に役立つ BGERerankFunction をインポートする。次に、BAAI/bge-reranker-v2-m3 モデルを使って BGE reranker を初期化する。このコードでは、最初の検索結果から文書を抽出し、クエリとの関連性に基づいて並べ替えるためにリランカーを使用する。以下はその結果である。

図5- BGEモデルによる再順位付け結果](https://assets.zilliz.com/Fig_5_Reranked_results_using_BGE_model_c988ed6bbc.png)

再ランク付けされた結果は、予想通り、クエリに直接答える結果を優先するように、モデルが最初の検索結果を再ランク付けしたことを示している。

他の再ランカーモデルを使った検索結果の再ランク付け

上記で使用したモデルは、PyMilvusモデルを介して呼び出すことができます。Milvus以外のモデルで同じ結果を得る方法を見てみましょう。クロスエンコーダーモデルを使ってみましょう。


from transformers import BertTokenizer, BertForSequenceClassification

インポートトーチ

# リランキング・モデルの初期化

tokenizer = BertTokenizer.from_pretrained('crossencoder/ms-marco-MiniLM-L-6-v2')

model = BertForSequenceClassification.from_pretrained('cross-encoder/ms-marco-MiniLM-L-6-v2')

def rerank(query, docs):

    inputs = tokenizer([query] * len(docs), docs, return_tensors='pt', padding=True, truncation=True)

    torch.no_grad()を使用:

        出力 = model(**inputs)

    スコア = outputs.logits[:, 0].

    ranked_indices = scores.argsort(descending=True).tolist()

    return [docs[i] for i in ranked_indices].

# 検索結果の再ランク付け

initial_docs = [result['entity']['text'] for result in search_results[0]] # 検索結果を再ランク付けする。

reranked_docs = rerank(query, initial_docs)

# 再ランクされた検索結果を表示する

print("nReranked Search Results:")

for i, doc in enumerate(reranked_docs):

    print(f "Rank {i + 1}: {doc}")

    print("---")

上記のコードは cross-encoder/ms-marco-MiniLM-L-6-v2 を用いてクロスエンコーダーモデルを初期化している。そして、このモデルを使用してクエリと文書のペアを評価し、関連性スコアに基づいて文書をランク付けする rerank 関数を定義する。以下はその結果である。

再ランクされた検索結果

ランク1:1956年、ジョン・マッカーシーはマービン・ミンスキー、ナサニエル・ロチェスター、クロード・シャノンと共に、AIの誕生とされるダートマス会議を主催した。


ランク2:人工知能(AI)は1956年、ジョン・マッカーシー、マービン・ミンスキー、ナサニエル・ロチェスター、クロード・シャノンが主催したダートマス会議で正式に学問分野として創設された。この会議はAIの誕生と広く考えられている。


ランク3:1956年に開催されたダートマス会議は、学問分野としての人工知能の創設イベントと広く考えられている。


この結果は、Milvusがサポートするリランキングモデルを使用して得られた結果と同様である。これは、パイプラインにリランカーを含めることによって、RAGアプリケーションの検索結果を改善できることを示している。しかし、常にリランカーを使用することが望ましいのでしょうか?

RAGでリランカーを使うべき時

リランカーを使用することをお勧めするいくつかの状況をご紹介します。

  • 複雑なクエリ: 複雑なクエリには複数のファセットが含まれることが多く、コンテキストやセマンティクスを深く理解する必要があります。リランカーは、クエリ内の複雑な詳細や関係を最もよく理解するドキュメントを再評価し、優先順位を付けることができます。

  • 医療、法律、技術サポートなど、情報の精度が重要なアプリケーションでは、生成されるコンテンツの正確性と信頼性が最も重要です。リランカーは最初の結果の関連性を高め、生成に使用される情報が正確で信頼できることを保証します。

  • 曖昧なクエリ:** 曖昧なクエリには複数の解釈があり、1段階の検索手法では正しい文脈を特定することが難しい。再ランカーはクエリのニュアンスを分析し、その意図に近い文書を優先順位付けすることで、より首尾一貫した、文脈に適した回答を提供することができる。

RAGでリランカーを使わない場合

以下のシナリオでは、リランカーの使用はお勧めできません:

  • 単純なクエリ: **単純なクエリの場合、TF-IDF、BM25、または基本的なベクトルベースのアプローチのような初期の検索方法は、多くの場合、十分に正確な結果を提供する。このような場合にリランカーを追加しても、結果は大きく改善されない可能性があり、不必要な複雑さと処理時間が発生する可能性がある。

  • 低リスクのアプリケーション:**応答の精度が重要でないアプリケーション(例えば、カジュアルなクエリ、エンターテイメント)では、リランカーの追加された計算オーバーヘッドは正当化されないかもしれない。単純な1段階の検索方法は、再ランク付けをすることなく、速度と関連性の良いバランスを提供することができる。

  • リランカーは余計な処理を追加するため、応答時間が長くなる可能性がある。リアルタイムのチャットボットやインタラクティブなアプリケーションなど、迅速な応答が不可欠なシナリオでは、リランキングによって生じる遅延がユーザーエクスペリエンスに悪影響を及ぼす可能性があります。そのような場合は、結果をさらに洗練させるよりもスピードを優先する方が有益です。

結論

リランカーは、検索結果を精緻化し、より正確で文脈に適した結果を提供することで、情報検索を大幅に改善してきた。Milvusのような堅牢なベクトルデータベースとリランカーを統合することで、特にRAG(Retrieval Augmented Generation)のような複雑なアプリケーションにおいて、検索システムの関連性と効率が向上する。

その他のリソース

  • Milvusの始め方](https://milvus.io/blog/how-to-get-started-with-milvus.md)

  • リランカー概要|Milvusドキュメント](https://milvus.io/docs/rerankers-overview.md)

  • リランカーによるRAGの最適化: 役割とトレードオフ - Zillizブログ](https://zilliz.com/learn/optimize-rag-with-rerankers-the-role-and-tradeoffs)

  • あなたのGenAIアプリのためのトップパフォーマンスAIモデル|Zilliz](https://zilliz.com/ai-models)

  • ジェネレーティブAIリソースハブ|Zilliz](https://zilliz.com/learn/generative-ai)