[OpenAI]新しいマルチエージェンフレームワークSwarmを試してみた

LLM

はじめに

2024/11/11にOpenAIから新しいマルチエージェントフレームワークが発表されました。

業務でAssistants API(Swarmの前に公開されたマルチエージェントフレームワーク)を使用している身としては試さなければならないと思い、少しだけ触ってみようと思います。

基本的にReadmeを翻訳しつつ、実際にコードを実行してみます。

GitHub - openai/swarm: Educational framework exploring ergonomic, lightweight multi-agent orchestration. Managed by OpenAI Solution team.
Educational framework exploring ergonomic, lightweight multi-agent orchestration. Managed by OpenAI Solution team. - ope...

使用上の注意

Swarmは現在、マルチ・エージェント・システムの人間工学的インタフェースを探求するための実験的なサンプル・フレームワークです。本番環境での使用は想定していないため、公式なサポートはありません。(これは、私たちがPRや問題をレビューしないことも意味します!)

Swarmの主な目的は、Orchestrating Agentsで検討されたハンドオフとルーチンのパターンを紹介することです: ハンドオフとルーチンのクックブック。これは独立したライブラリではなく、主に教育目的です。

つまり、SwarmとはOrchestrating Agentsのアイデアをパッケージ化したもので、本番環境での使用は想定していないからサポートはしてないよ、ということらしいです。

Swarmの概要

Swarmは、エージェントの協調と実行を軽量で、高度に制御可能かつ簡単にテストできるようにすることに焦点を当てています。

これを実現するために、2つの基本的な抽象概念を使用しています。それが「エージェント」と「ハンドオフ」です。エージェントは指示やツールを含み、任意のタイミングで別のエージェントに会話を引き継ぐことができます。

これらの基本概念は、ツールやエージェントのネットワーク間で複雑な動作を表現するのに十分な強力さを持っており、急な学習曲線を避けながら、スケーラブルで現実的なソリューションを構築することができます。

つまりは、「エージェント」と「ハンドオフ」というアプローチでエージェントの協調、実行、制御、テストを簡単に行えることに焦点を当てているもののようです。

Swarm Agentsは、Assistants APIにおけるAssistantsとは関係がありません。名前が似ているのは便宜上のものであり、他の点では完全に無関係です。SwarmはChat Completions APIによって完全に動作しており、そのため、呼び出し間で状態を保持しないステートレスな仕組みです。

同じマルチエージェントフレームワークですが、SwarmとAssistants APIは関係がないようです。

なぜSwarmなのか

Swarmは、軽量でスケーラブル、かつ高いカスタマイズ性を持つデザインパターンを探求しています。Swarmに似たアプローチは、多くの独立した機能や指示を扱い、それを1つのプロンプトにエンコードするのが難しい状況に最も適しています。

Assistants APIは、完全にホスティングされたスレッドや組み込みのメモリ管理と情報取得機能を求める開発者にとっては素晴らしい選択肢です。一方で、Swarmはマルチエージェントのオーケストレーションに興味のある開発者に向けた教育的なリソースです。Swarmは(ほぼ)完全にクライアント上で動作し、Chat Completions APIのように呼び出し間で状態を保持しません。

Assistants APIはfile search機能でRAGが簡単に実装できるので、そういったものを求める開発者には向いている一方で、マルチエージェントのオーケストレーションに興味がある開発者はSwarmが向いているということのようです。

Example

OpenAI側が複数のユースケースを用意してくれていました。

/exampleにそれぞれのユースケースの資材が格納されています。

  • basic:セットアップ、関数呼び出し、ハンドオフ、コンテキスト変数といった基本的な要素のシンプルな例
  • triage_agent:適切なエージェントに引き継ぐための基本的なトリアージステップを設定するシンプルな例
  • weather_agent: 関数呼び出しのシンプルな例
  • airline: 航空会社の顧客サービスリクエストを処理するためのマルチエージェント設定
  • support_bot: ユーザーインターフェースエージェントと複数のツールを持つヘルプセンターエージェントを含むカスタマーサービスボット
  • personal_shopper: 販売や注文の返金をサポートできるパーソナルショッピングエージェント

付随資料

ここではマルチエージェントの動きを図式化しています。

  1. ユーザー : ニューヨークの天気は?
  2. Triage Assistant : Weather Assistantを呼び出す
  3. Weather Assistant : ニューヨークの天気を取得
  4. Weather Assistant : 回答を返却

というような流れのようです。

Assistants APIでは今回で言うところのTriage AssistantにWeather Assistantが答えを返却して、Triage Assistantがユーザーに回答を返却していました。

今回は呼び出される側のAssistantが回答を返却できるようですね。

実行準備

ここまでSwarmとは何かを見てきましたが、いよいよ実際に実行してみようと思います。その前に環境を構築しておきます。

仮想環境構築

直接インストールすると環境が汚れるのでAnacondaを使用して仮想環境を構築します。

また、Pythonのバージョンが3.10以上である必要があるため、Python3.10をインストールします。

$ conda create -n swarm python=3.10

仮想環境が構築できたら、仮想環境をアクティベイトします。

$ conda activate swarm

Swarmのインストール

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

Swarmの実行

今回は最も基本的な“basic”の中でもSwarmの重要な概念であるハンドオフに触れるためにagent_handoff.pyを実行していきます。

実行

dotenvを使用して環境変数を設定しています。OPENAI_API_KEYという名前で環境変数の設定が必要です。

from swarm import Swarm, Agent
from dotenv import load_dotenv

load_dotenv()

client = Swarm()

english_agent = Agent(
    name="English Agent",
    instructions="You only speak English.",
)

spanish_agent = Agent(
    name="Spanish Agent",
    instructions="You only speak Spanish.",
)


def transfer_to_spanish_agent():
    """Transfer spanish speaking users immediately."""
    return spanish_agent


english_agent.functions.append(transfer_to_spanish_agent)

messages = [{"role": "user", "content": "Hola. ¿Como estás?"}]
response = client.run(agent=english_agent, messages=messages)

print(response.messages[-1]["content"])
$ python agent_handoff.py

出力

¡Hola! Estoy bien, gracias. ¿Y tú, cómo estás?

スペイン語でenglish_agentに挨拶しても、きちんとスペイン語で帰ってきました。

ハンドオフとは

hand offとは日本語に翻訳すると「渡す」という意味です。ここではエージェント間の連携をhand offと言っているのだと思います。

hand offの肝は以下になります。

def transfer_to_spanish_agent():
    """Transfer spanish speaking users immediately."""
    return spanish_agent


english_agent.functions.append(transfer_to_spanish_agent)

spanish_agentと連携するためのtransfer_to_spanish_agent関数を定義してあげた後、english_agentに渡してあげています。そうすることでエージェント間の連携を図っているようです。

Assistants APIとの違い

Assistants APIではすべての会話はプロキシエージェントと呼ばれるエージェント間を仲介するエージェントが間を取り持ち、複数のエージェントの連携を行っていました。

一方Swarmではエージェントが、他のエージェントを呼ぶための関数を持ち、相互に連携を取るという流れのようです。

最後に

ここまでSwarmの概要とSwarmの重要なアプローチであるhand offについて見てきました。

プロキシエージェントを通さない、エージェント間の連携は新しいアプローチだったと思います。

まだまだ簡単な一例を実行しただけなので、引き続きSwarmを試してみたいと思います。

コメント

タイトルとURLをコピーしました