Microsoft AutoGen v0.4でマルチエージェントAIシステムを構築する:データ分析とコード生成を専門エージェントで自動化する

AI tutorial - IT technology blog
AI tutorial - IT technology blog

背景:なぜマルチエージェントAIシステムが必要なのか

タスクが複雑になると、シングルエージェント系はすぐに限界を迎えます。一つのLLMにデータパイプラインの設計、pandasコードの作成、バグのコードレビュー、そして最適化までを任せると、コンテキストウィンドウがすぐに埋まり、モデルが文脈を見失い、出力品質が低下していきます。マルチエージェントシステムはまさにこのボトルネックを解消するために生まれました。

Microsoft AutoGen v0.4はAIエージェント同士の連携方法を根本から再設計しています。以前のバージョンとは異なり、v0.4ではクリーンなイベント駆動アーキテクチャと、洗練されたAgentChat高レベルAPIが導入されています。各エージェントは固有の役割とシステムプロンプトを持ちます。チームコーディネーターが次の発言者を決定します。その結果は実際のエンジニアリングチームの働き方を模倣したものになります:一人が計画し、別の人がコードを書き、三人目がレビューする、という形です。

エージェントを連携させる方法を理解すると、シングルプロンプトの制約がなくなります。プロンプトではなくワークフローで考えるようになります。この思考の転換こそが、AIを活用した自動化を構築したい人にとってこのパターンを学ぶ価値がある理由です。

以下では具体的な実装を順を追って説明します:データ分析向けに構築した3エージェントチーム — Planner(計画担当)Data Analyst(データ分析担当)Code Reviewer(コードレビュー担当)です。最終的には、自分のプロジェクトに応用できる動作するシステムが手に入ります。

AutoGen v0.4のインストール

前提条件

開始する前に、以下が揃っていることを確認してください:

  • Python 3.10以上
  • OpenAI APIキー(Azure OpenAIやLM StudioなどOpenAI互換エンドポイントでも可)
  • ターミナルとpipの基本的な操作知識

まず仮想環境を作成します — 依存関係を分離してバージョン競合を防ぐためです:

python -m venv autogen-env
source autogen-env/bin/activate  # Windows: autogen-env\Scripts\activate

パッケージのインストール

AutoGen v0.4はモジュール式パッケージに分かれています。主要な2つが必要です:

pip install autogen-agentchat autogen-ext[openai]

インストールが成功したか確認します:

python -c "import autogen_agentchat; print(autogen_agentchat.__version__)"

0.4.xのようなバージョンが表示されるはずです。インポートエラーが出た場合は、仮想環境が有効化されているか確認してください。

APIキーの設定

APIキーは環境変数として保存します — スクリプトにハードコードするのは絶対に避けてください:

# Linux/macOS
export OPENAI_API_KEY="sk-your-key-here"

# Windows PowerShell
$env:OPENAI_API_KEY="sk-your-key-here"

エージェントチームの設定

ファイル名はmulti_agent.pyとします。以下の完全な実装はおよそ70行です — 一度で読み通せるほどコンパクトですが、実際のデータセットに対して実行できる完全なコードです。

ステップ1:モデルクライアントの設定

モデルクライアントは全エージェントがLLMを呼び出す際に使うものです。AutoGen v0.4ではこれを綺麗に抽象化しており、一度定義すれば全エージェントで共有できます:

import asyncio
import os
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient

# 共有モデルクライアント — 全エージェントが同じ設定を使用
model_client = OpenAIChatCompletionClient(
    model="gpt-4o-mini",
    api_key=os.environ["OPENAI_API_KEY"],
)

gpt-4o-miniを使うことでテスト中のコストを抑えられます。入力トークン100万件あたり約$0.15なので、数十回のテストワークフローを実行しても1ドルもかかりません。本番タスクで精度を高めたい場合はgpt-4oに切り替えてください。

ステップ2:専門エージェントの作成

各エージェントには役割を定義する専用のsystem_messageを設定します。役割定義が明確であるほど、出力品質が向上します:

# エージェント1:タスクを明確なステップに分解する
planner_agent = AssistantAgent(
    name="Planner",
    model_client=model_client,
    system_message="""あなたはプロジェクトプランナーです。
データ分析タスクが与えられたら、3〜5つの具体的なステップに分解してください。
各ステップを明確にリストアップしてください。コードは一切書かず、計画のみを提示してください。
最後に「Plan ready.」と述べて回答を終えてください。""",
)

# エージェント2:計画に基づいてPythonコードを書く
analyst_agent = AssistantAgent(
    name="DataAnalyst",
    model_client=model_client,
    system_message="""あなたはPythonコードを書くデータアナリストです。
計画を受け取り、pandas、numpy、またはmatplotlibを使って各ステップを実装してください。
各コードブロックが何をしているか説明するコメントを必ず含めてください。
最後に「Code ready.」と述べて回答を終えてください。""",
)

# エージェント3:コード品質をレビューして改善点を提案する
reviewer_agent = AssistantAgent(
    name="CodeReviewer",
    model_client=model_client,
    system_message="""あなたはシニアコードレビュアーです。
提供されたPythonコードについて以下の観点でレビューしてください:
- 正確性とロジックエラー
- コードの明確さと可読性
- 処理されていないエッジケース
具体的で実行可能なフィードバックを提供してください。
コードが問題なければ「APPROVED」と述べてセッションを終了してください。""",
)

ステップ3:チームの構築

RoundRobinGroupChatは会話を固定順序で回していきます — Planner → DataAnalyst → CodeReviewer — 終了条件が満たされるまでループします:

# レビュアーがAPPROVEDと言ったら停止
termination = TextMentionTermination("APPROVED")

# チームを構築 — エージェントは順番に発言する
team = RoundRobinGroupChat(
    participants=[planner_agent, analyst_agent, reviewer_agent],
    termination_condition=termination,
    max_turns=9,  # 安全上限:最大3ラウンド × 3エージェント
)

max_turnsの上限は、エージェントが終了キーワードに達しない場合に会話が無限ループするのを防ぎます。9ターンあれば Planner → Analyst → Reviewer の3サイクルを回せるので、このワークフローには通常十分です。

ステップ4:実際のタスクでチームを実行する

async def main():
    task = """
    以下のカラムを持つ売上トランザクションのCSVデータセットを分析してください:
    date(日付)、product_name(商品名)、quantity(数量)、unit_price(単価)、region(地域)。

    以下を計算してください:
    1. 地域別の総売上
    2. 数量ベースで上位5位の売れ筋商品
    3. 直近6ヶ月の月次売上トレンド
    4. これらの統計をまとめた印刷用サマリーレポートを生成する

    CSVファイルは現在のディレクトリに'sales_data.csv'という名前で存在すると仮定してください。
    """

    # Consoleは各エージェントの返答をリアルタイムでターミナルに表示する
    await Console(team.run_stream(task=task))

if __name__ == "__main__":
    asyncio.run(main())

ターミナルから実行します:

python multi_agent.py

動作確認とモニタリング

コンソール出力の読み方

Consoleラッパーは各エージェントのメッセージが届くとリアルタイムで表示します。次のようなラベル付きのセクションが見えます:

---------- Planner ----------
Step 1: pandasのread_csv()でCSVファイルを読み込む...
Step 2: 売上カラムを追加する(数量 × 単価)...
Step 3: 地域でグループ化して売上を合計する...
...
Plan ready.

---------- DataAnalyst ----------
import pandas as pd

# データの読み込みと前処理
df = pd.read_csv('sales_data.csv')
df['revenue'] = df['quantity'] * df['unit_price']
...
Code ready.

---------- CodeReviewer ----------
ロジックは正しいです。追加を推奨:if df.empty: raise ValueError
APPROVED

各セクションには、どのエージェントが発言しているかが明確に表示されます。あるエージェントが質の低い出力を生成した場合、ラベルを見れば、どのシステムメッセージを調整すべきかがすぐにわかります。

結果をプログラムで取得する

コンソールへの出力は開発中は問題ありません。本番環境に移行する際は、完全なメッセージ履歴を変数に格納しておくと、ログに残したり、保存したり、結果に基づいて後続のアクションをトリガーしたりできます:

async def main():
    task = "タスクをここに記述..."
    result = await team.run(task=task)

    for message in result.messages:
        print(f"[{message.source}] {message.content[:300]}")

    print(f"\n停止理由: {result.stop_reason}")
    print(f"総メッセージ数: {len(result.messages)}")

result.stop_reasonフィールドを見ると、実行が正常に終了した(終了条件が満たされた)のか、max_turnsの上限に達したのかがわかります — 何か問題が発生した際のアラートに役立ちます。

よくある問題と対処法

  • エージェントが止まらずにループし続ける:終了キーワードが出現していません。エージェントのシステムメッセージを確認し、適切なタイミングで正確なキーワードを言うよう明示的に指示してください。
  • レート制限エラーが発生する:テスト実行の間に遅延を追加する、max_turnsを減らす、または上位のAPIプランに切り替えてください。
  • エージェントが自分の役割を無視する:システムメッセージは指示的である必要があります。「コードを書けます」の代わりに「Pythonコードのみを書き、それ以外は何もしないでください」と記述してください。
  • 出力品質が安定しない:特に繊細な判断が求められるCodeReviewerエージェントについては、gpt-4o-miniからgpt-4oへのアップグレードを試してください。

スケールアップ:動的エージェント選択

3エージェントチームが安定して動作するようになったら、SelectorGroupChatを試してみましょう — 固定の順序ではなく、モデルが次に発言するエージェントを決定します:

from autogen_agentchat.teams import SelectorGroupChat

dynamic_team = SelectorGroupChat(
    participants=[planner_agent, analyst_agent, reviewer_agent],
    model_client=model_client,
    termination_condition=termination,
)

これはエージェント同士の責任範囲が重なっている場合や、次に発言すべきエージェントが直前のメッセージの文脈に依存する場合に有効です。このデータ分析パイプラインのような明確な逐次ワークフローには、RoundRobinGroupChatを使い続けることをお勧めします — 予測可能でデバッグが容易だからです。

ここまでで、計画・コーディング・レビューを自動的に行うマルチエージェントシステムが完成しました。次の自然なステップは、AutoGenのツール呼び出しサポートを使ってエージェントに実際のツール — ファイルI/O、Web検索、コード実行 — を持たせることです。そこまで到達すると、このアーキテクチャはおもちゃの域を超え、実際の本番ワークロードを処理できるシステムへと進化します。

Share: