2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【DSPy】「使えば使うほど賢くなるAI」に憧れて、試しに「推しの布教」に適用してみた(前編)

Last updated at Posted at 2025-12-04

はじめに:本記事の立ち位置

本テーマについては前編・後編の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の記事でも紹介されていた以下の手法を比較検証します。

  1. BootstrapFewShot
    • 「良い布教文の正解データ」を渡すと、その中から「どの例を見せればAIが賢くなるか」を自動選別して、プロンプトのFew-Shot(例示)部分を最適化してくれます。
  2. MIPROv2
    • データに基づいて、指示(Instruction)の候補を複数生成し、どのFew-Shotと組み合わせると良いかを探索してくれます。
    • 例えば、「友達にLINEを送るように書いて」とか「最初はあえて欠点を伝えて惹きつけよう」といった、人間が思いつかないような「刺さる指示」をAIが勝手に編み出してくれる可能性があります

Step 4: Metrics(評価基準)

何をもって「布教成功」とするか?
ここも LLM-as-a-Judge(AIによる判定)を採用します。別のAIに審査員になってもらい、生成された文章が「本当に見たくなる文章か?」を判定させます。

後編の予告

次回は実践編です。

  • 実際にどのようなコードで試したのか
  • 最適化手法ごとに違いはあったのか
  • 最適化前と後でプロンプトと生成結果はどのように変わったのか

あたりを中心にまとめていきます!!!


ここまで読んでくださってありがとうございました!!!!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?