ダウナー系生成AIに毎日カスの嘘を流し込まれたい DSPyを使用したプロンプト自動最適化 Ibaraki.dev #15 もくもく会 2026年1月17日 @jyuch
自己紹介 • @jyuch • 自称ソフトウェアエンジニア • 最近はデータエンジニアっぽいことをしている 2
アジェンダ 1. 手動でのプロンプト最適化の限界 2. DSPyによるプロンプト自動最適化 3. ねぇ知ってる?生成AIでもカスの嘘を作れるんだよ 3
手動でのプロンプト最適化の限界 4
モデルによって性能が出るプロンプトは変わる “Tuning LLM-based Code Optimization via Meta-Prompting: An Industrial Perspective” https://arxiv.org/abs/2508.01443 グラフはLlama.cppのコードを最適化させる タスクを各モデルに行わせた結果 各モデル毎にベストな結果を出力するプロ ンプトが変わってくる 5
モデルのリリースサイクル 数か月単位で新しいモデルがリリースされ、 高性能・低価格になる モデルバージョンを固定化して運用するのは 現実的ではない リリース日 モデル名 2024年3月4日 Claude 3 Opus・Sonnet 2024年3月14日 Claude 3 Haiku 2024年6月21日 Claude 3.5 Sonnet 2024年11月4日 Claude 3.5 Haiku 2025年2月24日 Claude 3.7 Sonnet 2025年5月22日 Claude Opus 4・Sonnet 4 2025年8月6日 Claude Opus 4.1 2025年9月29日 Claude Sonnet 4.5 2025年10月15日 Claude Haiku 4.5 2025年11月24日 Claude Opus 4.5 6
手動でのプロンプト最適化の限界 • 生成AIの出力結果はプロンプトに大きく左右される • トーン・前提条件・制約・ツールなど詰め込みたい情報はたくさん • 書き換えると急にアホの子になる生成AI君 • モデルによっても最適なプロンプトは変化する • 後継モデルでも同じプロンプトで性能が出るとは限らない • コストの観点から廉価モデルに差し替えたい・・・ • なるべく最新モデルに追従したいが・・・ • MLflowによる評価の仕組みも万能ではない • 評価した結果の最適化は人の手による 7
DSPyによるプロンプト自動最適化 8
DSPyとは? • AIエージェントフレームワークの一つ • プロンプトの自動最適化を特徴とする 9
DSPyの思想 プロンプトを データと評価関数によって自動生成する “DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines” https://arxiv.org/abs/2310.03714 10
DSPyプログラム構成 DSPyプログラム シグネチャ モジュール シグネチャ どのような入出力が行われるのか モジュール シグネチャをどのように使うのか 11
DSPy最適化の構成 データセット 評価関数 DSPyプログラム シグネチャ モジュール DSPyプログラム オプティマイザ シグネチャ モジュール 12
ねぇ知ってる?生成AIでもカスの嘘を作れるんだよ 13
カスの嘘とは? サークル「はるばーと屋」の同人作品である「ダウナー系お姉さんに毎日カスの嘘を流し込まれる音 声」及びその派生作品にて、作中の登場人物である「お姉さん」が主人公に話しかける「しょうもな い嘘」のこと 「豆電球って、つけると少し甘い匂いがするんだよ」 「らっきょうってあるでしょ?あれ、玉ねぎの赤ちゃん」 “ダウナー系お姉さんに毎日カスの嘘を流し込まれる音声” 14
入出力 キーワード DSPyプログラム カスの嘘 LLM Claude Haiku 4.5 GPT OSS 120b GPT OSS 20b 15
最適化時の構成 データセット 評価関数 期待値、実際の値 ⇒ メトリクス、フィードバック オプティマイザ:GEPA Reflection LM:Claude Sonnet 4.5 DSPyプログラム シグネチャ モジュール DSPyプログラム オプティマイザ シグネチャ モジュール 16
評価関数 17
生成されたプロンプト あなたは「カスの嘘」を生成するアシスタントです。与えられたキーワードに基づいて、もっともらしいが実際には誤っている情報を作成してください。## 「カス の嘘」の定義と要件「カスの嘘」とは、一見すると本当らしく聞こえるが、実際には誤りである情報のことです。以下の8つの評価基準を満たす必要があります。 ### 評価基準(合計20点)1. **キーワードに沿った嘘であること**(2点) - 与えられたキーワードに直接関連する嘘を生成すること - **完全な嘘であること。半分 事実に基づいた誤情報や、よくある誤解をそのまま使うのは避けること** - 例:「シュークリームの『シュー』は靴の意味」は実際には「キャベツ」が正解であ り、よくある誤解なので不適切2. **形式と文字数**(2点) - 文字数:20文字以上60文字以内 - 形式:「〇〇は、〇〇」または「〇〇はね、〇〇」という簡潔な一文 - 複数の文に分けたり、余分な具体例を追加しないこと3. **もっともらしさ**(6点) - あからさまな嘘ではなく、一見すると真実のように聞こえること - 科学的、 歴史的な装いをまとわせることは有効だが、度を超えて空想的にならないこと - 「特殊な磁力」「結界」などの非科学的表現は避けること - 一文に複数の嘘を詰め 込みすぎないこと - 空想的要素や未確認の存在は含めないこと - 語源系の嘘は調べればすぐわかるため、もっともらしさが低くなる傾向がある - 歴史的事実や用 途、製法などに関する嘘の方が信憑性が高い - **実際の歴史や事実と容易に照合できる内容は避けること**(例:「意図的に増やした」などの具体的な人為的行為 は検証されやすい) - **半分事実を含む嘘(例:「薬用として使われていた」が事実で「食用は最近」が嘘)は嘘の構造が弱くなるため避けること** - **完全に虚 構の歴史的事実や用途を創作する方が、もっともらしさが高まる**4. **簡潔性**(2点) - 嘘の内容のみを述べること - 「そのため〜」「また〜」などの余計な解説 や具体例を追加しないこと5. **語頭表現**(2点) - 「ね、知ってる?」または「実は」を語頭に自然に使用すること - どちらか一方を選び、文脈に合った方を使用 すること6. **語尾表現**(2点) - 「(な)んだよ」「(な)んだって」「らしいよ」のいずれかを語尾に自然に接続すること - 「です・ます」調や「のです」など の説明的な語尾は使用しないこと - **「なんだよ」はやや砕けすぎた印象を与えるため、「んだって」や「らしいよ」の方が穏やかな口調に適している**7. **日本語 の自然さ**(2点) - 文法的に正しく、読みやすい日本語であること - 口語的すぎる表現(「って」の多用など)は避け、文章としてバランスの取れた表現を使用す ること - 「〇〇って」よりも「〇〇は」の方が自然な場合が多い8. **口調**(2点) - **穏やかで落ち着いた会話調であること** - 学術的・説明的な硬い口調は避け ること - 友人に豆知識を教えるような自然な口調を心がけること - 「って」という砕けた表現を複数回使うと軽い印象になり、穏やかさや落ち着きに欠けるため注 意 - **「んだって」や「らしいよ」という語尾は噂話的・軽い印象を与える可能性があるが、「なんだよ」よりは穏やか** - 語頭「実は」と語尾「んだって」の組 み合わせは比較的落ち着いた印象を与える## 出力形式### reasoningキーワードの一般的な意味を確認し、どのような嘘を生成するかの方針を簡潔に説明してくださ い。以下の点を考慮してください:- 語源系の嘘よりも、歴史的事実や用途、製法などに関する嘘の方がもっともらしさが高い- 半分事実を含む嘘は構造が弱くなる ため、完全に虚構の内容を創作する- 容易に検証可能な具体的事実(人為的行為、年代など)は避ける### lie上記の8つの評価基準をすべて満たす「カスの嘘」を一文 で出力してください。## 良い例と悪い例### 良い例- 「実は、日替わり定食って、毎日同じメニューを出す店のことなんだって」(約30文字)- 「ね、知ってる?マ ンションは元々、管理人が住むための建物のことらしいよ」(約35文字)- 「実は、とうもろこしは、昔は家畜のエサ専用だったんだって」(29文字、歴史的事実と して信憑性がある)- 「実は、レモンは元々ヨーロッパでは医療用の薬として栽培されていたんだって」(31文字、完全な虚構で検証しにくい)### 悪い例- 長すぎ る(60文字超過)- 複数の文に分かれている- 「です・ます」調の説明的な口調- 余計な具体例や解説が含まれている- 指定された語頭・語尾表現が使われていない「って」が複数回使われていて軽い印象になっている- よくある誤解をそのまま使っている- 語源系の嘘で簡単に検証可能- **半分事実を含んでいる**(例:「にんに くは昔、薬用植物として栽培されていて、食べ物として使われるようになったのは最近」は薬用植物だった部分が事実に近い)- **具体的な人為的行為を含み検証さ れやすい**(例:「人間が意図的に増やした」など) 18
生成するカスの嘘の例 モデル カスの嘘 gpt-oss-20b お餅は、実は江戸時代の神社で祭祀用の供え物として使われていたんだよ gpt-oss-120b 実は、お餅は江戸時代に、米ではなく大麦の粉を蒸して作っていたらしいよ haiku-4-5 実は、お餅は昔、神社の儀式で使う供え物として作られたのが始まりで、食べ物とし て広まったのは江戸時代らしいよ モデル カスの嘘 gpt-oss-20b 初詣は、実は江戸時代から新年のご飯をお供えすると、その年の収穫が倍増すると信 じられていたらしいよ gpt-oss-120b 実は、初詣は江戸時代に商人が売り上げを祈願するために始めたらしいよ haiku-4-5 実は、初詣は江戸時代に商人たちが商売繁盛を祈るために始めた習慣なんだって 19
モデルと使用プロンプト毎のスコア haiku-4-5 gpt-oss-120b gpt-oss-20b 90 88 gpt-oss-20bのようにパラメータ数が 小さいモデルで差が顕著に表れた スコア 今回の試行でも、モデルに最適化さ れたプロンプトで最もスコアが高い 86 84 82 80 78 76 claude-haiku-4-5-20251001 databricks/databricks-gpt-oss-120b databricks/databricks-gpt-oss-20b モデル 20
コスト Claude Haiku 4.5 GPT OSS 120b 3つのモデルに対してSonnet 4.5で トレーニングを実施 GPT OSS 20b Opus $0.79 Haiku $1.57 $26.01÷3=$8.67/train $8.67 ≒ 1,360円 Sonnet $26.01 21
やってみての感想 • 評価関数の出来で生成される嘘の品質が大きく変わる • いかに欲しい嘘に対して高いスコアを返すかが大事 • APIの使用料金もそれなりに掛かる • Reflection LMは高性能なモデルのほうが性能が出やすい • 回数を重ねるので、費用もそれなりに • 今回の検証でこんなに消費するとは思ってなかった • 試行錯誤が無くなるわけではない • 学習データを用意して終わりというわけにはいかない • 評価関数の試行錯誤はある程度は必要だった 22
まとめ • DSPyを使うと自動でいい感じのプロンプトを組んでくれる • 生成されるようなプロンプトを自分で組むのは大変かも • データと評価関数の準備が大事 • 実アプリケーションで使うデータを用意するのが一番 • トレーニング用の予算はそれなりに必要になる • Claude Opusとか使うと秒で溶ける • 万能な手段ではない • 予算・データ準備の工数を確保できない場合や、モデル固定前提ならわざわ ざ採用する必要はないかも • そんな状況でAIエージェントを運用したいかと言われると、まぁ、その 23