Langfuseで始めるLLM運用の可視化 ─ コスト・プロンプト・評価を一元管理する

最近は案件の中で LLM をプロダクトに組み込むことが増えてきました。
その中で毎回必ずぶつかる壁として、LLM を使った処理のコストの把握(原価の把握)、プロンプトのバージョニング、LLM からの出力のスコアリングがあります。
機能を継続的かつ安定して届けていくためにこのあたりはクリアしていく必要があります。
今回はその課題を解決してくれるオープンソースの Langfuse を触ってみたので、概要と使いどころをまとめておこうと思います。
Langfuseとは
Langfuse はオープンソースの LLM エンジニアリングプラットフォームで、トレース(入出力ログ/メトリクス)、プロンプト管理、評価(スコアリング・テスト)、データセット管理などを一体的にサポートします。
Langfuse の主な機能とできること
以下は、Langfuse がプロダクト開発の現場で強みを発揮する主要な機能群です。
機能 | 主な役割 | できること・特徴 |
---|---|---|
トレース / ロギング / メトリクス | LLM 呼び出しの入出力・コスト可視化 | 入力/出力テキスト・トークン数・レイテンシ・エラーなどを自動で記録し、だれが/どの処理で呼んだかを追えるようにする |
プロンプト管理 & バージョニング | プロンプト設計のライフサイクル管理 | プロンプトを中心にバージョン管理、スロット埋め込み、フォルダ整理、フェールバック処理などが可能 (langfuse.com) |
評価 / スコアリング / データセット (Evals & Datasets) | 出力の品質チェック・回帰防止 | 期待出力との比較、評価基準によるスコア割り振り、実運用トレースをテストケース化など (langfuse.com) |
セッション / ユーザー追跡 / 環境 / メタデータ | 文脈・コンテキストを意識した追跡 | 複数のトレースをセッションでまとめたり、環境(開発/本番)区分、タグ/メタデータ付与が可能 (langfuse.com) |
自己ホスティング & オープンソース性 | 社内運用 / データ主権 | MIT ライセンスで公開。Docker / Kubernetes / 単一 VM での構成などで自己ホスト可能 (langfuse.com) |
トレース / ロギング / メトリクス
LLM を呼び出すたびに、「入力プロンプトの内容」「何トークン使ったか」「出力内容」「実行時間」「例外情報」などを記録する仕組みが Langfuse のコアです。これにより、1 回の呼び出しあたりどれだけコストがかかったかを把握できます(トークン数 → コスト換算を後付けでやることが多い)

LLM Observability & Application Tracing (open source) - Langfuse
また、どのユーザーが呼び出したか、どのセッション・コンテキスト下で呼ばれたか、という属性情報も紐づけられるため、「誰が」「どのユースケースで」課題が起きたかを追えます。
トレース情報は UI 上で一覧でき、フィルタリング、検索、統計グラフ化も可能です。これにより、LLM 呼び出しのパフォーマンス傾向や異常箇所を可視化できます。
TypeScript/JavaScript の場合、Langfuse SDK を通じてラップして呼び出すことで、自動でトレースを送信できます。
プロンプト管理 & バージョニング
プロンプトは本質的にテキストです。コードにベタ書きするのもありですが、プロンプトの進化や改修が発生すると管理が煩雑になります。Langfuse はこの部分を「プロンプト管理システム (Prompt Management)」として扱っており、いくつかの機能を提供します。

Open Source Prompt Management - Langfuse
- プロンプトの登録・取得
プロンプトに一意な “slug”(識別子)を割り振って保存でき、アプリコードから
getPrompt("slug")
のように取得できる。SDK 側でキャッシュも行われ、レイテンシを抑える設計。 - バージョン管理
プロンプトのバージョン履歴を持てるため、過去のものに戻せたり、差分を追えたりする仕組み。
このように、プロンプトをアプリ本体から分離し、バージョン管理・組織化・安全性を提供することで、改修/実験/ロールバックがやりやすくなります。
評価 / スコアリング / データセット (Evals & Datasets)
LLM の出力品質を自動でチェックしたり、回帰を防止したりするための仕組みも Langfuse は持っています。
Evaluation of LLM Applications - Langfuse
- Datasets
入力と期待出力をペアにしたテストデータセットを定義でき、プロダクションから得たトレースをそのままテストケースにできる。UI/SDK どちらからも操作可能。 (langfuse.com)
- Dataset Items
個別の入力・期待出力(+任意のメタデータ)を dataset に追加できる。CSV インポートや UI からも可能。
- Experiment / ラン
定義済み dataset に対して、現行モデルや新モデルでテストを実行し、スコアを比較できる。つまり、モデル改版前後で性能劣化が出ていないかをチェックする仕組みに使える。
- 評価 (Evals / スコアリング)
出力に対して自動スコアリング(正しさ、類似度、カスタム評価基準)を行える。これにより、手動で評価ロジックを用意する手間を省略可能。
この機能を使うと、「モデル改修後に出力品質が落ちていないか?」といった回帰チェックを自動化できます。
自己ホスティングとオープンソース性
Self-host Langfuse (Open Source LLM Observability) - Langfuse
Langfuse は MIT ライセンスで提供されており、完全にオープンソース化されています。2025 年 6 月には全機能が OSS(無料)化された旨のアナウンスも出ています。
自己ホスティングに関しては、Docker Compose、Kubernetes、単一 VM、Terraform を使ったクラウド構成など複数の導入パターンが公式ドキュメントでサポートされています。環境変数による構成設定も豊富です。
自社インフラ下で運用することで、ログデータやプロンプト資産を自社管理でき、セキュリティ/ガバナンスを確保しやすくなります。
TypeScript(JavaScript)で始める Langfuse の導入例
プロンプトをLangfuseで管理するように
ここは比較的導入ハードルは低い部分だと思います。
Langfuseアプリからプロンプト作成もしくはコードからまずはプロンプトを作成します。
例えば、テキストプロンプトで作成した場合には下記のように取得が可能です。基本的にプロンプトは関数などに切り出されているケースが多いと思うので、下記の処理に置き換えればLangfuse管理ができるかと思います。
// 現在の`production`バージョンを取得する
const prompt = await langfuse.prompt.get("movie-critic");
// プロンプトテンプレートに変数を挿入する
const compiledPrompt = prompt.compile({
criticlevel: "expert",
movie: "Dune 2",
});
// -> "As an expert movie critic, do you like Dune 2?"`
Get Started with Open Source Prompt Management - Langfuse
LLMのログを取得しLangfuseで確認する
ここからが Langfuse の本領発揮ともいえる部分です。
Langfuse では LLM 呼び出しのすべての処理を観測可能な形で記録でき、トークン数・コスト(=金額)・処理時間(レイテンシ) を含む詳細なメトリクスを自動で可視化できます。これを支えているのが、Langfuse が採用している trace と observation という2つの概念です。
trace(トレース) は、ひとまとまりの処理(例:ユーザーの質問に応答する一連の LLM 呼び出し)を表し、その中に複数の observation(オブザベーション) が紐づきます。observation は、たとえば「OpenAI への API 呼び出し」「Embedding の生成」「モデル応答の後処理」など、個々の処理単位を指します。Langfuse はこれらを階層的に記録することで、1トレース内での処理フローを可視化し、どの処理に時間やコストがかかっているのかを明確にしてくれます。
Langfuse の TypeScript SDK では、ログ(トレース)を記録する方法として 2つのアプローチ が用意されています。
それが Native Instrumentation と Custom Instrumentation です。
Native Instrumentation
Langfuse が提供する専用のクライアントを使う方法で、OpenAI や Anthropic などの LLM SDK を Langfuse 経由で呼び出すだけで自動的にログが記録されます。トークン数、処理時間、エラー、レスポンス内容などが自動で Langfuse に送られ、UI 上で確認できます。
import { LangfuseOpenAI } from "langfuse";
const openai = new LangfuseOpenAI({
apiKey: process.env.OPENAI_API_KEY,
langfuseApiKey: process.env.LANGFUSE_API_KEY,
});
const completion = await openai.chat.completions.create({
model: "gpt-4",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Explain Langfuse in one sentence." },
],
});
このようにラッパー経由で呼ぶだけで、処理の 開始〜終了時間、トークン使用量、コスト が自動的にトレースとして記録されます。
Custom Instrumentation
一方で、自前の処理や独自のモデル呼び出しを観測したい場合は Custom Instrumentation を使います。これは開発者が明示的にどの処理を記録するかを指定する方法で、さらに trace/span/generation の3種類の粒度で制御できます。
import { Langfuse } from "langfuse";
const langfuse = new Langfuse({ apiKey: process.env.LANGFUSE_API_KEY });
const trace = langfuse.trace({ name: "user-query" });
const generation = trace.generation({
name: "openai-completion",
input: { prompt: "Tell me a joke about AI." },
});
const output = await openai.chat.completions.create({
model: "gpt-4",
messages: [{ role: "user", content: "Tell me a joke about AI." }],
});
generation.end({
output: output.choices[0].message.content,
usage: output.usage,
});
trace.end();
Custom Instrumentation では、trace
が全体の処理単位、generation
がその中の LLM 呼び出し単位になります。Langfuse はこれらの開始・終了時刻を自動で記録し、処理時間(latency) を計測します。また、usage
情報から トークン数 を集計し、登録済みのモデル単価を使って金額換算も行います。
このように Langfuse を組み込むことで、どのリクエストにどれだけコストがかかっているのか、どの部分で遅延が発生しているのかをリアルタイムで把握できるようになります。プロダクトに LLM を安定的に組み込む上では、この可観測性が非常に重要な鍵になります。
まとめ
Langfuse は、LLM をプロダクトに組み込む上で避けて通れない “見えない部分” を見える化してくれる強力なツールです。ログの収集やトークン数の可視化、プロンプトのバージョン管理、出力品質のスコアリングといった要素を一つのプラットフォームで統合的に扱えるため、開発・検証・運用のサイクルを継続的に回すことができます。
特に TypeScript との相性も良く、既存の OpenAI クライアントを Langfuse 経由に置き換えるだけで、コストやレイテンシを自動で計測できるのは大きな利点です。また、Custom Instrumentation を活用すれば、自前のモデル処理や複雑なワークフローまで含めて柔軟に観測できます。
LLM の導入は、動かすだけなら簡単でも、安定して運用し続けるためには「観測」と「管理」の仕組みが欠かせないです。Langfuse はその両輪をしっかり支えてくれるOSS。
今後 LLM を本番環境に組み込む際には、まず最初に導入を検討すべき基盤のひとつかもしれないです。
Anycloudでは一緒に働くメンバーを募集しています!
Anycloudは、ユーザーの心を動かす体験を届けることを大切にしています。フルリモート・フルフレックスの環境のもと、ライフスタイルに合わせた働き方を実現しながら挑戦したい方を歓迎します。詳細はこちらをご覧ください。