メインコンテンツへスキップ
Retrieval Augmented Generation (RAG) は、独自のナレッジベースを利用できる生成 AI アプリを構築する一般的な手法です。このチュートリアルでは、RAG アプリケーションを構築し、Weave を使用して取得ステップをトラッキングし、LLM judge を使って応答を評価する方法を説明します。これにより、アプリケーションが返す回答の品質を測定し、改善できます。 このガイドは、パイプラインに可観測性と体系的な評価を追加したい、RAG アプリケーションを構築する開発者向けです。 Evals hero

学べること

このガイドでは、次の方法を学びます。
  • ナレッジベースを構築する。
  • 関連するドキュメントを検索する 取得 step を含む RAG アプリケーションを作成する。
  • Weave で取得 step をトラッキングする。
  • LLM judge を使って RAG アプリケーションを評価し、コンテキストの適合率を測定する。
  • カスタムのスコアリング関数を定義する。

前提条件

  • W&Bアカウント
  • Python 3.10+ または Node.js 18+
  • 必要なパッケージがインストールされていること:
    • Python: pip install weave openai
    • TypeScript: npm install weave openai
  • OpenAI APIキー が環境変数として設定されていること。

ナレッジベースを構築する

ナレッジベースは、RAG アプリケーションがクエリ時に検索対象とするコーパスです。このセクションでは、少数の記事に対してベクトル埋め込みを計算し、後で特定の質問に最も関連性の高い記事を取得できるようにします。 まず、記事の埋め込みを計算します。通常、この処理は記事に対して一度だけ実行し、埋め込みとメタデータをデータベースに格納しますが、ここでは簡単にするため、スクリプトを実行するたびに毎回実行します。

RAG アプリを作成する

ナレッジベースの準備ができたので、次は RAG アプリケーション自体を構築できます。このセクションでは、取得ステップと LLM Call を組み合わせ、さらにその両方を Weave でラップして、すべての入力と出力が自動的にトラッキングされるようにします。 次に、取得関数 get_most_relevant_documentweave.op() デコレータでラップし、Model クラスを作成します。取得関数を weave.op() でラップすると、呼び出しごとにその入力と出力を Weave で取得できるようになり、後で取得ステップを確認できるようになります。weave.init('<team-name>/rag-quickstart') を呼び出して、後で確認できるように関数のすべての入力と出力のトラッキングを開始します。チーム名を指定しない場合、出力は W&B のデフォルト team または entity に記録されます。

LLM judge を用いた評価

RAG アプリケーションが実行され、Weave でトラッキングされるようになったら、次のステップは、質問にどの程度適切に回答できるかを評価することです。このセクションでは、LLM を自動 judge として使用し、ラベルを手作業で作成することなくアプリケーションの応答をスコアリングする方法を示します。 アプリケーションを評価する簡単な方法がない場合、1 つの方法として、LLM を使ってそのいくつかの側面を評価できます。以下は、与えられた回答にたどり着くうえでコンテキストが有用だったかを検証するよう LLM judge に促し、コンテキストの適合率を測定しようとする例です。このプロンプトは、広く使われている RAGAS フレームワーク をもとに拡張したものです。

スコアリング関数を定義する

Build an Evaluation pipeline tutorial と同様に、アプリをテストするためのサンプル行のセットとスコアリング関数を定義します。スコアリング関数は 1 行を受け取り、それを評価します。入力引数は行内の対応するキーと一致している必要があるため、ここでの question は行の辞書から取得されます。output はモデルの出力です。モデルへの入力も、その入力引数に基づいてサンプルから取得されるため、ここでの question も同様です。この例では async 関数を使用しているので、並列に実行できます。async の簡単な入門については、Python asyncio ドキュメント を参照してください。

任意: Scorer クラスを定義する

前のセクションのスコアリング関数はシンプルなケースではうまく機能しますが、同じ judge を複数の評価で再利用したい場合や、スコアの集計方法をカスタマイズしたい場合には、Scorer クラスが役立ちます。以下の手順では、どのような場合に定義すべきかと、その方法を示します。 アプリケーションによっては、カスタム評価クラスを作成したい場合があります。たとえば、チャットモデルやプロンプトなどのパラメーターを持つ標準化済みの LLMJudge クラス、各行に対するカスタムスコアリング、集計スコアのカスタム計算を作成したいことがあります。Weave にはそのまま使用できる Scorer クラスがいくつか用意されており、カスタム Scorer も簡単に作成できます。以下の例では、カスタム class CorrectnessLLMJudge(Scorer) を作成する方法を示します。 大まかには、カスタム Scorer を作成する手順は次のとおりです。
  1. weave.flow.scorer.Scorer を継承するカスタムクラスを定義します。
  2. score 関数をオーバーライドし、関数の各 call をトラッキングしたい場合は @weave.op() を追加します。
    • この関数では、モデルの予測結果が渡される output 引数を定義する必要があります。モデルが “None” を返す場合に備えて、タイプ Optional[dict] として定義してください。
    • 残りの引数は、汎用的な Any または dict にすることも、weave.Evaluate クラスを使用してモデルを評価する際に使うデータセットから特定の列を選ぶこともできます。preprocess_model_input を使用する場合、これらの引数名は、その処理後の単一行の列名またはキーと完全に一致している必要があります。
  3. 任意: summarize 関数をオーバーライドして、集計スコアの計算をカスタマイズします。デフォルトでは、カスタム関数を定義しない場合、Weave は weave.flow.scorer.auto_summarize 関数を使用します。
    • この関数には @weave.op() デコレーターが必要です。
これを Scorer として使用するには、初期化してから、次のように Evaluationscorers 引数に渡します。

まとめ

このセクションでは、前のステップの内容をすべて 1 つのエンドツーエンドの例にまとめ、各要素がどのように連携するのかを確認し、それらをご自身の RAG アプリケーションに合わせて調整できるようにします。 RAG アプリケーションで同じ結果を得るには、次のようにします。
  • LLM Call と取得ステップの関数を weave.op() でラップします。
  • オプション: predict 関数とアプリケーションの詳細を含む Model のサブクラスを作成します。
  • 評価用の例を収集します。
  • 1 つの例をスコアリングする評価関数を作成します。
  • Evaluation クラスを使用して、例に対する評価を実行します。
注: Evaluation の非同期実行により、OpenAI や Anthropic などのモデルで rate limit に達することがあります。これを防ぐには、たとえば WEAVE_PARALLELISM=3 のように、並列ワーカー数を制限する環境変数を設定できます。 コード全体は次のとおりです。

まとめ

このチュートリアルでは、この例の取得 step のように、アプリケーションのさまざまな step に可観測性を組み込む方法を紹介しました。また、アプリケーションの応答を自動的に評価するために、LLM judge のような、より複雑なスコアリング関数を構築する方法も学びました。

次のステップ

エンジニア向けの実践的なRAG手法をさらに深く学ぶには、RAG++ courseをご覧ください。W&B、Cohere、Weaviateが提供する本番運用対応のソリューションを通じて、パフォーマンスの最適化、コスト削減、アプリケーションの精度と関連性の向上に役立つ知見を学べます。