はじめに
前回記事でOllamaを使ってローカルLLMを呼び出すことまで実施しました。
今回はローカルLLMを用いて、エージェントを構築し、構築したエージェントを監視するところまで実施したので、自身のやったことを整理するために本記事を書きました。
LangGraphとは
LangChainをベースにしたライブラリで、LLMのワークフローを構築するために使われます。
特に、グラフ構造を活用して、複雑な対話フローやデータフローを柔軟に設計できることが特徴です。
以下の画像のようなイメージです。
(https://blog.langchain.dev/langgraph-multi-agent-workflows/ より引用)
構築したエージェント
下図が今回構築したものをグラフ化したものになります。
(Langfuseにより出力・Langfuseについては後述)
簡単に流れを説明すると、以下の3ステップからなります。
- collect_basic:基本情報の収集・要約
- collect_trends:最新のトレンドの収集・分析・要約
- summarize:上記2つの情報の要約
長くなってしまうので、ここではエージェントの詳細な実装については省略します。
Langfuseとは
一言でいうと、LLMアプリのためのOSS監視ツールです。
公式ドキュメント(Why Langfuse?)では以下のように紹介されていました。
- 最も利用されているオープンソースのLLMOpsプラットフォーム
- モデルやフレームワークにとらわれない
- 本番環境向けの構築
- 徐々に導入可能、1つの機能から始めて、時間をかけてプラットフォーム全体に拡張
- APIファースト、カスタム統合のためにAPI経由ですべての機能が利用可能
- オプションで、Langfuseは簡単にセルフホスト可能
監視してみる
Langfuseの準備
いくつかの方法があるそうですが、一番簡単そうなローカルで準備したいと思います。
以下ページを参考に準備します。
git clone https://github.com/langfuse/langfuse.git
cd langfuse
docker compose up
これで、http://localhost:3000
へアクセスすると利用することができます。
また、settings/api-keys
からAPIキーを取得することができます。
コードの修正
以下ページを参考に、作成したコードを修正しました。
- コンストラクタへの追加内容(APIキーは
.env
にて管理)
from langfuse.callback import CallbackHandler
self.langfuse_handler = CallbackHandler(
secret_key=os.environ.get("LANGFUSE_SECRET_KEY"),
public_key=os.environ.get("LANGFUSE_PUBLIC_KEY"),
host=os.environ.get("LANGFUSE_HOST"),
)
- ワークフロー構築の際に変更する内容
# 変更前
workflow.compile()
# 変更後
workflow.compile().with_config({"callbacks": [self.langfuse_handler]})
監視できているか確認
コードの修正後、再度エージェントを使ってみると、以下のようにtracesが生成されており、構造的にそれぞれの要素の入出力や、所要時間などを確認することができました。
(また、ベータ機能として前述のようにエージェントのグラフを表示することもできていました)
おわりに
思った以上に簡単にLangfuseを構築できたので驚きました。(実質CallbackHandler
の設定と、.with_config({"callbacks": [self.langfuse_handler]})
を追加しただけ)
これでデータの流れなどが分かりやすくなったので、プロンプトの調整や受け渡すデータの形式の見直しなどの作業がはかどるように思います。
また、評価がまだあまりできていないのでそちら方面(RAGASなど)の深堀りもしていきたいと思います。
ありがとうございました。
参考サイト