本記事ではDify で作ったLLMアプリケーションをLangfuse で可視化してみた時に、処理はどう見えるのか、そしてどのように役に立つのかをご紹介します。
*このブログは前半と後半に分かれており、前半パートなります。
はじめに
近年のDifyユーザーの広がりとエンタープライズでの採用事例などから、Dify でも生成AIアプリケーションの可視化ニーズが高まっています。そこでこの記事では、Langfuse を使った可視化についてご紹介します。
なおこの記事ではDify の設定には深く踏み込まず、あくまでLangfuse側でどのような情報が標準では反映されるのかにフォーカスしています。
Dify とLangfuse の設定の詳細手順については、Difyの公式ページ をご参照ください。
手順といっても特に難しいことはなく、実際は各アプリケーション左側のメニューバー一番下の "監視" をクリックしていただければ、あとはキー情報などをいれるだけです。

Dify でのサンプルアプリの構成
まず今回のケースで用いたアプリは、以下の処理をします。
ユーザーがファイルアップロード
"テキスト抽出ツール" でテキストを抽出
"LLM1" で 原文に忠実に翻訳
"LLM2" でそれをレビューして修正
"LLM3" で不要な文字は全て排除して、マークダウンに変更
5の結果を出力

実行すると以下のようになります。
特に何の変哲もないアプリケーションなので、詳細な処理は割愛します。

ここまでが前置きで、ここからLangfuse側で状態を見ていきます。
Traceとは
Dify側で "秘密キー" , "公開キー", "HOST" を入れていることを確認し、Langfuse側で状況を見てみます。フローを実行してまもなく、Trace に新しいエントリがあることがわかります。

改めてご説明するとTrace の定義は以下のとおりです。詳細はこちらも確認ください。
なんとなくでもご存知の方は以下の点線内は飛ばして先に進んでいただけます。
Traces
A Trace represents a single execution of a LLM feature. It is a container for all succeeding objects. 訳:
Trace はLLM機能の単一実行を表します。これはすべての後続オブジェクトのコンテナです
Observations
Each Trace can contain multiple Observations to record individual steps of an execution. There are different types of Observations:
Events are the basic building block. They are used to track discrete events in a Trace.
Spans track time periods and include an end_time.
Generations are a specific type of Spans which are used to record generations of an AI model. They contain additional metadata about the model, LLM token and cost tracking, and the prompt/completions are specifically rendered in the langfuse UI.
訳:
各Traceは、実行の個々のステップを記録するための複数のObservations を含めることができます。Observations にはさまざまな種類があります。
Event は基本的な構成要素です。これらは、トレース内の個別のイベントを追跡するために使用されます。
Span は時間期間を追跡し、end_timeを含みます。
Generation は、スパンの特殊なタイプであり、AIモデルの世代を記録するために使用されます。これには、モデル、LLMトークン、コスト追跡に関する追加のメタデータが含まれ、プロンプト/補完は、特にlangfuse UI でレンダリングされます。

Langfuse での見え方

各Trace をクリックすると、こんな感じでInput/Output を確認することができます。
Trace名 workflow の下には、日時と所要時間とToken数が見て取れます。Dify側で出すInput/Out TokenとLangfuse側の取り扱いが原因で、ゼロ担ってますが合計のTokenも確認することができます。
まずこのTraceのInputとOutput を確認することが可能ですが、それに加えて下の方にはDify で付与したMetadata があることも確認できます。

そして右側のメニューを Tree から Timeline に切り替えると、どこの処理でどの程の時間がかかったかを視覚的に見ていただくことも可能です。

ただ、ちょっと問題なのはDifyで3つあったLLM での処理と各アウトプットが全部 llm で名称が統一されてしまっており、Langfuse の画面だけで分からない (DifyのUIの仕様) 問題があります。これについては、各GENERATION をクリックして中身から確認が可能です。
この画面ではGENERATION の詳細で、Systemプロンプトなどの他にレイテンシーやToken、Model などの情報が確認できます。

この画面の下の方では、Metadata が表示されておりDIfyのノード名やタイプなどの情報を
確認することができます。 node_name として定義されている部分です。

ちなみに結果がうまく出ないなど、本当に文章抽出されてる?など思った時にはSPANとして document-extractor を見ていただくと実際のOUTPUTなどの詳細を確認することができます。ここから更に Debug が可能です。

このようにLangfuse を活用することで、ブラックボックスになりがちなDify の各処理を確認しながら、効率的な開発・運用を進めることができます。
Langfuseでの可視化 [Dify編 (前半) ] まとめ
本記事ではLangfuseのTrace機能を通じて、Difyの処理の可視化の基本的をご紹介しました。次回はもう少し深掘りして、RAGを行った場合について触れていきます。
ガオ株式会社 は企業向けにLangfuse ProおよびEnterpriseプランを日本円で販売し、日本語でサポート提供・導入支援などを実施している唯一の企業です。
Langfuseにご興味ある方は、contact@gao-ai.comまでご連絡ください。
Komentar