こちらで知りました。マルチエージェントシステムとな。
こちらで公開されています。
クイックスタートなどを動かしてみます。
🤖 LangGraph マルチエージェント スウォーム
LangGraph を使用してスウォームスタイルのマルチエージェントシステムを作成するための Python ライブラリ。スウォームは、エージェントがそれぞれの専門分野に基づいて動的に制御を引き継ぐタイプのマルチエージェントアーキテクチャです。システムは最後にアクティブだったエージェントを記憶し、次回の対話ではそのエージェントとの会話が再開されることを保証します。
特徴
- 🤖 マルチエージェント協調 - 専門化されたエージェントが協力し、コンテキストを引き継ぐことが可能
- 🛠️ カスタマイズ可能な引き継ぎツール - エージェント間の通信のための組み込みツール
このライブラリは、エージェントアプリケーションを構築するための強力なフレームワークであるLangGraphの上に構築されており、ストリーミング、短期および長期メモリ、人間の介在をサポートする機能が標準で備わっています
%pip install langgraph-swarm langchain-openai
%pip install -U mlflow
%restart_python
MLflow Tracingでエージェントの挙動をトレースします。
import mlflow
mlflow.langchain.autolog()
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
複数のエージェントBob
とAlice
を実装します。
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.prebuilt import create_react_agent
from langgraph_swarm import create_handoff_tool, create_swarm
model = ChatOpenAI(model="gpt-4o-mini")
def add(a: int, b: int) -> int:
"""2つの数字を足す"""
return a + b
alice = create_react_agent(
model,
[add, create_handoff_tool(agent_name="Bob")],
prompt="あなたはAlice、足し算の専門家です。",
name="Alice",
)
bob = create_react_agent(
model,
[create_handoff_tool(agent_name="Alice", description="Aliceに転送、彼女は数学を手伝うことができます")],
prompt="あなたはBob、海賊のように話します。",
name="Bob",
)
checkpointer = InMemorySaver()
workflow = create_swarm(
[alice, bob],
default_active_agent="Alice"
)
app = workflow.compile(checkpointer=checkpointer)
config = {"configurable": {"thread_id": "1"}}
turn_1 = app.invoke(
{"messages": [{"role": "user", "content": "Bobと話したい"}]},
config,
)
print(turn_1)
turn_2 = app.invoke(
{"messages": [{"role": "user", "content": "5 + 7 は何ですか?"}]},
config,
)
print(turn_2)
MLflow Tracingで挙動を確認します。ツールが定義されています。
デフォルトのエージェントはAlice
でしたが、Bob
に転送されています。
海賊っぽいです。その後で算数の質問をするとAlice
に転送されています。
Alice
によって加算ツールが呼び出され、回答が返却されました。
メモリー
スウォームマルチエージェントシステムに短期および長期のメモリを追加できます。create_swarm()
は使用前にコンパイルする必要がある StateGraph
のインスタンスを返すため、.compile()
メソッドに直接チェックポインタまたはストアインスタンスを渡すことができます:
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.store.memory import InMemoryStore
# 短期記憶
checkpointer = InMemorySaver()
# 長期記憶
store = InMemoryStore()
model = ChatOpenAI(model="gpt-4o-mini")
alice = create_react_agent(
model,
[add, create_handoff_tool(agent_name="Bob")],
prompt="あなたはAlice、足し算の専門家です。",
name="Alice",
)
bob = create_react_agent(
model,
[create_handoff_tool(agent_name="Alice", description="Aliceに転送、彼女は数学を手伝うことができます")],
prompt="あなたはBob、海賊のように話します。",
name="Bob",
)
workflow = create_swarm(
[alice, bob],
default_active_agent="Alice"
)
# チェックポインタ/ストアでコンパイル
app = workflow.compile(
checkpointer=checkpointer,
store=store
)
config = {"configurable": {"thread_id": "2"}}
turn_1 = app.invoke(
{"messages": [{"role": "user", "content": "5 + 7 は何ですか?"}]},
config,
)
print(turn_1)
turn_2 = app.invoke(
{"messages": [{"role": "user", "content": "前の回答を覚えていますか?"}]},
config,
)
print(turn_2)
メモリーが動作しています。
重要
短期メモリを追加することは、複数の対話にわたって会話の状態を維持するために重要です。これがないと、スウォームは最後にアクティブだったエージェントを「忘れ」、会話の履歴を失ってしまいます。マルチターンの会話で使用する場合は、必ずチェックポインタを使用してスウォームをコンパイルしてください。例: workflow.compile(checkpointer=checkpointer)
。
この他、ハンドオフツールやエージェント実装のカスタマイズ方法も紹介されています。