🧠

LangfuseでAgentのプロンプトを管理する

に公開

Langfuseのプロンプト管理がAgent開発において結構便利だったので、記事にしました。

Langfuseとは

Langfuseは、LLMやAIアプリケーションのモニタリングと分析を提供するプラットフォームです。
要するにいい感じにプロンプトを管理したり、LLMのレスポンスを分析したりできるサービスです。

Langfuseの画面

Langfuseのプロンプト管理

Langfuseではプロンプト管理という機能があり、プロンプトのバージョン管理ができます。プロンプト管理では、画像のようにプロンプトの一覧が表示され、各プロンプトのバージョン履歴や使用されたトレースの数など、確認することができます。

プロンプト管理の画面

さらに、各プロンプトですが、ディレクトリのようにまとめることも可能で、マルチエージェントやプロジェクトごとに整理することも可能です。

プロンプトのディレクトリ管理

プロンプトの詳細を見てみると、productionラベルやlatestラベルがわかると思います。

プロンプトの詳細

本番はproductionラベルをつけたバージョンを使い、開発中はlatestラベルをつけたバージョンを使うなど、運用ルールを決めておけばそれぞれの環境に応じたプロンプトを簡単に切り替えることができます。

また、プロンプトは変更の差分を確認することができるので、プロンプトのどこを変更したかもわかります。今回だと、「なり」という単語を追加したことがわかります。
プロンプトの変更

ここで使用したプロンプトは、トレースの際にも確認することができます。

プロンプト確認

プロンプトのバージョンまで確認できるので、どのプロンプトでレスポンスが生成されたのかがわかります。プロンプトを更新したときに実際に反映されているか確認できるため、非常に便利です。

実際に使ってみる

Langfuseのプロンプトは、以下のコードで簡単に使用できます。

from langfuse import Langfuse

prompt_name = "test"
langfuse = Langfuse()

prompt = langfuse.get_prompt(prompt_name)

# 環境によってラベルを切り替え
prompt = langfuse.get_prompt(prompt_name, label="production")
prompt = langfuse.get_prompt(prompt_name, label="latest")

使用するプロンプトがディレクトリ構成の場合は、以下のように記載する必要があります。

prompt_name = "dir1/dir2/test"
prompt = langfuse.get_prompt(prompt_name)

このプロンプト管理機能を使って、ADK(Google Agent Development Kit)で作成したAgentのinstructionsを管理してみました。

from google.adk.agents import Agent
from langfuse import Langfuse

# 実際の運用では環境変数から取得することを推奨します
LANGFUSE_PUBLIC_KEY = "<YOUR_PUBLIC_KEY>"
LANGFUSE_SECRET_KEY = "<YOUR_SECRET_KEY>"
LANGFUSE_HOST = "<YOUR_HOST>"

langfuse = Langfuse(
    public_key=LANGFUSE_PUBLIC_KEY,
    secret_key=LANGFUSE_SECRET_KEY,
    host=LANGFUSE_HOST
)

prompt_name = "test"
prompt = langfuse.get_prompt(prompt_name)

root_agent = Agent(
    name="agent_test",
    model="gemini-2.0-flash",
    instruction=prompt.prompt
)

Langfuseのプロンプトでは、「語尾をナリにしてください。」という指示を追加しました。
適用されているか確認してみましょう。

実行結果

きちんと語尾がナリになっていますね。

このように、Langfuseのプロンプト管理を使うことで、Agentのプロンプトを簡単にバージョン管理できるようになります。

Langfuseのプロンプト管理のメリット

プロンプトをLangfuseで管理すると、以下のようなメリットがあります。

デプロイ不要でプロンプトを更新できる

コードで管理していると、プロンプトを変更するたびに再デプロイが必要になります。Langfuseで管理すれば、デプロイなしでプロンプトを更新できるため、開発効率が大幅に向上します。特に、プロンプトのチューニングを繰り返す際に、この手軽さは非常に便利だと思います。

環境ごとのプロンプト切り替えが簡単

本番環境にはproductionラベル、開発環境にはlatestラベルをつけることで、環境に応じたプロンプトの切り替えが簡単になります。開発時にうまくいったプロンプトにproductionラベルをつけるだけで本番環境に適用されます。

逆に、本番でうまくいかない場合も、ラベルを戻すだけで即座にロールバックできるため、運用リスクを最小限に抑えられます。

チーム全体でプロンプトを改善できる

Langfuseの画面からプロンプトを編集できるため、非エンジニアのメンバーもプロンプトのチューニングに参加できます。これにより、ドメイン知識を持つメンバーが直接プロンプトを改善できるようになり、チーム全体での開発スピードが向上します。

簡単にA/Bテストができる

ドキュメントに記載されていますが、Langfuseを使用すると簡単にA/Bテストを実施できます。異なるプロンプトのラベルを作成し、下記のようなコードで指定するだけで、A/Bテストが可能です。

# Fetch prompt versions
prompt_a = langfuse.get_prompt("my-prompt-name", label="prod-a")
prompt_b = langfuse.get_prompt("my-prompt-name", label="prod-b")
 
# Randomly select version
selected_prompt = random.choice([prompt_a, prompt_b])

実際はrandom.choiceを使用しているだけなので、weights=[70, 30]のように重み付けなども自由に実装可能です。自分の好きなようにチューニングしてみてください。

まとめ

Langfuseでプロンプトを管理することで、非エンジニアでもAgentの検証がしやすくなりました。
差分も確認できるので、プロンプト変更の履歴もわかりやすく、個人的におすすめです。

Discussion