Skip to content

AutoGenとMCP:強力なマルチエージェントシステムの構築

はじめに

人工知能が急速に発展する今日、大規模言語モデル(LLM)の応用は単純な対話システムから複雑なエージェントシステムへと発展しています。MicrosoftのAutoGenフレームワークは、強力なマルチエージェント構築ツールとして、この分野のイノベーションを牽引しています。本記事では、AutoGenフレームワークの重要なコンポーネントであるModel Context Protocol(MCP)について詳しく探求し、それを活用して強力なマルチエージェントシステムを構築する方法を紹介します。

AutoGenの紹介

AutoGenは、Microsoftが開発したオープンソースフレームワークで、大規模言語モデルベースのマルチエージェントシステムの構築プロセスを簡素化することを目的としています。柔軟なツールとAPIセットを提供し、開発者が相互協力可能なエージェントネットワークを作成できるようにします。各エージェントは特定のタスクを実行したり、特定の役割を果たしたりできます。

AutoGenの主要な利点:

  1. マルチエージェント協力:複数のエージェント間の複雑な相互作用と協力をサポート
  2. ツール使用能力:エージェントは様々なツールを使用して能力を拡張可能
  3. 柔軟な対話フロー:カスタム対話フローと制御ロジックをサポート
  4. 拡張性:新しいモデルとツールの統合が容易

MCP(Model Context Protocol)とは?

Model Context Protocol(MCP)は、AIモデルと外部ツールやサービスとの相互作用を統一することを目的とした開放標準です。AutoGenフレームワークにおいて、MCPはエージェントと外部ツールを接続する橋渡しの役割を果たします。

MCPの核心理念は、AIモデル(大規模言語モデルなど)が様々な外部サービスやツールと一貫した方法で相互作用できる標準化されたプロトコルを提供することです。これらのツールは、ローカルなコマンドラインツール、リモートAPIサービス、さらには他のAIシステムである可能性があります。

MCPの主要特性

  1. 標準化インターフェース:統一されたツール呼び出しと応答フォーマットを提供
  2. 複数の通信方式:標準入出力(STDIO)やServer-Sent Events(SSE)などの通信方式をサポート
  3. ツール発見メカニズム:利用可能なツールの動的発見と使用を可能にする
  4. セッション管理:ツール呼び出しのセッション状態の維持をサポート

AutoGenにおけるMCP実装

AutoGenフレームワークでは、MCPサポートはautogen_ext.tools.mcpモジュールによって提供されます。このモジュールは、開発者がMCP互換ツールをAutoGenエージェントに簡単に統合できる様々なコンポーネントを提供します。

核心コンポーネント

  1. McpWorkbench:MCPサーバーをラップし、サーバーが提供するツールのリストと呼び出しのインターフェースを提供
  2. StdioMcpToolAdapter:標準入出力を通じてMCPツールとの相互作用を可能にする
  3. SseMcpToolAdapter:Server-Sent Events(SSE)をサポートするMCPツールとのHTTP経由での相互作用を可能にする
  4. McpSessionActor:MCPサーバーとのセッションを管理

設定パラメータ

MCPツールアダプターは接続確立のために特定のサーバーパラメータが必要です:

  1. StdioServerParams:標準入出力を通じてMCPサーバーに接続するためのパラメータ

    • command:実行するコマンド
    • args:コマンド引数
    • env:環境変数
    • read_timeout_seconds:読み取りタイムアウト時間
  2. SseServerParams:HTTP/SSEを通じてMCPサーバーに接続するためのパラメータ

    • url:サーバーURL
    • headers:HTTPヘッダー情報
    • timeout:接続タイムアウト時間
    • sse_read_timeout:SSE読み取りタイムアウト時間

実際のケース:マルチソース情報検索システムの構築

以下では、実際のケースを通じて、AutoGenとMCPを使用して複数の情報源(GitHub、Jira、Confluence)から情報を検索できるシステムを構築する方法を示します。

システムアーキテクチャ

このシステムは3つの主要コンポーネントで構成されます:

  1. 検索エージェント:複数の情報源から関連情報を検索する責任
  2. 要約エージェント:検索された情報の処理と要約を担当
  3. ユーザープロキシ:ユーザーを代表して他のエージェントと相互作用

システムはMCPツールを使用してGitHubとAtlassian(JiraとConfluence)サービスに接続し、エージェントがこれらのプラットフォームの情報にアクセスできるようにします。

コード実装

python
from typing import Sequence
import os
import asyncio
from autogen_ext.tools.mcp import StdioServerParams, mcp_server_tools
from autogen_ext.models.openai import AzureOpenAIChatCompletionClient
from autogen_agentchat.messages import BaseAgentEvent, BaseChatMessage
from autogen_agentchat.agents import AssistantAgent, UserProxyAgent
from autogen_agentchat.teams import SelectorGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.ui import Console

def get_model_client() -> AzureOpenAIChatCompletionClient:
    return AzureOpenAIChatCompletionClient(
        azure_deployment=os.getenv("AZURE_OPENAI_MODEL_DEPLOYMENT"),
        api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
        azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
        api_key=os.getenv("AZURE_OPENAI_API_KEY"),
        model="gpt-4o"
    )

search_agent_prompt = """
ユーザーの質問に基づいて、提供されたツールを使用してJira、Confluence、Githubからできるだけ多くの関連情報を検索してください。
見つかった情報を処理やコメントなしで返してください。
情報が見つからない場合は、「申し訳ございませんが、この問題に関する関連情報を見つけることができませんでした。」と回答してください。
"""

summary_agent_prompt = """
あなたはAIアシスタントです。検索エージェントの応答に基づいて、ユーザーの質問に答えるのを手伝ってください。
"""

async def main() -> None:
    github_server_params = StdioServerParams(
            command="docker",
            args=[
                "run",
                "-i",
                "--rm",
                "-e",
                "GITHUB_PERSONAL_ACCESS_TOKEN",
                "-e",
                "GH_HOST",
                "ghcr.io/github/github-mcp-server"
            ],
            env={
                "GITHUB_PERSONAL_ACCESS_TOKEN": os.getenv("GITHUB_PERSONAL_ACCESS_TOKEN"),
                "GH_HOST": os.getenv("GH_HOST")
            }
    )
    github_tools = await mcp_server_tools(github_server_params)

    atl_server_params = StdioServerParams(
        command="uv",
        args=[
            'run',
            'mcp-atlassian',
            '-v',
            '--jira-url',
            os.getenv("JIRA_HOST"),
            '--jira-personal-token',
            os.getenv("JIRA_PERSONAL_TOKEN"),
            '--confluence-url',
            os.getenv("CONFLUENCE_HOST"),
            '--confluence-personal-token',
            os.getenv("CONFLUENCE_PERSONAL_TOKEN"),
        ],
    )

    atl_tools = await mcp_server_tools(atl_server_params)

    # 翻訳ツールを使用できるエージェントを作成
    search_agent = AssistantAgent(
        name="search_agent",
        model_client=get_model_client(),
        tools=github_tools + atl_tools,
        system_message=search_agent_prompt,
    )

    summary_agent = AssistantAgent(
        name="summary_agent",
        model_client=get_model_client(),
        system_message=summary_agent_prompt,
    )

    user_proxy = UserProxyAgent("user", input_func=input)

    # ユーザーが「Exit」と言った時に会話を終了する終了条件を作成
    termination = TextMentionTermination("Exit")

    def selector_func(messages: Sequence[BaseAgentEvent | BaseChatMessage]) -> str | None:
        if messages[-1].source == "user":
            return search_agent.name
        elif messages[-1].source == search_agent.name:
            return summary_agent.name
        elif messages[-1].source == summary_agent.name:
            return user_proxy.name
        return user_proxy.name

    team = SelectorGroupChat(
        [search_agent, summary_agent, user_proxy],
        model_client=get_model_client(),
        termination_condition=termination,
        selector_func=selector_func,
        allow_repeated_speaker=False,
    )

    task = "Marvinとは何ですか?"

    await Console(team.run_stream(task=task))

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

コード解析

  1. MCPサーバー設定

    • StdioServerParamsを使用してGitHubとAtlassian MCPサーバーを設定
    • 環境変数を通じて認証情報とサーバーアドレスを渡す
  2. ツール取得

    • mcp_server_tools関数を使用してMCPサーバーから利用可能なツールを取得
    • GitHubとAtlassianツールを一つのツールリストに統合
  3. エージェント作成

    • すべてのMCPツールを割り当てて検索エージェントを作成
    • 検索結果の処理を担当する要約エージェントを作成
    • ユーザー入力を処理するユーザープロキシを作成
  4. 対話フロー制御

    • selector_funcを使用してエージェント間の相互作用順序を定義
    • シンプルなワークフローを実装:ユーザー質問 → 検索エージェント検索 → 要約エージェント要約 → ユーザーに返答
  5. 終了条件

    • TextMentionTerminationを使用して会話終了条件を定義

MCPの高度な応用シナリオ

上記の例に加えて、MCPは様々な高度なシナリオに応用できます:

1. ファイルシステム操作

ファイルシステムMCPサーバーを使用して、エージェントはファイルの作成、読み取り、書き込みなどの操作を実行できます:

python
# ファイルシステムMCPサーバーパラメータの設定
desktop = str(Path.home() / "Desktop")
server_params = StdioServerParams(
    command="npx.cmd",
    args=["-y", "@modelcontextprotocol/server-filesystem", desktop]
)

# すべての利用可能なツールを取得
tools = await mcp_server_tools(server_params)

# これらのツールを使用できるエージェントを作成
agent = AssistantAgent(
    name="file_manager",
    model_client=OpenAIChatCompletionClient(model="gpt-4"),
    tools=tools,
)

2. Webコンテンツ取得

fetch MCPサーバーを使用して、エージェントはWebコンテンツを取得し処理できます:

python
# fetchツールを取得
fetch_mcp_server = StdioServerParams(command="uvx", args=["mcp-server-fetch"])
tools = await mcp_server_tools(fetch_mcp_server)

# fetchツールを使用できるエージェントを作成
agent = AssistantAgent(
    name="fetcher",
    model_client=OpenAIChatCompletionClient(model="gpt-4o"),
    tools=tools,
    reflect_on_tool_use=True
)

3. Webブラウザ自動化

Playwright MCPサーバーを使用して、エージェントはWebブラウザを制御し、複雑な相互作用を実行できます:

python
params = StdioServerParams(
    command="npx",
    args=["@playwright/mcp@latest"],
    read_timeout_seconds=60,
)

async with create_mcp_server_session(params) as session:
    await session.initialize()
    tools = await mcp_server_tools(server_params=params, session=session)

    agent = AssistantAgent(
        name="Assistant",
        model_client=model_client,
        tools=tools,
    )

MCPの利点と制限

利点

  1. 標準化インターフェース:統一されたツール呼び出し方式を提供し、統合プロセスを簡素化
  2. 多様なツールサポート:ローカルコマンドラインツールからリモートAPIサービスまで、様々なタイプのツールをサポート
  3. セッション管理:ツール呼び出しのセッション状態の維持をサポート、状態が必要なツール(ブラウザなど)に適用
  4. 拡張性:新しいツールとサービスの追加が容易

制限

  1. 外部サービスへの依存:外部MCPサーバーのサポートが必要
  2. 設定の複雑性:一部のツールの設定が複雑な場合がある
  3. パフォーマンスオーバーヘッド:プロセス間通信やネットワーク通信により追加の遅延が発生する可能性
  4. セキュリティ考慮事項:ツールの権限と認証情報の慎重な処理が必要

結論

AutoGenのMCPモジュールは、強力なマルチエージェントシステムの構築に重要なサポートを提供します。標準化されたツールインターフェースにより、開発者は様々な外部ツールとサービスをエージェントシステムに簡単に統合でき、エージェントの能力範囲を大幅に拡張できます。

簡単なファイル操作から複雑なWebブラウザ自動化まで、MCPはエージェントがより豊富な現実世界との相互作用を可能にします。この能力は、真に有用なAIアプリケーションの構築にとって重要です。なぜなら、AIシステムがユーザーの意図を理解するだけでなく、その意図を実現するための具体的な行動を取ることができるからです。

AutoGenとMCPの継続的な発展により、より多くの革新的なマルチエージェントアプリケーションが登場し、様々な分野でユーザーにより知的で効率的なサービスを提供することが期待されます。

参考リソース