「AIエージェントキャッチアップ #6 - Swarm (OpenAI)」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #6 - Swarm (OpenAI)」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

youtube.com

Swarm

今回は、OpenAI社が公開した実験的なマルチエージェントフレームワーク「Swarm」を動かしたり、READMEやソースコードを読んだりしてみました。

SwarmのGitHubリポジトリはこちらです。

github.com

今回のポイント

Swarmのコンセプト

SwarmはOpenAIのCookbook「Orchestrating Agents: Routines and Handoffs」で紹介されている「Routine」と「Handoff」というアイデアをもとに実装したものになっています。

cookbook.openai.com

Swarmが何をしているのかは、このCookbookを読むとよく分かります。

簡単に言えば、

  • 特定のシステムプロンプトのもと、Function callingでツールを使いながら処理を進める一連の手順をRoutineと呼び、RoutineはAgentとみなすことができる
  • Function callingの関数がAgent型を返す場合は、そのAgentに処理が切り替わるように実装でき、それをHandsoffと呼ぶ

という内容です。

上記のCookbookではOpenAIパッケージを使ってそのような処理が実装されており、それをライブラリ化したのが「Swarm」ということです。

SwarmのHello World

SwarmのHello World的なコードとしては、README に以下のように書かれています。

from swarm import Swarm, Agent

client = Swarm()

def transfer_to_agent_b():
    return agent_b


agent_a = Agent(
    name="Agent A",
    instructions="You are a helpful agent.",
    functions=[transfer_to_agent_b],
)

agent_b = Agent(
    name="Agent B",
    instructions="Only speak in Haikus.",
)

response = client.run(
    agent=agent_a,
    messages=[{"role": "user", "content": "I want to talk to agent B."}],
)

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

システムプロンプト(instructions)の異なる2つのエージェントを用意して、agent_aにはtransfer_to_agent_b、つまりagent_bに切り替わるツールを与えています。

agent_aは必要に応じてFunction callingで処理をagent_bに切り替えるようになっている、ということです。

Swarmの機能

Swarmは主に以下の2つの機能が実装されただけの非常にシンプルなフレームワークでした。

  1. 単純なFunction callingを使ったAgent機能(LangGraphのcreate_react_agentのような機能)
  2. Function callingの関数がAgent型を返す場合に、Agent(システムプロンプトやツール)が切り替わる機能

※処理の実行開始時やシステムプロンプトの組み立て時、Function callingの関数実行時に、context_variablesという値を共有するような機能もあります

実際にSwarmの実装を参照すると swarm/core.py に前述のCookbookとほとんど同じような処理が実装されているだけです。

Swarmの特徴だと感じた点

Swarmはとにかく単純なマルチエージェントフレームワークでした。

Agentのようなオブジェクトを作成して実行するという流れはAutoGenやcrewAIに似ていますが、Swarmはより単純で、Function callingでエージェントがお互い呼び出し合うだけになっています。

LangChainやLangGraphでは、開発者が明示的に処理の流れ(ChainやGraph)を定義するのに対して、Swarmでは処理の流れ自体もLLMが動的に考えていくことになっています。

そのため、Swarmで特定のワークフローを組んだりしたい場合は、システムプロンプトなどでうまく調整することになりそうです。

現状ではSwarmのような単純なフレームワークで解決できることは少なく、開発者が明示的にワークフローを組みたくなるケースが多いと思います。

しかし今後LLMがより高性能になっていくと、Swarmのように単純なフレームワークでもタスクを解決できることが増えていくのかもしれません。

次回のご案内

以上、今回はOpenAIのSwarmをキャッチアップしました。

次回は「AIエージェントキャッチアップ #7 - Bolt.new」ということで、ブラウザで動作するフルスタックWeb開発エージェント「Bolt.new」がテーマです!

github.com

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!