DSPyとは?
DSPyは、LLMをモジュール型の自己改善パイプラインとして扱うフレームワークです。主な構成要素は以下の3つです:
- Signatures(署名): 入出力関係を定義するブループリント。
- Modules(モジュール): タスクを効率的に処理するためのコンポーネント。
- Teleprompters(最適化ツール): モジュールの性能を向上させるための最適化エンジン。
DSPyの主な特徴
他のフレームワークと比較したDSPyの利点を見てみましょう。
- 制御された生成
他フレームワーク(例: Guidance, LMQL): テンプレートベースの生成を提供するが、手動設定が必要。
DSPy: テレプロンプターによる自動最適化で、一貫した結果を提供 - スキーマ駆動型生成
他フレームワーク(例: Marvin, Instructor): 定義済みスキーマを使用するが、柔軟性が低い。
DSPy: 自然言語署名で幅広いタスクをサポート - モジュール型プログラミング
他フレームワーク(例: LangChain): プロトタイピングには便利だが、カスタマイズ性に欠ける。
DSPy: 高度な最適化戦略を提供し、複雑なパイプラインを構築可能 - オープンエージェント
他フレームワーク(例: AutoGPT, MetaGPT): 固定されたプロンプトに依存。
DSPy: 継続的な自己改善が可能なカスタマイズパイプラインを構築
DSPyの主要コンポーネント
1. 署名
署名はタスクの入出力関係を自然言語で定義するブループリントです。
例:
sig_1 = dspy.Signature("質問 -> 答え")
sig_2 = dspy.Signature("ドキュメント -> 要約")
sig_3 = dspy.Signature("質問, 文脈 -> 答え")
2. モジュール
モジュールは特定のタスクを処理するための組み込み機能を提供します。
モジュールの種類
- Predictモジュール: シンプルな入力と出力のマッピングを提供。
- ChainOfThought(CoT)モジュール: 複雑なタスクを段階的に処理。
- ProgramOfThought(PoT)モジュール: 抽象度の高いタスクを処理。
例: アクションアイテムの抽出
class ExtractActionItems(dspy.Signature):
"""
テキストからアクションアイテムを抽出し、Pythonリストとして返します。
"""
Text = dspy.InputField(desc="テキスト")
Extracted_action_items = dspy.OutputField(desc="アクションアイテムのリスト")
action_items_extractor = dspy.Predict(ExtractActionItems)
response = action_items_extractor(Text=Text)
3. 最適化ツール
DSPyのテレプロンプターは、モジュールの性能を継続的に改善する最適化エンジンです。
種類
- Few-Shot学習: ラベル付きデータから最適なプロンプトを生成。
- 指示最適化: 効率的な指示を生成し、最適化。
- ファインチューニング最適化: 小規模モデル向けに重みを調整。
例: Few-Shot最適化
optimizer = dspy.teleprompt.BootstrapFewShot()
optimized_model = optimizer.compile(module, trainset=get_examples())
DSPyを使ったユースケース:フィードバック要約の最適化
シナリオ
アプリのフィードバックを要約し、感情分析やアクションアイテムを抽出するタスクを想定。
タスクの定義
class FeedbackSummary(dspy.Signature):
feedback_text = dspy.InputField()
sentiment = dspy.OutputField()
topics = dspy.OutputField()
action_items = dspy.OutputField()
モジュールの作成
class SummarizeFeedback(dspy.Module):
def __init__(self):
super().__init__()
self.summary = dspy.ChainOfThought(FeedbackSummary)
def forward(self, feedback_text):
return self.summary(feedback_text=feedback_text)
トレーニングデータの追加
def get_examples():
return [
dspy.Example(
feedback_text="新機能は素晴らしいが、ドキュメントが不足している。",
sentiment="ポジティブ",
topics="新機能, ドキュメント",
action_items="ドキュメントの改善"
)
]
最適化の実施
optimizer = dspy.teleprompt.BootstrapFewShot()
optimized_summarizer = optimizer.compile(SummarizeFeedback(), trainset=get_examples())
参考