dspy について
dspy は、Python、型付きシグネチャ、評価指標を使って LLM プログラムを構築・最適化する開発者向けスキルです。チェーンによる構成ではなく、プロンプトをコンパイルして調整する方法を解説します。
主な機能
- 01型付きシグネチャによるタスク定義
- 02予測・推論・ツール利用モジュールの構成
- 03指標に基づくプロンプト最適化
- 04プログラムの評価・保存・読み込み
- 05RAG と複数段階プログラムの参照例
活用シーン
- 01既存プロンプトを最適化可能なプログラムに変換
- 02複数段階の LLM ワークフロー構築
- 03ツール利用エージェントの最適化
- 04分類や RAG プログラムの評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ magnus919/ agent-skills --skill dspyインストール後、Claude Code で/dspyを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdevals/evals.jsonreferences/agent-patterns.mdcompilation-guide.mdcore-modules.mdevaluation.mdexample-rag-compilation.mdfaq-and-troubleshooting.mdoptimizer-guide.mdprogram-patterns.mdvalidation-audit.mdscripts/check-setup.pytemplates/classification.pymulti-step.pyrag-program.py詳細
DSPy エキスパートスキル
DSPy はプロンプトプログラム用のコンパイラーであり、チェーンや RAG のフレームワークではありません。型付きシグネチャを使った Python プログラムを記述すると、DSPy がプロンプトを自動的に最適化します。
⚠️ DSPy はチェーンフレームワークではありません。
prompt | model | parserは使いません。LCEL もありません。DSPy は異なるレイヤーで動作します。Python の制御フローと型付きシグネチャでプログラムを定義し、コンパイラーがメトリクスに基づいてプロンプトを最適化します。LangChain のような合成を期待して DSPy を使おうとしているなら、選ぶツールを間違えています。
LLM 向けの PyTorch と考えてください。アーキテクチャを定義し、コンパイラーが重み(プロンプト)を調整します。
コアとなるパラダイム
まずここを読んでください。DSPy について理解すべき最も重要な内容です。
import dspy
# 1. Configure the LM
lm = dspy.LM("openai/gpt-4o-mini")
dspy.configure(lm=lm)
# 2. Define a signature (input/output schema)
class QASignature(dspy.Signature):
"""Answer questions concisely."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
# 3. Build a program using modules
qa = dspy.ChainOfThought(QASignature)
# 4. Compile against a metric
optimizer = dspy.MIPROv2(metric=dspy.answer_exact_match)
compiled_qa = optimizer.compile(qa, trainset=trainset, num_trials=25)
# 5. Use the compiled program (portable artifact)
answer = compiled_qa(question="What is DSPy?").answer
コア原則
-
DSPy はコンパイラーであり、チェーンフレームワークではありません。 Python の制御フローと型付きシグネチャでプログラムの構造を定義します。コンパイラーがプロンプトを最適化します。これは、LangChain の明示的なプロンプト合成とは根本的に異なります。
-
シグネチャでタスクを定義します。 任意の説明を付けられる入力フィールドと出力フィールドのペアが、タスクの定義になります。構文は
input1, input2 -> output1, output2です。 -
モジュールはプログラムの構成要素です。
dspy.Predict(直接予測)、dspy.ChainOfThought(推論)、dspy.ReAct(ツール使用)、およびカスタムのdspy.Moduleサブクラスを使います。Python の制御フロー(if/for/while)でこれらを合成します。 -
オプティマイザーは重みではなくプロンプトを調整します。 多数のオプティマイザー(テレプロンプター)が、指示、少数ショットのデモ、またはその両方を調整します。選択はボトルネックと予算によって異なります。オプティマイザーの早見表を参照してください。
-
一度コンパイルして、何度も提供します。 コンパイルには高いコストがかかります($3~$300 以上)。出力は
program.save(path)で保存できるポータブルな成果物です。推論のコストは低く抑えられます。 -
積極的にキャッシュします。 DSPy はデフォルトですべての LM 呼び出しをキャッシュします。現在のクライアント用に
DSPY_CACHEDIRを設定してください。dspy.LM(..., cache=False)で無効にできます。
どこから始めるか
| すでにあるもの | ここから始める |
|---|---|
| 何もない — DSPy を試している | パラダイムを理解し(まずこのページを読んでください)、次にシンプルな Predict プログラムを作成します |
| 最適化したい、動作中のプロンプト | DSPy の Signature に移植し、ChainOfThought を追加して、BootstrapFewShot でコンパイルします |
| 複数ステップのパイプライン | カスタムの dspy.Module として Python の制御フローで構築し、MIPROv2 でコンパイルします |
| エージェント/ツール使用のタスク | ツールと dspy.ReAct を使い、GEPA または AvatarOptimizer でコンパイルします |
| フレームワークを比較している | フレームワーク選択ガイドを参照してください |
クイックリファレンス
| タスク | 方法 | 参照先 |
|---|---|---|
| 基本的な予測 | dspy.Predict(signature) | references/core-modules.md |
| 推論を伴う予測 | dspy.ChainOfThought(signature) | references/core-modules.md |
| ツールを使った予測 | dspy.ReAct(tools=tools) | references/agent-patterns.md |
| カスタムプログラム | class MyProgram(dspy.Module) | references/program-patterns.md |
| 手軽な最適化 | dspy.BootstrapFewShot(metric) | references/optimizer-guide.md |
| 本格的な最適化 | dspy.MIPROv2(metric, auto="medium") | references/optimizer-guide.md |
| 評価 | dspy.Evaluate(metric=fn, devset=examples) | references/evaluation.md |
| 保存/読み込み | program.save(path) / program.load(path) | references/compilation-guide.md |
| 検索 | dspy.Retrieve(k=5) | references/program-patterns.md |
フレームワーク選択ガイド
| シナリオ | 選ぶもの | 理由 |
|---|---|---|
| プロンプト最適化/コンパイル済みプログラム | DSPy | メトリクスに基づいてプロンプトを自動最適化する唯一のフレームワークです |
| ドキュメントのクエリ/RAG | LlamaIndex | データの取り込みと検索が第一級のプリミティブです |
| チェーン/エージェントの合成 | LangChain | LCEL はパイプベースの合成モデルとして最も洗練されています |
| ステートマシン型のマルチエージェント | LangGraph | グラフトポロジー、サブグラフ、human-in-the-loop を扱えます |
| 検索パイプライン | Haystack | 検索ワークロードでは、パイプラインモデルがより成熟しています |
| 役割ベースのチーム | CrewAI | より高水準のエージェント抽象化を提供します |
参照ファイル
| 参照先 | 読み込むタイミング | ファイル |
|---|---|---|
| コアモジュール | Predict、ChainOfThought、ReAct を使用して構築する場合 | references/core-modules.md |
| オプティマイザーガイド | オプティマイザーを選択、設定する場合 | references/optimizer-guide.md |
| プログラムパターン | RAG、分類、マルチステップ、ツール使用の場合 | references/program-patterns.md |
| 評価 | メトリクス、評価ループ、データセットの作成の場合 | references/evaluation.md |
| コンパイルガイド | キャッシュ、コスト管理、保存/読み込みの場合 | references/compilation-guide.md |
| エージェントパターン | ReAct エージェント、ツール使用、AvatarOptimizer の場合 | references/agent-patterns.md |
| FAQ とトラブルシューティング | よくあるエラーと解決方法を確認する場合 | references/faq-and-troubleshooting.md |
| 検証監査 | すべての API に関する主張を調査、検証する場合 | references/validation-audit.md |
| RAG の実例 | 期待される出力を含む RAG の完全なコンパイル例 | references/example-rag-compilation.md |
テンプレートファイル
| テンプレート | 使用する場面 | ファイル |
|---|---|---|
| 分類 | BootstrapFewShot を使用したテキスト分類 | templates/classification.py |
| RAG プログラム | ColBERT 検索と ChainOfThought を使用した RAG | templates/rag-program.py |
| マルチステップ推論 | ツール使用を含むマルチステッププログラム | templates/multi-step.py |
スクリプト
| スクリプト | 目的 | ファイル |
|---|---|---|
| check-setup | DSPy のインストールと設定を確認する | scripts/check-setup.py |
トラブルシューティング
| 症状 | 考えられる原因 | 解決方法 | 参照先 |
|---|---|---|---|
| コンパイルが遅すぎる | 候補やスレッドが多すぎる | num_candidates を減らすか、auto="light" を使用します | references/optimizer-guide.md |
| コンパイルのコストが高すぎる | キャッシュがない | DSPY_CACHEDIR を有効にします | references/compilation-guide.md |
| コンテキストが長すぎる | デモが多すぎる | max_bootstrapped_demos と max_labeled_demos を減らします | references/faq-and-troubleshooting.md |
| コンパイル後の品質が低い | ボトルネックに合わないオプティマイザー | チートシートで、指示・デモ・重みのどれが該当するか確認します | references/optimizer-guide.md |
| プログラムが改善しない | メトリクスに判別力がない | bool ではなく float を返すメトリクスを使用します | references/evaluation.md |
| サブモジュールが更新されない | _compiled フラグが設定されている | 再コンパイル前に module._compiled = False を設定します | references/compilation-guide.md |
DSPy を使用しない場合
- シンプルな単一プロンプトのアプリケーション — 生の API 呼び出しのほうが簡単です
- 事前構築済みのアプリケーションモジュール(PDF の Q&A、テキストから SQL への変換)が必要な場合 — LlamaIndex または LangChain を使用します
- 最適化の予算がない単発タスク — DSPy のコンパイラーのオーバーヘッドを償却できません
- リアルタイム性が重視される低レイテンシのタスク — コンパイルは開発時に行われるため、推論時のオーバーヘッドは増加しません