見出し画像

OpenAIの新しいマルチエージェント用フレームワークSwarmを試す

Google ColabでSwarmを試したのでまとめました。


1. Swarm

OpenAIが新しくマルチエージェント構築のためのフレームワークを作り始めました。まだ実験的なフレームワークで、本番環境での使用を想定していないようで、今の所かなりシンプルな仕組みに見えます。
エージェントの調整と実行を軽量で、制御性が高く、テストしやすいものにすることに重点を置いているようです。

2. Google Colabで実行してみる

2.1 実行準備

ライブラリのインストール

!pip install git+https://github.com/openai/swarm.git

OPENAI_API_KEYを環境変数として設定。(SwarmはOpenAI APIを使うので必要)

import os
from google.colab import userdata

os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')

2.2 実行(最小構成)

最小構成で実行してみます。
LangGraphなどと同様、agentを定義→runで実行の流れです。

client = Swarm()

agent = Agent(
    name="Agent",
    instructions="You are a helpful agent.",
)

messages = [{"role": "user", "content": "クリスマスは何月何日でしょうか。"}]
response = client.run(agent=agent, messages=messages)

print(response.messages[-1]["content"])

以下の回答がprintされます。

クリスマスは12月25日です。

2.3 実行(モデルの変更)

モデルを変更してみます。コードを軽くみた感じだと、Agentの指定の時にmodelが指定できそうでした。
デフォルトはgpt-4oみたい(2024/10/12時点)なので、Agentの稼働確認程度であればgpt-4o-miniに変更しておいた方が良さそうです。

client = Swarm()

agent = Agent(
    name="Agent",
    model="gpt-4o-mini",  # 追加
    instructions="You are a helpful agent.",
)

messages = [{"role": "user", "content": "クリスマスは何月何日でしょうか。"}]
response = client.run(agent=agent, messages=messages)

print(response.messages[-1]["content"])

回答は変わらずでした。

クリスマスは12月25日です。

2.4 実行(マルチエージェント)

複数エージェントで連携を取らせる構成を試します。
exampleを見た限りだと、どうやら複数エージェントの連携はfunctionを介して行うようです。

client = Swarm()

def transfer_to_agent_b():
    return agent_b


agent_a = Agent(
    name="Agent A",
    model="gpt-4o-mini",
    instructions="You are a helpful agent.",
    functions=[transfer_to_agent_b],
)

agent_b = Agent(
    name="Agent B",
    model="gpt-4o-mini",
    instructions="Only speak in Haikus.",
)

response = client.run(
    agent=agent_a,
    messages=[{"role": "user", "content": "agent Bと話したい。agent Bに日本語の俳句を作らせてください。"}],
)

print(response.messages[-1]["content"])

以下の俳句を返してくれました。

ここにあれど
静けさの中で
花は咲くよ

全メッセージを以下で確認すると処理の流れが確認できます。

for message in response.messages:
  print(message)

結果は以下のようになります。

{'content': None, 'role': 'assistant', 'function_call': None, 'tool_calls': [{'id': 'call_tEGujHWYQgI0VwNkYT0zaysm', 'function': {'arguments': '{}', 'name': 'transfer_to_agent_b'}, 'type': 'function'}], 'refusal': None, 'sender': 'Agent A'}
{'role': 'tool', 'tool_call_id': 'call_tEGujHWYQgI0VwNkYT0zaysm', 'tool_name': 'transfer_to_agent_b', 'content': '{"assistant": "Agent B"}'}
{'content': 'ここにあれど  \n静けさの中で  \n花は咲くよ  ', 'role': 'assistant', 'function_call': None, 'tool_calls': None, 'refusal': None, 'sender': 'Agent B'}

上記では以下の流れで処理が行われています。

  1. Agent Aに対して、「agent Bと話したい。agent Bに日本語の俳句を作らせてください。」とユーザーが指示

  2. Agent AがAgent Bをtransfer_to_agent_b関数経由で呼び出し

  3. Agent Bが俳句を作成して返す

3. まとめ

今回はOpenAIの新しいマルチエージェントシステム用のフレームワークを試してみました。
現状、実験的なものであるとのことでかなりシンプルな作りになっている気がします。

エージェント間の繋がりが関数経由である点は、LangGraphのワークフローの形式で慣れていると若干使いづらい気がします。ですが、ReActを使ったAgentの連携を考えると将来的にはこの形式の方が理想的なような気がします。
OpenAIの次の目指すところがやはりマルチエージェント的なところにありそうだとわかって面白かったです。

今後はもう少し複雑なマルチエージェントシステムを作ってみようと考えています。
よければNoteかXのフォローお願いします。

X: https://twitter.com/CurveWeb

参照


この記事が気に入ったらサポートをしてみませんか?