はじめに:本記事の立ち位置
本テーマについては前編・後編の2本構成でお届けします。本記事では、執筆の動機、DSPyという技術の概要、そして後編で扱う題材について解説します。
実際にDSpyを使って試した内容や具体的な結果は、12月19日公開予定の後編にまとめています。
(正直に言うと、アドカレの締め切りに間に合いませんでした…😇)
なお、本記事は DSPy を専門的に深掘りする技術解説ではありません。
この領域に馴染みの薄い人が「まず軽く触ってみた」ときの視点を中心に書いており、ライトに概要を知りたい読者向けの内容です。
1. 動機:
きっかけは、LayerXさんのこちらのテックブログを読んだことでした。
AI Agent時代における「使えば使うほど賢くなるAI機能」の開発
https://tech.layerx.co.jp/entry/2025/10/23/222742
使えば使うほど賢くなるAI、めっちゃええやん!となりました。
プロダクトに生成AIを組み込む際、プロンプトの改善は個人の勘や経験に依存しがちで、ユーザーからのフィードバックを踏まえて微調整していくのも中々しんどいです。
もし、この改善プロセスを“正解データを与えるだけで”自動化できるなら、負担は大きく下がり、品質向上のサイクルも回しやすくなります。
記事で紹介されていた DSPy というフレームワークは、まさにこの課題にアプローチできる可能性を持っていました。
それを知った瞬間、「まずは実際に触って確かめてみよう」と思い立った、というのが今回の動機です。
2. DSPyとは?:
DSPy (Declarative Self-improving Python) は、スタンフォード大学発のフレームワークです。
ざっくり言うと、「プロンプト(文字列)を書くのではなく、入出力の論理(プログラム)を書く」ためのツールです。
- これまで:人間が「あなたは優秀なライターです…」と試行錯誤してプロンプトを書く。
- DSPy:人間は「入力はA、出力はB」と定義し、プロンプトの中身はAIが勝手に実験して最適化する。
概念の理解には、以下の記事が非常に参考になりました。
3. なぜ「推しの布教」なのか?
今回は実験テーマとして「推しの布教」を題材に選びました。
LayerXの記事では 経費精算の承認 を題材に、「各社ごとのルールに合わせてAIが判断できるよう最適化する」ことがテーマでした。
これを自分の身近なテーマに置き換えると、次のようになります。
- LayerX の例:企業ごとの細かなルール(=暗黙知)を、承認AIに最適化させる
- 私の例:特定の友人に対しての嗜好や刺さりどころ(=暗黙知)を、布教文に最適化させる
DSPyで行えることを抽象化すると、 まだ言語化されていない暗黙知を、few-shot例やプロンプトとして“表現”し、その表現を最適化することで、タスクに最適化されたアウトプットを得ること です。
「キャラ描写を強めた方が刺さる」「設定考察を前面に出した方が効果的」──こうした“言語化していないけれど確かに存在する判断基準”を、正解データ(どんな布教文を渡したら刺さったか)から学習させる。
今回の実験では、この暗黙知の部分をDSPyに任せ、どこまで布教文構築プロンプトをパーソナライズできるのかを試してみる、という位置づけです。
4. 実装計画
それでは、DSPyを使ってどう実装するか、計画をコードに落としていきます。
Step 1: Signature(やりたいことの定義)
プロンプトのような長文指示は書きません。Pythonのクラスで「型」を定義するだけです。
import dspy
class GeneratePitch(dspy.Signature):
"""
推しコンテンツの情報と理由を受け取り、
他者が「見たい!」と思うような熱量のある布教文を生成する
"""
# 入力:素材
content: str = dspy.InputField(desc="作品名と概要")
reason: str = dspy.InputField(desc="おすすめする理由")
# 出力:生成したいもの
pitch: str = dspy.OutputField(desc="相手を沼に落とすための布教文")
Step 2: Module(思考プロセスの導入)
単に答えを出させるのではなく、ChainOfThought(思考の連鎖) を使います。
これで、「いきなり書く」のではなく「どう伝えれば刺さるか構成を練ってから書く」ようになります。
# これだけで「Reasoning(思考)」のステップが勝手に追加される
generate_pitch = dspy.ChainOfThought(GeneratePitch)
# 実行イメージ
# pred = generate_pitch(content="...", reason="...")
# print(pred.reasoning) # -> 「まずは相手の共感を得るために…」
# print(pred.pitch) # -> 実際の布教文
Step 3: Optimizer(最適化手法)
ここが実験の本丸です。LayerXの記事でも紹介されていた以下の手法を比較検証します。
-
BootstrapFewShot
- 「良い布教文の正解データ」を渡すと、その中から「どの例を見せればAIが賢くなるか」を自動選別して、プロンプトのFew-Shot(例示)部分を最適化してくれます。
-
MIPROv2
- データに基づいて、指示(Instruction)の候補を複数生成し、どのFew-Shotと組み合わせると良いかを探索してくれます。
- 例えば、「友達にLINEを送るように書いて」とか「最初はあえて欠点を伝えて惹きつけよう」といった、人間が思いつかないような「刺さる指示」をAIが勝手に編み出してくれる可能性があります
Step 4: Metrics(評価基準)
何をもって「布教成功」とするか?
ここも LLM-as-a-Judge(AIによる判定)を採用します。別のAIに審査員になってもらい、生成された文章が「本当に見たくなる文章か?」を判定させます。
後編の予告
次回は実践編です。
- 実際にどのようなコードで試したのか
- 最適化手法ごとに違いはあったのか
- 最適化前と後でプロンプトと生成結果はどのように変わったのか
あたりを中心にまとめていきます!!!
ここまで読んでくださってありがとうございました!!!!