LLMフレームワークにDSPyが選ばれる理由|LangChainとの違い

LLM を使ったアプリケーション開発を始めると、まず直面するのが「どのフレームワークを選ぶか」という問いです。LangChain、LlamaIndex、Haystack など選択肢は豊富ですが、Stanford NLP が開発した DSPy は、これらとは根本的に異なるアプローチを取っています。
本記事では、stanfordnlp/dspy(スター数: 33,943 / ライセンス: MIT)を取り上げ、DSPy の仕組みと特徴、LangChain との違い、採用すべきケースを整理します。

目次
作業時間削減
システム化を通して時間を生み出し、ビジネスの加速をサポートします。
システム開発が可能に
DSPy とは: プロンプトではなくプログラムで LLM を制御する
スタンフォード大学が開発した LLM プログラミングフレームワーク
DSPy(Declarative Self-improving Python)は、スタンフォード大学の NLP 研究チームが開発した Python フレームワークです。
公式 GitHub リポジトリには、このキャッチフレーズが掲げられています。
DSPy: The framework for programming—not prompting—language models
「プロンプティングではなく、プログラミング」。このシンプルな一文が、DSPy の本質を表しています。
2023年10月に発表された論文「DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines」を起点に開発が進み、2026年4月現在でバージョン 3.2.0 がリリースされています。スター数は 33,943、フォーク数は 2,831 と、研究コミュニティを中心に着実に普及しています。
基本情報(出典: stanfordnlp/dspy GitHub):
項目 | 値 |
|---|---|
バージョン | 3.2.0(2026-04-21) |
ライセンス | MIT |
言語 | Python(99.3%) |
スター数 | 33,943 |
フォーク数 | 2,831 |
従来のプロンプトエンジニアリングとの根本的な違い
従来の LLM アプリ開発では、「どう質問するか」「どう指示を書くか」というプロンプトの手動調整が開発作業の中心でした。このアプローチには根本的な問題があります。
- 脆弱性: LLM のバージョンアップや言語を変えると、プロンプトを書き直す必要がある
- 非体系性: 試行錯誤でプロンプトを改善するため、再現性が低い
- 密結合: システムの本質的な処理ロジックとプロンプト表現が混在してしまう
DSPy はこの問題を、「プロンプトを書く作業をフレームワーク側に委ねる」ことで解決します。開発者は「何をしてほしいか(入力と出力の型)」を宣言的に記述するだけで、最適なプロンプトは DSPy のオプティマイザーが自動生成・調整します。
三つの中核概念: Signatures・Modules・Optimizers

DSPy の公式ドキュメントでは、フレームワークの構成要素として三つの概念が定義されています。
Signatures: 入出力を宣言的に定義する
Signature(シグネチャ)は、LLM モジュールの「入力と出力の型定義」です。「どのように処理するか」ではなく「何を入力して何を出力するか」を記述します。
最もシンプルなのはインライン形式です(出典: DSPy Signatures ガイド):
sentence = "it's a charming and often affecting journey."
classify = dspy.Predict('sentence -> sentiment: bool')
classify(sentence=sentence).sentiment
'sentence -> sentiment: bool' という文字列が Signature です。これだけで「文章(sentence)を入力として受け取り、感情の真偽(bool)を返す」モジュールが定義されます。
より複雑なケースではクラスベースの Signature を使用します(出典: DSPy Signatures ガイド):
from typing import Literal
class Emotion(dspy.Signature):
"""Classify emotion."""
sentence: str = dspy.InputField()
sentiment: Literal['sadness', 'joy', 'love', 'anger', 'fear', 'surprise'] = dspy.OutputField()
sentence = "i started feeling a little vulnerable when the giant spotlight started blinding me"
classify = dspy.Predict(Emotion)
classify(sentence=sentence)
さらに、引用への忠実性を検証するような複合的な出力も定義できます(出典: DSPy Signatures ガイド):
class CheckCitationFaithfulness(dspy.Signature):
"""Verify that the text is based on the provided context."""
context: str = dspy.InputField(desc="facts here are assumed to be true")
text: str = dspy.InputField()
faithfulness: bool = dspy.OutputField()
evidence: dict[str, list[str]] = dspy.OutputField(desc="Supporting evidence for claims")
Signature は「この処理をしてほしい」という意図をコードで表現する仕組みです。プロンプトの文言は DSPy が内部で生成・最適化します。
Modules: プロンプティング技術を抽象化する
Module(モジュール)は、プロンプティング技術を抽象化した再利用可能なコンポーネントです。DSPy Modules ガイドでは以下の主要モジュールが定義されています。
モジュール | 説明 |
|---|---|
| 基本的な予測(シグネチャをそのまま適用) |
| 段階的思考の推論プロセスを生成 |
| Python コードを生成して実行 |
| ツールを利用するエージェント |
| 複数の ChainOfThought 出力を比較 |
たとえば、dspy.ChainOfThought を使うと、LLM に段階的な思考プロセスを踏ませながら回答を生成させられます(出典: DSPy Modules ガイド):
math = dspy.ChainOfThought("question -> answer: float")
math(question="Two dice are tossed. What is the probability that the sum equals two?")
実行結果(例):
Prediction(
reasoning='When two dice are tossed, each die has 6 faces, resulting in a total of 6 x 6 = 36 possible outcomes. The sum of the numbers on the two dice equals two only when both dice show a 1. This is just one specific outcome: (1, 1). Therefore, there is only 1 favorable outcome. The probability of the sum being two is the number of favorable outcomes divided by the total number of possible outcomes, which is 1/36.',
answer=0.0277776
)
dspy.ReAct を使うと、ツールを組み合わせたエージェントも構築できます(出典: DSPy Modules ガイド):
def evaluate_math(expression: str) -> float:
return dspy.PythonInterpreter({}).execute(expression)
def search_wikipedia(query: str) -> str:
results = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')(query, k=3)
return [x['text'] for x in results]
react = dspy.ReAct("question -> answer: float", tools=[evaluate_math, search_wikipedia])
pred = react(question="What is 9362158 divided by the year of birth of David Gregory of Kinnairdy castle?")
print(pred.answer) # 5761.328
モジュールは dspy.Module を継承してカスタムクラスとして定義することもできます。複数のモジュールを組み合わせた複雑なパイプラインも Python のクラス設計として自然に記述できます(出典: DSPy Modules ガイド):
class Hop(dspy.Module):
def __init__(self, num_docs=10, num_hops=4):
self.num_docs, self.num_hops = num_docs, num_hops
self.generate_query = dspy.ChainOfThought('claim, notes -> query')
self.append_notes = dspy.ChainOfThought('claim, notes, context -> new_notes: list[str], titles: list[str]')
def forward(self, claim: str) -> list[str]:
notes = []
titles = []
for _ in range(self.num_hops):
query = self.generate_query(claim=claim, notes=notes).query
context = search(query, k=self.num_docs)
prediction = self.append_notes(claim=claim, notes=notes, context=context)
notes.extend(prediction.new_notes)
titles.extend(prediction.titles)
return dspy.Prediction(notes=notes, titles=list(set(titles)))
Optimizers: プロンプトを自動で最適化する
Optimizer(オプティマイザー)は、DSPy 最大の特徴です。定義した Signature と Module の組み合わせを受け取り、トレーニングデータに基づいてプロンプトとモデルの重みを自動的に最適化します。
DSPy Optimizers ガイドでは以下のオプティマイザーが提供されています。
オプティマイザー | 概要 |
|---|---|
MIPROv2 | 命令と few-shot 例を両方自動生成・最適化 |
BootstrapFewShot | few-shot 例を自動合成 |
GEPA | プロンプトを反射的に進化 |
BootstrapFinetune | モデル重みをファインチューニング |
COPRO | 命令を座標降下法で最適化 |
SIMBA | ミニバッチ対応の最適化 |
代表的なオプティマイザー MIPROv2 の使用例は以下のとおりです(出典: DSPy Optimizers ガイド):
import dspy
from dspy.datasets import HotPotQA
dspy.configure(lm=dspy.LM('openai/gpt-4o-mini'))
def search(query: str) -> list[str]:
results = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')(query, k=3)
return [x['text'] for x in results]
trainset = [x.with_inputs('question') for x in HotPotQA(train_seed=2024, train_size=500).train]
react = dspy.ReAct("question -> answer", tools=[search])
tp = dspy.MIPROv2(metric=dspy.evaluate.answer_exact_match, auto="light", num_threads=24)
optimized_react = tp.compile(react, trainset=trainset)
tp.compile(react, trainset=trainset) を実行するだけで、提供したデータセットに基づいてパイプライン全体のプロンプトが自動最適化されます。
コードで学ぶ DSPy の基本的な使い方
インストールと初期設定
インストールは pip で行います(出典: stanfordnlp/dspy GitHub):
pip install dspy
最新の開発版を使用する場合は以下のコマンドを使います(出典: stanfordnlp/dspy GitHub):
pip install git+https://github.com/stanfordnlp/dspy.git
感情分類をインラインシグネチャで実装する
DSPy を使った感情分類の最小サンプルです(出典: DSPy Signatures ガイド):
sentence = "it's a charming and often affecting journey."
# Signature で宣言
classify = dspy.Predict('sentence -> sentiment: bool')
# 入力で呼び出し
classify(sentence=sentence).sentiment # True
たった2行で感情分類が完成します。プロンプトのテキストは一切書いていません。
ChainOfThought で段階的推論を実現する
RAG(検索拡張生成)パイプラインも簡潔に記述できます(出典: DSPy Modules ガイド):
rag = dspy.ChainOfThought('context, question -> response')
question = "What's the name of the castle that David Gregory inherited?"
rag(context=search_wikipedia(question), question=question)
出力(例):
Prediction(
reasoning='The context provides information about David Gregory, a Scottish physician and inventor. It specifically mentions that he inherited Kinnairdy Castle in 1664...',
response='Kinnairdy Castle'
)
reasoning フィールドに思考プロセスが自動的に生成される点が特徴です。
DSPy を採用すべきケース・LangChain を選ぶべきケース
DSPy と LangChain はそれぞれ異なる強みを持ちます。「プロンプトを書く vs プロンプトを最適化させる」という根本的な設計思想の違いが、選択の決め手になります。
DSPy が向いているケース
DSPy は以下のようなケースで特に力を発揮します。
- 精度の最適化が重要な場面: QA パイプライン、情報抽出、分類タスクなど、定量的な評価指標で最適化したい場合
- 複数モデルをテストしたい場合: Signature と Module を再定義せずに LLM を差し替えられるため、GPT-4o と Gemini などの比較が容易
- 研究・実験段階のプロジェクト: 再現性・体系性が重要で、プロンプトのバージョン管理が課題になっている場合
- LangChain や LlamaIndex の上に乗せる最適化層として: DSPy は他フレームワークと競合するより補完するポジションにあります
LangChain を選ぶべきケース
LangChain が適しているケースも明確です。
- エコシステムの広さが必要な場合: 70 以上のプロバイダー統合、豊富なインテグレーション
- 迅速なプロトタイプが優先される場合: 大規模なコミュニティとドキュメントが充実しており、始めやすい
- 複雑な多段ワークフローの手動制御が必要な場合: 処理フローを明示的にコントロールしたいケース
LlamaIndex との組み合わせパターン
LlamaIndex と DSPy は競合ではなく補完関係にあります。一般的な組み合わせパターンとして以下が推奨されています。
- LlamaIndex でデータ取込・インデックス構築: 大量ドキュメントの取込と検索に LlamaIndex を使用
- DSPy で検索クエリと回答生成を最適化: DSPy のオプティマイザーで精度を自動チューニング
プロジェクト状況と将来性
DSPy は 2026 年 4 月現在、活発に開発が継続されています。
- スター数: 33,943(成長中)
- 最新バージョン: 3.2.0(2026-04-21 リリース)
- 総リリース数: 107 件(継続的なアップデート)
- 最終コミット: 2026-04-21(前日に更新)
- 開発元: Stanford NLP(スタンフォード大学自然言語処理グループ)
研究論文を基盤に持つプロジェクトであり、学術的な信頼性とプロダクションでの実用性を両立しています。MIT ライセンスで提供されているため、商用利用も問題ありません。
まとめ: DSPy が解決する「プロンプト職人問題」
従来の LLM 開発では、優れた「プロンプト職人」がいないとシステムの品質が安定しないという課題がありました。DSPy はこの問題を、プロンプトを「書く」から「最適化される」ものに変えることで解決します。
自プロジェクトへの DSPy 採用を検討する際の判断ポイントをまとめます。
DSPy を選ぶ理由が明確なケース:
- プロンプトのバージョン管理・再現性に悩んでいる
- タスクの精度を定量的に最適化したい
- 複数の LLM を試して最良のものを選びたい
- 研究・実験フェーズで体系的なアプローチが必要
LangChain や他のフレームワークを継続するケース:
- すでに LangChain エコシステムで開発が進んでいる
- 手動でプロンプトを制御する必要がある
- 迅速なプロトタイプが最優先で最適化は後回しでよい
DSPy は「プロンプトを書く」作業から解放してくれるフレームワークです。LLM アプリの品質向上に課題を感じているエンジニアにとって、検討する価値のある選択肢といえます。
詳細は公式ドキュメント(dspy.ai)およびGitHub リポジトリをご参照ください。
時間を自由に
挑戦と成長を共にできるメンバーとの出会いをお待ちしています。









