Microsoft が出している論文で、RAG を行うのに約立ちそうな論文を見つけたので、これを読んで RAG の理解を深めるという目的で自分なりに訳すことにしました。
この論文記事で学べること
- RAG(Retrieval-Augmented Generation)システムの基本概念と重要性
- Azure AI Searchの構造と機能(検索層とランキング層)
- ハイブリッド検索 + セマンティックランキングの有用性
- 効果的な文書チャンク分割方法
本記事では、Microsoft の最新の研究結果に基づき、RAGシステムの性能を向上させる方法を知ることができます。
RAG システムにおいて大切なこと
RAG(Retrieval-Augmented Generation)は、大規模な情報源からユーザーの質問に関連する情報を検索し、その情報をLLM(大規模言語モデル)に提供することで、より正確で関連性の高い回答を生成する手法です。
RAGプロセスにおいて、LLMによる回答生成部分は比較的安定していますが、膨大な情報から最も関連性の高い情報を抽出する検索部分が、最終的な結果の質に大きな影響を与えます。この検索の精度が、RAGシステム全体の性能を左右する重要な要素となっています。
Microsoftは、より正確で関連性の高い情報をどのように検索できるかについて、綿密な実験を行っています。その結果をAzure AI Searchに適用し、その詳細を論文で公開しています。
この論文では、以下の3つの戦略を組み合わせることで最も効果的な検索が可能になることを示しています。
- 長文コンテンツの適切なチャンク分割
- キーワード検索とベクトル検索を組み合わせたハイブリッド検索の採用
- 高度なセマンティックランキングの活用
これらの戦略は、従来のベクトル検索やキーワード検索単独の方法と比較して、顕著に高い性能を示しています。
Azure AI Search の検索方法の概要
Azure AI Searchの検索システムは、主に2つの層で構成されています
検索層(Retrieval)
L1とも呼ばれるこの層の目的は、インデックスから検索基準を満たすすべての文書を素早く見つけ出すことです。これは数百万から数十億の文書の中から行われます。スコアリングされた後、通常は上位50程度の結果がユーザーに返されるか、次の層に送られます。
Azure AI Searchは3つの異なるL1モードをサポートしています。
キーワード検索
従来の全文検索手法を使用します。コンテンツは言語固有のテキスト分析を通じて単語に分解されます。
特定のプロダクト名などの固有名詞を含むクエリの場合、この後のベクトル検索よりキーワード検索が有利になります。
ベクトル検索
文書はテキストから埋め込みモデルを使用してベクトル表現に変換されます。クエリの埋め込みを生成し、そのベクトルに最も近い文書ベクトルを見つけることで検索が行われます。
ベクトル検索では意味的に近いものの検索を行うことができます。
ハイブリット検索
キーワード検索とベクトル検索の両方を実行し、各手法から最良の結果を選択するということをします。
ランキング層(Ranking)
Azure AI Searchのランキング層(L2)は、検索層(L1)が抽出した結果に対して、より高度な計算処理を適用し、結果の順序を最適化します。この過程で、L2はL1で絞り込んでいることから、各結果により多くの計算リソースを割り当てることができるため、L1のランキングを大幅に改善します。
ただし、L2の機能には制限があります。L2はL1が検出した結果のみを再順序付けできるため、L1が重要な文書を見逃した場合、L2はその欠落を補うことができません。そのため、L1の精度も非常に重要です。
特にRAG(Retrieval-Augmented Generation)アプリケーションにおいて、L2ランキングは最も関連性の高い結果を上位に配置する上で極めて重要な役割を果たします。これにより、生成AIモデルに提供される情報の質が向上し、より正確で関連性の高い回答が可能になります。
Azure AI SearchのL2ランカーは、高度なセマンティックランキングを実行します。
- Microsoft Bingから派生した多言語対応の深層学習モデルを活用しています。これにより、単純なキーワードマッチングを超えた、意味論的な関連性評価が可能になります。
- L1からの上位50件の結果に対して詳細なランキングを行い、最も関連性の高い情報を特定します。
このように、Azure AI Searchは複数の洗練された検索手法と高度なランキング機能を組み合わせることで、極めて関連性の高い検索結果を提供します。この設計は、特に生成AIアプリケーションの RAG パターンに最適化されており、高品質な情報抽出と効果的な知識増強を実現します。結果として、より正確で文脈に適した回答生成が可能となり、AIアプリケーションの全体的な性能向上に大きく貢献します。
ハイブリッド検索の優位性について
- ベクトル検索(Vector retrieval)の特徴
- クエリと文書の意味的な類似性を基に検索
- 以下のケースに強い:
- スペルミス
- 同義語
- 表現の違い
- 異なる言語間での検索(クロスリンガル)
- キーワード検索の特徴
- 特定の重要な単語のマッチングを優先する
- ベクトル表現では希釈されてしまう可能性のある重要語を捉える
- ハイブリッド検索の優位性
- 様々な形式のユーザー検索に対応可能
- 異なるクエリタイプに対して一貫して良好な結果を提供
- 最も効果的なL1(検索層)を実現
ハイブリッド検索は、キーワード検索とベクトル検索それぞれの長所を組み合わせることで、より柔軟で効果的な検索を可能にします。これにより、様々な検索シナリオに対応し、最終的により質の高い検索結果を提供できます。
この結果を見ても、Keyword queries 以外ではすべての項目で、ハイブリット検索、さらにそれに対してセマンティックランカーを行ったものが有利なことが分かります。
文書チャンク分割戦略
チャンク分割は、生成AIアプリケーションにおいて3つの重要な問題を解決します。
- 長文書の効率的な処理: 長文書を適切な長さの断片(チャンク)に分割することで、LLMのコンテキストウィンドウ制限内で複数の関連文書を処理することが可能になります。
- 関連性の高い部分の優先: 文書内の最も関連性の高い部分を優先的にランク付けすることができます。
- ベクトル検索モデルの制限への対応: 各チャンクを個別のベクトルに埋め込むことで、埋め込みモデルのトークン制限内に収めつつ、文書全体をANN(近似最近傍)検索インデックスで検索可能にします。
技術的な観点から見ると、一般的な深層埋め込みモデルは512トークンの制限がありますが、Ada-002モデルは8,192トークンまで対応しています。しかし、中程度の長さの文書でも数万トークンになることがあるため、チャンク分割は非常に重要です。
チャンク分割の効果は、特に以下の場合に顕著です。
- 非常に長い文書を扱う場合
- クエリへの回答が文書の後半にある場合
実験結果によると、長文書や文書後半に回答がある場合、チャンク分割を行うことで検索性能(Recall@50)が大幅に向上することが示されています。
具体的には以下の表のようになっていて、チャンク分割したときの Recall@50 が大幅に改善しているのが分かります。
また、埋め込みモデルは、文章の意味内容を限られた次元数の数値(例:Ada-002モデルでは1,536次元)に圧縮する必要があります。この制約のため、複数のトピックを含む長い文章を単一のベクトルにエンコードすると、重要な細かいニュアンスが失われる危険性があります。
実際、分析結果によると、大きなチャンクを使用すると検索性能が低下することが示されています。つまり、効果的な検索を実現するためには、文章を適切な長さに分割することが重要です。チャンクサイズを小さくすることで、より詳細な意味情報を保持し、検索精度を向上させることができます。
このことから、開発者は埋め込みモデルの特性を十分に考慮し、慎重にチャンクサイズを選択する必要があります。適切なチャンク分割戦略は、生成AIアプリケーションの検索性能を最適化する上で重要な要素となります。
以下はチャンク長を変化させた実験結果で、512トークンが最も精度高く検索できていることが分かります。
さらに、開発者がベクトル入力を構築する方法には様々なアプローチがあります。これらの方法は、検索性能を向上させ、より豊かな文脈情報を提供することを目的としています。
一つの効果的な手法は、各チャンクを重複させることです。これにより、チャンク間で文脈が共有され、連続性が保たれます。また、各ベクトルに文書タイトルや主要トピックを追加することで、より広範な文脈情報を付与することも可能です。これらの方法は、個々のチャンクにより多くの背景情報を与え、検索の正確性を高める効果があります。
特に注目すべき戦略として、自然な文章や段落の区切りでベクトルを終了させる方法があります。この手法は実装が比較的簡単でありながら、非常に効果的です。文章の自然な構造を尊重することで、意味のまとまりを保持し、より適切な検索結果を得られる可能性が高まります。
これらの戦略を適切に組み合わせることで、開発者は検索システムの性能を最適化し、より正確で文脈に即した結果を提供することができます。チャンク分割の方法は、生成AIアプリケーションの全体的な性能に大きな影響を与える重要な要素の一つと言えるでしょう。
以下の実験結果では、25%オーバーラップさせたものが最も性能が良くなっていることが分かります。
セマンティックランキングが最良の結果を上位に配置
セマンティックランキングは、生成AIアプリケーションにおいて最も関連性の高い結果を優先的に提供するための重要な技術です。
一般的に、生成AIシナリオでは、最も重要な情報を優先するために、上位3〜5件の結果を基盤となる文脈として使用します。このため、AI検索アプリケーションでは、低品質の結果をフィルタリングできる調整された関連性スコアが非常に効果的です。
セマンティックランカーの仕組みは以下の通りです:
- クエリと文書のテキストを同時にトランスフォーマーモデルに通します。
- このモデルはクロスアテンション機構を利用してランカースコアを生成します。
- クエリと文書チャンクのスコアは、すべてのインデックスとクエリで一貫した範囲に調整されます。
- スコアは0(非常に関連性が低い)から4(非常に関連性が高い)の範囲で表されます。
実験結果によると、ハイブリッド検索とセマンティックランキングを組み合わせることで、各結果セットサイズにおいて、LLM(大規模言語モデル)に最適なコンテンツを見つけ出すことができます。
この手法により、生成AIアプリケーションは最も関連性の高い情報を効率的に活用し、より正確で文脈に即した応答を生成することが可能となります。セマンティックランキングは、大量の情報から最も価値のある部分を抽出し、AIシステムの性能を最大化するための重要な要素と言えるでしょう。
さいごに
自分で RAG システムを構築するときにもこの実験結果を参考にしたいと思いました。