Skip to main content
これはインタラクティブなノートブックです。ローカルで実行するか、次のリンクから利用できます。
BIG-bench (Beyond the Imitation Game Benchmark) は、200 を超えるタスクで大規模言語モデルを検証し、その将来の能力を推定する共同ベンチマークです。BIG-Bench Hard (BBH) は、BIG-Bench のタスクのうち、現世代の言語モデルでも解くのが難しい、特に難易度の高い 23 のタスクをまとめたものです。 このチュートリアルでは、BIG-bench Hard ベンチマークの因果判断タスクを対象に実装した LLM ワークフローのパフォーマンスを改善し、プロンプト戦略を評価する方法を紹介します。LLM ワークフローの実装とプロンプト戦略の最適化には DSPy を使用します。また、LLM ワークフローのトラッキングとプロンプト戦略の評価には Weave を使用します。 このチュートリアルでは、因果推論のためのベースライン DSPy プログラムを構築して Weave で評価し、DSPy のオプティマイザーを適用してプロンプト戦略を改善したうえで、最適化したプログラムをベースラインと比較します。自身の LLM ワークフローにプロンプト最適化を適用し、Weave で結果をトラッキング・比較したい実務者を対象としています。

依存関係をインストールする

始める前に、このチュートリアルで使用するライブラリをインストールします。このチュートリアルでは、次のライブラリを使用します。
  • DSPy: LLM ワークフローの構築と最適化に使用します。
  • Weave: LLM ワークフローのトラッキングと、プロンプト戦略の評価に使用します。
  • datasets: HuggingFace Hub の BIG-Bench Hard データセットへのアクセスに使用します。
このチュートリアルでは LLM ベンダーとして OpenAI API を使用するため、OpenAI APIキーも必要です。OpenAI Platform でサインアップすると、ご自身の APIキーを取得できます。

Weave を使用してトラッキングを有効にする

このセクションでは Weave を設定し、チュートリアルでこれ以降に実行する DSPy の Call が自動的にトレースされ、Weights & Biases UI で確認できるようにします。 Weave は DSPy と連携しています。コードの冒頭に weave.init を追加すると、DSPy の関数が自動的にトレースされ、Weights & Biases UI で詳しく確認できます。詳細については、DSPy 向け Weave インテグレーションのドキュメントを参照してください。
このチュートリアルでは、weave.Object を継承したメタデータクラスを使用してメタデータを管理します。
オブジェクトのバージョン管理:Metadata オブジェクトを使用する関数をトレースすると、その Metadata オブジェクトも自動的にバージョン管理され、トレースされます。

BIG-Bench Hard データセットを読み込む

Weave のトラッキングを有効にしたら、次に DSPy プログラムのトレーニングと評価に使用するデータを準備します。 HuggingFace Hub からこのデータセットを読み込み、トレーニングセットと検証セットに分割して、Weave にパブリッシュします。パブリッシュすると、データセットをバージョン管理できるだけでなく、weave.Evaluation を使用してプロンプト戦略を評価することもできます。
データセットの準備手順とデータ構造を示す DSPy のデータセット読み込みインターフェース

DSPy プログラム

データセットを Weave にパブリッシュしたので、次に、後で評価と最適化を行うベースラインの DSPy プログラムを定義します。 DSPy は、新しい LM パイプラインの構築を、任意形式の文字列を操作する作業から、プログラミング (モジュール化されたオペレーターを組み合わせてテキスト変換グラフを構築すること) に近いものへと転換するフレームワークです。DSPy では、コンパイラーがプログラムから最適化された LM invocation 戦略とプロンプトを自動的に生成します。 dspy.LM で言語モデルを設定し、dspy.configure でそのモデルをデフォルトに設定します。

因果推論の Signature を記述する

Signature は、DSPy モジュールの入出力の動作を宣言的に定義する仕様です。DSPy モジュールは、タスクに応じて適応するコンポーネント (ニューラルネットワークの層に相当) で、任意のテキスト変換を抽象化します。
BIG-Bench Hard の因果推論サブセットにある例を 1 つ使って、LLM ワークフロー (つまり CausalReasoningModule) をテストします。
ベースライン DSPy プログラムの評価結果(パフォーマンスメトリクスと出力例)

DSPy プログラムを評価する

ベースラインとなるプロンプト戦略ができたので、weave.Evaluation を使用して検証セットで評価します。メトリクスには、予測された回答を正解と照合するものを使用します。Weave は各例をアプリケーションに渡し、その出力を複数のカスタムスコアリング関数でスコア付けします。これにより、アプリケーションのパフォーマンスを把握できるほか、充実した UI で個々の出力やスコアを詳しく確認できます。 まず、予測された回答が正解と一致するかどうかを判定するスコアリング関数を作成します。Weave のスコアリング関数は、モデルの戻り値を output として受け取り、データセットの例に含まれるキーのうち名前が一致するものを追加の引数として受け取ります。ここでは、answer はデータセットから渡され、output は CausalReasoningModule.forward が返す dict です。
次に、weave.Evaluation から呼び出せるように、モジュールをトレース対象の関数でラップします。ラッパーの引数名は、モデルが使用するデータセットの列名と一致させる必要があります。
これで、評価を定義して実行できます。
DSPy プログラムのパフォーマンスメトリクス、トレース、比較結果を表示した Weave の評価ダッシュボード
Python スクリプトから実行する場合は、次のコードで評価を実行できます。
因果推論データセットで評価を実行すると、約 $0.24 分の OpenAI クレジットを消費します。

DSPy プログラムを最適化する

ベースラインのパフォーマンスを測定できたので、DSPy のオプティマイザーを適用し、その結果をベースラインと比較します。 ベースラインとなる DSPy プログラムが用意できたら、BootstrapFewShot オプティマイザーを使用して、因果推論におけるパフォーマンスを向上させます。このオプティマイザーは、指定したメトリクスが最大になるように DSPy プログラムのパラメーターを調整します。
テレプロンプターの設定と最適化の進行状況を表示する DSPy プログラム最適化プロセスのインターフェース
因果推論データセットで評価を実行すると、OpenAI のクレジットが約 $0.04 かかります。
最適化されたプログラム (最適化されたプロンプト戦略) ができたので、これを検証セットで再度評価し、ベースラインの DSPy プログラムと比較します。
パフォーマンスメトリクスと出力品質が向上した、最適化済み DSPy プログラムの評価結果
ベースラインのプログラムと最適化済みのプログラムの評価結果を比較すると、最適化済みのプログラムのほうが因果推論の質問により高い精度で回答できていることがわかります。

まとめ

このチュートリアルでは、DSPy を使用してプロンプト最適化を行い、Weave でトラッキングと評価を行って、元のプログラムと最適化後のプログラムを比較する方法を学びました。
最終更新日 2026年9月30日