勉強会「【LangChainゆる勉強会#15】LangChainによるプロンプト最適化 「Promptim」」を開催しました #StudyCo

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

運営している勉強会コミュニティStudyCoで「【LangChainゆる勉強会#15】LangChainによるプロンプト最適化 「Promptim」」というイベントを開催しました。

studyco.connpass.com

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

youtube.com

今回はLangChainの公式ブログで紹介されたプロンプト最適化ツール「Promptim」を動かしてみました。

PromptimについてのLangChain公式ブログはこちらです。

blog.langchain.dev

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

github.com

今回のポイント

Promptimの概要

Promptimの概要は、上記の公式ブログやGitHubのREADMEに書かれています。

簡単に言えばLangSmithを使ったプロンプト最適化のツールで、LangSmith上のDatasetに対する評価を繰り返し、そのスコアが向上するようにLLMでプロンプトを書き換えていく、というものです。

「LLMを使って自動でプロンプトをチューニングする」ということを考えたときの想像通りの手法を実施しているように思います。

プロンプト最適化で有名なDSpyがある程度幅広い機能を提供するのに対して、Promptimは現状よりシンプルにプロンプトの最適化だけに注目しているとのことです。

使い方の概要

Promptimの使い方はREADME.mdのQuick startに書かれています。

まずは以下のコマンドでPromptimのタスクを初期化します。

promptim create task ./my-tweet-task \
    --name my-tweet-task \
    --prompt langchain-ai/tweet-generator-example-with-nothing:starter \
    --dataset https://smith.langchain.com/public/6ed521df-c0d8-42b7-a0db-48dd73a0c680/d \
    --description "Write informative tweets on any subject." \
    -y

すると以下のようなJSONファイル(config.json)が生成されるので、ここに使用するデータセットや初期プロンプト、Evaluatorの参照などを記述します。

{
  "name": "my-tweet-task",
  "dataset": "tweet-optim",
  "description": "Write informative tweets on any subject.",
  "evaluators": "./task.py:evaluators",
    :

同時に生成されるtask.pyファイルは、Evaluatorを記述するテンプレートとなっています。 以下のようにEvaluatorを実装して、プロンプトに対する評価を定義することになります。

def example_evaluator(run: Run, example: Example) -> dict:
    :

evaluators = [example_evaluator]

このEvaluatorの実装は、LangSmithのCustom Evaluatorのようなので、詳細は以下の公式ドキュメントを見るとよさそうです。

docs.smith.langchain.com

また、おそらくLangSmithが提供する既製のEvaluatorも使うことができそうです。

docs.smith.langchain.com

メタプロンプト

Promptimでは、より良いプロンプトの生成のため、「メタプロンプト」というプロンプトを生成するプロンプトが使われます。

デフォルトのメタプロンプトは、src/promptim/trainer.pyファイルを参照すると見つかります。

https://github.com/hinthornw/promptimizer/blob/7da731c53a5ab2fbd4c3f6209f0402fd5d57024a/src/promptim/trainer.py#L51

これは、

  • 現在のプロンプト
  • 過去に試したプロンプト
  • 評価結果
  • タスクの説明

をもとに、分析と改善されたプロンプトを出力する、という内容です。 (分析を出力するのはZero-shot CoTのような役割と思われます)

LangSmithのトレースを見ると、具体的にどのようにメタプロンプトが動いているのか確認できます。

対応しているモデル

Promptimで使われるモデルは、config.jsonで以下のように設定するようです。

  "optimizer": {
    "model": {
      "model": "claude-3-5-sonnet-20241022",
      "max_tokens_to_sample": 8192
    }
  },

Promptimのソースコード(src/promptim/trainer.py)を参照すると、init_chat_modelというLangChainの各種チャットモデルを初期化する関数が使われていたので、この関数に対応しているモデルであればおそらくなんでも使えそうです。

python.langchain.com

おわりに

以上、プロンプト最適化の「Promptim」をさわってみました。

実際にPromptimでのプロンプト最適化がどこまで有効かはさらに本格的に検証しないと分かりませんが、個人的には他のプロンプト最適化ツールよりも動作を想像しやすくとっつきやすく感じました。

公式ブログにはPromptimをLangSmithのUIに統合する可能性も書かれており、今後にも期待です。

LangChain / LangGraph、その他のテーマで引き続き勉強会を開催していきます。 もしも「こんな話が聞きたい」というテーマがあれば、ぜひお声がけください!