メインコンテンツへスキップ
Retrieval Augmented Generation (RAG) は、独自のナレッジベースを利用できる生成 AI アプリを構築する一般的な手法です。 Evals hero

学べること:

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

前提条件

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

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

まず、記事の埋め込みを計算します。通常、この処理は記事ごとに一度だけ行い、埋め込みとメタデータをデータベースに保存しますが、ここでは簡単にするため、スクリプトを実行するたびに毎回計算しています。

RAG アプリを作成する

次に、取得関数 get_most_relevant_documentweave.op() デコレータでラップし、Model クラスを作成します。weave.init('<team-name>/rag-quickstart') を呼び出して、後で確認できるように関数のすべての入力と出力のトラッキングを開始します。チーム名を指定しない場合、出力は W&B のデフォルト team または entity に記録されます。

LLM judge を用いた評価

アプリケーションを評価する簡単な方法がない場合、1 つの方法として、LLM を使ってそのいくつかの側面を評価できます。以下は、与えられた回答にたどり着くうえでコンテキストが有用だったかを検証するよう LLM judge に促し、コンテキストの適合率を測定しようとする例です。このプロンプトは、広く使われている RAGAS フレームワーク をもとに拡張したものです。

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

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

任意: 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 引数に次のように渡します。

ここまでをまとめる

RAG アプリで同じ結果を得るには、次のようにします。
  • LLM 呼び出しと検索 step 関数を weave.op() でラップする
  • (任意) predict 関数とアプリの詳細を持つ Model のサブクラスを作成する
  • 評価用の例を収集する
  • 1 つの例を採点するスコアリング関数を作成する
  • Evaluation クラスを使用して、例に対して評価を実行する
注: Evaluation の非同期実行により、OpenAI や Anthropic などのモデルで rate limit に達することがあります。これを防ぐには、並列ワーカー数を制限する環境変数を設定します。たとえば WEAVE_PARALLELISM=3 です。 以下にコード全体を示します。

まとめ

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

次のステップ

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