LLMの検証を加速するトレースツール:Langfuseのご紹介
はじめに
株式会社Rehab for JAPAN でMLOpsエンジニアをしている松本です。
LLMアプリケーションの開発と運用において、パフォーマンスの監視と分析は重要な課題です。
今回は、LLM監視プラットフォーム「Langfuse」に焦点を当て、その機能と魅力をご紹介します。
特に、他のフレームワーク・ツールと容易に連携できる点が強みだと思っており、その一例として、ノーコード開発ツール「Langflow」との連携方法も併せてご紹介します。
ターゲット
- LLMアプリケーションの監視・分析基盤を構築したい方
- 既存のLLMツールチェーンにモニタリング機能を追加したい方
- LLMOpsの効率化を検討している方
- Langfuseの活用方法と連携例を知りたい方
Langfuseとは?
Langfuseは、LLMアプリケーションの挙動を可視化するオープンソースプラットフォームです。プロンプトやレスポンス、コストなどを一元管理し、検証や運用効率化を支援します。活発にアップデートされているのも魅力で、ここ数ヶ月で使いやすさが格段に向上してきた印象です。同じオープンソースであるMLflowと比べても高機能で柔軟性も高いです。
Langfuseのダッシュボード
トレース一覧
Langfuseの基本的な使い方
Langfuseの利用方法には、公式が提供する有料のマネージドサービスと、自前でサーバを構築するセルフホスティングの2種類があります。
本記事では、後者のセルフホスティングする場合のセットアップ手順をご紹介します。
Langfuseサーバのセットアップ
最も手軽な方法は、公式のdocker-compose.yml
を利用する方法です。
- 公式リポジトリから
docker-compose.yml
を取得git clone https://github.com/langfuse/langfuse.git cd langfuse
- 必要に応じて環境変数やポート番号を編集
- サービスを起動
docker compose up
- ブラウザで
http://localhost:3000
にアクセスし、初期ユーザーを作成
(最初に作成したユーザーが自動的にオーナー権限を持つユーザーとなります)
トレーシングの基本
Langfuseの主要機能の一つが「トレーシング」です。
トレーシングとは、LLMアプリケーション内で発生する一連の処理フロー(プロンプト生成、API呼び出し、レスポンス取得など)を追跡できるように記録・可視化することを指します。LangfuseのSDK(Python/TypeScriptに対応)を使ってトレース情報の連携処理を埋め込むことで、各プロンプトに対してどのような応答が得られたか、APIのコストがどの程度かかったかなどを、UI上で確認できます。
事前準備:LangfuseのAPIキー作成
LangfuseのUI上でプロジェクトを作成し、「Project Settings」→「API Keys」でAPIキーを作成、public keyとsecret keyをコピーしておきます。
Python SDK インストール
pip install langfuse
Python実装例
以下のように実装するとLangfuseサーバにトレースデータを送信できます。
from langfuse import Langfuse
# どのプロジェクトに対してデータを送信するかをAPIキーで指定します(環境変数でも指定可能)
langfuse = Langfuse(secret_key="sk-...", public_key="pk-...")
# トレースの作成
trace = langfuse.trace(name="my-llm-flow")
# LLMへリクエストを投げる処理
response = my_llm_call(prompt)
# 生成内容の記録
trace.generation(input=prompt, output=response)
"trace"がtop-levelの管理単位となり、1つのユーザーリクエストに対する一連の処理全体を表します。その下に各API呼び出し("generation")を子要素として複数紐付けられるため、処理の流れを階層構造で整理できます。
例えば、複数ステップのLLM処理フローがある場合、以下のようなツリー構造で記録できます:
trace "my-llm-flow"
├── generation "プロンプト生成"
│ ├── input: "ユーザーの質問"
│ └── output: "最適化されたプロンプト"
├── generation "API呼び出し"
│ ├── input: "最適化されたプロンプト"
│ └── output: "AIの回答"
└── generation "後処理"
├── input: "AIの回答"
└── output: "整形された最終回答"
※observeデコレータを使うなど上記以外の実装方法もあるので、詳しくは公式ドキュメントの実装例をご参照ください。
Web UIの機能
記録されたトレースは、LangfuseのWeb UIで時系列やツリー構造で可視化されます。
記録を確認するだけでなく、trace/generationに対して評価スコアやコメントをつけたり、データセットに登録して後で再利用することもできます。
詳細画面
Annotateボタンをクリックすると以下の画面が表示されます。アノテーションの選択肢は数値だけでなく、画像例のようなカテゴリ選択もカスタムで設定できます。
他ツールとの連携
冒頭で触れた通り、Langfuseの最大の強みだと思っているのが、様々なLLMアプリ開発フレームワークやツールと連携できる点です。公式ドキュメントの一覧表を見ても、メジャーなものはほぼ網羅されていることが分かります。LLM関連のツールは山ほどあるので、用途によって使い分けることが想定されますが、ロギングはLangfuseに統一するということもできそうです。
今回は一例として、ノーコード開発ツールLangflowとの連携例をご紹介します。
Langflowとは?
Langflowは、LangChainベースのLLMアプリケーションをノーコードで開発できるビジュアルツールです。直感的なインターフェースを使用してプロンプトエンジニアリングやLLMパイプラインの構築が可能で、非エンジニアにも実験環境として使って頂けるのが魅力です。
Langflow → Langfuse連携方法
環境変数を3つ設定してLangflowを立ち上げるだけで、Langflowで実行された処理が自動的にLangfuseに連携されるようになります。SDKを使ったコード実装は一切不要です。(この手軽さには感動しました!)
-
Langflowのサービスに環境変数を設定
docker-compose.yml内、Langflowサービスのenvironmentに以下のように追加します。environment: - LANGFUSE_SECRET_KEY=sk-lf-xxxxx - LANGFUSE_PUBLIC_KEY=pk-lf-xxxxx - LANGFUSE_HOST="http://langfuse-server:3000"
※LANGFUSE_(SECRET/PUBLIC)_KEYはLangfuseのUI上で発行したプロジェクトのAPIキー
※"langfuse-server"の部分はlangfuse-webサービスにつけたコンテナ名
※Langflow用docker-compose.ymlの例は公式レポジトリ参照 -
コンテナ起動
docker compose up
-
起動後の接続確認
docker exec langflow python -c "import requests, os; addr = os.environ.get('LANGFUSE_HOST'); print(addr); res = requests.get(addr, timeout=5); print(res.status_code)"
以下のように出力されればOK
http://langfuse-server:3000 200
主な活用例・連携するメリット
- トークン数やAPIコストを確認できる
- good/bad等の評価スコアやコメントを付けられる
- デバッグに活用できる
- トレースをデータセットに登録することで、繰り返し検証に使える
連携されるトレースの例
1つのフローで実行される処理がまとめて1つのトレースで管理され、LLMへのリクエスト・レスポンスだけでなく、各コンポーネントの入力・出力や、LangflowのUI上には表示されないメタデータまで含めて詳細に確認できます。
まとめ
今回は以下の内容をご紹介しました。
- Langfuseの使い方
- Langfuseの魅力
- Langflow → Langfuseへの連携方法とその容易さ
参考
バージョン情報
当記事は以下のバージョンで確認した内容になっています。
- Langfuse: v3.51.0
- Langflow: v1.3.2
Discussion