マルチエージェントシステムライブラリLangGraph SwarmをDatabricksで動かしてみる

こちらで知りました。マルチエージェントシステムとな。

https://x.com/LangChainJP/status/1896032749032464494

こちらで公開されています。

https://github.com/langchain-ai/langgraph-swarm-py?tab=readme-ov-file

クイックスタートなどを動かしてみます。

# 🤖 LangGraph マルチエージェント スウォーム

[LangGraph](https://github.com/langchain-ai/langgraph) を使用してスウォームスタイルの[マルチエージェント](https://langchain-ai.github.io/langgraph/concepts/multi_agent)システムを作成するための Python ライブラリ。スウォームは、エージェントがそれぞれの専門分野に基づいて動的に制御を引き継ぐタイプのマルチエージェントアーキテクチャです。システムは最後にアクティブだったエージェントを記憶し、次回の対話ではそのエージェントとの会話が再開されることを保証します。

![](https://github.com/langchain-ai/langgraph-swarm-py/raw/main/static/img/swarm.png)

## 特徴
- 🤖  **マルチエージェント協調** - 専門化されたエージェントが協力し、コンテキストを引き継ぐことが可能
- 🛠️ **カスタマイズ可能な引き継ぎツール** - エージェント間の通信のための組み込みツール

このライブラリは、エージェントアプリケーションを構築するための強力なフレームワークである[LangGraph](https://github.com/langchain-ai/langgraph)の上に構築されており、[ストリーミング](https://langchain-ai.github.io/langgraph/how-tos/#streaming)、[短期および長期メモリ](https://langchain-ai.github.io/langgraph/concepts/memory/)、[人間の介在](https://langchain-ai.github.io/langgraph/concepts/human_in_the_loop/)をサポートする機能が標準で備わっています

```py
%pip install langgraph-swarm langchain-openai
%pip install -U mlflow
%restart_python
```

[MLflow Tracing](https://qiita.com/taka_yayoi/items/35c96ecd401c199e617b)でエージェントの挙動をトレースします。

```py
import mlflow
mlflow.langchain.autolog()
```


```py
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
```

複数のエージェント`Bob`と`Alice`を実装します。

```py
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で挙動を確認します。ツールが定義されています。

![Screenshot 2025-03-02 at 14.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/186319e6-f439-4492-9c25-8e057474f46a.png)

デフォルトのエージェントは`Alice`でしたが、`Bob`に転送されています。

![Screenshot 2025-03-02 at 14.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7fae43bb-7542-4109-b7be-540decc210dc.png)

海賊っぽいです。その後で算数の質問をすると`Alice`に転送されています。

![Screenshot 2025-03-02 at 14.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/50dd1988-51ee-4519-ad68-573a87543263.png)

`Alice`によって加算ツールが呼び出され、回答が返却されました。

![Screenshot 2025-03-02 at 14.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6628a22d-8434-405c-9eb4-8d29e626902b.png)

## メモリー

スウォームマルチエージェントシステムに[短期](https://langchain-ai.github.io/langgraph/how-tos/persistence/)および[長期](https://langchain-ai.github.io/langgraph/how-tos/cross-thread-persistence/)の[メモリ](https://langchain-ai.github.io/langgraph/concepts/memory/)を追加できます。`create_swarm()` は使用前にコンパイルする必要がある `StateGraph` のインスタンスを返すため、`.compile()` メソッドに直接[チェックポインタ](https://langchain-ai.github.io/langgraph/reference/checkpoints/#langgraph.checkpoint.base.BaseCheckpointSaver)または[ストア](https://langchain-ai.github.io/langgraph/reference/store/#langgraph.store.base.BaseStore)インスタンスを渡すことができます:

```py
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)
```

メモリーが動作しています。

![Screenshot 2025-03-02 at 14.25.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/816af0c7-33e6-424b-a7e1-2e4e026ffab0.png)
![Screenshot 2025-03-02 at 14.25.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8c264f24-da4b-42d5-9e04-b3cbe5647f05.png)

:::note info
**重要**

[短期メモリ](https://langchain-ai.github.io/langgraph/concepts/persistence/)を追加することは、複数の対話にわたって会話の状態を維持するために重要です。これがないと、スウォームは最後にアクティブだったエージェントを「忘れ」、会話の履歴を失ってしまいます。マルチターンの会話で使用する場合は、必ずチェックポインタを使用してスウォームをコンパイルしてください。例: `workflow.compile(checkpointer=checkpointer)`。
:::

この他、ハンドオフツールやエージェント実装の[カスタマイズ方法](https://github.com/langchain-ai/langgraph-swarm-py?tab=readme-ov-file#how-to-customize)も紹介されています。



### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)