✍️

プロンプトの試行錯誤をラクにしたい!プロンプトのマネージメントツールの調査✏️

2024/06/28に公開

プロンプトエンジニアリングライフ、楽しんでますか?
LLMを使ったアプリケーションを作成するとき、欲しい出力を得るのにプロンプトの試行錯誤ある程度すると思いますが、「変える前の方がいいな」とか「AとBのプロンプトはどっちがいいんだろ」とか色々やってると、プロジェクトのコードが散乱してきて、整理に苦労する場面がしばしばあると思います。

今回はこういったプロンプトのトライアンドエラーを少しでも便利にしたり、試行錯誤の管理を重点に使えそうなアプリケーションを調査してみました。

調査したアプリケーション

まずは気軽に試してみたい。ということで課金オンリーのサービスではなく、セルフホスティング可能なアプリケーションを中心に調べてみました。

LangFuse(⭐GitHubスター:4.4k)

この手のセルフホスティング可能なアプリケーションとしては一番利用されている印象で、GitHubスターも4.2Kと多いです。

プロンプト管理に関しては、コード上で定義したプロンプトをアプリケーションのDBにアップロードする機能があります。

from langfuse import Langfuse
langfuse = Langfuse()
langfuse.create_prompt(
    name="asking-capital",
    type="chat",
    prompt=[
        {"role": "system", "content": "あなたは地理の専門家です"},
        {"role": "user", "content": "{{country}}の首都を教えてください。"}
    ],
    config={
        "model":"gpt-3.5-turbo-1106",
        "temperature": 0.7,
    },
    labels=["production"],
    tags=["test_tag"],
)

そして、アップロードしたプロンプトは自動でバージョニングされ、GUI上で履歴を簡単に追うことができます。


GUI上でプロンプトやバージョンの確認ができる

これを別の環境でコードからダウンロードすることもできます。

from langchain_core.prompts import ChatPromptTemplate
langfuse_prompt = langfuse.get_prompt("asking-capital")

特にlangchainとのインテグレーションがスムーズで、ダウンロードしたものをlangchainのChatTemplateに変換してそのまま利用可能になっています。

# get_langchain_promptでlangchainのChatPromptTemplateへ流し込める
langchain_prompt = ChatPromptTemplate.from_template(langfuse_prompt.get_langchain_prompt())

変数を含めたプロンプト定義も可能になっているので

試行錯誤 → アップロードして管理 → プロダクション環境でダウンロード → そのままlangchain等でプロンプトを利用

というサイクルを踏めそうなのが便利そうです。
プロンプトごとにトレースも見れるみたいなので、モニタリングもバッチリな印象でした。

惜しいポイントとして、GUIでプロンプト試せるPlaygroundの利用は課金グレードのみでした。
今のリリースされているプロンプトを画面でサクッと試す、みたいなことができればもっと便利になりそうです。

Agenta(⭐GitHubスター:968)

まだまだ開発途中という印象がありますが、プロンプトの試行錯誤にはとても便利そうなアプリケーションです。

特にSplitViewでプロンプト並べながら同時にRunができる画面が便利でした。
こういった画面はOpenAIのPlaygroundでも用意されていますが、Agentaは他のLLMプロバイダーにも対応しているので同じ画面で試せるのは便利そうです。


SplitViewでプロンプト並べる

変数の埋め込みにも対応しているのでテストのデータを用意して複数を同時一気に流すということも可能です。


SplitViewでテストを同時実行しながら出力を比較

二つのプロンプトのA/Bテストにも対応しています。
要約のようなテストケースを事前に決めにくいようなタスクにはあったら嬉しい機能です。


A/Bテスト

残念ながら、プロンプトのバージョニングは課金グレードのみで、常に最新版しか保持できないようです。
トレーシングなどのモニタリング機能はまだベータ版のようですが、こういったプロンプト周りのマネジメントだけを行い人には便利なサービスかと思いました。

promptfoo(⭐GitHubスター:3.4k)

いくつか日本語記事も見当たるのと、GitHubスターも多いです。

リポジトリには以下のように謳われており、トライアンドエラーのではなくテスト駆動でプロンプトを作成することを目指としているアプリケーションになってます。

The goal: test-driven LLM development instead of trial-and-error.

そのため、PlaygroundはなくCLIでテストのカバレッジを見ながら開発を進める流れになります。

プロンプトやテストを定義は専用のyamlを使います。

サンプルのyaml
# Learn more about building a configuration: https://promptfoo.dev/docs/configuration/guide
description: "My eval"

prompts:
  - "Write a tweet about {{topic}}"
  - "Write a concise, funny tweet about {{topic}}"
  

providers:
  - "openai:gpt-3.5-turbo"
  - "openai:gpt-4o"
  

tests:
  - vars:
      topic: bananas

  - vars:
      topic: avocado toast
    assert:
      # For more information on assertions, see https://promptfoo.dev/docs/configuration/expected-outputs

      # Make sure output contains the word "avocado"
      - type: icontains
        value: avocado

      # Prefer shorter outputs
      - type: javascript
        value: 1 / (output.length + 1)

  - vars:
      topic: new york city
    assert:
      # For more information on model-graded evals, see https://promptfoo.dev/docs/configuration/expected-outputs/model-graded
      - type: llm-rubric
        value: ensure that the output is funny

コマンドラインからtestをします。


テスト実行次のCLI画面

ブラウザのビューワーも用意されており、テスト結果を他の人と共有することも可能なようです。


ブラウザのビューワーでカバレッジを確認できる

独自のConfigの定義方法を覚えたり、テストを用意する必要があるので、チームに導入したり、サクッと試したいという場面ではちょっと事前の準備が重い印象です。
一方ですでにプロダクションに乗っているプロンプトを改善するようなフェーズだと便利そうです。

まとめ

他にもいろいろ調べましたが、有象無象で選択肢が多く、さらにLLMのエコシステム周りの発展が早いので、使ってみたけどすぐに他の良さそうなサービスが出てきた、とかのコストを考えると選ぶもの一苦労です。

個人的には試行錯誤後に、結局評価で困る場面が多いので、初手からpromptfooのようなテスト駆動で進めた方が良さそうだなと最近は感じています。

こういった便利ツールを駆使して少しでも虚無になりがちなプロンプトエンジニアリングライフをエンジョイできたらと思います!

Nishika Tech Blog

Discussion