これはインタラクティブなノートブックです。ローカルで実行することも、以下のリンクを使用することもできます。
DSPy と Weave を使用した LLM ワークフローの最適化
BIG-bench (Beyond the Imitation Game Benchmark) は、大規模言語モデルを検証し、その将来的な能力を予測することを目的とした共同ベンチマークで、200 を超えるタスクで構成されています。BIG-Bench Hard (BBH) は、BIG-Bench の中でも特に難易度の高い 23 のタスクからなるベンチマークスイートで、現世代の言語モデルでは解くのが非常に難しい場合があります。
このチュートリアルでは、BIG-bench Hard ベンチマークの因果判断タスクに実装した LLM ワークフローのパフォーマンスを改善し、プロンプト戦略を評価する方法を紹介します。LLM ワークフローの実装とプロンプト戦略の最適化には DSPy を使用します。また、LLM ワークフローのトラッキングとプロンプト戦略の評価には Weave も使用します。
このチュートリアルでは、次のライブラリを使用します。
- DSPy:LLMワークフローの構築と最適化に使用します。
- Weave:LLMワークフローをトラッキングし、プロンプト戦略を評価するために使用します。
- datasets:HuggingFace Hub から Big-Bench Hard データセットにアクセスするために使用します。
LLMベンダーとして OpenAI API を使用するため、OpenAIのAPIキーも必要です。ご自身のAPIキーを取得するには、OpenAIプラットフォームで サインアップ してください。
Weave は現在 DSPy と統合されており、コードの先頭で weave.init を呼び出すと、DSPy の関数を自動的にトレースし、その内容を Weave UI で確認できます。詳しくは、DSPy 向け Weave インテグレーションのドキュメント を参照してください。
このチュートリアルでは、メタデータの管理に、weave.Object を継承したメタデータクラスを使用します。
オブジェクトのバージョン管理: Metadata オブジェクトは、それらを利用する関数がトレースされると、自動的にバージョン管理され、あわせてトレースされます
BIG-Bench Hardデータセットを読み込む
このデータセットをHuggingFace Hubから読み込み、トレーニング用セットと検証セットに分割したうえで、Weaveで公開します。これにより、データセットをバージョン管理できるようになり、weave.Evaluationを使用してプロンプト戦略を評価することもできます。
DSPy は、新しい LM パイプラインの構築を、自由記述の文字列を操作するやり方から、プログラミング (モジュール化されたオペレーターを組み合わせてテキスト変換グラフを構成すること) へと近づけるフレームワークです。これにより、コンパイラがプログラムから最適化された LM 呼び出し戦略とプロンプトを自動生成します。
言語モデルの設定には dspy.LM を使用し、それをデフォルトに設定するには dspy.configure を使用します。
signature とは、DSPy module の入出力の振る舞いを宣言的に定義するものです。DSPy module は、ニューラルネットワークの層に似たタスク適応型のコンポーネントで、特定のテキスト変換を抽象化します。
Big-Bench Hard の因果推論サブセットの例を使って、LLMワークフロー、つまり CausalReasoningModule をテストしてみましょう。

DSPy プログラムを評価する
ベースラインのプロンプト戦略ができたので、予測した回答と正解を照合するシンプルなメトリクスを使って、weave.Evaluation で検証セットを評価してみましょう。Weave は各例をアプリケーションに渡し、複数のカスタムスコアリング関数で出力を採点します。これにより、アプリケーションのパフォーマンスを把握できるほか、個々の出力やスコアを詳しく確認できる充実した UI も利用できます。
まず、予測した回答が正解と一致するかどうかを判定するスコアリング関数を作成する必要があります。Weave のスコアリング関数は、モデルの戻り値を output として受け取り、さらにデータセット例内の一致するキーを追加の引数として受け取ります。ここでは、answer はデータセットから取得され、output は CausalReasoningModule.forward が返す dict です。
次に、weave.Evaluation から呼び出せるように、モジュールをトレース対象の関数でラップします。ラッパーの引数名は、モデルが受け取るデータセットの列名と一致している必要があります。
ここで、評価を定義して実行します。
Python スクリプトから実行している場合は、次のコードを使用して評価を実行できます。
因果推論 データセットで評価を実行すると、OpenAI クレジットで約 $0.24 の費用がかかります。
これで DSPy プログラムのベースラインができたので、指定したメトリクスを最大化するように DSPy プログラムのパラメーターを調整できる BootstrapFewShot オプティマイザーを使って、因果推論のパフォーマンスをさらに向上させてみましょう。
因果推論の評価用データセットを実行すると、OpenAI クレジットが約 $0.04 かかります。
最適化済みのプログラム (最適化されたプロンプト戦略) が用意できたので、これを検証セットでもう一度評価し、ベースラインの DSPy プログラムと比較してみましょう。
ベースラインプログラムの評価結果を最適化済みプログラムと比較すると、最適化済みプログラムのほうが因果推論に関する質問に対して大幅に高い精度で回答できていることがわかります。
このチュートリアルでは、DSPyを使ってプロンプトを最適化し、Weaveでトラッキングと評価を行って、元のプログラムと最適化後のプログラムを比較する方法を学びました。