Zenn
🐕

langfuseを触ってみた

2025/03/31に公開
1

はじめに

こんにちは、クラウドエース第三開発部の橋野です。

今回は大規模言語モデル(以下、LLM)を活用したアプリケーションを分析・評価できるツールである Langfuse を触ってみたので試したことを記事にまとめてみました。

Langfuse の始め方

Langfuse を利用する際は、ホスティング方法として以下の2種類が用意されています。

  • セルフホスティング
  • Langfuse アカウントを利用したホスティング

本記事では、Langfuse アカウントによるホスティング方法を推奨します。Free プランの場合、Langfuse アカウントでしか使用できない機能が一部存在するためです。

Langfuse アカウントを作成してプロジェクトを作成する

Langfuse アカウントを作成して使用する方法についてご説明します。

下記手順に沿って作成を行います。

1. Langfuse アカウントの作成
2. 組織の作成
3. プロジェクトの作成
4. API キーの作成

1. Langfuse アカウントの作成

まずはこちらのリンクからアカウント作成を行います。

https://cloud.langfuse.com/auth/sign-in

login.png

Google アカウントや GitHub アカウント等、任意の方法でアカウントを作成することができます。

ログインするとこのような画面が表示されます。

2. 組織の作成

この画面から、まずは組織を作成します。
「+ New Organization」をクリックしてください。

organization.png

組織名を入力し、「Create」をクリックします。

neworg.png

続いて、組織に追加するメンバーを招待します。今回は自分自身を追加しています。

invite.png

3. プロジェクトの作成

組織の作成が完了したので、次はプロジェクトを作成します。
任意の名前を入力し、「Create」をクリックします。

newproject.png

4. API キーの作成

完了するとこのようなプロジェクト設定画面が表示されます。
サイドバーの「API Keys」を選択します。

projectsetting.png

APIキーの作成画面が表示されるので、「Create new API keys」を選択します。

apikeys.png

モーダルが表示されるので、下記の必要なキーを控えておきます。

  • Secret Key
  • Public Key
  • Host

apimodal.png

これでAPIキーの作成は完了です。
なお、組織を作成したと同時にAPIキーも作成されている場合があります。
その場合、そちらのキーを使用しても問題ありません。

これで Langfuse 周りの設定は完了です。
続いて、 Python 環境を構築します。筆者の場合は uv を用いて Python の開発環境を構築しました。

Langchain を用いて開発を行う為、APIキー作成時に表示されたこちらのコードを流用して開発を行います。

from langfuse.callback import CallbackHandler
langfuse_handler = CallbackHandler(
    public_key="pk-lf-xxx",
    secret_key="sk-lf-xxx",
    host="http://localhost:3000"
)

# <Your Langchain code here>
 
# Add handler to run/invoke/call/chat
chain.invoke({"input": "<user_input>"}, config={"callbacks": [langfuse_handler]})

Trace の確認

実際に簡単なプログラムを作成し、 LLM の動きをトレースさせてみましょう。
今回は英語を日本語に翻訳するプログラムを作成し、トレースします。
.env ファイルに Langfuse・OpenAI の API キーを記述しています。

import os
from dotenv import load_dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langfuse.callback import CallbackHandler

load_dotenv()

# Langfuseのコールバックハンドラを設定
langfuse_handler = CallbackHandler(
    public_key=os.getenv("LANGFUSE_PUBLIC_KEY"),
    secret_key=os.getenv("LANGFUSE_SECRET_KEY"),
    host=os.getenv("LANGFUSE_HOST")
)

def main():
    # GPT-4oモデルを使用
    llm = ChatOpenAI(model="gpt-4o")

    # プロンプトテンプレートを定義
    prompt = ChatPromptTemplate.from_messages(
        [
            (
                "system",
                "You are a helpful assistant that translates {input_language} to {output_language}.",
            ),
            ("human", "{input}"),
        ]
    )

    # チェーンを作成
    chain = prompt | llm
    user_input = "I love programming."

    # チェーンを実行し、Langfuseでトレース
    result = chain.invoke(
        {
            "input_language": "English",
            "output_language": "Japanese",
            "input": user_input,
        },
        config={"callbacks": [langfuse_handler]}  # Langfuseでトレース
    )

    # 結果を表示
    print(result.content)

if __name__ == "__main__":
    main()
OPENAI_API_KEY="sk-xxx" 
LANGFUSE_PUBLIC_KEY="pk-lf-xxx"
LANGFUSE_SECRET_KEY="sk-lf-xxx"
LANGFUSE_HOST="https://cloud.langfuse.com"
GOOGLE_API_KEY="AIxxx"

プログラム実行後、 Langfuse の画面を確認してみましょう。
Tracing タブ上で実行されていることが確認できます。

trace.png

ID をクリックすると Trace の詳細を確認することができます。
出力の結果・コストの可視化・レイテンシを確認することができます。

traceid.png

LLM-as-a-Judge

LLM-as-a-Judge 機能はアプリケーションの出力を別の LLM に評価させる手法です。
LLM に対して生成されたトレースやデータセットのエントリを提示し、その出力に対するスコアリングを行うことができます。これらの評価結果は、 Langfuse 内でスコアとして保存され、アプリケーションの品質向上に役立てることができます。

RAG(Retrieval-Augmented Generation)のプログラムを評価することを例に、設定方法を簡単にご説明しようと思います。

LLM-as-a-Judge のタブを開き、「Create Evaluator」をクリックします。
なお、バージョンによっては画像の表記が異なる場合があります。

evaluator.png

「Select a template」から「Create new template」を選択します。

今回はテンプレートを利用して作成します。画像上部のセレクトタブから「Correctness」を選択します。

correctness.png

次に、「+ Add new LLM API key」から API キーを設定します。
入力後、画面下部の Save ボタンをクリックしたらテンプレートの作成完了です。

続いて、Evaluators タブから「New evaluator」を選択します。

テンプレートを選択する画面が表示されるので、「correctness」を選択します。
この時、Target filter で Session ID を設定することで、評価したいものをフィルタリングすることができます。

filter.png

続いて、{{query}}と{{generation}}の項目を設定します。

画像のように Input と Output を設定します。
最後に画面下部の Save ボタンをクリックすれば設定は完了です。

querysetting.png

Evaluator の設定が完了したらコードを実行してみましょう。
実行後に確認すると、画像のようにスコアが表示されていることがわかります。
スコアは 0 から 1 の範囲で算出され、値が高いほど評価対象の精度が高いことを意味します。

judge.png

ダッシュボード機能(レイテンシ)

Langfuse のダッシュボードタブでは、LLM の使用料金やトレース数、LLM-as-a-Judge のスコアやレイテンシが可視化されたグラフを見ることができます。
今回は各モデル別のレイテンシを可視化してみようと思います。
使用するモデルは以下のモデルです。

  • gemini-2.0-flash: Google が 2025/3/26 現在新しく発表された高速モデルです。
  • gpt-4o: 複雑な対話や議論に柔軟に対応できる高い能力を持っています。
  • gpt-o3-mini: OpenAI のモデルの中でも軽量かつ高速な動作が特長で、リソースが限られた環境に最適です。

また下記内容についての検証を行います。

  1. RAG によるモデル別の可視化
  2. 翻訳によるモデル別の可視化
  3. 要約によるモデル別の可視化

dashboard.png

1. RAG によるモデル別の可視化

生成 AI で簡単な社内規定ドキュメントを作成し、それをデータソースとした RAG を作成しました。
コードの流れはこのようなものです。

1. 環境変数をロードし、Langfuse 用のコールバックハンドラを設定する。
2. 社内規定.pdfを読み込み、テキストをチャンクに分割してベクトルストアを生成する。
3. 分割されたドキュメントをリトリーバーへ変換して、コンテキスト情報として利用可能にする。
4. LLM とプロンプトテンプレートを定義して、チェーンの構築準備を行う。
5. リトリーバーで取得した文書とユーザーの質問を組み合わせ、文脈を整形する。
6. チェーンを実行し、Langfuse のトレース付きで回答結果をコンソールに出力する。

勤務時間の書いている社内規定サンプルに「勤務時間は何時から何時ですか?」と質問を投げてみます。
結果は画像のようになりました。時間が掛かるほど値が大きくなります。

gpt-4o が最も時間がかかると予想していましたが、実際には gpt-o3-mini の方が処理時間が長かったため驚きました。
特に、RAG のケースでは gpt-o3-mini の処理時間が増加する傾向があるのかもしれません。

rag.png

2. 翻訳によるモデル別の可視化

600文字程度の英文を日本語に翻訳するプログラムを作成します。
コードの流れはこのようなものです。

1. 環境変数(設定情報)を読み込み、外部サービスとの通信設定を行います。
2. Langfuseを利用して、実行中の動作状況やログを追跡できる仕組みを導入しています。
3. ChatOpenAI(gpt-4o)という大規模言語モデルを利用し、翻訳処理の基盤を整えます。
4. ユーザーが入力した英語文章を自然な日本語へ変換するための指示文(プロンプト)を作成します。
5. プロンプトとモデルを連携させ、翻訳タスクを一連の処理(チェーン)として組み立てます。
6. メイン関数で、実際に英語文章を翻訳し、結果を画面に出力するよう実行しています。

次のような英文を LLM に訳してもらいます。

Every morning, I wake up at 6:30 a.m. I brush my teeth, wash my face, and eat breakfast. After that, I go to school by bus. My classes start at 8:30 a.m. and end at 3:00 p.m. I like English and math, but I don’t like history because it is difficult.After school, I go to the library to study. Sometimes, I play soccer with my friends in the park. In the evening, I have dinner with my family. My mother cooks delicious food every day. After dinner, I do my homework and watch TV.Before going to bed, I read a book or listen to music. I usually sleep at 10:30 p.m. This is my daily routine.

レイテンシはこのような形で表示されました。
右側のグラフが指標になります。

gemini-2.0-flash、gpt-o3-mini、gpt-4o の順番と予想していたのですが、想定通りの結果となりました。
gemini-2.0-flash は gpt-4o の約 3 倍の速度で処理を完了し、その高速性から翻訳処理に適しているのかもしれません。

translate.png

3. 要約によるモデル別の可視化

600文字程度の文章を LLM に要約してもらいます。
コードの流れはこのようなものです。

次のような文章を各モデル毎に要約してもらいます。

人工知能(AI)の歴史は1950年代に始まり、その後数十年にわたって発展を続けています。
初期のAIは単純な論理的タスクを実行することしかできませんでしたが、
現代のAIシステムは機械学習や深層学習を用いて、画像認識、自然言語処理、
ゲームプレイなど、より複雑なタスクを実行できるようになっています。

特に2010年代以降、ディープラーニングの発展により、AIの能力は飛躍的に向上しました。
例えば、2012年にはディープラーニングを用いた画像認識システムがImageNetチャレンジで
人間の認識精度を上回り、2016年にはAlphaGoが世界トップクラスの囲碁プレイヤーに勝利しました。

現在、AIは私たちの日常生活のさまざまな場面で使用されています。
スマートフォンの音声アシスタント、オンラインショッピングのレコメンデーションシステム、
自動運転車の開発など、その応用範囲は広がり続けています。

しかし、AIの発展には課題もあります。プライバシーの問題、アルゴリズムの偏り、
雇用への影響など、社会的・倫理的な問題が指摘されています。
これらの課題に対処しながら、AIの開発と応用を進めていくことが重要です。

将来的には、AIはさらに進化し、より多くの分野で活用されることが予想されます。
医療診断、気候変動対策、宇宙探査など、人類が直面する様々な課題の解決に
AIが貢献することが期待されています。

レイテンシはこのような形で表示されました。

gemini-2.0-flash は非常に高速で、gpt-4o と gpt-o3-mini はほぼ同等の性能を示しました。
一方、gpt-o3-mini は速いと予想していたため、gpt-4o と同程度の結果になった点が意外でした。

summary.png

おわりに

今回は Langfuse を実際に試してみました。
生成 AI を利用したツールは多種多様に存在しますが、作成した LLM アプリケーションを評価・可視化するツールは新鮮で、触っていて楽しかったです。

また、LLM-as-a-Judge などの機能を通じて、生成 AI の精度向上に向けた PDCA サイクルを実践できる点も大変便利です。
これからは、LLM を活用したアプリケーション開発の際に Langfuse を積極的に取り入れ、さらなる精度向上を目指していきたいと思います。

最後まで読んでいただきありがとうございました。

1

Discussion

ログインするとコメントできます