Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Amazon BedrockのMulti Agent Collaboration で高度なエージェント連携を実現

はじめに

最近OSSのLLMサービスが気になっているデータ分析エンジニアの木介です。
今回は2024年12月に発表された、Amazon Bedrockの「Multi Agent Collaboration」について実際にサンプルコードを動かしながら解説していきます。

aws.amazon.com

Multi Agent Collaborationとは

1. 概要

Multi Agent Collaborationとは、Amazon Bedrockが提供する新機能で、複数のAI Agentが協力してタスクをこなすことができる機能です。
AWS公式ブログにあったソーシャルメディアキャンペーンの例では以下のようなものが紹介されていました。

  1. ユーザーから受けたリクエストを、Supervisor Agentが受け取る。
  2. コンテンツ作成を専門とするAgentに投稿の作成を依頼する。
  3. エンゲージメント予測を専門とするAgentに投稿タイミングを依頼する。
  4. それぞれのAgentから得られた結果を統合したレスポンスをユーザーに返す。

Supervisor Agentが専門的なAgentにそれぞれタスクを割り振ることで、複数のAgentが協力した出力を生成可能となっています。


aws.amazon.com

2. 他Agentサービスとの比較

複数のAgentを扱うサービスにおいてMulti Agent Collaborationと類似するものとして、Multi Agent Orchestratorがあります。
以下の表にて、通常のAgent、Multi Agent CollaborationMulti Agent Orchestratorのそれぞれの特徴と適用範囲についてまとめました。

特徴 通常のAgent Multi Agent Collaboration Multi Agent Orchestrator
目的 1つのAgentがすべての処理を担当し、単純なタスクを完結させる。 複数のAgentが連携してタスクを分担し、複雑なタスクを効率的に処理する。 複数のAgentをまとめて管理し、最適なAgentにタスクを割り振る。
構造 単一のAgentがユーザーリクエストを受け取り、すべての処理を1つで完結させる。 管理Agentがタスクを分割し、それぞれのAgentに割り振り、結果を統合する。 管理役がリクエストを分析し、適切なAgentを選んでタスクを実行させる。
主な機能 1. 単純なタスク処理
2. 一貫した応答
1. 複数のAgentによる効率的な分業
2. 各Agentの専門性を活かした処理
1. リクエストに応じた柔軟なAgent選択
2. 動的なタスク割り振り
メリット 1. 単純で実装が容易
2. 小規模なタスクに適している
1. 複雑なタスクを効率的に処理可能
2. 各Agentの専門能力を最大限活用
1. シンプルな設計で追加や変更がしやすい
2. 幅広いタスクに柔軟に対応可能
デメリット 1. 1つのAgentですべて処理するためスケーラビリティが低い
2. 複雑なタスクには対応困難
1. Agent間の連携が必要で管理が難しい
2. 複雑なシステム設計を要する
1. Agent同士の協力が乏しく、複雑なタスクには向かない
2. 処理の多くを中央管理に依存する


github.com

Multi Agent Collaborationを用いることで通常のAgentやMulti Agent Orchestratorを用いた時と比較して、より複雑なタスクを扱うことが出来そうです。

サンプルシナリオを動かす

さて、では実際にMulti Agent Collaborationを使っていきましょう。
今回は以下のAWSの公式より、株式分析アシスタントを作成していきます。

github.com

1. 株式分析アシスタント概要

以下のような株式分析アシスタントを作成していきます。

サンプルコードを実行することで以下のような4つのAgentを作成していきます。

  1. Stock Analysis (Supervisor Agent)
    1. ユーザーからの株式情報を受け取り、株価データとニュースデータを分析。
    2. それぞれの専門Agentに処理を委任し、最終的なレポートを作成。
  2. Stock Data Researcher (株価データ研究Agent)
    1. 株価の履歴データを取得し、価格変動を分析。
    2. Lambdaを介してリアルタイムの市場データを取得。
  3. News Researcher (ニュース研究Agent)
    1. 指定されたティッカーの関連ニュースを取得し、センチメントやトレンドを分析。
    2. Lambdaを介してWeb検索APIを活用し、最新のニュースを収集。
  4. Financial Analyst (ファイナンシャルアナリスト)
    1. 株価分析とニュース分析の結果を統合し、投資判断を提供。
    2. 最終的なレコメンデーションを作成し、ユーザー向けのレポートを生成。

ユーザーから入力された株式の情報から、2~4のAgentがリクエストされた株式の情報について収集、解析を行い、それらを1のStock Analysis Agentが統合する形となっています。

2. 作成方法

Bedrock AgentでのMulti Agent Collaborationの作成は簡単で以下の設定のみとなっています。

  1. Multi Agent Collaborationで協力させたいAgentを作成する。
  2. Agentを統括するSupervisor Agentを以下の設定で作成する。
    1. Supervisor Agentを作成する際に以下の「Enable multi-agent collaboration」をオンにする。
    2. 以下の形でSupervisor Agentが統括するCollaborator Agentを設定する。

今回は以下のサンプルコードを実行することでboto3からの構築を行っています。

github.com

README通りに構築していきます。

1. 以下のコマンドを実行し、環境を構築する。

git clone https://github.com/awslabs/amazon-bedrock-agent-samples

cd amazon-bedrock-agent-samples

python3 -m venv .venv

source .venv/bin/activate

pip3 install -r src/requirements.txt

2. 以下のコマンドを実行し、サンプルのAgentを作成する。

python3 examples/multi_agent_collaboration/portfolio_assistant_agent/main.py --recreate_agents "true"

3. 以下のAgentがそれぞれ作成されます。


作成されたAgentの概要については以下の形となります。
Supervisor Agentとしてportfolio_assistant Agentを設定し、他のAgentをCollaborator Agentとして登録しています。

Stock Analysis (Supervisor Agent)
以下のコードを実行することでSupervisor Agentを作成しています。

        portfolio_assistant = SupervisorAgent.direct_create(
            "portfolio_assistant",
            role="Portfolio Assistant",
            goal="特定の潜在的な株式投資を分析し、一連の投資考慮事項を含むレポートを提供します",
            collaboration_type="SUPERVISOR",
            instructions="""
                     特定の銘柄の潜在的な株式投資を分析する熟練した専門家として行動します。
                     最近の株価の動向や株式に関する最近のニュースを理解するために調査を行います。
                     潜在的な投資家への配慮を盛り込んだ、よく書かれた、慎重に検討されたレポートを提出します。
                     アナリストの協力者を使って最終分析を行い、ニュースと株式データをアナリストに入力として渡します。
                     協力者を並行ではなく順番に使用します。
                     最終的な出力は全て日本語で回答してください。""",
            collaborator_agents=[
                {
                    "agent": "news_agent",
                    "instructions": """
                     特定の株に関するニュースを見つけるには、このコラボレーターを使用してください。""",
                },
                {
                    "agent": "stock_data_agent",
                    "instructions": """
                     特定の株式の価格履歴を検索するには、このコラボレーターを使用します。""",
                },
                {
                    "agent": "analyst_agent",
                    "instructions": """
                     このコラボレーターを使用して、生の調査を取得し、詳細なレポートと投資に関する考慮事項を作成します。""",
                },
            ],
            collaborator_objects=[news_agent, stock_data_agent, analyst_agent],
            guardrail=no_bitcoin_guardrail,
            llm="us.anthropic.claude-3-5-sonnet-20241022-v2:0",
            verbose=False,
        )

github.com

設定している項目としては以下のものになります。

  1. goal: Agent全体として期待している出力を設定する。
  2. instructions:Supervisor Agentへの指示を定義し、どのようにCollaborator Agentと協力していくかを設定する。
  3. collaborator_agents:各Collaborator Agentの設定を定義し、Supervisor AgentがCollaborator Agentを扱えるようにする。

AWSコンソール上でもportfolio_assistant AgentをSupervisor Agentとして設定し、ほかの3つのAgentをCollaborator Agentとして登録できていることがわかります。

また、プロンプトで以下の指示を与えて、他のCollaborator Agentと協力して渡された株式についての分析を行うように指示しています。
(本来は英語表記ですが、回答を日本語で行うためにプロンプトの修正を行っています。)
今回は順次実行を行うようにプロンプトで指定していますが、Collaborator Agentの並列での実行も可能となっています。

特定の銘柄の潜在的株式投資を分析する熟練した専門家として行動します。
最近の株価の動向や株式に関する最近のニュースを理解するために調査を行います。
潜在的な投資家への配慮を盛り込んだ、よく書かれた、慎重に検討されたレポートを提出します。
アナリストの協力者を使って最終分析を行い、ニュースと株式データをアナリストに入力として渡します。
協力者を並行ではなく順番に使用します。
最終的な出力は全て日本語で回答してください。

stock_data_agent (株価データ研究Agent)
以下の図のように、株式についての価格情報を取得するLambdaをアクショングループとして設定しています。
このアクショングループにより株式の価格情報を取得することが、このAgentの役割になります。

以下のコードを実行することで定義を行っています。
tool_defsで定義したパラメータをSupervisor Agentから渡されるプロンプトから抽出することで、株価情報を取得するように設定しています。

        # Define Stock Data Agent
        stock_data_agent = Agent.direct_create(
            name="stock_data_agent",
            role="財務データコレクター",
            goal="特定のティッカーの正確な株価傾向を取得します。",
            instructions="リアルタイムの財務データ抽出のスペシャリスト",
            tool_code=f"arn:aws:lambda:{region}:{account_id}:function:stock_data_lookup",
            tool_defs=[
                {  # lambda_layers: yfinance_layer.zip, numpy_layer.zip
                    "name": "stock_data_lookup",
                    "description": "指定された株価ティッカーの 1 か月の株価履歴を JSON 形式で取得します",
                    "parameters": {
                        "ticker": {
                            "description": "The ticker to retrieve price history for",
                            "type": "string",
                            "required": True,
                        }
                    },
                }
            ],
        )

github.com

news_agent (ニュース研究Agent)
以下の図のように、株式についてのニュースを検索し、取得するLambdaをアクショングループとして設定しています。
このアクショングループにより、株式関連のニュースを取得することが、このAgentの役割になります。

analyst_agent (ファイナンシャルアナリスト)
以下のプロンプトを与えて、入力された株式の価格情報とニュースから分析をおこなうように設定されています。

役割: 財務アナリスト、
目標: 株式の傾向と市場ニュースを分析して洞察を得る。
手順: 経験豊富なアナリストが戦略的な推奨事項を提供します。ニュース概要と株価概要を入力として受け取ります。
利用可能なツールがありません。自分自身の知識のみに頼ってください。

3. サンプルシナリオを動かしてみる

構築されたAgentを早速動かしていきましょう。
今回はAWS コンソール上から動かしていきます。

Supervisor Agentとして作成されたportfolio_assistant Agentから以下のリクエストでAmazonの株について聞いてみます。

リクエス

ticker:Amazon

回答

今回の場合ではおおよそ30秒程度で回答が返ってきました。
こちらの実行時間は実行するAgent依存になりますが、検索など時間のかかる処理を複数行うとそれだけ時間がかかる形となります。

また、以下の形でどのようにCollaborator Agentが処理を行っているかを確認することができます。
news_agent、stock_data_agent、analyst_agentがそれぞれ協力して質問に回答できていることがわかります。

Supervisor AgentからどのようにCollaborator Agentへ指令が行われているかを確認してみましょう。
以下のようにトレースステップから各Agentの挙動を確認することができます。

以下の形でCollaborator AgentがSupervisorAgentから渡されるプロンプトからパラメータを抽出できていることがわかります。

SupervisorAgentからCollaborator Agent(stock_data_agent)へのプロンプト

[{text=Please provide the price history for the stock with the ticker 'Amazon'.}]

Collaborator Agentが実行するアクショングループの入力

"invocationInput": [
{
"actionGroupInvocationInput": {
"actionGroupName": "actions_stock_data_agent",
"executionType": "LAMBDA",
"function": "stock_data_lookup",
"parameters": [
{
"name": "ticker",
"type": "string",
"value": "Amazon"
}
]
},
"invocationType": "ACTION_GROUP",
"traceId": "1f373c5c-12b9-4d07-8a24-1317d66f5115-0"
}
]

Supervisor Agentが与えられたリクエストに対して、Collaborator Agentにそれぞれタスクを割り振るといった流れを簡単に構築することができました。
こういった複数の専門的なAgentに分割してタスクを解決する際にMulti Agent Collaborationの力を発揮することが出来そうです。

まとめ

今回は2024年12月に発表されたAmazon BedrockのMulti Agent Collaborationについて解説を行いました。
特にBedrock Agentのみで専門的なAgentとそれを統括するSupervisor Agentまで構築できることが魅力的だと感じました。
様々なユースケースでの利用が考えられますので、今後もいろいろと試していきたいと思います。

Acroquest Technologyでは、キャリア採用を行っています。

  • Azure OpenAI/Amazon Bedrock等を使った生成AIソリューションの開発
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

www.wantedly.com