「AIエージェントキャッチアップ #46 - DSPy v3」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #46 - DSPy v3」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

www.youtube.com

DSPy v3

今回は、先日v3がリリースされた、プロンプト最適化の「DSPy」をキャッチアップしました。

DSPyのGitHubリポジトリはこちらです。

github.com

公式ドキュメントはこちらです。

dspy.ai

今回のポイント

DSPy v3とは

DSPyはDeclarative Self-improving Python(宣言的自己改善型Python)の略であり、言語モデルをプロンプティングではなくプログラミングするためのフレームワークだとされています。

プロンプトの最適化(自動チューニング)において、最も有名なフレームワークだと言えます。

DSPyは2025年8月にv3がリリースされ、活発に開発されています。

DSPyの主要な概念

DSPyの主要な概念として、以下の4つを紹介します。

  • Module
  • Signature
  • Metric
  • Optimizer

Module

DSPyを使用する際は、プロンプト最適化の機能を使用する前提として、LLMアプリケーションをDSPyのしくみで実装することになります。

DSPyでは、言語モデルを使用するプログラムの構成要素を「Module」と呼びます。

DSPyでは、以下のような組み込みモジュールが提供されています。

  • dspy.Predict
  • dspy.ChainOfThought
  • dspy.ReAct

Signature

DSPyの各モジュールを使用する際は、その入出力をSignatureとして定義することになります。

RAGの例であれば、以下のようにしてcontextquestionを入力、responseを出力として定義することになります。

rag = dspy.ChainOfThought("context, question -> response")

Signatureは以下のようにクラスを使って定義することもできます。

class RAG(dspy.Signature):
    context = dspy.InputField()
    question = dspy.InputField()
    response = dspy.OutputField()

DSPyのドキュメント (https://dspy.ai/) には、以下のように書かれています。

Standard prompts conflate interface ("what should the LM do?") with implementation ("how do we tell it to do that?"). DSPy isolates the former as signatures so we can infer the latter or learn it from data — in the context of a bigger program.

日本語にすると、以下のようになります。

標準的なプロンプトは、インターフェース(「言語モデルは何をすべきか?」)と実装(「それをどのように指示するか?」)を混同しています。DSPyは前者をシグネチャとして分離することで、より大きなプログラムの文脈において、後者を推論したりデータから学習したりできるようにしています。

プロンプトを記述するうえで、「何をすべきか」と「それをどう指示するか」を分離することで、自動的な最適化が可能になるという考え方です。

Metric

DSPyでは、自動的な最適化を実施するため、人手を介さない指標 (Metric) を用意する必要があります。

dspy.evaluate.metrics.answer_exact_matchなどの組み込みのMetricに加えて、自身でMetricを実装することも可能です。

Optimizer

DSPyプログラムのパラメータを調整するアルゴリズムが「Optimizer」です。

Optimizerには、以下の3つを与えて実行します。

  • DSPyプログラム (単一または複数のModule)
  • Metric
  • トレーニングデータ

Few-shotの最適化用、instructionの最適化用など、さまざまなOptimizerが提供されています。

実際にOptimizerを動かした様子

実際にOptimizerを実行した様子は以下のようになります。

最適化の前後で、プロンプトが変化していることを確認しました。

次回のご案内

以上、今回は「DSPy v3」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #47 - Deep Agents (LangChain)」ということで、よく使われているAIエージェントの構成を汎用化した、LangChainの「Deep Agents」がテーマです!

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!