メインコンテンツへスキップ
これはインタラクティブなノートブックです。ローカルで実行するか、以下のリンクをご利用ください。
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キーも必要です。ご自身のAPIキーを取得するには、OpenAIプラットフォームで サインアップ してください。

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

このセクションでは Weave を設定し、このチュートリアルで以降に行う DSPy の Call が自動的にトレースされ、Weave UI で確認できるようにします。 Weave は DSPy と統合されています。コードの先頭で weave.init を呼び出すと、DSPy の関数が自動的にトレースされ、その内容を Weave UI で確認できます。詳しくは、DSPy 向け Weave インテグレーションのドキュメント を参照してください。
このチュートリアルでは、メタデータの管理に、weave.Object を継承したメタデータクラスを使用します。
オブジェクトのバージョン管理: Metadata オブジェクトは、それらを利用する関数がトレースされると、自動的にバージョン管理され、あわせてトレースされます。

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

Weave tracking を有効にしたら、次のステップは、DSPyプログラムのトレーニングと評価に使用するデータを準備することです。 このデータセットをHuggingFace Hubから読み込み、トレーニング用セットと検証セットに分割したうえで、Weaveで公開します。公開すると、データセットをバージョン管理できるようになり、weave.Evaluationを使用してプロンプト戦略を評価することもできます。
データセット準備のstepとデータ構造を示すDSPyのデータセット読み込みインターフェース

DSPy プログラム

データセットを Weave に公開したので、次に、後で評価および最適化するベースラインの DSPy プログラムを定義できます。 DSPy は、新しい LM パイプラインの構築を、自由記述の文字列を操作するやり方から、プログラミング (モジュール化されたオペレーターを組み合わせてテキスト変換グラフを構成すること) へと近づけるフレームワークです。これにより、コンパイラがプログラムから最適化された LM 呼び出し戦略とプロンプトを自動生成します。 言語モデルの設定には dspy.LM を使用し、それをデフォルトに設定するには dspy.configure を使用します。

因果推論シグネチャを作成する

signature とは、DSPy module の入出力の動作を宣言的に定義するものです。DSPy modules は、ニューラルネットワークの層に似たタスク適応型のコンポーネントで、特定のテキスト変換を抽象化します。
BIG-Bench Hard の因果推論サブセットの例を使って、LLMワークフロー、つまり CausalReasoningModule をテストします。
パフォーマンス メトリクスと出力例を含むベースライン DSPy プログラムの評価結果

DSPy プログラムを評価する

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

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

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

結論

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