VMware Private AI Foundation with NVIDIA(PAIF-N)に関する VMware Explore 2024 における発表内容の一環として、お客様が Retrieval Augmented Generation(RAG)システムで利用される言語モデルの本番環境レベルの属性(堅牢、スケーラブル、セキュア)を提供する最新の NVIDIA Inference Microservices(NIM)を活用できるように、Improved RAG Starter Pack v2.0 の更新をすることにしました。
オリジナルの Improved RAG Starter Pack(v1.0)の方針を継承し、強化されたRAG とJupyter notebook を提供します。これらは、事実に基づいた関連のあるコンテキストによって大規模言語モデル(LLM)を拡充します。LLM の事前トレーニング コーパスに含まれていない可能性がある専門知識に関する質問を受けたときに、LLM が正確で信頼できる回答を生成することを支援します。これによって、LLM のハルシネーションを効果的に低減し、AI を活用するアプリケーションの信頼性を高めることができます。
以下は、アップデートされた Improved RAG Starter Pack の新機能です。
- LLMやテキスト埋め込み、テキスト再ランキングに NVIDIA NIM を使用しています。これらは、RAG パイプラインを強化するために使用される 3 つの主要な言語モデルです
- LlamaIndex を v0.11.1 にアップデートしました
- RAG パイプラインを推進するジェネレーター LLM として Meta-Llama3-8b-Instruct を使用します
- 以下の2点のために、RAG パイプラインの評価に関する DeepEval 用のエンジンとして、OpenAI GPT-4 を Meta-Llama-3-70b-Instruct に置き換えました
- RAG システムの評価セットのシンセサイザーとして動作させる
- 評価セットから抽出された質問に対する RAG パイプラインの回答にスコア付けすることで、パイプラインの評価者(審査員)として動作させる。各回答は複数の DeepEval メトリックと照らし合わせて評価されます。これらのメトリックの詳細については後述します
Improved RAG Starter Pack の仕組み
この Starter Pack がホストされている GitHub リポジトリのディレクトリでは、標準の RAG システムの各種要素を実装するためのステップバイステップ アプローチが提供されています。
RAG システムでは、NVIDIA NIM に加えていくつかの一般的なテクノロジーが活用されています。これらのテクノロジーとしては、LlamaIndex(LLM ベースのアプリケーション開発フレームワーク)、vLLM(LLM 推論サービス)、PostgreSQL with PGVector(VMware Data Services Manager を使用して展開できるスケーラブルで堅牢なベクトル データベース)などが挙げられます。
最初に、標準の RAG パイプラインを実装します。次に、RAG のナレッジベースを使用して、RAG システムを評価するための評価データセットを合成します。次に、より高度な検索技法(このドキュメントで後述します)を追加することで、標準の RAG システムを向上させます。最後に、DeepEval を使用してさまざまな RAG アプローチが評価されて、これらのアプローチが比較されて、それぞれの長所と短所が特定されます。
ディレクトリ構造は次のように編成されています。
それでは、各セクションの内容を説明します。
NIM と vLLM のサービスのセットアップ(00)
このセクションでは、RAG パイプラインを実装して評価するために必要な NVIDIA NIM と vLLM のサービスを展開するための手順と Linux シェル スクリプトを提供しています。
PGVector のインスタンス化(01)
このセクションでは、PostgreSQL with PGVector を展開するためのいくつかの代替方法を紹介しています。PGVector は、LlamaIndex がナレッジベース(テキスト、埋め込み、メタデータ)を保管するために使用するベクトル ストアです。ナレッジベースは LLM のナレッジを強化して、ユーザーの質問に対してより正確な回答を生成します。
KB ドキュメントのダウンロード(02)
RAG のデモや紹介の多くは、LLM の事前トレーニング データに含まれていない可能性のあるナレッジ ドメインについて尋ねられたときに、ナレッジベースを使用して LLM の生成機能が強化される、という点を訴求しています。この Starter Pack では、NASA のヒストリー eBook コレクションに含まれている 10 個のドキュメントを使用することにしました。このコレクションには、RAG に関するチュートリアルで見られるさまざまタイプのドキュメントが含まれています。
ドキュメントの取り込み(03)
このセクションに含まれている初期 Jupyter notebook では、LlamaIndex を使用して eBook(PDF 形式)を解析し、これらの eBook を複数のチャンク(LlamaIndex ノード)に分割します。その後、各ノードを長いベクトル(埋め込み内容)としてエンコードし、それらのベクトルを PostgreSQL with PGVector に保管します。PostgreSQL with PGVector は、ベクトルのインデックスとクエリのエンジンとして動作します。次の図は、ドキュメント取り込みプロセスの流れを示しています。
いったん PGVector によって、メタデータ、テキスト チャンク、それらに対応する埋め込み内容を含むノードが取り込まれると、PGVector は、LLM がナレッジベース(このケースでは NASA ヒストリー ブック)に関する回答を生成するためのナレッジベースを提供できます。
評価データセットの生成(04)
このフォルダ内の Jupyter Notebook では、DeepEval の Synthesizer を使用して質問/回答のデータセットを生成する方法が例示されています。このデータセットが後で DeepEval のメトリックによって使用されることで、RAG パイプラインの品質が評価されて、RAG パイプライン内の重要コンポーネント(LLM、埋め込みモデル、再ランキング モデル、ベクトル ストア、検索アルゴリズムなど)の変化が生成プロセスの品質に与える影響が特定されます。Meta-Llama-3-70b-Instruct モデルを使用して、評価セットを合成的に生成します。
RAG バリアントの実装(05)
このディレクトリには 3 つのサブディレクトリがあり、各サブディレクトリには、NVIDIA NIM によってサポートされる言語モデルと LlamaIndex をベースにした以下の RAG パイプライン実装バリアントの 1 つを検証する 1 つの Jupyter Notebook が含まれています。
- 標準の RAG パイプライン + 再ランカー:この Notebook は、LlamaIndex を使用して標準の RAG パイプラインを実装して、再ランキング言語モデルをベースにした最終再ランキング ステップを組み込みます。埋め込みモデルとは異なり、再ランカーは質問とドキュメントを入力として使用し、埋め込みの代わりに類似性を直接出力します。質問と句を再ランカーに入力することで、関連性スコアを取得できます。次の NVIDIA NIM を使用して RAG システムを動作させます
- RAG ジェネレーター LLM:Meta-Llama-3-8b-Instruct
- RAG 埋め込みモデル:nvidia/nv-embedqa-e5-v5
- RAG 再ランカー:nvidia/nv-rerankqa-mistral-4b-v3
次の図は、この RAG システムの仕組みを示しています。
- センテンス ウィンドウ検索:Sentence Window Retrieval(SWR)手法は、ターゲット センテンスを囲むセンテンスの特定ウィンドウに重点を置くことで、RAG パイプライン内の情報抽出の正確性と関連性を向上させます。この重点的アプローチは、関連のない情報を除外することで正確性を高めて、検索時に処理されるテキストの量を削減することで効率性を高めます。開発者はこのウィンドウのサイズを調整することで、自身の特定ユースケースのニーズに従って検索をさらに細かくカスタマイズできます
ただし、この手法には潜在的なデメリットがあります。すなわち、ウィンドウを狭くし過ぎると、隣接テキスト内の重要情報を逃してしまう恐れがあるため、検索プロセスの正確性と完全性の両方を最適化するためには、適切なコンテキスト ウィンドウ サイズを選択することが不可欠になります。このディレクトリ内の Jupyter Notebook は、ドキュメントを複数のノード(各ノードは 1 つのセンテンスになります)に分割する Sentence Window Node Parsing モジュールを介して LlamaIndex の SWR 実装を使用します。各ノードには、そのノードのメタデータ内の周辺センテンスからの 1 つのウィンドウが含まれています。このノード リストは再ランキングされてから、LLM に渡されて、それらのノードからのデータに基づいて質問回答が生成されます。
- 自動マージ検索:自動マージ検索は、言語モデル内のコンテキスト断片化の問題に対処するために設計された RAG 手法です(主に、従来の検索プロセスによってつながりのないテキスト スニペットが生成される場合)。この手法では、小さいテキスト チャンクが大きい親チャンクにリンクされるという階層構造が導入されています。検索時に、同じ親チャンクに属する複数の小さいチャンクが特定しきい値を満たした場合は、それらの小さいチャンクは自動的にマージされます。この階層的なマージ アプローチを使用することで、断片化されたスニペットが検索される代わりに、整合性のある大きい親チャンクがシステムによって収集されるようになります。このディレクトリ内の Notebook は、LlamaIndex の AutoMergingRetriever を使用してこの RAG バリアントを実装しています
RAG パイプラインの評価(06)
このフォルダに含まれている Jupyter Notebook は DeepEval を使用して、先ほど実装された RAG パイプラインを評価します。この目的のために、DeepEval は直前のステップで生成された評価データセットを使用します。以下では、さまざまな RAG パイプライン実装を比較するために使用される DeepEval メトリックを簡単に説明しています。DeepEval メトリック アルゴリズムは、LLM によってメトリックに各スコアが付与された理由を説明できます。ここでは、この機能を有効にして動作が確認できるようにしています。
- コンテキスト正確性(Contextual Precision)では、検索コンテキスト内のノードのうち、提供された入力に関連があるものが、関連のないノードよりも高くランク付けされているかどうかが評価されることで、RAG パイプラインのリトリーバーが測定されます
- 忠実性(Faithfulness)では、実際の出力が事実の面から検索コンテキストの内容と整合しているかどうかが評価されることで、RAG パイプラインのジェネレーターの品質が測定されます
- コンテキスト リコール(Contextual Recall)では、検索コンテキストが期待される出力と整合している度合が評価されることで、RAG パイプラインのリトリーバーの品質が測定されます
- 回答の関連性(Answer Relevancy)では、RAG パイプラインの実際の出力が、提供された入力と比べてどの程度関連性があるように見えるのかが測定されます
- ハルシネーション(Hallucination)。このメトリックでは、実際の出力が提供されたコンテキストと比較されることで、お使いの LLM によって事実の面で正しい情報が生成されているかどうかが測定されます。これは基本的なメトリックです。その理由は、RAG パイプラインの主な目標の 1 つが、事実に基づいた正確で最新の回答をユーザーの質問に対して生成できるように LLM を支援することであるからです
DeepEval による評価は、次のセットアップを使用して実行されます。
- DeepEval のメトリックをスコア付けする LLM を審査します:ガイド付き JSON モードで vLLM 上で実行されている Meta-Llama-3-70b-Instruct
次の表は、40 以上の質問/回答ペアを使用して行われた実験の 1 つから得られた評価結果を示しています。
RAG 実装 | コンテクスト正確性(Contextual Precision) のスコア | コンテクスト リコール(Contextual Recall) のスコア | 回答の関連性(Answer Relevancy) のスコア | 忠実性(Faithfulness)のスコア | ハルシネーション(Hallucination)のスコア (小さい方が望ましい) |
標準の RAG + 再ランカー | 0.80 | 0.83 | 0.84 | 0.94 | 0.43 |
センテンス ウィンドウ検索 | 0.89 | 0.79 | 0.80 | 0.96 | 0.31 |
自動マージ検索 | 0.83 | 0.84 | 0.82 | 0.96 | 0.40 |
次のグラフは、上の表と同じ結果を示しています。
表からわかるように、特定の RAG 実装は特定のメトリックに関する性能が他の RAG 実装よりも高い場合があります。このことは、ユースケースよって最適な RAG 実装が異なる可能性があることを示しています。さらに、上記の評価メトリックはパイプライン全体の性能を高めるために RAG パイプラインのどのコンポーネントを調整する必要があるのかを判断するのに役立ちます。
まとめ
Improved RAG Starter Pack では、RAG システムを実装する担当者向けの有用なツールキットが提供されており、コンテキスト上の理解を深めることで LLM を強化するように設計された一連の適切に文書化された Python Notebook が付属しています。この Starter Pack には、システムを評価するための DeepEval のような高度な検索技法と検索ツールが含まれており、これらの技法とツールは、LLM のハルシネーションなどの問題を軽減して、AI 回答の信頼性を高めるのに役立ちます。GitHub リポジトリは適切に構造化されており、データ サイエンティストでなくても簡単に実践できる明確なステップバイステップのガイダンスをユーザーに提示します。弊社の Private AI Foundation with NVIDIA のお客様とパートナー様が VMware Cloud Foundation インフラストラクチャ上で生成 AI アプリケーションの実行を開始するにあたって、このガイダンスをお役立ていただければ幸いです。安全性とセキュリティに関する本番環境用 RAG パイプラインの重要な側面についての今後の記事にご期待ください。
エンリケ・コロは、18 年以上にわたって VMware に勤務しており、イリノイ大学でデータ サイエンス分野の修士号を取得しています。現在はデータ サイエンス エンジニアとして働いています。