DSPy搭載オプティマイザ一覧

概要

DSPy オプティマイザ 統合リファレンス

DSPyのオプティマイザ(旧称:Teleprompter)は、DSPyプログラムのパラメータ(プロンプトやLMの重み)を自動的に調整し、指定したメトリクスを最大化するアルゴリズムです。公式ドキュメント(dspy.ai)に基づき、以下の 4カテゴリ・11種類 のオプティマイザが存在します。

プロンプトに最適化された例(デモンストレーション)を自動生成・挿入するオプティマイザ群です。

オプティマイザ 概要 適したタスク/指示のタイプ metric ラベル(正解出力) コード例(一文)
LabeledFewShot ラベル付きデータからランダムに k 個のデモを選んでプロンプトに挿入する最もシンプルな方法。ラベル付きデータからランダムにデモを選ぶだけなので、metricは使わない。ただしラベルは必須。 良質なラベル付きデータが少量あり、素早くベースラインを作りたい分類・QAタスク。 不要 必要 dspy.LabeledFewShot(k=8).compile(program, trainset=trainset)
BootstrapFewShot teacherモジュールで各ステップの完全なデモを自動生成し、metricを通過した高品質デモのみ保持する。metricがNoneの場合、すべてのブートストラップされたデモが受け入れられる(フィルタなし)。入力のみでも動作可能。 データが約10件程度と少なく、自動でデモを生成して品質を底上げしたいタスク全般。 あると良い(None可) あると良い dspy.BootstrapFewShot(metric=my_metric, max_bootstrapped_demos=4, max_labeled_demos=16).compile(program, trainset=trainset)
BootstrapFewShotWithRandomSearch BootstrapFewShot を複数回ランダムサーチで実行し、最良の候補プログラムを選択する。num_candidate_programs で候補数を指定可能。最も一般的に使われるオプティマイザの一つ。 50件以上のデータがあり、Bootstrap単体より確実に良い結果を得たいタスク全般。 必要 あると良い dspy.BootstrapFewShotWithRandomSearch(metric=my_metric, max_bootstrapped_demos=4, max_labeled_demos=4, num_candidate_programs=10).compile(program, trainset=trainset)
KNNFewShot k-最近傍法で入力に最も類似した訓練例を動的に選び、それをBootstrapFewShotの訓練セットとして使用する。入力依存の動的なデモ選択が可能。 入力の多様性が高く、入力ごとに最も関連性の高いデモを選びたいタスク(例:多ドメインQA)。入力の類似度でデモを選ぶ。 内部のBootstrapFewShot依存 あると良い dspy.KNNFewShot(k=3, trainset=trainset, vectorizer=dspy.Embedder(encoder_fn)).compile(program)

プロンプトのインストラクション(指示文)そのものを最適化するオプティマイザ群です。

オプティマイザ 概要 適したタスク/指示のタイプ metric ラベル(正解出力) コード例(一文)
COPRO 各ステップに対して新しいインストラクションを生成・改善し、座標上昇法(Coordinate Ascent)で最適化する。depth パラメータで改善イテレーション回数を制御。インストラクションの良し悪しをmetricで評価する必要あり。 プロンプトの指示文(instruction)自体を磨き上げたい、比較的シンプルなパイプライン。 必要 入力のみでも可 dspy.COPRO(metric=my_metric, depth=3, breadth=6).compile(program, trainset=trainset, eval_kwargs={})
MIPROv2 インストラクション Few-Shotデモの両方を同時に最適化。データ・デモ認識型の指示生成を行い、ベイズ最適化で探索空間を効率的に探索する。auto="light"/"medium"/"heavy" モードあり。最も強力な汎用オプティマイザの一つ。ベイズ最適化でインストラクション+デモを探索するためmetric必須。0-shot設定(max_bootstrapped_demos=0, max_labeled_demos=0)ならインストラクションだけ最適化でき、ラベル不要。 200件以上のデータで長時間最適化が可能な、複雑なマルチステップパイプラインやRAG。0-shot設定でインストラクションのみの最適化も可能。 必要 入力のみでも可 dspy.MIPROv2(metric=my_metric, auto="light", num_threads=24).compile(program, trainset=trainset)
SIMBA Stochastic Introspective Mini-Batch Ascent。確率的ミニバッチサンプリングで出力のばらつきが大きい困難な例を特定し、LMの自己内省(Introspection)で失敗を分析、自己改善ルールやデモを生成する。失敗分析にmetricが必要。 大規模データセットでの系統的な改善や、出力品質のばらつきが大きいタスク。 必要 入力のみでも可 dspy.SIMBA(metric=my_metric, bsize=8, max_steps=4, num_candidates=4).compile(program, trainset=trainset)
GEPA LMを使ってプログラムのトラジェクトリ(実行軌跡)を振り返り、何がうまくいき何がうまくいかなかったかを特定し、ギャップを埋めるプロンプトを提案する進化的オプティマイザ。ドメイン固有のテキストフィードバックも活用可能。トラジェクトリの振り返りにmetricが必要。論文: GEPA: Reflective Prompt Engineering 複雑な推論タスクやドメイン特化の最適化で、ドメイン知識をフィードバックとして組み込みたい場合。 必要 入力のみでも可 dspy.GEPA(metric=my_metric, auto="medium", reflection_lm=dspy.LM("openai/gpt-4o")).compile(program, trainset=trainset)

LMの重み自体を更新するオプティマイザです。

オプティマイザ 概要 適したタスク/指示のタイプ metric ラベル(正解出力) コード例(一文)
BootstrapFinetune プロンプトベースのDSPyプログラムをLMの重み更新に蒸留。各ステップがファインチューニング済みモデルで実行されるプログラムを生成する。metricがあるとトレーニングデータのフィルタリングに使われる。 大規模LMで最適化した後、小規模LMに蒸留してコスト・レイテンシを下げたい場合。 あると良い(None可) あると良い dspy.BootstrapFinetune(metric=my_metric, num_threads=24).compile(program, trainset=trainset)

複数のプログラムを組み合わせる変換オプティマイザです。

オプティマイザ 概要 適したタスク/指示のタイプ metric ラベル(正解出力) コード例(一文)
Ensemble 複数のDSPyプログラムをアンサンブルし、全セットまたはランダムサブセットを1つのプログラムに統合する。 複数のオプティマイザで生成した候補プログラムを多数決等で束ねて推論精度を上げたい場合。 不要 不要 dspy.Ensemble(reduce_fn=dspy.majority, size=5).compile(list_of_programs)
オプティマイザ 概要 適したタスク/指示のタイプ metric ラベル(正解出力) コード例(一文)
BetterTogether プロンプト最適化(MIPROv2等)とファインチューニング(BootstrapFinetune)を交互に実行し、両者の相乗効果で最適化する。内部でMIPROv2+BootstrapFinetuneを交互に回すのでmetric必須。論文: Fine-Tuning and Prompt Optimization: Two Great Steps that Work Better Together プロンプト最適化だけでは不十分で、重み更新も組み合わせて最大限の性能を引き出したい場合。 必要 あると良い dspy.BetterTogether(metric=my_metric, num_threads=24).compile(program, trainset=trainset)
  • metricについて: 「必要」と記載したオプティマイザでも、metricは必ずしも正解ラベルとの比較関数である必要はありません。LLM-as-Judgeや、出力フォーマットチェックなど、ラベル不要のmetric関数でも動作します。例えば「出力が日本語であるか」「回答が100文字以内か」「フォーマットが正しいか」といった、正解データに依存しないmetricも有効です。
  • ラベル(正解出力)について: LabeledFewShot 以外は、原則として入力のみ(ラベルなし)のデータでも動作可能です。ラベルがあればmetricの品質が上がるので最適化の精度も上がりますが、必須ではありません。
  • 「入力のみでも可」について: trainsetに dspy.Example(question="...").with_inputs("question") のように入力フィールドだけを持つデータを渡しても最適化が実行できます。ラベル付きデータがあるほど最適化精度は向上しますが、必須ではありません。
条件 推奨オプティマイザ
例がごく少数(約10件) BootstrapFewShot
50件以上のデータがある BootstrapFewShotWithRandomSearch
0-shotでインストラクションのみ最適化したい MIPROv2(0-shot設定)
十分な推論コスト・データ(200件以上)で長時間最適化 MIPROv2
大規模LMで最適化後、小規模LMに蒸留したい BootstrapFinetune
複雑な推論タスク・ドメイン特化 GEPA
大規模データセットでの系統的改善 SIMBA

オプティマイザは組み合わせ可能です。例えば MIPROv2 の出力を再度 MIPROv2 に入れたり、BootstrapFinetune に渡したりできます。また、複数の候補プログラムを Ensemble で統合することも可能です。