DSPy
DSPyは、型付きシグネチャとモジュールからLLMパイプラインを構築するオープンソースフレームワークです。さらに、評価指標に基づいてプロンプトを最適化します。
DSPyは、手書きのプロンプトではなくコードとして大規模言語モデル(LLM)アプリケーションを構築するための、オープンソースのPythonフレームワークです。開発者は各ステップの入力と出力を宣言し、ステップを組み合わせてプログラムを作成します。そのうえでDSPyオプティマイザーにプロンプト、またはモデルの重みを書き換え・調整させ、サンプル集合に対する指標を最大化します。名前はDeclarative Self-improving Pythonの略で、プロンプトではなく言語モデルをプログラミングするためのフレームワークと説明されています。スタンフォード大学のOmar Khattab氏らは、2023年10月の論文DSPy: Compiling Declarative Language Model Calls into Self-Improving PipelinesでDSPyを発表しました。コンパイルから数分以内に、少数行のDSPyコードでGPT-3.5とLlama-2-13B-chatのパイプラインを構築でき、標準的なfew-shotプロンプティングをそれぞれ25%超、65%超上回りました。また、専門家が作成したデモを使うパイプラインに対しても、それぞれ最大46%、40%上回りました。
シグネチャ、モジュール、オプティマイザー#
- シグネチャ:ステップの入力と出力を型付きで宣言します。
"question -> answer"のようにインラインで記述するか、タスクを説明するdocstringを持つクラスとして定義します。シグネチャはステップの機能を指定し、プロンプトの文言はDSPyに任せます。 - モジュール:シグネチャを実行するための戦略です。
dspy.Predictはモデルを1回呼び出します。dspy.ChainOfThoughtは回答の前に推論フィールドを追加し、思考の連鎖プロンプティングと同様の形式にします。dspy.ReActはReActプロンプティング形式でツールを使うループを実行します。モジュールはPyTorchのレイヤーのように組み合わせて、複数ステップのプログラムを構築できます。たとえば、検索クエリを書き、パッセージを取得し、その内容に基づいて回答する検索拡張生成(RAG)パイプラインを作れます。 - アダプター:シグネチャをモデル向けのチャットメッセージに変換し、応答を解析して型付きフィールドに戻します。
- オプティマイザー:指標に基づいてプログラムを改善するアルゴリズムです。
BootstrapFewShotは学習用サンプルでプログラムを実行し、指標を通過したトレースをデモとして保持します。MIPROv2は提案された指示とデモの組み合わせを探索します。BootstrapFinetuneはファインチューニングによってプログラムをモデルの重みに蒸留します。
最適化ループは、プロンプトをパラメーターとして扱う点でモデルの学習に似ています。
2025年のGEPAオプティマイザーは、dspy.GEPAとして利用でき、プログラムの実行トレースとテキスト形式のフィードバックを読み取ります。LLMに失敗の原因を分析させ、その結果に基づいて指示を改良します。6つのタスク全体で、強化学習手法のGRPOを平均6%、最大20%上回り、ロールアウト数を最大35分の1に抑えました。また、MIPROv2も10%超上回りました。
シグネチャからプロンプトへ#
DSPyはシグネチャからプロンプトを生成するため、同じプログラムを新しいモデル向けに再最適化でき、書き直す必要はありません。ここでは、Ultralytics YOLO26の検出結果の要約を入力として使います。Results.verbose()は予測モードの結果をクラスごとの検出数を示す短い文字列として返します。シグネチャではこの文字列をテキストとして受け取り、実際の物体検出出力を使って、オプティマイザーが推論ステップを調整できるようにします。メッセージの整形にモデルやAPIキーは必要ありません。
import dspy
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
class SceneQA(dspy.Signature):
"""Answer a question about a photo from the objects a detector found in it."""
detections: str = dspy.InputField()
question: str = dspy.InputField()
answer: str = dspy.OutputField()
# The adapter turns the signature and inputs into the chat messages the model will receive
inputs = {"detections": results[0].verbose(), "question": "How many people are in the photo?"}
messages = dspy.ChatAdapter().format(SceneQA, demos=[], inputs=inputs)
for message in messages:
print(f"--- {message['role']} ---\n{message['content']}")システムメッセージには入力フィールドと出力フィールド、DSPyが応答の解析に使う[[ ## field ## ]]マーカー、目的を示すdocstringが含まれます。ユーザーメッセージには検出器の件数が含まれます。オプティマイザーは目的を書き換え、メッセージにデモを追加してプログラムを改善しますが、Pythonコードは変更しません。
DSPyと関連用語の比較#
- プロンプトエンジニアリング:プロンプトを手作業で作成・修正することです。DSPyでは、指標とサンプルを使った最適化問題として扱います。
- LangChain:LLMアプリケーションを構成するための統合機能、ツール、エージェントループを提供するフレームワークです。プロンプトは開発者が管理します。
- ハイパーパラメーター調整:検証指標に基づいて学習設定を探索する手法です。DSPyがプロンプトを探索する方法に最も近い考え方です。
- 複合AIシステム:複数のモデル呼び出し、検索器、ツールから構築されるアプリケーションです。DSPyはこのようなパイプライン全体を最適化し、最終指標に基づいて各ステップのプロンプトを調整するために設計されています。










