HUOXIU

Advanced RAG 11: ユーザー入力を分類して最適化します。

編集者注: AIアシスタントに複雑な質問をしたのに、答えがあまりにも単純だったり、あるいはあなたの意図とは全くかけ離れたものだったり、あるいは非常に簡単な質問をしたのに、AIアシスタントが不要な情報を大量に返してイライラしたりした経験はありませんか?

従来の RAG テクノロジーは AI 応答のエラーを効果的に削減できますが、ユーザーの最初のクエリを改善することはできないため、次のような問題が発生する可能性があります。

  • ユーザーが送信した単純なクエリの場合、システムは過剰なコンピューティング リソースを消費し、ユーザーの時間を無駄にし、リソースの消費が増加する可能性があります。
  • 複雑なクエリに直面した場合、元のクエリを直接使用して検索を行うと、十分な情報を収集できず、不完全または不正確な回答がもたらされることがよくあります。
  • 曖昧または不明瞭なクエリの場合、情報検索のために元のクエリのみに頼るのは十分ではなく、ユーザーの真の意図を誤解する可能性があります。

では、これらの問題を軽減し、AIシステムの理解と応答品質を向上させるにはどうすればよいでしょうか。この記事では、クエリ分類クエリ絞り込みという2つの技術的ソリューションを紹介し、コード例を用いて解説します。また、これらの技術的ソリューションに対する著者の理解と考察についても記します。

著者 | フロリアン・ジューン

編纂者:岳陽

目次

01 Adaptive-RAG: 問題の複雑さに応じてデータを分類・処理する検索強化型LLM(Adapt)

1.1 全体的なプロセス

1.2 分類器の構築

1.3 データセットの構築

1.4 トレーニングと推論

1.5 分類器のサイズの選択

02 RQ-RAG: RAGシステムにおけるクエリ最適化技術

2.1 データセットの構築

2.2 トレーニング

2.3 回答の選択

03 洞察と考察

3.1 これらの技術とSelf-RAGおよびCRAGとの比較

3.2 技術実践中に遭遇したいくつかの問題(エンジニアリング実装について)

3.3 小型モデルも活躍

04 結論

従来の RAG テクノロジーは LLM の応答におけるエラー率を効果的に低減できますが、図 1 の赤いボックスに示すように、このテクノロジーではユーザーの初期クエリを最適化することはできません。

図1:従来のRAG手法では、初期クエリ(図中の赤でマークされた部分)は改善されない。画像は原著者作成。

この方法には次のような問題が生じる可能性があります。

  • 単純なクエリを処理する場合、RAG システムは過剰なコンピューティング リソースを消費する可能性があります。
  • 複雑なクエリに直面した場合、元のクエリ(変更されていないクエリの内容、ユーザーが最初に送信した検索要求)を直接使用すると十分な情報を収集できないことがよくあります。
  • 複数の回答がある可能性のあるあいまいなクエリの場合、情報検索に元のクエリのみに頼るのは十分ではありません。

本稿では、クエリ分類クエリ改良という2つの高度な戦略を考察します。どちらも小規模なモデルを学習することでシステム全体のパフォーマンスを向上させます。最後に、著者はこれら2つのアルゴリズムに関する理解と考察を共有します。

01 Adaptive-RAG: 問題の複雑さに応じてデータを分類・処理する検索強化型LLM(Adapt)

1.1 全体的なプロセス

Adaptive-RAGは、革新的な適応型フレームワークを提案します(訳者注:このシステムは、クエリの複雑さに基づいて、最適な情報検索・生成戦略を動的に選択できます)。図2に示すように、システムはクエリの複雑さに基づいて、最も単純なものから最も複雑なものまで複数の戦略を含む、最適なLLM利用戦略を動的に選択できます。

図2: 異なる検索強化型LLMの解法戦略の比較。出典: Adaptive-RAG[1]

図2(A)は、まず関連文書を検索し、次に回答を生成するシングルステップアプローチを示しています。ただし、このアプローチは、複数段階の推論を必要とする複雑なクエリに対しては十分な精度が得られない可能性があります。

図2(B)は、反復的な文書検索と中間応答の生成を含む複数段階のプロセスを示しています。この手法はパフォーマンスは良好ですが、大規模言語モデル(LLM)とリトリーバーを複数回呼び出す必要があるため、単純なクエリの処理にはあまり効率的ではありません。

図2(C)は適応型アプローチを示しています。慎重に設計された分類器を用いることで、最適な検索戦略(反復検索、単一検索、あるいは検索手法なし)をより正確に決定・選択することができます。

Adaptive-RAGのワークフローをより直感的に理解していただくため、この記事では具体的なコード例を用いて解説します。現在、この技術のコード実装には、公式バージョン[2]、Langchain**バージョン[3]、LlamaIndexバージョン[4]、Cohereバージョン[5]の4つのバージョンがあります。この記事では、LlamaIndexバージョンを例に挙げてこの技術を紹介します。

詳細については、こちらのドキュメント[6]を参照してください。コード量が膨大であるため、この記事ではコアとなるコードスニペットの説明に重点を置きます。

図3: Adaptive-RAGのさまざまなツール。画像は著者によるもので、LlamaIndexバージョン[4]を参考にしています。

コードの実行方法はクエリの複雑さに応じて異なり、それに応じてさまざまなツールが呼び出されます。

  • 複雑なクエリを処理するには、複数のツールを連携させる必要があります。これらのツールは、図3の右上に示すように、複数のドキュメントから情報を抽出します。
  • 単純なクエリの場合: 図 3 の左上に示すように、単一のドキュメントから必要なコンテキストを取得するには単一のツールが必要です。
  • 簡単なクエリの処理: 図 3 の下部に示すように、LLM を直接呼び出して回答を提供します。

図2(C)に示すように、分類器を用いて適切なツールを選択できます。ただし、公式版とは異なり、ここで使用する分類器はこのアプリケーションシナリオ向けに特別に学習されたものではなく、図4に明確に示されているように、既製のLLMが直接適用されています

図4: Adaptive-RAGのツール選択。画像は著者によるもので、LlamaIndexバージョン[4]を参考にしています。

1.2 分類器の構築

LlamaIndex バージョンのコード実装には分類子の構築手順は含まれていませんが、分類子の構築プロセスを完全に理解することは、その後の開発作業にとって非常に重要です。

1.3 データセットの構築

この技術を実装する上での大きな課題は、クエリと複雑度のペアを含むトレーニングデータセットが不足していることです。では、この問題にどう対処すればよいのでしょうか?Adaptive-RAGは、必要なトレーニングデータセットを自動的に作成するために2つの戦略を採用しています。

Adaptive-RAG [7]が提供するデータセットによると、分類器トレーニングセットのデータラベル付け作業は、ラベル付きの公開されている質問と回答のデータセットに基づいていることがわかります。

処理戦略は 2 つあります。

ユーザーがアップロードしたクエリの場合、最も単純な非検索ベースの方法で正しい回答が得られた場合、そのクエリには「A」というラベルが付けられます。同様に、シングルステップのアプローチで正しく回答できるクエリには「B」というラベルが付けられマルチステップのプロセスで正しく回答できるクエリには「C」というラベルが付けられます。ただし、より単純なモデルの方が優先度が高いことを強調しておくことが重要です。つまり、シングルステップとマルチステップの両方の方法で正しい回答が得られ、非検索ベースの方法では正しく回答が得られない場合、図5に示すように、そのクエリには「B」というラベルが付けられます。

図 5: Adaptive-RAG データセットのサンプル例、元の著者からのスクリーンショット。

上記の3つの方法のいずれも正しい回答を生成しない場合は、一部の質問がまだラベル付けおよび分類されていないことを意味します。この場合、公開データセットに基づいて直接分類します。具体的には、シングルホップデータセットのクエリは「B」、マルチホップデータセットのクエリは「C」とラベル付けされます。

1.4 トレーニングと推論

トレーニング方法では、クロスエントロピー損失関数を採用し、自動的に収集されたクエリと複雑さのペアに基づいて分類器をトレーニングします。

次に、推論プロセス中にクエリを分類器に入力し、クエリの複雑度レベルを決定します。レベルラベルは「A」、「B」、「C」のいずれかになります:o = Classifier(q)。

1.5 分類器モデルのサイズの選択

図6:異なるサイズの分類モデルの実験結果。出典:Adaptive-RAG[1] 図6からわかるように、分類モデルのサイズに関わらず、パフォーマンスに大きな差はありません。小さなモデルでも同じレベルのパフォーマンスを維持できるため、リソース利用効率の向上に効果的です。

次に、クエリ最適化手法である RQ-RAG を紹介します。

02 RQ-RAG: RAGシステムにおけるクエリ最適化技術

前述の課題に対処するために、RQ-RAG は図 7 に示すように 3 つの最適化手法を提案しています。

図7:RQ-RAGが使用するモデルは、ニーズに応じて情報検索を実行し、必要に応じてクエリを書き換え、分解、曖昧性を解消することができます。出典:RQ-RAG[8]。

  • 「毎日の挨拶」のような単純なクエリの場合、余分なコンテキスト情報を追加すると、大規模モデルの応答品質が実際に低下する可能性があります。このような場合、大規模言語モデルは、モデルの回答品質の低下を避けるために、不要なコンテキスト情報を追加するのではなく、直接応答する必要があります。言い換えれば、図7の左上に示すように、モデルはオンデマンドで応答する能力を持つべきです。
  • RQ-RAGは、複雑なクエリに直面した場合、それを解決しやすい複数のサブクエリに分解します。そして、各サブクエリから関連情報を取得し、元の複雑なクエリに対する完全な応答を作成します(図7の右上を参照)。
  • 意味が曖昧であったり、複数の解釈が可能なクエリに遭遇した場合、元のクエリテキストをそのまま検索に用いるだけでは十分ではありません。大規模な言語モデルは、クエリテキストの具体的な詳細を把握し、ユーザーの真の意図を理解し、的を絞った検索戦略を策定する必要があります。

この方法により、図 7 の下部に示すように、取得された情報が包括的かつ正確であることが保証され、質問に効果的に答えることができます。

RQ-RAG は Llama2 7B モデルをエンドツーエンドでトレーニングし、書き換え、分解、および曖昧性の除去を通じてモデルがクエリ検索パフォーマンスを動的に向上できるようにします。

RQ-RAG[9]のコードは現在リファクタリング段階[10]にあるため、一部の機能はまだ完全に実装されておらず、この記事ではそれらを説明することはできません。

2.1 データセットの構築

RQ-RAG システムのエンドツーエンドの性質を考えると、データセット構築プロセスに重点を置くことが重要です。

図8:データセット構築プロセス。出典:RQ-RAG[8]

データセット[11]の構築は主に以下のステップで構成される。

1.まず、図9に示すように、様々な利用シナリオ(マルチターン対話、分解が必要なクエリ文、曖昧性解消が必要なクエリ文など)を網羅したコーパスを収集します。このコーパスに基づいて、タスクプールを構築します。

図9:データセットの構造。出典:RQ-RAG[8]

2.次のステップでは、タスクプール内のタスクを、マルチターン対話、クエリ分解、クエリ曖昧性解消の3つの主要なタイプに分類します。例えば、マルチターン対話データセット内の各サンプルは、マルチターン対話カテゴリに分類されます。

3. 3つ目のステップは、ChatGPT**を用いて様々なクエリを最適化することです。次に、これらの最適化されたクエリ文を用いて外部データソースから情報を取得します。一般的に、DuckDuckGoが主要な情報検索ソースであり、この検索プロセスは不透明な「ブラックボックス」と考えられています。

4. 4番目のステップでは、最適化されたクエリとそのコンテキストに基づいて、ChatGPTに修正されたモデル応答を生成するよう指示します。このプロセスを繰り返すことで、合計約40,000(40k)のインスタンスが蓄積されました。

図10、11、12は、ChatGPTとのやり取りで使用されるプロンプトテンプレートを示しています。青いテキストは、状況に応じて入力する必要がある具体的な内容を示しています。

図10:データセット構築時に使用したマルチターン対話プロンプト単語テンプレート。出典:RQ-RAG[8]

図11:データセット構築時に使用したクエリ分解プロンプトテンプレート。出典:RQ-RAG[8]

図12:データセット構築時に使用したクエリ曖昧性解消プロンプトテンプレート。出典:RQ-RAG[8]

上記の手順をすべて完了すると、図 13 の右側に示すトレーニング サンプルが取得されます。

図13: トレーニングサンプル。出典: RQ-RAG[8]

各トレーニング サンプルは、基本的に特定のトークンを含む操作シーケンスです。

  • 「Xorigin」「Yorigin」は、元のデータセット内の入力と出力のペアのセットを表します。
  • 「タイプ」は最適化アクションを指します。クエリの書き換え、クエリの分解、あいまいさの排除などが考えられます。
  • 「i」は反復ラウンドを表します。
  • 「SPECIALtype」は最適化のタイプを示します。
  • 「Qi, type」は、i 番目の反復における特定のトークンに基づいて最適化されたクエリ テキストを指します。
  • 「[Di1、Di2、...、Dik]」は、i 番目の反復で取得された最初の k 個のドキュメントを表します。
  • 「Ynew」は最後の反復で生成された新しい回答です。

2.2 トレーニング

訓練データセットを取得した後、従来の自己回帰法[12]を用いて大規模言語モデル(LLM)を訓練することができる。具体的な訓練目的関数を図14に示す。

図14:RQ-RAGモデルの訓練目標。出典:RQ-RAG[8]

つまり、トレーニングの核心は、モデルパラメータを微調整して、各ステップ i で、元の入力 x、最適化されたクエリ qi、および取得されたドキュメント di に直面したときに、モデル M がモデル応答 y に対して最も高い確率の予測を与えることができるようにすることにあります。

2.3 回答の選択

各反復処理において、モデルはクエリの書き換え、分解、曖昧性の解消といった特定のニーズに基づいて、複数の検索クエリ文を生成します。これらのクエリは異なるコンテキストを獲得することで、モデルが複雑なタスクをより包括的かつ柔軟に処理できるようになります(これにより、拡張パスの多様化が促進されます)。

図15:異なるパスに対して、我々は3つの異なる戦略を開発しました。それは、パープレキシティ(PPL)、信頼度、そしてアンサンブル学習に基づく選択手法です。出典:RQ-RAG[8]

図15に示すように、RQ-RAGはツリーデコード戦略を開発し、3つの選択メカニズム[13]を使用しました。3つの選択メカニズムとは、パープレキシティベースの選択方法信頼度ベースの選択方法、およびアンサンブルベースの選択方法です

パープレキシティベースの選択手法では、モデルはすべての出力の中で最も低いパープレキシティ(PPL)を持つ回答を選択します。信頼度ベースの選択手法では、最も高い信頼度スコアを持つ結果を選択します。一方、アンサンブル学習ベースの選択手法では、累積信頼度スコアが最も高い最終結果を選択する傾向があります。

03 洞察と考察

3.1 これらの技術とSelf-RAGおよびCRAGとの比較

検索前に元のクエリを最適化するAdaptive-RAGやRQ-RAGとは異なり、Self-RAG[14]とCRAG[15]は、検索操作をいつ実行するかを決定することと、検索操作後の情報処理効率をどのように最適化するかに重点を置いています。特にCRAGは、Web検索に使用されるクエリ文を書き換えることで、検索結果の情報品質を向上させる点が注目に値します。

RQ-RAGとSelf-RAGはどちらも、小規模な言語モデルを学習することで、元の大規模モデル(LLM)を置き換えます。一方、Adaptive-RAGとCRAGは元のモデルを維持し、クエリを分類または評価するための2つの機能層のみを追加します。

注目の Adaptive-RAG と RQ-RAG はどちらも Self-RAG よりも優れていると主張しており、それぞれの論文には対応する実験レポートが含まれています。

生成プロセスの観点から見ると、Self-RAG、CRAG、および Adaptive-RAG は複雑なツリーデコード戦略を採用していないため、よりシンプルで高速であるように見えます。

3.2 技術実践中に遭遇したいくつかの問題(エンジニアリング実装について)

クエリが複数ターンの対話に変換される場合、大規模な言語モデルを用いて長いプロンプト語データを処理すると、応答に遅延が生じる可能性があります。現在の私の理解に基づくと、この問題の効果的な解決策としては並列化が考えられます。

さらに、Adaptive-RAGとRQ-RAGはどちらもクエリを分類します。しかし、これらの分類手法は本当に最適な状態に達しているのでしょうか?特定の運用シナリオに完全に適合しているのでしょうか?他の分類戦略を使用することで、より良い結果を得ることができるのでしょうか?これらの疑問は、一連の比較実験を通じて検証する必要があります。

3.3 小型モデルも活躍

RQ-RAG の実際のアプリケーションでは、データセットが適切に構築され、生成プロセスが改良されていれば、70 億のパラメータを持つモデルでも優れたパフォーマンスを実現できることが実証されています。

盲目的に大規模なモデルサイズを追求することは、必ずしも費用対効果の向上につながるわけではありません。リソースが限られているチームにとっては、データセットの最適化とアルゴリズムの改良に重点を置く方が賢明な選択となるかもしれません。

04 結論

この記事では、クエリ分類とクエリ絞り込みという2つの技術的ソリューションを取り上げ、コード例を用いて解説します。また、これらの技術に対する著者の理解と考察も共有します。

検索エンジン拡張 (RAG) テクノロジーにご興味がございましたら、このシリーズの他の記事もぜひご覧ください。

  • 上級RAG 10: CRAGテクノロジーの詳細な説明 - 検索評価と知識の洗練を導入

  • 上級RAG 09: プロンプトワード圧縮技術の概要

  • 上級RAG 08: セルフRAGによる高品質で追跡可能なRAGシステムの構築

  • 「白海IDP」RAGシリーズの他の記事

読んでくれてありがとう!

このブログを楽しんで、新しいことを学んでいただければ幸いです。

フロリアン・ジューン

AI研究者。LLM、RAG、エージェント、ドキュメントAI、データ構造に焦点を当てています。最新の記事はニュースレターをご覧ください。

https://florianjune.substack.com/

終わり

参考文献

[1] https://arxiv.org/pdf/2403.14403

[2] https://github.com/starsuzi/Adaptive-RAG

[3] https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_adaptive_rag_cohere.ipynb

[4] https://github.com/mistralai/cookbook/blob/e200507fba4e3404564f9249b345c89f83d73a10/third_party/LlamaIndex/Adaptive_RAG.ipynb

[5] https://github.com/cohere-ai/notebooks/blob/main/notebooks/react_agent_adaptive_rag_cohere.ipynb

[6] https://github.com/mistralai/cookbook/blob/e200507fba4e3404564f9249b345c89f83d73a10/third_party/LlamaIndex/Adaptive_RAG.ipynb

[7] https://github.com/starsuzi/Adaptive-RAG/blob/0c88670af8707667eb5c1163151bb5ce61b14acb/data.tar.gz

[8] https://arxiv.org/pdf/2404.00610

[9] https://github.com/chanchimin/RQ-RAG

[10] https://github.com/chanchimin/RQ-RAG/tree/96b4ec981d4a4399e8402da1b75e16f7812aedfe

[11] https://github.com/chanchimin/RQ-RAG/blob/96b4ec981d4a4399e8402da1b75e16f7812aedfe/data_curation/main_multiturn_answer_generate.py

[12] https://github.com/chanchimin/RQ-RAG/blob/96b4ec981d4a4399e8402da1b75e16f7812aedfe/retrieval_lm/finetune.py

[13] https://github.com/chanchimin/RQ-RAG/blob/96b4ec981d4a4399e8402da1b75e16f7812aedfe/retrieval_lm/output/sample_from_tree.py

[14] https://medium.com/ai-advances/advanced-rag-08-self-rag-c0c5b5952e0e

[15] https://ai.gopubby.com/advanced-rag-10-corrective-retrieval-augmented-generation-crag-3f5a140796f9

オリジナルリンク:

https://ai.gopubby.com/advanced-rag-11-query-classification-and-refinement-2aec79f4140b