Skip to main content

W&Bを用いたRAGの構築・評価ステップ

このレポートは、RAGを実際に手を動かしながら説明し、W&Bと一緒に使用する方法を説明しています。
Created on October 31|Last edited on February 7

Overview

RAGは、LLM(Large Language Model)ベースのアプリケーションの中で最も人気のあるものの1つになっています。このレポートでは、W&Bを使用してRAGを開発および評価する方法を探ります。RAGを構築する詳細に興味がある方には、動画のトレーニングも提供されているので、英語ではありますが、是非合わせて参照してください。
(ファインチューニングも提供されています "Training and Fine-tuning Large Language Models (LLMs)" )
このレポートでは、「Wandbot」と呼ばれるLLM(Large Language Model)を活用したドキュメンテーションアプリケーションを評価する方法について見ていきます。もしまだWandbotを使ったことがない方は是非wandbjp.slack.comの#wandbotのチャネルにいき、試してみてください。
💡



このレポートは、以下のステップで進めていきます。
Step 0:最初に、wandbログインから始めましょう。
Step 1:RAGにはさまざまなプロセスが関与していますが、このレポートでは最初にTracesと呼ばれる機能を使用してそれらを可視化します。数百のサンプルの評価に進む前に、予測が正確かどうかをいくつか評価しましょう。問題がある場合、Tracesは問題がどのフェーズで発生しているかを特定するのに役立ちます。
Step 2:その後、RAGの評価に移ります。評価方法はさまざまですが、ここではモデルベースの評価に特に焦点を当てます。
Step 3:最後に、Sweepsを使用して、最も有望なパターンを特定しましょう。


Step0: Wandb セットアップ

Wandbのセットアップについては、 こちらのドキュメントを参照してください。W&Bのdedicated クラウド、VPC、またはオンプレミスを使用している場合は、こちらのドキュメントおよび次の図を参照してください。



Step1: Tracesを用いた中間プロセスの可視化

サンプルコードはこちらにあります。一緒に走らせながら、学んでいきましょう。 
LangChainおよびTracesとの統合
LangChainを使用する際にos.environ["LANGCHAIN_WANDB_TRACING"] = "true"と設定することで、簡単に結果を記録できます(official document).。
TracesはWeaveダッシュボードでも使用される予定です。そこでは、長い文章をより美しく可視化できます(この機能はプライベートベータ版です)
💡

Run: solar-flower-61
1



Artifactsを用いたドキュメントやプロンプトテンプレートの保存
  • ドキュメントやプロンプトテンプレートなどのデータを保存し、Artifactを使用してバージョン管理することができます (official document).。


実験の比較
同じダッシュボードで複数の実験を追跡し、ダッシュボードに表示される結果を簡単に切り替えることができます。また、各実行の概要から各設定を追跡できます(official document) 。
さまざまな方法を試してみましょう!




Step2: LLMベースの評価

LLM(Large Language Model)ベースのシステムを評価するのは簡単ではありません。それには複数のステップと数週間にわたる深い考察が必要です。 "How to Evaluate, Compare, and Optimize LLM Systems?" では、LLMベースのシステムの評価について詳しく説明しています。このレポートでは詳細には触れませんが大まかに評価の方法は以下の3つの主要なカテゴリに分かれます
目視のよる1つ1つの評価:モデルの性能を評価するために一つ一つ目で確認する評価を行い、おおまかに所望の回答が得られるかを確認にします。
教師ありデータを用いた評価:評価のための注釈付きデータセットを人間が生成し、評価する方法です。評価の実行としては、人間が行う方法と下記のようにモデルが行う方法があります。
LLMsベースの評価:gpt4などの強力なLLMを活用して、評価をします。QAボットの場合、LLMに質問と回答のペアを生成するところもLLMに行わせる手法があります。

ステップ1では、評価の「目視のよる1つ1つの評価」フェーズの一部をすでに実施してきました。ステップ2では、LLMを使用してRAGを評価しましょう。


LLMを用いて、評価データセットを生成

まず最初に、評価データセットを作成しましょう。QAボットを実際に評価するには、評価セット内の質問と回答のペアが必要です。このようなデータセットはLLMを用いて作成することもできます。このアプローチには明らかな利点と制限があります。
利点:
  • スケーラビリティ:必要に応じて大量のテストケースを生成できます
  • 柔軟性:テストケースは特定のエッジケースや複数のドメインに適用でき、関連性と適用可能性を評価できます
  • 低コスト:LLMは複数のドキュメントから情報を迅速に収集し、低コストで実行できます。
制限:
  • 医療分野などの専門的なラベラーが必要なユースケースでは機能しません。
  • 実際のユーザーの使用に対するパフォーマンスを評価しません。この方法では予期しない状況やエッジケースに対処できません。
  • 
評価データセットを生成するためのツール
Langchainには、質問と回答のペアを特定の文書から抽出するQAGenerationChainと呼ばれる便利なチェーンがあります。データローダーを使用して文書を読み込み(こちらで解説されています)、小さなチャンクに分割し、チェーンを使用してQAペアを抽出できます。

サンプルコード: Google colab
# scriptの変更ポイント:
# 以下の "eval_artifact","prompt_version","doc_version"のpathをstep1, 2で作成したartifactsのpathに置き換えてください

config = {
"model_name": "gpt-3.5-turbo", # model used for creating answers
"eval_model":"gpt-4", # model used for evaluation
"eval_artifact": '' , # evaluation data artifact
"prompt_version":'', # prompt artifact path
"doc_version":'', # doc artifact path
"embedding_method":"faiss",
}

Run: gentle-feather-64
1




評価データセットを用いてRAGを評価

QAペアの評価セットを用意することができたので、LLMベースのQAボットに質問の予測を生成させることができます。予測された答えと真の答えが与えられた場合、LLMを使用して、予測が真の答えと比べてどれほど良いかを評価することができます。
二つのテキスト(真の答えと予測された答え)の一致率をllmに判断させ、そのスコアを0から10まで付けることができます。
幸い、LangchainにはQAEvalChainというチェーンがあり、質問と真の答え、予測された答えを入力して、それらのスコアや「CORRECT / INCORRECT」のラベルを出力することができます。
サンプルコード: Google colab

Run: divine-moon-71
1






Step3: 最適化

評価の枠組みを用意した後は、W&B のSweeps を用いて、ハイパーパラメータチューニングをし、最適な設定の組み合わせを探しましょう。
Sweepsは、CL・notebookで実装方法が若干異なりますが、下記はnotebookの例です。
まず、sweep_configで、サーチ方法を選定し、その後評価メトリックを選択し、大きくなる方が良いのか、小さくなる方が良いのかを設定します。
その後、parameterのサーチ範囲をきめ、
wandb.agent(sweep_id=sweep_id, function=model_pipeline_sweep, count=10)のcountで実行回数を決めて、複数のパターンを自動実行します。
サンプルコード: Google colab
例えば、gpt-4に匹敵するgpt-3.5-turboの設定を探してみましょう。
# scriptの変更ポイント:
# 以下の "eval_artifact", "prompt_version","doc_version"のpathをstep1, 2で作成したartifactsのpathに置き換えてください
# prompt_versionについては、2 version作成していますが、2 versionとも記載しましょう。

sweep_config = {
'method': 'random',
'metric': {
'name': 'model_mean_score',
'goal': 'maximize'
},
}
parameters_dict = {
"model_name": {
'values': ["gpt-3.5-turbo", "gpt-4"]
},
"eval_model": {
'value': "gpt-4"
},
"eval_artifact": {
'value': ''
},
"prompt_version":{
'values': ["",
""]
},
"doc_version":{
'value': ""
},
"embedding_method":{
'values': ["chroma","tfidf","faiss"]
}
}
sweep_config['parameters'] = parameters_dict


Sweep: 4mwvu0r0 1
10
Sweep: 4mwvu0r0 2
0





参考文献

英語にはなりますが、下記のレポートも参考にしてください。




Google colabが使えない方向けのファイル