「AIエージェントキャッチアップ #12 - Multi-Agent Orchestrator」を開催しました

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

「AIエージェントキャッチアップ #12 - Multi-Agent Orchestrator」という勉強会を開催しました。

generative-agents.connpass.com

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

youtube.com

Multi-Agent Orchestrator

今回は、AWSが公開したマルチエージェントフレームワーク「Multi-Agent Orchestrator」について、公式ドキュメントを読んだり動かしたりしてみました。

Multi-Agent OrchestratorのGitHubリポジトリはこちらです。

github.com

公式ドキュメントはこちらです。

awslabs.github.io

今回のポイント

Multi-Agent Orchestratorの概要

Multi-Agent Orchestratorの概要は、ドキュメントの「How it works」のページで説明されています。

awslabs.github.io

非常にシンプルなフレームワークで、以下のように動作します。

  1. ユーザーの入力を受け付ける
  2. 「Classifier」が複数のAgentから適したAgentを選択する
  3. 選択されたAgentが今までの会話履歴をもとに回答する

前回扱った「Magentic-One」とも少し似ていますが、より単純な挙動ということになります。

blog.generative-agents.co.jp

Quickstart

Quickstartのコードを試したところ、しっかり動作しました。

awslabs.github.io

Quickstartのコードの重要な箇所を抽出すると以下のようになります。

orchestrator = MultiAgentOrchestrator(
    options=OrchestratorConfig(
            :
    ),
)

tech_agent = BedrockLLMAgent(
    BedrockLLMAgentOptions(
        name="Tech Agent",
        streaming=True,
        description="Specializes in technology areas including software development, hardware, AI, \
  cybersecurity, blockchain, cloud computing, emerging tech innovations, and pricing/costs \
  related to technology products and services.",
        callbacks=BedrockLLMAgentCallbacks(),
    ),
)
orchestrator.add_agent(tech_agent)
    :
async def handle_request(
    _orchestrator: MultiAgentOrchestrator,
    _user_input: str,
    _user_id: str,
    _session_id: str,
):
    response: AgentResponse = await _orchestrator.route_request(
        _user_input,
        _user_id,
        _session_id,
    )
        :

簡単に言えば、以下のような使い方になります。

  1. MultiAgentOrchestratorを初期化
  2. 「BedrockLLMAgent」などのAgentをnameやdescription、toolなどを与えて初期化
  3. orchestrator.add_agentとしてAgentをOrchestratorに登録
  4. _orchestrator.route_requestのようにしてOrchestrator実行

個人的な感覚としては、このようなマルチエージェントフレームワークはよく見かけます。

Agent

Multi-Agent Orchestratorにおける「Agent」はかなり広い概念です。

BedrockのLLMやAgent機能を使ったり、AnthropicやOpenAIのAPIを使うこともできれば、LambdaやCustom Agentで任意の関数を実行することもできます。 LLMによる処理に限らず、ルールベースの処理なども自由に実装できるということです。

「ChainAgent」を使用すれば、Agentを連鎖的に呼び出すことも可能とのことです。

awslabs.github.io

Classifier

Multi-Agent Orchestratorにおいて、Agentを選択するのが「Classifier」です。

Quickstartのコードを実行すると、以下のようなログが表示されます。

You: プログラミング初心者にPythonについて説明して
INFO:multi_agent_orchestrator.utils.logger:
** CLASSIFIED INTENT **
INFO:multi_agent_orchestrator.utils.logger:=======================
INFO:multi_agent_orchestrator.utils.logger:> Text: プログラミング初心者にPythonについて説明して
INFO:multi_agent_orchestrator.utils.logger:> Selected Agent: Tech Agent
INFO:multi_agent_orchestrator.utils.logger:> Confidence: 0.95
INFO:multi_agent_orchestrator.utils.logger:
INFO:multi_agent_orchestrator.utils.logger:
** AGENT TECH-AGENT CHAT HISTORY **
INFO:multi_agent_orchestrator.utils.logger:===================================
INFO:multi_agent_orchestrator.utils.logger:> - None -
INFO:multi_agent_orchestrator.utils.logger:
はい、プログラミング初心者にPythonについて説明させていただきます。

Selected Agent: Tech Agentという出力から、「Tech Agent」が選択されたことが分かります。 また、Confidence: 0.95という出力から、確信度が0.95であることが分かります。

ClassifierとしてはデフォルトでClaude 3.5 SonnetのTool useが使われています。

ソースコードを参照すると、Tool useでAgentを選択し確信度(Confidence)を出力させていることが分かります。

        self.tools = [
            {
                                    :
                                "selected_agent": {
                                    "type": "string",
                                    "description": "The name of the selected agent",
                                },
                                "confidence": {
                                    "type": "number",
                                    "description": "Confidence level between 0 and 1",
                                },
                                    :

https://github.com/awslabs/multi-agent-orchestrator/blob/38ff0dc91590f9dd52728061e959498733367139/python/src/multi_agent_orchestrator/classifiers/bedrock_classifier.py#L41

LLMでAgentを選択するようなコードを書くときの定番で簡単な実装です。

Agent Overlap Analysis

ドキュメントを見ていて気になったのが「Agent Overlap Analysis」という機能です。

awslabs.github.io

複数のエージェントの役割が重複しないよう、Agentのdescriptionに対してTF-IDFのコサイン類似度を算出して分析するという機能です。

Classifierがエージェントを明確に選択できるようにするための機能と思われます。

残念ながらPython版にはこの機能はないようだったので動かしませんでしたが、他のフレームワークでもあまり見ない機能だったので面白かったです。

次回のご案内

以上、今回は「Multi-Agent Orchestrator」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #13 - Model Context Protocol (MCP)」ということで、Anthropicが公開した「Model Context Protocol (MCP)」がテーマです!

www.anthropic.com

generative-agents.connpass.com

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

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