Skip to main content
検索拡張生成 (RAG) は、独自のナレッジベースを活用できる生成 AI アプリケーションを構築するための一般的な手法です。このチュートリアルでは、RAG アプリケーションを構築し、Weave を使用して取得ステップをトラッキングしながら、LLM ジャッジモデルで応答を評価する方法を順を追って説明します。これにより、アプリケーションが返す回答の品質を測定し、改善できるようになります。 このガイドは、RAG アプリケーションを構築していて、パイプラインに可観測性と体系的な評価を取り入れたい開発者を対象としています。 評価のヒーロー画像

このガイドで学ぶこと

このガイドでは、次の方法を説明します。
  • ナレッジベースを構築する
  • 関連ドキュメントを検索する取得ステップを備えた RAG アプリケーションを作成する
  • Weave で取得ステップをトラッキングする
  • LLM ジャッジモデルを使用して RAG アプリケーションを評価し、コンテキストの適合率を測定する
  • カスタムのスコアリング関数を定義する

前提条件

  • CoreWeave Forge アカウント
  • 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_document を weave.op() デコレーターでラップし、Model クラスを作成します。取得関数を weave.op() でラップすると、Weave は Call のたびにその入力と出力を取得します。これにより、後から取得ステップを検査できるようになります。weave.init('<team-name>/rag-quickstart') を Call すると、関数のすべての入力と出力のトラッキングが開始され、後から検査できるようになります。チーム名を指定しない場合、Weave は出力を W&B のデフォルトのチームまたは entity に記録します。

LLM ジャッジモデルで評価する

RAG アプリケーションが稼働し、Weave で追跡できるようになったら、次のステップはアプリケーションが質問にどの程度的確に回答できているかを評価することです。このセクションでは、LLM を自動ジャッジとして使用し、手作業でラベルを付けることなくアプリケーションの応答をスコアリングする方法を説明します。 アプリケーションを簡単に評価する方法がない場合は、LLM を使用してアプリケーションのさまざまな側面を評価するという方法があります。以下は、LLM ジャッジモデルを使用してコンテキストの適合率を測定する例です。ここでは、与えられた回答を導き出すうえでコンテキストが役立ったかどうかを検証するよう、プロンプトで LLM に指示しています。このプロンプトは、広く使われている RAGAS フレームワーク のプロンプトを拡張したものです。

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

評価パイプラインの構築チュートリアルと同様に、アプリのテストに使うサンプル行のセットと、スコアリング関数を定義します。スコアリング関数は 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 関数をオーバーライドします。関数の各呼び出しをトラッキングしたい場合は @weave.op() を追加します。
    • この関数では、モデルの予測が渡される output 引数を定義する必要があります。モデルが “None” を返す場合に備えて、タイプは Optional[dict] として定義してください。
    • 残りの引数には、汎用的な Any や dict を指定するか、weave.Evaluate クラスでモデルを評価する際に使用するデータセットから特定の列を選択して指定できます。引数名は、列名と完全に一致させる必要があります。preprocess_model_input を使用する場合は、それに渡された後の単一行のキーと一致させてください。
  3. オプション: summarize 関数をオーバーライドして、集計スコアの計算方法をカスタマイズします。カスタム関数を定義しない場合、Weave はデフォルトで weave.flow.scorer.auto_summarize 関数を使用します。
    • この関数には @weave.op() デコレーターを付ける必要があります。
これを scorer として使用するには、次のようにインスタンスを初期化して、Evaluation の scorers 引数に渡します。

すべてをまとめる

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

まとめ

このチュートリアルでは、今回の例の取得ステップのように、アプリケーションのさまざまなステップに可観測性を組み込む方法を紹介しました。また、LLM ジャッジモデルのような、より複雑なスコアリング関数を作成し、アプリケーションの応答を自動で評価する方法も学びました。
最終更新日 2026年9月30日