Slide 1

Slide 1 text

DSPy入門 Pythonで実現する自動プロンプト最適化 〜人手によるプロンプト調整からの卒業〜 山田 暉(やまだ ひかる)

Slide 2

Slide 2 text

自己紹介 ● NLP / AIエンジニア ● 業務は主にテキスト関連の研究開発 ● プライベートでは漫画のグラフデータの開発を行なっている ● Xアカウント: @sea_turt1e 2

Slide 3

Slide 3 text

今日持ち帰っていただけると嬉しいこと ● 「DSPyとはなにか 」をなんとなく理解する。 ● プロンプトを作成・運用する上での引き出しのひとつ にする。 ● できればDSPyを実際に触ってみようと思える。 DSPyってのがあるんだな 3

Slide 4

Slide 4 text

LLMを利用したサービスの増加 ここ2、3年はLLMを利用したサービスはどんどん増えてきていますよね。 今後もLLMを利用したサービスは増加するのは間違いないと思います。 4

Slide 5

Slide 5 text

前提: プロンプトとは? あなたはPyCon mini Shizuokaのスタッフです。参加者から質問を受けた時を想定して回答してください。 回答の具体例 ・ご質問ありがとうございます。〜については ...となっています。 ・ご質問の内容を早急に調査して、今週中には回答させていただきます。 プロンプトとはLLMと会話する前にLLMの振る舞い方を「指示文言」として入れておく 文書のこと。 プロンプト例 具体例を入れることで 出力をコントロールし やすくなる 5

Slide 6

Slide 6 text

LLM利用サービスの困りどころ 6

Slide 7

Slide 7 text

モデルバージョンの廃止サイクルが短い ● 例えば、1年も経たずにGPT4oのあるバージョンは廃止されることもあった。 ● LLMの発展は短いサイクルでどんどん性能が高くなっていくので、たとえモデ ルが廃止されていなくても新しいモデルが使いたいということもあり得る。 7

Slide 8

Slide 8 text

プロンプトの修正が必要になる ● モデルそのものを変更する場合(例 : GPT4 → GPT5や、GPT5→Claude4.5) ● モデルのバージョンアップをする場合(例 : GPT4-202404→GPT4-202504) 同じGPT4だったとしても、別バージョンで出力が大きく変わることも。 LLMの出力をエンドユーザーに直接届けるような サービスでは致命的な変更にもなりかねない。 なんか出力が前より悪くなっ たな...。 サービス使うのやめよ。 8

Slide 9

Slide 9 text

提供サービス少なければなんとかなるけど ...増えたら? ● LLM利用サービスが増えればどんどんプロンプトの修正工数が増えていく。 → 対応しきれくなる時がいずれくる。 ● (モデル廃止時に修正を行うのは最低限として) 本来は良いモデルや安価なモデルが出たらそちらに変更すべき。 9

Slide 10

Slide 10 text

じゃあどうするか 10

Slide 11

Slide 11 text

プロンプトも LLMに更新してもらお う 11

Slide 12

Slide 12 text

DSPyで! 12

Slide 13

Slide 13 text

DSPyとは ● Declarative Self-improving Pythonの略(宣言型自己改善型Python) ● プロンプトをLLMで自律的に改善するためのPythonフレームワーク ふーん 13

Slide 14

Slide 14 text

DSPyを使うと何が嬉しいの? プロンプトを自動的に生成・修正してくれるので、 モデルの変更やアップデート時に 人間がプロンプト修正をする必要がなくなる 。 *機械学習でモデルを学習する方法に近いので、AIに精通している方はそちらに当て嵌めながらこのあとを聞くとわかり やすいかもです。(機械学習の知識は必須ではありません) 14

Slide 15

Slide 15 text

でもそんな良いことばっかりじゃな いんでしょ? 15

Slide 16

Slide 16 text

はい、その通りです。 他で作業が必要なことがあります。 16

Slide 17

Slide 17 text

DSPyとは(さっきより少し詳しく) 定義した仕様書を基に具体的なデータを利用して、 プロンプトを生成するためのプログラムを最適化するためのPythonフレームワーク 具体的なデータ          プロンプト プログラム ここを最適化する 17

Slide 18

Slide 18 text

18 今回は 小学生の算数問題 を解くためのプロンプトを最適化 します。 例えばの算数問題 —--------------------- Q. 太郎は500円持っています。150円のジュースを2本買いました。 おつりはいくらですか? A. 200円

Slide 19

Slide 19 text

今までだったら ... 人間が頑張ってプロンプトを書き、何度も何度も修正する必要があった。 (=プロンプトエンジニアリング) 19

Slide 20

Slide 20 text

しかも... ● モデルを変える場合(例えばGPT4 -> GPT5)最悪やり直しになることもある。 ● バージョン(例えばGPT4-2401 ver. -> GPT4-2501 ver. )変更だけでも数日かか る可能性も高い。 20

Slide 21

Slide 21 text

そこでDSPyが登場 〜ここからDSPyの中身〜 21

Slide 22

Slide 22 text

DSPyの構成要素 ● シグネチャ : タスクを定義した仕様書 ● モジュール : シグネチャ(仕様書)を使って動く部品 ● 最適化: プロンプトを最適化    (DSPyではCompileやOptimizeと呼んだりする) 「最適化」がDSPyの肝 22

Slide 23

Slide 23 text

シグネチャ : タスクの「仕様書」を定義する シグネチャは、LLMに"何を"やってほしいかを定義する「仕様書」を表します。 23

Slide 24

Slide 24 text

シグネチャ(仕様書)の例 「以下のような変換(入力 → 出力)をしたい」という仕様書 ● 質問 → 回答 ● 例: 1+1は? → 2 ⚠ 注意: 上記はまだ「プロンプト」ではありません。あくまで「タスクの入出力」を定義 しています。 24

Slide 25

Slide 25 text

モジュール シグネチャ(仕様書)を使って動く部品。 ● dspy.Predict 最も基本的。シグネチャ(例:質問 -> 回答)に従う ● dspy.ChainOfThought 思考を連鎖して回答する (質問 -> (計算式) -> 回答 を自動で行う) ● dspy.ReAct 外部ツール(検索API等)と連携し、情報を収集しながら段階的に推論・回答す るモジュール (質問 → 思考 → 行動(検索等) → 観察 → ... → 回答) 25 今回は最もシンプルな Predictを使う。

Slide 26

Slide 26 text

まず結果をお見せします。 (最適化前のプロンプトと、最適化後のプロンプト) 26

Slide 27

Slide 27 text

最適化前のプロンプト 質問の内容に基づいて、回答を生成してください。 27 デフォルトのプロンプト

Slide 28

Slide 28 text

最適後のプロンプト 自然言語で書かれた数学の文章問題が与えられます。 あなたの仕事は、最終的な数値を単一の整数で計算することです。 内部的に実行する手順(出力には表示されません): テキストを解析してすべての数値と単位を特定し、関係と必要な算術を決定し、結果を計算しま す。 最終的な整数値のみを数字で出力し、追加のテキスト、説明、書式設定は行わないでください。 思考の連鎖的推論や中間ステップは提供しないでください。 単位の一貫性と正確性を確認してください。最終的な答えは整数でなければなりません。 28 これが自動で生成される ※人間が読みやすいよう改行して います。

Slide 29

Slide 29 text

実際のコード例 (一部抜粋) 29

Slide 30

Slide 30 text

セットアップ & LLM 設定 import dspy # 言語モデルの設定(LiteLLM 経由で様々なプロバイダーに対応) lm = dspy.LM("openai/gpt-5-nano") dspy.configure(lm=lm) 30

Slide 31

Slide 31 text

シグネチャ(仕様書)で「何をさせたいか」を定義 class MathQA(dspy.Signature): """算数問題を解く""" question = dspy.InputField(desc="問題文") answer = dspy.OutputField(desc="数値回答") predict = dspy.Predict(MathQA) # 実行 result = predict(question="5個のりんごが入った箱が3箱ある。全部で何個?") print(result.answer) # => 15 > シグネチャ = タスクの入出力の宣言 。プロンプトはDSPyが自動生成します。 31

Slide 32

Slide 32 text

MIPROv2 でOptimizerの設定 optimizer = MIPROv2( # 出力結果が算数として合っているかを評価する関数 metric=gsm8k_metric, # 最適化の強度 (light/medium/heavy) auto="light", ) 32

Slide 33

Slide 33 text

MIPROv2 で自動最適化 # 最適化を実行(trainset を使って最適なプロンプトを自動探索) optimized = optimizer.compile( baseline, # 最適化するプログラム trainset=trainset, # 訓練データ ) 33

Slide 34

Slide 34 text

34

Slide 35

Slide 35 text

プロンプトの最適化結果 35 質問の内容に基づいて、回答を生 成してください。 自然言語で書かれた数学の文章問題が与えられます。 あなたの仕事は、最終的な数値を単一の整数で計算する ことです。 内部的に実行する手順(出力には表示されません) テキストを解析してすべての数値と単位を特定し、関係と 必要な算術を決定し、結果を計算します。 最終的な整数値のみを数字で出力し、追加のテキスト、説 明、書式設定は行わないでください。 思考の連鎖的推論や中間ステップは提供しないでくださ い。 単位の一貫性と正確性を確認してください。最終的な答え は整数でなければなりません。 最適化 正解率 91.67% → 94.67%(3%UP) 最適化前 最適化後

Slide 36

Slide 36 text

最適化で何が変わったか? 36 質問の内容に基づいて、回答を生 成してください。 自然言語で書かれた数学の文章問題が与えられます。 あなたの仕事は、最終的な数値を単一の整数で計算する ことです。 内部的に実行する手順(出力には表示されません) テキストを解析してすべての数値と単位を特定し、関係と 必要な算術を決定し、結果を計算します。 最終的な整数値のみを数字で出力し、追加のテキスト、説 明、書式設定は行わないでください。 思考の連鎖的推論や中間ステップは提供しないでくださ い。 単位の一貫性と正確性を確認してください。最終的な答え は整数でなければなりません。 最適化前 最適化後 一般的で、アバウト ✓ 具体的な仕事内容: 「最 終的な数値を単一の整数で 計算」 ✓ 制約条件: 「余分なテキ スト、説明は不要」 ✓ 単位の一貫性を確保 ✓ 最終形式の指定: 「整数 でなければならない」

Slide 37

Slide 37 text

用意するデータのポイント 37

Slide 38

Slide 38 text

必要なデータ量 推奨量:10 ~ 100 個 ┗ 10個: 最小限(Light最適化向け) ┗ 50個: 標準(Medium最適化向け) ┗ 100個: しっかり最適化したい場合 38

Slide 39

Slide 39 text

データのポイント ● 機械学習の fine-tuning に比べ、必要データが圧倒的に少ない ● データの多様性が重要(異なるバリエーション を含める) ○ りんご5個、みかん3個、合計は?(複数単位) ○ 5x3+2は?(複合計算) ○ 100円から3個で50円の品を買いました。おつりは?(引き算) ● 100個を超えてもリターンは小さくなる傾向 ● 質 > 量(低品質なお手本は避ける) 39

Slide 40

Slide 40 text

最適化の詳細 40

Slide 41

Slide 41 text

         最適化(Compile, Optimize) ※前スライドの再喝 プログラムを「最適化」する仕組み 。 DSPyではこの「プログラム」を使ってプロンプトを生成する。 具体的なデータ プロンプト プログラム ここを最適化する 41

Slide 42

Slide 42 text

最適化の役割 データに基づいて最も正答率の高いプロンプト を自動的に探索 する。 1. 訓練データを使って成功パターンを収集 2. 複数の命令文(Instruction)候補を自動生成 3. 命令文と Few-Shot例の最適な組み合わせを探索 4. 評価関数で数値的に最も良い組み合わせを選択 人間がプロンプトを試行錯誤する作業を、アルゴリズムが自動で行う 42

Slide 43

Slide 43 text

何を最適化するのか? 1. 命令文(Instruction) — LLM への指示テキスト ○ 例) 算数の文章問題を解いて最終的な数値のみ回答してください 2. Few-shot 例(Demonstrations) — 入出力のお手本 ○ 例) Q:りんご3個×5箱=? → A:15 3. 上記の最適な組み合わせ — ベイズ最適化等で探索 43

Slide 44

Slide 44 text

最適化の具体的な流れのイメージ 1. プログラム定義 シグネチャ("Q -> A")+ モジュール(Predict)を定義 2. 入出力のお手本データ 質問と正解のペアを 10〜100 個用意 3. 最適化 Optimizerがデータを使って最適な命令文+Few-Shotの例を探索 4. 最適化済みプログラム JSON として保存。いつでも読み込んで再利用可能 44

Slide 45

Slide 45 text

最適化された「プログラム」を走らせると ... 最適化前と同じコードで実行するだけで、自動生成されたプロンプトが 作成可 能。 内部では最適化によって追加された 命令文 と Few-shot例 が自動的にプロン プトに組み込まれ、正答率が向上します。 45

Slide 46

Slide 46 text

使用するLLMのモデルが変わったら 再度「最適化」のプログラムを走らせればOK。これだけ。 【実行時間】 ● プロトタイプやデモ用途(Light 最適化): 5~10 分 ● コスパ重視(Medium 最適化): 20~30 分 ● 精度重視(Heavy 最適化): 60~120 分 (トレーニングデータ数、トライアル数に依存) これまでのプロンプトエンジニアリング(数日~1週間) と比較して圧倒的に高速化 46

Slide 47

Slide 47 text

最初だけ頑張れば、 それ以降は自動でプロンプトが更 新できる 47 => 怠惰を求めて勤勉に行き着く

Slide 48

Slide 48 text

個人的には ... ブラックボックスであるLLMの中身を想像しながら人間がプロンプトを書く という従来の方法よりも タスクを定義してAIに最適化してもらうDSPyの方が妥当な手法という気がしていま す。 48

Slide 49

Slide 49 text

他の実用例 ● 何度か推論をした上での回答をするボット(マルチホップQA) 例: 織田信長が幼少期に過ごしていた城で、主をしていたのは? ● 入力した文章をあるキャラクターの口調へ変換する 例: いつか起業したい! → 海賊王に俺はなるっ! ● RAGを用いた社内Q&Aボットのプロンプト向上 49

Slide 50

Slide 50 text

比較項目 従来の手法 DSPy 開発者がやること プロンプトを手動で作成/修正(試行錯誤) シグネチャ定義+お手本データの用意 最適化 勘と経験による手動チューニング お手本データに基づき自動最適化 ロジックとプロン プト 密結合(変更が大変) 分離(ロジックはそのまま) LLMモデルの変 更 GPT-5 nano→Claude 4.5 Haiku に変えたら正 解率が落ちたため、全面見直し LLMモデルを変えたら、再度、最適化 すればOK 「従来の手法」と「 DSPy」の比較表 50

Slide 51

Slide 51 text

まとめ ● DSPyを使えば、モデルの変更時やアップデート時にプロンプトを 人間が修正しなくて済むようになる。 ● 「プロンプトを人間が作る」という従来の方法ではなく、 1. 仕様書を人間が定義して 2. 具体的なデータを人間が少量用意して 3. プログラムを自動で最適化して 4. プロンプトを自動で生成/調整する イメージ。 51

Slide 52

Slide 52 text

コード全文 https://github.com/sea-turt1e/dspy-demo 52

Slide 53

Slide 53 text

参考文献等 【公式リソース】 ● DSPy 公式ドキュメント: https://dspy.ai/ ● DSPy GitHub リポジトリ: https://github.com/stanfordnlp/dspy ● MIPROv2 詳細ガイド: https://dspy.ai/api/optimizers/MIPROv2/ 【学習用記事】 ● 「プロンプトエンジニアリングを終わらせる DSPy」 ● Zenn: DSpyの基礎と構成(プログラムの実行と最適化) ● Dev.to: The Power of MIPROv2 【実装例】 ● HuggingFace Spaces: DSPy Demo ● Google Colab チュートリアル(公式) 【学術論文】 ● "DSPy: Optimizing LM Calls with Weak Supervision" Khattab et al., 2023 53

Slide 54

Slide 54 text

その他資料 54

Slide 55

Slide 55 text

最適化アルゴリズムの紹介 ● BootstrapFewShot 訓練データでプログラムを実行し、正解した例を Few-shot 候補として自動収集するシンプ ルなアルゴリズム。命令文の最適化は行わない。 ● COPRO 命令文(Instruction)を LLM で生成・改善していく手法 ● MIPROv2 ← 今回はこれを使っている Few-shot 収集 + 命令文生成 + ベイズ最適化を統合した高性能手法 ● GEPA 進化的アルゴリズムによる最適化 55