HUOXIU

上級RAG 03: RAGとLlamaIndexを使用したRAGアプリケーションの評価

編集者注:現在、検索拡張生成(RAG)技術は、様々な大規模モデルアプリケーションで広く利用されています。しかし、RAGシステムの性能と有効性をどのように正確に評価するかは、産業界と学界にとって常に重要な課題となっています。RAGシステムを包括的かつ客観的に評価しなければ、的を絞った最適化と改善は困難です。したがって、RAGシステムのための科学的かつ信頼性の高い評価指標システムを開発することは、RAG技術のさらなる発展を促進する上で非常に重要です。

この記事は、Advanced RAGシリーズの第3弾です。RAGA(Retrieval Augmented Generation Assessment)が提案するRAG評価指標フレームワークを紹介し、RAGAとLlamaIndexを用いて評価プロセス全体を実装する方法について説明します。

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

編纂者:岳陽

🚢🚢🚢AIテクノロジーソフトウェアと技術交流グループへのご参加をお待ちしております!最新のトレンドを把握し、一緒に技術的な課題を探求しましょう!

実世界のビジネスシステム向けに検索強化生成(RAG)アプリケーションを開発した場合、RAGアプリケーションのパフォーマンスを把握したいと考えるかもしれません。つまり、RAGアプリケーションのパフォーマンスを評価したいと考えるかもしれません。

さらに、既存のRAGアプリケーションが効果的でないことが判明した場合、使用されているRAGパフォーマンス最適化手法の有効性を検証する必要があるかもしれません。つまり、これらのパフォーマンス最適化手法が機能しているかどうかを判断するための評価が必要です。

本稿では、まずRAGAs(Retrieval Augmented Generation Assessment)[1]によって提案されたRAG評価指標を紹介します。RAGAsはRAGパイプラインを評価するためのフレームワークです。次に、RAGAsとLlamaIndexを用いて評価プロセス全体を実装する方法を説明します。

01 RAG評価指標

簡単に言えば、RAGプロセスは3つのステップで構成されます。ユーザーがシステムに提供する質問またはタスク(入力クエリ)を入力する、コンテキストを取得する、そしてユーザーの質問と取得したコンテキストに基づいて言語モデル(LLM)によって回答または解決策を生成するというものです。これら3つのステップは、RAGプロセスの最も重要な3つの要素を構成し、相互に依存しています。

したがって、図 1 に示すように、これら 3 つの要素間の相関関係を測定することによって RAG の有効性を評価することができます。

図1:RAGの有効性は、これら3つの要因間の相関関係を測定することで評価できます。画像は著者によるものです。

この論文[1]では、3つの指標について言及しています。忠実度(生成されたコンテンツがユーザーの入力した質問と取得したコンテキストに忠実であるかどうか)、回答関連性(生成された回答がユーザーの質問に関連しているかどうか)、そしてコンテキスト関連性(生成された回答がユーザーが提供する背景情報と一致しているかどうか)です。これらの指標は、手動でラベル付けされたデータセットや参照回答へのアクセスを必要としません。

さらに、RAGAのウェブサイト[2]では、コンテキスト精度(生成されたモデル応答のうちコンテキスト依存の程度)とコンテキスト再現率(生成されたモデル応答のうちコンテキスト依存の情報をカバーできる程度)という2つの指標も紹介されています。

1.1忠実さ/根拠

忠実度指標は、モデルの応答が特定のコンテキストに基づいているかどうかを評価するために使用されます。これは、開発者が誤解を招くRAGシステムを識別して回避するのに役立ち、取得したコンテキストがRAGシステムの出力を生成するために効果的に使用できることを保証します。

この指標スコアが低い場合、LLMの回答が検索された知識と一致していないことを意味し、幻覚的な回答を返す可能性が高くなります。例えば:

図2: 忠実度スコアの高いモデルと低いモデルの比較

出典: https://docs.ragas.io/en/latest/concepts/metrics/faithfulness.html

忠実度の値を推定するために、まずLLMを用いてステートメント集合S(a(q))を抽出します。具体的な方法は以下の通りです。

質問と回答が与えられた場合、与えられた回答の各文から 1 つ以上のステートメントを作成します。質問: [質問]回答: [回答] 

S(a(q))を生成した後、LLMは各文Siがc(q)から推論可能かどうかを判定します。この検証ステップは、以下のプロンプトを用いて実行されます。

与えられた文脈とそれに続く記述を検討し、文脈に含まれる情報によって裏付けられているかどうかを判断してください。それぞれの記述について、判断(はい/いいえ)を下す前に簡潔な説明を添えてください。最後に、各記述について、指定された形式で最終的な判断を順番に示してください。指定された形式から逸脱しないようにしてください。記述:[記述 1]
...文: [文 n]
与えられた文脈と以下の記述を検討し、文脈に含まれる情報によって裏付けられているかどうかを判断してください。それぞれの記述について簡潔な説明をした後、結論(はい/いいえ)を導き出してください。最後に、指定された形式に従って、それぞれの記述について最終的な判断を下してください。指定された形式から逸脱しないでください。
声明: [声明1]
...
ステートメント: [ステートメント n]。 

最終的な忠実度スコア F は、F = |V| / |S| として計算されます。ここで、|V| は、検証プロセス中に入力された質問と取得されたコンテキストから LLM (大規模言語モデル) が推測できると考えるステートメントの数を表し、|S| はステートメントの合計数を表します。

1.2 回答の関連性

この指標は、生成された回答とユーザーの入力クエリの関連性を測定します。スコアが高いほど関連性が高いことを示します。例:

図 3: 関連性の高い回答と関連性の低いモデル応答を比較した例。

出典: https://docs.ragas.io/en/latest/concepts/metrics/answer_relevance.html

モデルの回答とユーザーの入力クエリの関連性を推定するために、以下に示すように、LLM に与えられた回答 a(q) に基づいて n 個の潜在的な質問 qi を生成させます。

与えられた回答に対する質問を生成します。回答: [回答] 

次に、テキスト埋め込みモデルを使用して、すべての質問の埋め込みを取得します。

各qiについて、質問qとの類似度sim(q,qi)が計算されます。これは埋め込み間のコサイン類似度に相当します。質問qに対する回答の関連性を表すARスコアは、以下のように計算されます。

1.3 文脈の関連性

これは検索品質を測る指標であり、主に検索されたコンテキストがユーザーがシステムに提供した質問をどれだけ適切にサポートしているかを評価します。スコアが低い場合、検索されたコンテンツには無関係な情報が大量に含まれており、LLMによって生成される最終的な回答に影響を与える可能性があります。例えば、

図4: 文脈関連性の高低

出典: https://docs.ragas.io/en/latest/concepts/metrics/context_relevancy.html

文脈の関連性を評価するために、LLMを用いて文脈(c(q))から重要な文(Sext)の集合を抽出する必要があります。これらの文は、LLMが質問に正しく答えるために不可欠です。プロンプトは以下の通りです。

提供された文脈から、以下の質問への回答に役立つ可能性のある関連文を抽出してください。関連文が見つからない場合、または提供された文脈から質問に答えられないと思われる場合は、「情報不足」というフレーズを入力してください。候補文を抽出している間は、提供された文脈の文に変更を加えることはできません。
提示された文脈から、以下の質問に関連する可能性のある文を抽出してください。関連する文が見つからない場合、または提示された文脈から質問に回答できないと思われる場合は、「情報不足」というフレーズを返してください。候補文を抽出する際に、提示された文脈内の文に変更を加えることはできません。 

RAGA では、コンテキスト内の各文について、次の式を使用して文レベルでクエリとの関連性を計算できます。

1.4 コンテキストリコール

この指標は、取得したコンテキストとラベル付けされた回答の一貫性を測定します。ベンチマーク回答と取得したコンテキストを用いて計算され、値が高いほどパフォーマンスが良いことを示します。例:

図5: 高い文脈想起と低い文脈想起

出典: https://docs.ragas.io/en/latest/concepts/metrics/context_recall.html

評価プロセスを実装する場合、手動でラベル付けされたベースライン データが必要です。

計算式は次のとおりです。

1.5 コンテキスト精度

この指標は比較的複雑で、検索結果において、真実の情報を含むすべての関連コンテキストが優先されているかどうかを測定します。スコアが高いほど、精度が高いことを示します。

この指標を計算する式は次のとおりです。

コンテキスト精度のメリットは、ランキング効果(つまり、関連コンテンツが検索結果の上位に正しく表示されているかどうか)を検出できることです。しかし、デメリットは、関連性の高い検索結果が少ないにもかかわらず、すべてが上位にランクインしている場合、スコアが非常に高くなる可能性があることです。そのため、他の複数の指標と組み合わせて、全体的な影響を考慮する必要があります。

02. RAGAとLlamaIndexを使用してRAGアプリを評価する

主なプロセスを図 6 に示します。

図6: メインプロセス。画像は著者による。

2.1 システムの動作環境構成を評価する

ragas をインストールするには、次のコマンドを使用して、pip 経由で ragas をインストールします。

 pip インストール ragas 

次に、ラーガの現在のバージョンを確認します。

 (py) Florian:~ Florian$ pip list | grep ragasragas 0.0.22 

言及する価値があるのは、

pip install git+https://github.com/explodinggradients/ragas.gitを使用して ragas の最新バージョン (v0.1.0rc1) をインストールすると、LlamaIndex はサポートされません。

次に、関連するライブラリをインポートし、環境変数とグローバル変数を設定します。

インポートOS
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" dir_path = "YOUR_DIR_PATH" llama_indexからVectorStoreIndex、SimpleDirectoryReaderをインポートします
ragas.metrics からのインポート (
忠実、
回答の関連性、
コンテキスト関連性、
コンテキストリコール、
コンテキスト精度
)
ragas.llama_indexからインポートして評価する

ディレクトリには「TinyLlama: オープンソースの小規模言語モデル」[3]というPDFファイルが1つだけあります。

 (py) フロリアン:~ フロリアン$ ls /Users/Florian/Downloads/pdf_test/tinyllama.pdf 

2.2 LlamaIndexを使ったシンプルなRAGクエリエンジンの構築

ドキュメント = SimpleDirectoryReader(dir_path).load_data()
インデックス = VectorStoreIndex.from_documents(ドキュメント)
query_engine = index.as_query_engine() 

デフォルトでは、LlamaIndex は OpenAI モデルを使用しますが、LLM および埋め込みモデルは ServiceContext を使用して簡単に構成できます。

2.3 評価データセットの構築

一部の評価指標では手動でラベル付けされたデータセットが必要なため、自分でいくつかの質問を作成し、対応する回答でラベル付けしました。

評価質問 = [
「TinyLlama モデルについて簡潔に説明していただけますか?」
「TinyLlama が行った速度最適化について知りたいです。」
「なぜ TinyLlama は Grouped-query Attention を使用するのか?」
「TinyLlama モデルはオープンソースですか?」
「starcoderdataデータセットについて教えてください」
]
評価回答 = [
TinyLlamaは、約1兆個のトークンを用いて約3エポックで事前学習された、コンパクトな11億個の言語モデルです。Llama 2のアーキテクチャとトークナイザーを基盤とし、オープンソースコミュニティによってもたらされた様々な先進技術(FlashAttentionなど)を活用することで、より優れた計算効率を実現しています。比較的小型であるにもかかわらず、TinyLlamaは一連のダウンストリームタスクにおいて驚異的なパフォーマンスを発揮します。同規模の既存のオープンソース言語モデルを大幅に上回る性能を発揮します。
トレーニング中、マルチGPUおよびマルチノード構成を効率的に活用するために、コードベースにFSDPを統合しました。もう一つの重要な改善点は、最適化されたアテンションメカニズムであるFlash Attentionの統合です。xFormers(Lefaudeux et al., 2022)リポジトリの統合SwiGLUモジュールをオリジナルのSwiGLUモジュールに置き換え、コードベースの効率をさらに向上させました。これらの機能により、メモリフットプリントを削減し、1.1Bモデルを40GBのGPU RAMに収めることができます。
メモリ帯域幅のオーバーヘッドを削減し、推論を高速化するために、モデルではグループ化クエリアテンションを使用しています。クエリアテンションには32個のヘッドがあり、キーと値のヘッドを4つのグループに分けています。この技術により、モデルはパフォーマンスをあまり犠牲にすることなく、複数のヘッド間でキーと値の表現を共有できます。
「はい、TinyLlamaはオープンソースです」
このデータセットは、強力なオープンソースの大規模コード言語モデルであるStarCoder(Li et al., 2023)の学習用に収集されました。86のプログラミング言語にわたる約2500億トークンで構成されています。コードに加えて、GitHubの課題や自然言語を含むテキストとコードのペアも含まれています。
]
eval_answers = [[a] eval_answers 内の a について] 

2.4 評価指標の選択と使用:評価のためのRAGA

メトリクス = [
忠実、
回答の関連性、
コンテキスト関連性、
コンテキスト精度、
コンテキストリコール、
]
結果 = 評価(クエリエンジン、メトリック、評価質問、評価回答)
result.to_pandas().to_csv('YOUR_CSV_PATH', sep=',') 

デフォルトでは、RAGA は OpenAI モデルを使用することに注意してください。

RAGA では、他の LLM (Gemini など) を使用して LlamaIndex とともに RAG システムを評価する場合、RAGA ソース コードをデバッグした後でも、RAGA バージョン 0.0.22 でそれを実行する方法を見つけることができませんでした。

2.5 最終コード

インポートOS
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY"
dir_path = "YOUR_DIR_PATH"
llama_index から VectorStoreIndex、SimpleDirectoryReader をインポートします
ragas.metrics からのインポート (
忠実、
回答の関連性、
コンテキスト関連性、
コンテキストリコール、
コンテキスト精度
)
ragas.llama_indexからインポートして評価する
ドキュメント = SimpleDirectoryReader(dir_path).load_data()
インデックス = VectorStoreIndex.from_documents(ドキュメント)
query_engine = index.as_query_engine()
評価質問 = [
「TinyLlama モデルについて簡潔に説明していただけますか?」
「TinyLlama が行った速度最適化について知りたいです。」
「なぜ TinyLlama は Grouped-query Attention を使用するのか?」
「TinyLlama モデルはオープンソースですか?」
「starcoderdataデータセットについて教えてください」
]
評価回答 = [
TinyLlamaは、約1兆個のトークンを用いて約3エポックで事前学習された、コンパクトな11億個の言語モデルです。Llama 2のアーキテクチャとトークナイザーを基盤とし、オープンソースコミュニティによってもたらされた様々な先進技術(FlashAttentionなど)を活用することで、より優れた計算効率を実現しています。比較的小型であるにもかかわらず、TinyLlamaは一連のダウンストリームタスクにおいて驚異的なパフォーマンスを発揮します。同規模の既存のオープンソース言語モデルを大幅に上回る性能を発揮します。
トレーニング中、マルチGPUおよびマルチノード構成を効率的に活用するために、コードベースにFSDPを統合しました。もう一つの重要な改善点は、最適化されたアテンションメカニズムであるFlash Attentionの統合です。xFormers(Lefaudeux et al., 2022)リポジトリの統合SwiGLUモジュールをオリジナルのSwiGLUモジュールに置き換え、コードベースの効率をさらに向上させました。これらの機能により、メモリフットプリントを削減し、1.1Bモデルを40GBのGPU RAMに収めることができます。
メモリ帯域幅のオーバーヘッドを削減し、推論を高速化するために、モデルではグループ化クエリアテンションを使用しています。クエリアテンションには32個のヘッドがあり、キーと値のヘッドを4つのグループに分けています。この技術により、モデルはパフォーマンスをあまり犠牲にすることなく、複数のヘッド間でキーと値の表現を共有できます。
「はい、TinyLlamaはオープンソースです」
このデータセットは、強力なオープンソースの大規模コード言語モデルであるStarCoder(Li et al., 2023)の学習用に収集されました。86のプログラミング言語にわたる約2500億トークンで構成されています。コードに加えて、GitHubの課題や自然言語を含むテキストとコードのペアも含まれています。
]
eval_answers = [[a] eval_answers 内の a について]
メトリクス = [
忠実、
回答の関連性、
コンテキスト関連性、
コンテキスト精度、
コンテキストリコール、
]
結果 = 評価(クエリエンジン、メトリック、評価質問、評価回答)
result.to_pandas().to_csv('YOUR_CSV_PATH', sep=',') 

ターミナルでプログラムを実行すると、Pandasデータフレームが完全に表示されない場合があることに注意してください。図6に示すように、CSVファイルとしてエクスポートして表示できます。

図6: 最終結果。画像は著者による。

図6から明らかなように、4番目の質問「starcoderdataデータセットについて教えてください」のすべての指標は0です。これは、LLMがこの質問に回答できないためです。2番目と3番目の質問のコンテキスト適合率は0であり、取得されたコンテキストにおいて関連するコンテキストが優先されていないことを示しています。2番目の質問のコンテキスト再現率は0であり、取得されたコンテキストが手動で注釈付けされた回答と一致していないことを示しています。

さて、質問0から3の評価結果を見てみましょう。これらの質問に対するモデルの回答は高い関連性を示しており、モデルの回答と質問の間に強い相関関係があることを示しています。さらに、忠実度スコアは低くなく、回答は主に文脈から導き出された、あるいは要約されたものであることを示しています。したがって、これらの回答はLLMによって生成された錯覚ではないと結論付けることができます。

さらに、コンテキスト関連性スコアが低いにもかかわらず、gpt-3.5-turbo-16k (RAGA で使用されるデフォルトのモデル) は、依然としてそこから答えを導き出すことができることがわかりました。

これらの結果は、この基本的な RAG システムにはまだ改善の余地がたくさんあることを明確に示しています。

03 結論

RAGAsは、開発者がRAGアプリを評価するのに役立つ、多様で包括的な評価指標を提供し、使いやすいです。現在、市場に出回っているRAG評価フレームワークはまだ完璧ではありませんが、RAGAsは比較的効果的なRAGアプリ評価ツールです。

RAGAsの内部ソースコードをデバッグしている際に、RAGAsはまだ開発の初期段階にあることがわかりました。今後のアップデートとさらなる改善に期待しています。

最後に、この記事についてご質問がある場合は、下記にコメントを残してください。

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

——

フロリアン・ジューン

人工知能の研究者。主に大規模言語モデル、データ構造とアルゴリズム、NLP に関する記事を書いています。

終わり

参考文献

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

[2] https://docs.ragas.io/en/latest/concepts/metrics/index.html

[3] https://arxiv.org/pdf/2401.02385.pdf

この記事は、原著者の許可を得てBaihai IDPによって翻訳されました。翻訳の転載をご希望の場合は、お問い合わせください。

オリジナルリンク:

https://ai.plainenglish.io/advanced-rag-03-using-ragas-llamaindex-for-rag-evaluation-84756b82dca7