ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

LangfuseでマルチモーダルLLMアプリのトレーシングを行う際に工夫したこと

こんにちは。R&Dを担当している浅野です。

ユニファではマルチモーダルLLMを活用したアプリ開発を積極的に行っています。LLMを一度callして終わりではなく、複数のステップを直列や並列で組み合わせて処理を行う場合や、LLMに処理ステップから考えさせる場合は、最終のアウトプットだけでなく中間ステップの内容を確認することが重要です。通常のWebアプリ用のロギングツールを使ってそれを行うことも可能ですが、LLMアプリに特化したサービスを使うと、LLM callのLatency、消費トークン、コストなども把握できますし、プロンプト管理や評価機能がついているものもあり、かなり便利です。

私たちのチームではLLMアプリのロジック記述にLangChainを使っています。LangChainを使うことを前提にした場合、使いやすいトレーシングサービスとしてLangSmithとLangfuseの2つがあります。LangSmithはLangChainが提供している有償サービスで、環境変数をセットするだけでLangChainで実行したchainのトレースが自動的にLangSmithサーバーに送られるので、非常に手軽に利用できます。

www.langchain.com

もう一方のLangfuse(OSS)も、LangSmithほど簡単ではないものの、ほんの数行のコードでトレーシングを行うことができます。

langfuse.com

サードパーティーのサーバー上にトレースが残らないようにSelf hostすることを考えると、LangSmithは記事執筆時点でEnterpriseライセンスが必要なため、コストの観点からLangfuseを選択しました。この記事では、Langfuseで画像とテキストを扱うマルチモーダルLLMアプリのトレーシングを行う際に、無駄なコストが発生しないように工夫した点について記載します。

なお、マルチモーダルLLMへのプロンプトの工夫については、ぜひこの記事を参考にしてみてください tech.unifa-e.com

何に困っていたか

LangfuseにマルチモーダルLLMのトレースを送る方法は2種類あります (Multi-Modality & Attachments - Langfuse)。

  1. base64でエンコードして送る
  2. URLを渡す

1の場合、画像データは自動的にLangfuseのオブジェクトストレージに保存されます。私たちは画像をすでに別の場所(AWS S3)に保存しているので、ストレージコストが重複してしまいます。オブジェクトストレージのコストは比較的安価とはいえ、ルクミーのサービスを通じて得られるデータ量は膨大なため、この重複は許容できません。

そこで、2のURL渡しを考えます。セキュリティのため認証期限をできる限り短くして取得したS3のPresigned URLをLLMに送ります。すると、Langfuse上でオブジェクトストレージは使わなくなりますが、トレースを確認する頃には認証期限が切れているので、トレースに記載されているURLを参照してもどんな画像が使われたのかが分からず、LLMアプリが適切に動作したか確認ができなくなってしまいます。

どう解決したか

次のように処理を行うことで上記の問題を回避しました。

  1. LLMにはS3のPresigned URLを送る
  2. Presigned URLを発行してリダイレクトで返すAPIを別途作成する
  3. 2のAPIのendpointでLangfuseのトレースを書き換える

1は通常のURL渡しです。2はAPI gateway + Lambdaで簡単なAPIを作成しました。3のトレース書き換えを行う簡易コードを示します。

import uuid
from langfuse import Langfuse

langfuse_client = Langfuse()
run_id = uuid.uuid4()
request_url = get_reqeust_url() # API endpoint + parameterを取得

...LLMをcallしてTraceを送る処理(上記run_idを使う)...

# トレースの内容を書き換える
langfuse_client.trace(
    id=str(run_id),
    input={"image_url": request_url}
)

こうすることで、Langfuseのトレース上で表示されるURLをクリックすると、APIから返されるPresigned URLにリダイレクトして画像が表示されるようになります。

トレース画面の右側中央付近にあるinput部分に記載のURLをクリックすると...

Presigned URLにリダイレクトされて画像を確認することができる (画像はGeminiで作成)
上記のコードではトレースのトップレベルのinput URLだけを書き換えていますが、任意の部分のトレースを変更することができます。

なお、API gatewayへのアクセス制限など適切なセキュリティ対策が別途必要ですのでご注意ください。

まとめ

やや力技感のある方法ですが、すでにS3などのオブジェクトストレージにデータが保存されている場合に、Langfuse側で無駄なコストを発生させずセキュリティにも配慮した形でトレースを確認できるようになりました。これで開発と運用後のモニタリングがはかどりますね!


ユニファで一緒に働く仲間を探しています!

jobs.unifa-e.com