🌆

AutoGenを使ったマルチエージェントシステムのコトハジメ

2025/01/17に公開

概要

本記事は、AutoGen(v0.4.0)を使用したおでかけガイドアプリの実装を紹介する記事となります。

※StableDiffusionで生成

背景

業務で生成AIエージェントを使ったQAシステムを開発しており、Anthropic社のBuilding effective agentsでいう『Routing』ワークフローを採用しています。

このワークフローですが、ユーザーからの質問に対して効果的なケースとそうでないケースがあります。

『Routing』ワークフローの問題点

『Routing』ワークフローではRouterと呼ばれるタスク振り分けエージェントと、複数のタスク特化型LLMエージェントから構成されます。

例1)

User:東京のおすすめのお出かけスポットを教えて

➡RouterがGo-outエージェント(お出かけスポットを紹介するエージェント)に振り分ける
➡Go-outエージェントからおすすめのスポットが回答される

Go-out Agent:浅草はいかがでしょうか?

例2)

User:明日の天気予報を教えて

➡RouterがWeatherエージェント(お天気情報を提供するエージェント)に振り分る
➡Weatherエージェントからおすすめのスポットが回答される

Weather Agent:明日の天気は、晴れです。

『Routing』を使えば、ユーザーの質問に対して幅広いジャンルの回答を提供できて確かに良さそうです。しかしながら、『Routing』ワークフローでは1つの質問につき、1つのエージェントからしか回答を得られないため、柔軟性に欠けるところがデメリットになりそうです(私個人の見解です)。

例えば、以下のような質問だとどうでしょうか?

例3)

User:2025/1/10に東京に出かけるんだけど、おすすめのスポットを教えて

上記の質問のように色々な条件が加わった場合、仮に2025/1/10の東京の天気が雨だとすると、Go-outエージェントから

Go-out Agent:上野動物園はいかがでしょうか?

と回答されたらどうでしょうか?雨なのに外で動物を見るのは少しツライですよね。。。

Orchestrator-workersワークフロー

上記の問題を解決するにはどうすれば良いでしょうか?Go-outエージェントとWeatherエージェントで互いの情報を共有して議論させ、最適解を提案するのがよいでしょう。

Building effective agentsでは、この問題に効果的なワークフローが提案されています。『Orchestrator-workers』というワークフローです。

『Routing』との違いは、Orchestratorが質問に応じてタスク特化型LLMエージェントを動的に複数決定し、Synthesizer各タスク特化型LLMエージェントから回答を合成する点です。

今回は、「AIエージェント同士で議論させて回答を合成し、質問に最適な回答を導く」ことを念頭に置いておきます。

『Orchestrator-workers』ワークフローを使えば、ユーザーからの複雑な質問に対しても回答が出来そうな気がします。

AutoGenでOrchestrator-workersワークフローを実装してみる

上記を実装してみましょう。実装にあたり、マルチエージェントフレームワークの1つであるAutoGenを使用してみます。

採用理由は、以下となります。

  • ネットで情報量が豊富であることと
  • OSSで無料
  • MITライセンスで商用利用しやすい
  • エンタープライズ規模でも安定稼働が期待できる

以下よりWindows11 PCでの実装手順を紹介します。
※前提として、Azure Open AIリソースが使えることを想定しております。Azure Open AIが使えない方は、ローカルLLMでの代用も可能です。

Pythonのインストール

2025/1/13時点では、AutoGenを動かすためには、Python 3.10 以降が必要です。
上記バージョン以降のPythonをWindowsにインストールしてください。
※今回はPython3.11をインストールしました。

AutoGenのインストール

VSCodeでPowerShellターミナルを起動して、任意のディレクトリにて以下のコマンドでPythonの仮想環境を作成・アクティベートします。

python -m venv .venv
.\.venv\Scripts\activate

続いて、pipでAutoGenとpython-dotenvをインストールします。

pip install -U "autogen-agentchat" "autogen-ext[openai,azure]"
pip install python-dotenv

LLMモデルのデプロイ

Azure AI Foundryにて、事前にモデルをデプロイしておきます。今回はgpt-4oをデプロイしました。

環境変数の設定

任意のディレクトリ内で、.envファイルを作成し、下記のように環境変数を定義します。
いずれもAzure OpenAIのリソースで確認できます。

AZURE_OPENAI_API_KEY=[YOUR_API_KEY]
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/

※あくまでデモ用として.envでAZURE_OPENAI_API_KEYを定義しています。本来であれば、Azure Key VaultのSecretsなどで定義するのがセキュリティ的に望ましいです。

Pythonコード

tourist_guide.py
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import TextMentionTermination, MaxMessageTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import AzureOpenAIChatCompletionClient
from dotenv import load_dotenv
import os
import asyncio

load_dotenv()

# 非同期関数を定義
async def main() -> None:
    # Azure OpenAI Chat Completion APIを使うためのクライアントを作成
    az_model_client = AzureOpenAIChatCompletionClient(
        azure_deployment="gpt-4o-2024-11-20",
        model="gpt-4o",
        api_version="2024-06-01",
        azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
        api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    )

    # weather_agentが使う天気データ
    weather_data = """
    日付,都道府県,天気,最高気温(℃),最低気温(℃),降水確率(%)
    2025-01-10,東京都,雨,8.4,5.3,90
    2025-01-10,神奈川県,曇り,9.1,5.8,70
    2025-01-10,埼玉県,雨,7.8,4.5,85
    2025-01-10,千葉県,曇り,9.3,6.0,75
    2025-01-10,茨城県,雨,7.5,4.2,80
    2025-01-10,栃木県,曇り,6.9,3.8,65
    2025-01-10,群馬県,曇り,6.7,3.5,60
    """

    # エージェントの定義
    host_agent = AssistantAgent(
        name="host_agent",
        model_client=az_model_client,
        system_message="あなたはミーティングの司会者です。各エージェントに議題を与えて議論させてください。\n" + weather_data,
    )

    weather_agent = AssistantAgent(
        name="weather_agent",
        model_client=az_model_client,
        system_message="あなたは関東の天気予報士です。都市名と日付から天気,最高気温(℃),最低気温(℃),降水確率(%)を教えます。教える際は、以下のcsv形式の予報データを使用してください。\n" + weather_data,
    )

    go_out_agent = AssistantAgent(
        "go_out_agent",
        model_client=az_model_client,
        system_message="あなたはおでかけガイドです。都市名からユーザーが快適に楽しめるお出かけスポットを教えます。",
    )

    # 会話の終了条件を定義
    termination = TextMentionTermination("TERMINATE") | MaxMessageTermination(10)

    # マルチエージェントのチームを定義
    group_chat = RoundRobinGroupChat([weather_agent, go_out_agent, host_agent], termination_condition=termination)

    # チームを実行
    stream = group_chat.run_stream(task="2025/1/10に東京に出かけるんだけど、おすすめのスポットを教えて")

    # チームの実行結果をコンソールに表示
    await Console(stream)

# 非同期関数を実行
if __name__ == "__main__":
    asyncio.run(main())

コードの解説

  1. AzureOpenAIChatCompletionClientを使用して、Azure OpenAI クライアントを設定します。
  2. AssistantAgentでAIエージェントを定義します。今回はweather_agentとgo_out_agentの他に、議論の司会進行役としてhost_agentも追加しています。weather_agentには、お天気情報をcsv形式でsystem_messageに加えています。
  3. TextMentionTerminationとMaxMessageTerminationを使用して、"TERMINATE"という単語が含まれるか、メッセージ数が10に達した場合に会話を終了します。
  4. RoundRobinGroupChatを使用して、マルチエージェントのチームを定義します。
  5. group_chat.run_stream()でチームを実行し、指定されたタスク(ここでは2025/1/10の東京のおすすめスポットを教える)を処理します。結果はコンソールに表示されます。

実行コマンド

python tourist_guide.py

実行結果

実行結果をみると、ちゃんとお天気情報をweather_agentから他のエージェントに共有され、AIエージェントたちが議論しておすすめスポットを導きだしてくれます。

さらには、host_agentが議論内容をまとめて、1日のお出かけプラン候補を提示してくれています。スゴイ!

---------- user ----------
2025/1/10に東京に出かけるんだけど、おすすめのスポットを教えて

---------- weather_agent ----------
2025年1月10日の東京都の天気は「雨」、最高気温は8.4℃、最低気温は5.3℃、降水確率は90%です。雨が降る可能性が高いので、屋内で楽しめるスポットがおすすめです。

以下は雨の日でも楽しめる東京のおすすめスポットです:

### 1. **美術館・博物館**
   - **国立新美術館(六本木)**
     雨の日もゆっくりアートを楽しめます。カフェやレストランも併設されているので、暖かい室内でリラックスできます。
   - **日本科学未来館(お台場)**
     科学技術に触れられるエンターテイメント満載の場。プラネタリウムもおすすめです。

### 2. **ショッピングモール**
   - **渋谷スクランブルスクエア(渋谷)**
     最新のショッピングやグルメを楽しむことができます。渋谷駅直結なので雨に濡れにくいのも利点。
   - **東京ミッドタウン(六本木)**
     おしゃれなショップやカフェ、美術館などが集結しており、1日中過ごせます。

### 3. **エンターテイメント施設**
   - **チームラボボーダレス(お台場)**
     雨でも楽しめる屋内型のデジタルアートミュージアム。幻想的な光の世界を体験できます。
   - **東京スカイツリータウン(押上)**
     展望台に登るもよし、足元の商業施設「ソラマチ」で買い物や食事を楽しむもよし。

### 4. **温泉・スパ**
   - **大江戸温泉物語(お台場)**
     雨の日でも快適に温泉を楽しめます。館内は浴衣で過ごせるので、リラックスした時間が過ごせます。

天気が雨で冷え込みますので、傘や防寒具を忘れずにお持ちください!
[Prompt tokens: 313, Completion tokens: 512]
---------- go_out_agent ----------
東京での楽しみ方が広がるお出かけスポット、以下もぜひご検討ください:

---

### 5. **グルメ&体験スポット**
   - **築地場外市場(築地)**  
     雨でもアーケードが覆っているので食べ歩きが楽しめます。新鮮な魚介を使った寿司や丼物は寒い日のご褒美にぴったりです。
   - **レストラン水族館「アクアリウムダイニング銀座ライム」(銀座)**  
     美しい水槽を眺めながらおしゃれな料理を堪能できるレストラン。非日常感が味わえます。

---

### 6. **カフェ巡り**
   - **青山の「A to Z Cafe」**  
     福岡出身の有名デザイナーが手がけた、アートとコーヒーが融合する空間でゆったり過ごすのがおすすめです。
   - **六本木「スターバックスリザーブロースタリー」**  
     コーヒー愛好者に最適な場所で、焙煎された香り豊かなコーヒーを楽しみましょう。

---

### 7. **雨でもアクティブに!スポーツ施設**
   - **ラウンドワンスタジアム(池袋)**
     カラオケ、ボウリング、ゲームセンターなど多彩なアクティビティが揃っています。
   - **TOKYO DOME CITY アトラクションズ(後楽園)**
     屋内で楽しめるアトラクションもあり、遊ぶ場所を選べば雨の日でも問題ありません。

---

### 8. **ホテルでの特別体験**
   - **アマン東京の「ラグジュアリースパ」**
     極上のスパ体験と繊細な和モダン空間に癒されること間違いなし。
   - **パークハイアット東京の「ニューヨークグリル&バー」**
     雨の日でも高層階からの眺望が楽しめるレストランで、贅沢なひとときをどうぞ。

---

1月ならではの冷たい雨の日には、暖かく快適な室内で過ごせるようなスポットが最適です。東京にはたくさんの屋内型施設が揃っているので、ぜひ計画に合わせて選んでみてください!   
[Prompt tokens: 588, Completion tokens: 587]
---------- host_agent ----------
素敵ですね!それでは、まとめとしておすすめスポットの一部をさらにピックアップしてプランの参考になりそうな候補を提示します:

---

### 【ゆっくりアート&カルチャーを堪能】
- **午前:国立新美術館(六本木)**でアート鑑賞
   六本木エリアでゆったりとした時間を過ごしつつ、カフェでブランチを楽しむのも良いですね。

---

### 【お台場で一日満喫プラン】
- **午後:日本科学未来館&チームラボボーダレス**
   科学やデジタルアートの不思議な世界に触れた後、大江戸温泉物語でリラックス。心も体も温まります。

---

### 【カジュアル&グルメな都心散策】
- **昼:築地場外市場でグルメ食べ歩き**
   築地の新鮮な海鮮や温かいおでん。それから途中で銀座に移動し、雨の日でも爽やかに楽しめるアクアリウム・レストランを訪れるのもおすすめです。

---

当日は雨なので、**移動が便利なルート**や、なるべく一箇所で長く楽しめる施設を選ぶと快適かもしれません!
[Prompt tokens: 1394, Completion tokens: 321]
---------- weather_agent ----------
以上のプランを参考に、2025年1月10日を楽しくお過ごしいただければ幸いです!
寒さと雨に備えて、暖かい服装と傘を忘れずにお出かけくださいね。素敵な東京での1日を! ☔🌈
[Prompt tokens: 1755, Completion tokens: 72]
---

当日は雨なので、**移動が便利なルート**や、なるべく一箇所で長く楽しめる施設を選ぶと快適かもしれません!
[Prompt tokens: 1394, Completion tokens: 321]
---------- weather_agent ----------
以上のプランを参考に、2025年1月10日を楽しくお過ごしいただければ幸いです!
寒さと雨に備えて、暖かい服装と傘を忘れずにお出かけくださいね。素敵な東京での1日を! ☔🌈
[Prompt tokens: 1755, Completion tokens: 72]

当日は雨なので、**移動が便利なルート**や、なるべく一箇所で長く楽しめる施設を選ぶと快適かもしれません!
[Prompt tokens: 1394, Completion tokens: 321]
---------- weather_agent ----------
以上のプランを参考に、2025年1月10日を楽しくお過ごしいただければ幸いです!
寒さと雨に備えて、暖かい服装と傘を忘れずにお出かけくださいね。素敵な東京での1日を! ☔🌈
[Prompt tokens: 1755, Completion tokens: 72]
[Prompt tokens: 1394, Completion tokens: 321]
---------- weather_agent ----------
以上のプランを参考に、2025年1月10日を楽しくお過ごしいただければ幸いです!
寒さと雨に備えて、暖かい服装と傘を忘れずにお出かけくださいね。素敵な東京での1日を! ☔🌈
[Prompt tokens: 1755, Completion tokens: 72]
---------- weather_agent ----------
以上のプランを参考に、2025年1月10日を楽しくお過ごしいただければ幸いです!
寒さと雨に備えて、暖かい服装と傘を忘れずにお出かけくださいね。素敵な東京での1日を! ☔🌈
[Prompt tokens: 1755, Completion tokens: 72]
---------- go_out_agent ----------
何か他にご質問やご要望があれば、ぜひお気軽にお聞かせください!東京での素敵な1日を全力でサポートします!😊
寒さと雨に備えて、暖かい服装と傘を忘れずにお出かけくださいね。素敵な東京での1日を! ☔🌈
[Prompt tokens: 1755, Completion tokens: 72]
---------- go_out_agent ----------
何か他にご質問やご要望があれば、ぜひお気軽にお聞かせください!東京での素敵な1日を全力でサポートします!😊
[Prompt tokens: 1590, Completion tokens: 42]
---------- go_out_agent ----------
何か他にご質問やご要望があれば、ぜひお気軽にお聞かせください!東京での素敵な1日を全力でサポートします!😊
[Prompt tokens: 1590, Completion tokens: 42]
---------- host_agent ----------
[Prompt tokens: 1590, Completion tokens: 42]
---------- host_agent ----------
---------- host_agent ----------
それでは、楽しいプランで素敵なひとときをお過ごしください!また何か気になることがあれば、いつでもご連絡くださいね。お気をつけて楽しんできてください!✨
[Prompt tokens: 1851, Completion tokens: 51]
---------- weather_agent ----------
良い1日をお過ごしください!🎉☔ お出かけの成功を祈っております。また何かありましたらいつでもお声がけくださいね!
[Prompt tokens: 1942, Completion tokens: 41]
---------- go_out_agent ----------
お気をつけて、楽しい東京の旅を!また何かお手伝いが必要であればお気軽にどうぞ😊 safe travels! 🚶‍♂️🌆
[Prompt tokens: 1746, Completion tokens: 41]
---------- host_agent ----------
楽しい東京デート、満喫してください!バッチリ準備して最高の1日をお過ごしくださいね!☔✨
[Prompt tokens: 2006, Completion tokens: 32]
---------- Summary ----------
Number of messages: 10
Finish reason: Maximum number of messages 10 reached, current message count: 10
Total prompt tokens: 13185
Total completion tokens: 1699
Duration: 63.44 seconds

所感

AutoGenのバージョンが0.2から0.4に上がったことにより、割とシンプルなコードで複数のAIエージェントを議論させて回答を導き出すことができています。

また今回はFunctionCallingを使いませんでしたが、FunctionCallingを実装することでAIエージェントが質問のケースに応じて必要なAPIを自動で呼び出し、取得したデータをもとに最適な回答をよしなにまとめてくれそうです。

自分は今回初めてマルチエージェントシステムを実装してみたのですが、ユーザーからの難しい質問に対しても十分に答えられるシステムが作れそうな予感を感じさせてくれました。

まさに「三人寄れば文殊の知恵」なシステムだなぁと思います。

ヘッドウォータース

Discussion