👁️

Langfuseを導入してAIの応答をトレースする

2024/11/07に公開

Langfuseを導入してAIの応答をトレースする

LangSmithとLangfuse

LangSmithはLangChain公式のライブラリですが、無料で使う場合は制限が厳しいです。
一方、Langfuseは公式ライブラリではありませんが制限が緩く、LangSmithの代替として使えます。

LangSmith Langfuse
無料プランでのシート数上限 1人 3人
無料プランでの月間トレース数 5000 5万
有料プランの月間トレース数 10万 100万
有料プランの月額 $39 $59
データ保持期間 14日(基本トレース)、400日(拡張トレース) 30日(無料プラン)、無制限(有料プラン)
スループット(無料プラン) 5万/時 1000/分
スループット(有料プラン) 50万/時 1000/分

LangSmithとLangfuseのプランを比較してみると、それぞれのサービスの特徴が見えてきますね。
LangSmithは公式ライブラリということもあって、信頼性やサポート体制がしっかりしている印象です。
ただ、無料プランではシート数が1人に制限されていて、トレース数も月5000と少なめです。
これだと個人でちょっと試してみたいって人にはいいんですが、チームで使うにはちょっと物足りないかもしれません。

一方で、Langfuseは公式じゃないけど、制限がかなり緩いですね。
無料プランでも3人まで使えて、月5万トレースもできるのは魅力的です。
有料プランにしても月額$59で100万トレースって、コスパ的にはかなり良い感じです。
データ保持期間も無料で30日、有料で無制限ってのは長期的にデータを分析したい場合には嬉しいポイントですね。

どちらを選ぶかは、信頼性を重視するか、コストと柔軟性を重視するかで決まってきそうです。
個人的には、まずはLangfuseで試してみて、必要に応じてLangSmithに移行するってのもアリかなと思います。

インストール

$ pip install langfuse

Langfuseでできること

LangfuseはLangSmithと同じように、AIの応答をトレースすることができます。
それぞれ実装方法を交えて説明していきます。

Trace

基本になります。
これは一連の処理を追跡する機能で、AIモデルへのリクエストから応答までの流れを全部記録してくれます。
例えば、プロンプトの内容、モデルのパラメータ、生成された文章なんかが全部見れます。

LANGFUSE_SECRET_KEY=sk-lf-...
LANGFUSE_PUBLIC_KEY=pk-lf-...
LANGFUSE_HOST=https://xxx.langfuse.com
langfuse_handler = CallbackHandler()
result = retrieval_chain.invoke(
    {"input": user_message, "chat_history": chat_history},
    config={"callbacks": [langfuse_handler]},
)

または

@observe()
def langfuse_test():
    langfuse_handler = langfuse_context.get_current_langchain_handler()
    res = retrieval_chain.invoke({"animal": "犬"}, config={"callbacks": [langfuse_handler]})

LANGFUSE_SECRET_KEYLANGFUSE_PUBLIC_KEYLANGFUSE_HOSTはLangfuseのProject Settingsの、API Keys画面から発行し確認できます。
トレースした内容は、https://cloud.langfuse.com/ から確認できます。

Sessions

これは複数のTraceをまとめて一つのセッションとして扱える機能です。
ユーザーとAIの一連のやり取りを追跡したい時なんかに便利ですね。
チャットのスレッドごとにセッションを作って、それぞれのセッションをまとめて見たりと自由に使えます。

langfuse_handler = CallbackHandler(
  session_id="any_session_id",
)
result = retrieval_chain.invoke(
    {"input": user_message, "chat_history": chat_history},
    config={"callbacks": [langfuse_handler]},
)

Users

これを使えば、特定のユーザーに関連する全てのTraceやセッションを簡単に見つけられます。
ユーザーごとの使用パターンを分析したい時なんかに重宝します。

langfuse_handler = CallbackHandler(
  user_id=session["login_id"],
)
result = retrieval_chain.invoke(
    {"input": user_message, "chat_history": chat_history},
    config={"callbacks": [langfuse_handler]},
)

Metadata

TraceにKey-Valueの付加情報を追加できる機能です。
例えば、使用したデバイスの種類とか、アプリのバージョンとか、そういった情報を記録できます。
これがあると、後で詳細な分析がしやすくなります。

langfuse_handler = CallbackHandler(
  metadata={"category": category, "chat_id": chat_id},
)
result = retrieval_chain.invoke(
    {"input": user_message, "chat_history": chat_history},
    config={"callbacks": [langfuse_handler]},
)

Tags

これはTraceにラベルを付けられるんです。
例えば、ERROR みたいなタグを付けておけば、後で特定の種類のTraceをすぐに見つけられます。

@observe()
def langfuse_test():
    langfuse_handler = langfuse_context.get_current_langchain_handler()
    user_id = "test_user@example.com"
    session_id = "test_session"
    metadata = {"category": "動物", "chat_id": 1234}
    try:
        retrieval_chain = create_retrieval_chain()
        res = retrieval_chain.invoke({"animal": "犬"}, config={"callbacks": [langfuse_handler]})
        print(res.content)
        langfuse_context.update_current_trace(
            user_id=user_id,
            session_id=session_id,
            metadata=metadata,
            tags=["SUCCESS"],
        )
    except Exception as e:
        print(e)
        langfuse_context.update_current_trace(
            user_id=user_id,
            session_id=session_id,
            metadata=metadata,
            tags=["ERROR"],
        )

画面の使い方

Tracingのメニューを展開すると、Tracesからトレースされたログを確認することができます
トレースの際にsession_idを渡していれば、Sessionsからセッションごとのトレースを確認できます

トレースしたプロンプトでAPIを再実行する

AIからの応答で、なにか問題が発生した場合、その応答をシュミレーションすることができます

  1. トレースを選択
  2. GENERATIONをクリック
  3. Test in playgroundをクリック
  4. ProviderModel nameを選択 (未登録の場合はLLMを登録)
  5. Submitをクリック

タグやMetadataで絞り込む

フィルタのアイコンをクリックし、Columnで絞り込み対象をクリックし、条件などを設定できます

ユーザーごとのトレースやコストを確認する

Users から、user_id に埋め込んだユーザー情報ごとにトレースやコストを確認できます

まとめ

Langfuseを使うと、AIアプリケーションのトレーシングが簡単にできるようになります
LangSmithの代替として使えるし、無料プランでもかなり使い勝手が良いです

  1. Traceで一連の処理を追跡できる
  2. Sessionsで複数のやりとりをまとめられる
  3. Usersで特定ユーザーの行動を追跡できる
  4. MetadataとTagsで細かい情報を付けられる

画面の使い方も直感的で、トレースの確認や再実行、フィルタリングなんかも簡単にできます

Langfuseを使えば、AIアプリの開発がより効率的になります。
デバッグが楽になるし、ユーザーの行動も追跡しやすく、特に無料プランでもこれだけできるのは魅力的です。

AIアプリを作ってる人や、これから作ろうとしてる人には、一度試してみる価値は十分にあると思います。

Discussion