「ハイブリッド検索を用いたRAGパイプラインでの検索パフォーマンスの向上」

「ハイブリッド検索によるRAGパイプラインの検索パフォーマンス向上」

ハイブリッド検索機能を備えた検索バー

最近の< ahref=”https://www.voagi.com/discovering-retrievalaugmented-generation-in-llm.html”>検索強化生成(RAG)パイプラインへの関心の高まりに伴い、開発者たちは本番運用に適したパフォーマンスを持つRAGパイプラインの構築の課題について議論し始めています。人生の多くの側面と同様に、パレートの法則はRAGパイプラインでも適用され、初期の80%を達成することは比較的簡単ですが、残りの20%を本番用に準備するのは困難です。

一般的に繰り返されるテーマのひとつは、ハイブリッド検索を使用してRAGパイプラインの検索コンポーネントを改善することです。

RAGパイプラインの構築に関する経験を既に積んだ開発者たちは、自分たちの知見を共有し始めています。一般的に繰り返されるテーマのひとつは、ハイブリッド検索を使用してRAGパイプラインの検索コンポーネントを改善することです。

本記事では、ハイブリッド検索の概念について紹介し、より関連性の高い結果を取得するためにRAGパイプラインのパフォーマンスを改善する方法、および使用するタイミングについて説明します。

ハイブリッド検索は、複数の検索アルゴリズムを組み合わせることによって検索結果の関連性を向上させる検索技術です。どのアルゴリズムが組み合わされるかは明示されていませんが、ハイブリッド検索は通常、伝統的なキーワードベースの検索とモダンなベクトル検索の組み合わせを指します。

伝統的には、キーワードベースの検索が検索エンジンの明らかな選択肢でした。しかし、機械学習(ML)アルゴリズムの登場により、ベクトル埋め込みを利用したベクトルまたはセマンティック検索と呼ばれる新しい検索技術が可能となり、データをセマンティックに検索することができるようになりました。ただし、両方の検索技術には考慮すべき重要なトレードオフがあります:

  • キーワードベースの検索:特定の用語(製品名や業界の専門用語など)に対して正確なキーワードマッチング機能がありますが、タイポや類義語に対しては敏感で重要な文脈を見逃してしまうことがあります。
  • ベクトルまたはセマンティック検索:セマンティック検索の機能により、データのセマンティックな意味に基づいた多言語およびマルチモーダルな検索が可能となり、タイポに強くなりますが、重要なキーワードを見落とすことがあります。さらに、生成されたベクトル埋め込みの品質に依存し、ドメイン外の用語に敏感です。

キーワードベースとベクトル検索をハイブリッド検索として組み合わせることで、特にテキスト検索のユースケースにおいて検索結果の関連性を向上させることができます。

例えば、検索クエリ「Pandas DataFramesを.concat()でマージする方法」を考えてみましょう。キーワード検索はメソッド.concat()に関連する結果を見つけるのに役立ちますが、単語「マージ」には「結合」、「連結」、「結合」などの類義語があるため、セマンティック検索の文脈認識を活用できると便利です(詳細はいつハイブリッド検索を使用するべきですかを参照してください)。

興味があれば、このライブ�デモで異なるキーワードベース、意味ベース、 ハイブリッド検索クエリを試して映画を検索することができます(その実装は この記事 で詳しく説明されています)。

ハイブリッド検索はどのように機能するのですか?

ハイブリッド検索は、キーワードベースとベクトル検索の技術を組み合わせて、それらの検索結果を統合し再ランキングします。

ハイブリッド検索の文脈でのキーワードベースの検索は、スパースエンベッディングと呼ばれる表現をよく使用します。そのため、スパースベクトル検索とも呼ばれます。スパースエンベッディングは、ほとんどがゼロの値で構成され、ごくわずかな非ゼロの値を持つベクトルです。

[0, 0, 0, 0, 0, 1, 0, 0, 0, 24, 3, 0, 0, 0, 0, ...]

スパースエンベッディングは、さまざまなアルゴリズムで生成することができます。スパースエンベッディングの最も一般的なアルゴリズムはBM25(Best Match 25)で、TF-IDF(Term Frequency-Inverse Document Frequency)アプローチに基づいており、これを改良しています。簡単に言えば、BM25は、ドキュメント内での用語の頻度を、すべてのドキュメント内での頻度に対して相対的に重要視します。

ベクトル検索は、MLの進歩とともに登場した近代的な検索技術です。近代的なMLアルゴリズム(例:トランスフォーマー)は、テキスト、画像などのさまざまなモダリティのデータオブジェクトの数値表現であるベクトルエンベッディングを生成することができます。

これらのベクトルエンベッディングは通常、情報が詰まっており、非ゼロ値が主な構成要素となっています(デンスベクトル)。以下に示すように、ベクトル検索はデンスベクトル検索とも呼ばれています。

[0.634、0.234、0.867、0.042、0.249、0.093、0.029、0.123、0.234、...]

検索クエリはデータオブジェクトと同じベクトル空間に埋め込まれます。その後、ベクトルエンベッディングを使用して、特定の類似性メトリック(例:コサイン距離)に基づいて最も近いデータオブジェクトを計算します。検索結果は、検索クエリに対する類似性に基づいてランク付けされた最も近いデータオブジェクトのリストです。

キーワードベースとベクトル検索結果の統合

キーワードベースの検索とベクトル検索の両方は、通常、計算された関連性に基づいて別々の結果セットを返します。これらの別々の検索結果セットを結合する必要があります。

2つのリストのランキング結果を単一のランキングに組み合わせるためのさまざまな戦略があります。例えば、Benham and Culpepper の論文で説明されています。

一般的に、検索結果はまずスコアリングされます。これらのスコアは、コサイン距離などの指定されたメトリックに基づいて計算することができます。または、単に検索結果リストでのランクです。

次に、計算されたスコアはパラメータalphaで重み付けされ、各アルゴリズムの重み付けと結果に対する再ランキングに影響を与えます。

hybrid_score = (1 - alpha) * sparse_score + alpha * dense_score

通常、alphaは0から1の値を取ります。以下は、ランキングに基づいてキーワードとベクトル検索の融合の最小限の例であり、alpha = 0.5としてスコアリングされています。

Minimal example of how keyword and vector search results can be fused in hybrid search with scoring based on ranking and an alpha of 0.5 (Image by the author, inspired by Hybrid search explained)

ハイブリッドサーチはRAGパイプラインのパフォーマンスを向上させる方法は?

RAGパイプラインは、そのパフォーマンスを向上させるために調整できるパラメータが多くあります。これらのパラメータの1つは、取得したコンテキストの関連性を向上させることです。なぜなら、与えられた質問に対する関連性のない取得されたコンテキストは、LLMも関連する回答を生成することができないからです。

コンテキストの種類とクエリに応じて、RAGアプリケーションにとって最も有益な3つの検索手法を決定する必要があります。したがって、キーワードベースの検索と意味ベースの検索の間の重み付けを制御するalphaパラメータは、調整が必要なハイパーパラメータと見なすことができます。

LangChainを使用した一般的なRAGパイプラインでは、リトリーバーコンポーネントを以下のように使用して、使用するvectorstoreコンポーネントをリトリーバーとして定義します:

# Define and populate vector store# See details here https://towardsdatascience.com/retrieval-augmented-generation-rag-from-theory-to-langchain-implementation-4e9bd5f6a4f2vectorstore = ...# Set vectorstore as retrieverretriever = vectorstore.as_retriever()

ただし、この方法では意味ベースの検索のみが可能です。LangChainでハイブリッドサーチを有効にしたい場合は、特定のハイブリッド検索機能を持つWeaviateHybridSearchRetrieverなどの特定のretrieverコンポーネントを定義する必要があります:

from langchain.retrievers.weaviate_hybrid_search import WeaviateHybridSearchRetrieverretriever = WeaviateHybridSearchRetriever(    alpha = 0.5,               # デフォルトは0.5で、キーワード検索と意味検索の均等な重み付け    client = client,           # Weaviateクライアントに渡すキーワード引数    index_name = "LangChain",  # 使用するインデックスの名前    text_key = "text",         # 使用するテキストキーの名前    attributes = [],           # 結果に返す属性)

その他のバニラのRAGパイプラインは同じままです。

この小さなコードの変更により、キーワードベースの検索とベクトル検索の間の異なる重み付けを試すことができます。注意点として、alpha = 1を設定すると、完全な意味ベースの検索と同等であり、vectorstoreコンポーネントからリトリーバーを定義することと同等です(retriever = vectorstore.as_retriever())。

ハイブリッドサーチを使用する場合(ハイブリッドサーチのユースケース)

ハイブリッドサーチは、製品名やシリアル番号などの特定の用語の正確なフレーズマッチングを必要とする場合に、より人間らしい検索体験のための意味ベースの検索機能を有効にしたいユースケースに最適です。

優れた例としては、最近ハイブリッドサーチを使用して検索機能を拡張したプラットフォームStack Overflowがあります。

ヒトのように質問する:Stack Overflowにおける意味ベースの検索の実装

stackoverflow.blog

最初は、Stack Overflowはキーワードを文書にマッチさせるためにTF-IDFを使用していました[2]。しかし、解決しようとしているコーディング問題を記述することは困難です。問題を説明するために使用する単語によって異なる結果をもたらすことがあります(例えば、2つのPandasのDataFrameをマージ、結合、連結するなどの異なる方法があります)。そのため、意味ベースの検索のようなより文脈に応じた検索手法が、これらの場合にはより有益です。

しかしながら、Stack Overflowの一般的な使用例は、エラーメッセージをコピー&ペーストすることです。その場合、正確なキーワード一致が好ましい検索方法です。また、メソッドや引数の名前(例:.read_csv() in Pandas)に対しても、正確なキーワード一致の機能が必要です。

実際のユースケースでは、コンテキストに意識したセマンティック検索が有効な場合も多いですが、それでも正確なキーワード一致に頼ることがあります。このようなユースケースは、ハイブリッド検索リトリーバーコンポーネントの実装によって大きな恩恵を受けることができます。

概要

本記事では、キーワードベースとベクトル検索の組み合わせであるハイブリッド検索の文脈を紹介しました。ハイブリッド検索は、別々の検索アルゴリズムの検索結果を統合し、それに応じて検索結果を再ランク付けします。

ハイブリッド検索では、パラメータalphaを使用してキーワードベースとセマンティック検索の重み付けを制御します。このパラメータalphaは、RAGパイプラインで検索結果の正確性を向上させるためのハイパーパラメータとして調整することができます。

Stack Overflow [2] のケーススタディを使用して、セマンティック検索が検索体験を向上させることができるユースケースにおいて、ハイブリッド検索がどれほど有用であるかを紹介しました。ただし、特定の用語が頻出する場合には、正確なキーワード一致も重要です。

この記事を楽しんでいただけましたか?

無料で登録すると、新しい記事が公開された際に通知を受け取ることができます。

Leonie Monigattiが記事を公開するたびにメールを受け取る。

Leonie Monigattiが記事を公開するたびにメールを受け取る。すでにVoAGIアカウントをお持ちでない場合は、登録されます…

VoAGI.com

LinkedIn、Twitter、およびKaggleで私を見つけてください。

免責事項

本執筆時点で、私はオープンソースのベクトルデータベースであるWeaviateのDeveloper Advocateです。

参考文献

文献

[1] Benham, R., & Culpepper, J. S. (2017). Risk-reward trade-offs in rank fusion. In Proceedings of the 22nd Australasian Document Computing Symposium (pp. 1–8).

[2] Haney, D. & Gibson, D. in Stack Overflow Blog. Ask like a human: Implementing semantic search on Stack Overflow(アクセス日:2023年11月24日)。

画像

特別に明示されていない場合、すべての画像は著者によって作成されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more