langgraph-supervisorでマルチエージェントシステムを構築した

はじめに
こんにちは!
KINTOテクノロジーズの生成AI活用PJTで生成AIエンジニアを担当しているAlexです。
最近、LLM(大規模言語モデル)を利用したマルチエージェントシステムの需要が急速に高まっています。今回、LangGraphの最新アップデート「langgraph_supervisor」を活用し、わずか30分以内でSupervisor型マルチエージェントシステムを構築した実例をご紹介します。このシステムは、複数の専門エージェントを中央のスーパーバイザーが効率的に調整・連携させる仕組みとなっており、業務の自動化やカスタマイズ可能な提案シナリオの生成など、さまざまなユースケースに応用可能です。
LangGraphとは
LangGraphは、AIエージェントやRAG(Retrieval-Augmented Generation)システムの構築を容易にするPythonライブラリです。LangChainと組み合わせることで、複雑なワークフローやタスクを効率的に設計・実装できます。状態(State)の永続化、ツールの呼び出し、そして「人間の介在(human-in-the-loop)」や「後からの検証」が容易な中央パーシステンス層を提供しており、今回のSupervisor型システムの基盤となりました。
langgraph-supervisorとは
langgraph-supervisorは、LangChainに最近発表されたLangGraphを活用して階層型Multi Agentシステムを構築するためのPythonライブラリです。中央のスーパーバイザーエージェントが各専門エージェントを統括し、タスクの割り当てや通信を管理します。これにより、複雑なタスクを効率的に処理できる柔軟なシステムの構築が可能です。
主な機能
-
Supervisor Agentの作成:
複数の専門エージェントを統括し、全体のオーケストレーションを行います。 -
ツールベースのAgent間Handoff機構:
エージェント間の円滑な通信を実現するためのメカニズムを提供します。 -
柔軟なメッセージ履歴管理:
会話の制御を容易にするため、メッセージ履歴を柔軟に管理できます。
Supervisor型Multi Agentシステムとは
出典:https://langchain-ai.github.io/langgraph/tutorials/multi_agent/agent_supervisor/
Supervisor型Multi Agentシステムとは、Supervisorと呼ばれる全体を統制するAgentがツールコール対応の各LLM Agentと連携して、どのAgentをいつ呼び出すか、またそれらのAgentに渡す引数を決定するMulti Agent構造です。
langgraph-supervisorでMulti Agentシステムを構築
以下は、実際にlanggraph-supervisorでMulti Agentシステムを構築する手順を紹介します。
今回は、匿名化した顧客の基本情報を入れるだけで、その顧客にお勧めする車と、お勧めのエンジンタイプも出力するシステムを構築します。
また、車の情報とエンジン情報に関しては、ローカルで格納している「車両情報.csv」からAgentが取得していきます。
環境準備
Azure OpenAIのAPIキーの用意
今回は、Azure OpenAI経由でGPT-4oを使用します。ご自身の状況によって、OpenAI APIやAnthropic APIなどを使用することも可能です。
また、Azure OpenAIのAPIキーやエンドポイントを環境変数として設定します。
os.environ["AZURE_OPENAI_API_KEY"] = "YOUR API KEY"
os.environ["AZURE_OPENAI_ENDPOINT"] = "YOUR ENDPOINT"
os.environ["AZURE_OPENAI_API_VERSION"] = "YOUR API VERSION"
os.environ["AZURE_OPENAI_DEPLOYMENT"] = "YOUR DEPLOYMENT NAME"
LangGraph、LangChainのインストール
pip install langgraph
pip install langchain
pip install langchain_openai
langgraph-supervisorのインストール
pip install langgraph-supervisor
LLMおよび各Agentで使うツール関数のセットアップ
Azure OpenAI GPT-4oでモデルを定義します。
また、エージェント用のツール関数も定義します。
from langchain_openai import AzureChatOpenAI
import pandas as pd
# LLMの初期化
llm = AzureChatOpenAI(
azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT"),
api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
)
car_information_path = "/xxx/xxx/車両情報.csv"
# ツール関数の定義例
# CSVファイルから車両情報を読み込み、候補を生成する例
def get_car_features():
"""The python code to get car information."""
path = car_information_path # CSVファイルのパスを指定
df = pd.read_csv(car_information_path)
car_features = df[["車種名", "ボディタイプ", "説明"]].drop_duplicates()
return car_features.to_dict(orient="records")
# 選択された車種に対してエンジンタイプを抽出する例
def get_engine_type(selected_car):
"""The python code to get engine type and engine information."""
path = car_information_path
df = pd.read_csv(car_information_path)
engine_types = list(df[df["車種名"] == selected_car]["エンジンタイプ"].unique())
return engine_types, "エンジンに関する補足情報"
各Agentの定義
LangGraphの「create_react_agent」を利用して、各専門エージェント(車種推薦、エンジンタイプ選択)を定義します。
from langgraph.prebuilt import create_react_agent
# 車種推薦エージェント
car_agent = create_react_agent(
model=llm,
tools=[get_car_features],
name="car_agent",
prompt="""
# 指示書
提案パターンに基づいて、推薦する車種を選び、200文字程度の根拠を説明してください。
"""
)
# エンジンタイプ選択エージェント
engine_agent = create_react_agent(
model=llm,
tools=[get_engine_type],
name="engine_agent",
prompt="""
# 指示書
推薦車種に最適なエンジンタイプを選び、200文字程度の根拠を説明してください。
"""
)
Supervisorの定義
各エージェントを統括するSupervisorを作成し、顧客情報に基づいた最終提案を生成します。
ここで工夫した点としては、Supervisorに入力するプロンプトをモジュール化して、より高い汎用性を実現しました。roleやtask変数の中身と、紐づくAgentを変更すれば、他のタスクにも流用可能です。
from langgraph_supervisor import create_supervisor
# プロンプトの各モジュールの内容を作成
role = "車のセールスマン"
task = "顧客情報をもとに、最適な車とエンジンタイプを提案してください。"
guideline = """
- 出力は必ず上記JSON形式で行ってください。
- 各根拠は200文字程度の豊かな文章で記述してください。"
"""
output_format = """
{
"提案内容": {
"提案する車種",
"車種の根拠",
"選択したエンジンタイプ",
"エンジン選定理由"
}
}
"""
# プロンプトを作成
system_prompt = f"""
## ロール
あなたは優れた{role}です。
## タスク
{task}
## ガイドライン
{guideline}
## 最終生成物のフォーマット
{output_format}
"""
# Supervisorの作成
workflow = create_supervisor(
# 先ほど作成したエージェントと紐づく
[car_agent, engine_agent],
model=llm,
prompt=system_prompt
)
# グラフのコンパイル
app = workflow.compile()
実行例
from langchain.schema import HumanMessage
import time
# 顧客情報の例(必要に応じて詳細情報を追加)
customer_info = "顧客情報: 年齢35歳、燃費重視、現在乗車中の車はコンパクトカー"
# 実行例
start_time = time.time()
result = app.invoke({
"messages": [
{"role": "user", "content": customer_info}
]
})
end_time = time.time()
# 最終出力の表示
print("最終提案:")
print(result["messages"][-1].content)
print("実行時間: {:.3f}秒".format(end_time - start_time))
Supervisorからの返答
最終提案:
{
"提案内容": {
"提案する車種": "ハイブリッド技術を採用した最新コンパクトカー",
"車種の根拠": "顧客は現在コンパクトカーに乗車中であり、燃費性能の良さを重視しています。ハイブリッド技術を採用した車は、燃料使用の効率が高く、経済的負担や環境への配慮が優れています。また、ハイブリッドシステムは短距離や都市部での走行にも最適です。そのため、最新のハイブリッドコンパクトカーが最適な選択肢となります。",
"選択したエンジンタイプ": "ハイブリッドエンジン",
"エンジン選定理由": "ハイブリッドエンジンは燃費性能が非常に優れており、顧客のニーズである燃料効率を最優先に考慮しています。さらに、コンパクトカーとの相性も良く、都市部での利用や日常の移動において高いパフォーマンスを発揮します。このエンジンの選択は、快適性、経済性、環境性能を全て満たします。"
}
}
実行時間: 21.938秒
実際に構築してみた感想
迅速なプロトタイピング
langgraph_supervisorを利用することで、従来のLangGraphに必要だった複雑なAgent間の連携や状態管理がシンプルなコードで実装でき、30分以内にプロトタイプを構築できた点は非常に印象的でした。
柔軟性と拡張性
各Agentは独自のpromptやツール関数で実装できるため、ビジネスニーズに合わせたカスタマイズが容易です。また、状態管理が中央で行われるため、将来的な改善や新しい機能の追加もスムーズに行えそうです。
We Are Hiring!
KINTOテクノロジーズでは、事業における生成AIの活用を推進する仲間を探しています。まずは気軽にカジュアル面談からの対応も可能です。少しでも興味のある方は以下のリンク、またはXのDMなどからご連絡ください。お待ちしております!!
ここまでお読みいただき、ありがとうございました!
関連記事 | Related Posts

Slack上でLLMを活用する社内チャットボット「しぇるぱ」の実装事例を紹介

8月・9月入社メンバー紹介②
![Cover Image for [生成AI][Copilot] 非エンジニアの私がAIを使って運用ツールを開発した話](/assets/blog/authors/yamayuki/01.png)
[生成AI][Copilot] 非エンジニアの私がAIを使って運用ツールを開発した話

「GitLabに学ぶ 世界最先端のリモート組織のつくりかた」輪読会が最高だったのでシェアしたい

ChatGPT(GPT-4)のAdvanced Data Analysis(旧Code Interpreter)、日本語フォントでグラフや画像、PDFファイルを出力する方法とTwitterの分析

コードとブログの両方を効率的にレビューする仕組みについて:PR-Agent(Amazon Bedrock Claude3)の導入
We are hiring!
生成AIエンジニア/生成AI活用PJT/東京・名古屋・大阪
生成AI活用PJTについて生成AIの活用を通じて、KINTO及びKINTOテクノロジーズへ事業貢献することをミッションに2024年1月に新設されたプロジェクトチームです。生成AI技術は生まれて日が浅く、その技術を業務活用する仕事には定説がありません。
【データサイエンティスト(リーダークラス)】データサイエンスG/東京・名古屋
データ分析部について※データ分析部は、データサイエンスGが所属している部門です。クルマのサブスクというビジネスモデルを展開するKINTOでは、市場やお客様のニーズを捉え、最高の顧客体験を提供するために、マーケティング分析においても挑戦と創造が求められます。