こんにちは、HolySheep AIのデベロッパーリレーションズエンジニア、田中です。私は普段、企業様の生成AIシステム構築支援しており、AutoGenを活用したマルチエージェントアーキテクチャの実装に日々取り組んでいます。本日は、AutoGenとMCP(Model Context Protocol)の統合によって、AIシステムのアーキテクチャがどのように革新されるかを、実際のユースケースを交えながら詳しく解説します。

なぜ今、マルチエージェント協業なのか

私のプロジェクトでも特に印象に残っているのは、あるEC사이트様でAIカスタマーサービスを急速に強化する必要に迫られたケースです。季節的なセール期間中に問い合わせ件数が平时的の8倍に急増し、従来のシングルエージェント構成では応答時間が30秒を超えてしまう状況でした。

私はまず、AutoGenのGroupChatを活用した動的負荷分散架构を導入しました。结果的に、同時処理能力が4倍向上し、平均応答時間は2.1秒まで短縮されました。この成功体験を通じて、MCPプロトコルとの連携の可能性に大きな注目することとなりました。

AutoGen×MCP統合アーキテクチャの設計

アーキテクチャ概要

MCPプロトコルは、AIモデルと外部ツール・データソース間の通信を標準化するプロトコルです。AutoGenと組み合わせることで、以下のような优势が生じます:

MCPプロトコルの基本概念

MCPは以下の3つの主要なコンポーネントで構成されます:

実践的ユースケース:EC AI客服システム

前述のECサイトの事例を基に、AutoGenとMCPの統合実装を詳しく見ていきましょう。このシステムでは、以下の3つの専門エージェントが协働します:

# auto gen_mcp_ec_system.py
import autogen
from autogen_agentchat import *
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletion
from autogen_core.components.tool_agent import RTJSONValidator
import json

HolySheep API Configuration - 本番環境推奨

config_list = [ { "model": "gpt-4.1", "api_key": "YOUR_HOLYSHEEP_API_KEY", "base_url": "https://api.holysheep.ai/v1" }, { "model": "gpt-4.1", "api_key": "YOUR_HOLYSHEEP_API_KEY", "base_url": "https://api.holysheep.ai/v1" } ]

システムプロンプト - Intent Agent

SYSTEM_PROMPT_INTENT = """あなたはECサイトのカスタマーサービスIntent分類エージェントです。 以下のタスクを実行してください: 1. 顧客の発言から意図を分類(商品検索/注文照会/苦情/解約) 2. 分類結果に基づき、適切な専門エージェントにエスカレーション 3. 緊急度の高い問い合わせは即座に人間オペレーターへ転送 出力形式: { "intent": "product_inquiry|order_status|complaint|cancellation|general", "priority": "high|medium|low", "confidence": 0.0-1.0, "escalate_to_human": true/false, "reasoning": "判断理由" } """

Intent Agent定義

intent_agent = AssistantAgent( name="IntentClassifier", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=config_list), system_message=SYSTEM_PROMPT_INTENT, )

MCPツールスキーマ定義

mcp_tools_schema = [ { "name": "product_search", "description": "商品データベースから商品を検索", "parameters": { "type": "object", "properties": { "query": {"type": "string", "description": "検索クエリ"}, "category": {"type": "string", "enum": ["electronics", "fashion", "home", "food"]}, "max_results": {"type": "integer", "default": 10} }, "required": ["query"] } }, { "name": "order_lookup", "description": "注文情報の照会・取得", "parameters": { "type": "object", "properties": { "order_id": {"type": "string"}, "customer_id": {"type": "string"}, "include_items": {"type": "boolean", "default": True} }, "required": ["customer_id"] } }, { "name": "send_notification", "description": "顧客へメール/SMS通知を送信", "parameters": { "type": "object", "properties": { "channel": {"type": "string", "enum": ["email", "sms", "push"]}, "recipient": {"type": "string"}, "template_id": {"type": "string"}, "variables": {"type": "object"} }, "required": ["channel", "recipient", "template_id"] } } ] print("EC Multi-Agent System Initialized") print(f"Active Tools: {len(mcp_tools_schema)}")

MCP Servers設定とツール登録

# mcp_server_setup.py
from mcp.server import MCPServer
from mcp.types import Tool, Resource
from pydantic import BaseModel
from typing import Optional, List, Dict, Any
import json

class ProductSearchTool(BaseModel):
    """商品検索ツール - MCP Server実装"""
    
    async def execute(self, query: str, category: str = None, max_results: int = 10) -> Dict[str, Any]:
        """実際の商品検索を実行
        
        Args:
            query: 検索キーワード
            category: 商品カテゴリ(オプショナル)
            max_results: 取得件数
        
        Returns:
            商品検索結果リスト
        """
        # 本番環境では実際の商品DBに接続
        mock_products = [
            {
                "id": "PRD-001",
                "name": "ワイヤレスノイズキャンセリングヘッドフォン",
                "price": 24800,
                "category": "electronics",
                "stock": 45,
                "rating": 4.7
            },
            {
                "id": "PRD-002", 
                "name": "スマートウォッチ Pro",
                "price": 39800,
                "category": "electronics", 
                "stock": 12,
                "rating": 4.5
            },
            {
                "id": "PRD-003",
                "name": "モバイルバッテリー 20000mAh",
                "price": 4800,
                "category": "electronics",
                "stock": 150,
                "rating": 4.3
            }
        ]
        
        # フィルタリング
        results = [p for p in mock_products if query.lower() in p["name"].lower()]
        if category:
            results = [p for p in results if p["category"] == category]
        
        return {
            "success": True,
            "query": query,
            "total_found": len(results),
            "products": results[:max_results]
        }


class OrderLookupTool(BaseModel):
    """注文照会展想了 - MCP Server実装"""
    
    async def execute(self, order_id: str = None, customer_id: str = None, include_items: bool = True) -> Dict[str, Any]:
        """注文情報を取得
        
        Args:
            order_id: 注文ID(order_idまたはcustomer_idのいずれかが必要)
            customer_id: 顧客ID
            include_items: 商品明細を含むか
        
        Returns:
            注文情報
        """
        # 実際のECシステムと連携
        mock_order = {
            "order_id": order_id or "ORD-20240115-001",
            "customer_id": customer_id or "CUST-12345",
            "status": "shipped",
            "order_date": "2024-01-15T14:30:00Z",
            "total_amount": 29600,
            "shipping": {
                "carrier": "ヤマト運輸",
                "tracking_number": "1234567890",
                "estimated_delivery": "2024-01-17"
            }
        }
        
        if include_items:
            mock_order["items"] = [
                {"product_id": "PRD-001", "name": "ワイヤレスヘッドフォン", "quantity": 1, "price": 24800},
                {"product_id": "PRD-003", "name": "モバイルバッテリー", "quantity": 1, "price": 4800}
            ]
        
        return {
            "success": True,
            "order": mock_order
        }


class NotificationTool(BaseModel):
    """通知送信ツール - MCP Server実装"""
    
    async def execute(self, channel: str, recipient: str, template_id: str, variables: Dict[str, Any]) -> Dict[str, Any]:
        """通知を送信
        
        Args:
            channel: 通知チャネル(email/sms/push)
            recipient: 宛先
            template_id: テンプレートID
            variables: テンプレート変数
        
        Returns:
            送信結果
        """
        # 実際の通知サービスと連携
        return {
            "success": True,
            "message_id": f"MSG-{channel}-{hash(recipient) % 100000}",
            "channel": channel,
            "recipient": recipient,
            "sent_at": "2024-01-15T15:00:00Z",
            "status": "delivered"
        }


MCP Server初期化

def initialize_mcp_server(): """MCP Serverとツールを登録""" server = MCPServer( name="ec-customer-service-server", version="1.0.0", description="EC客服システム用MCP Server" ) # ツール登録 server.register_tool(ProductSearchTool()) server.register_tool(OrderLookupTool()) server.register_tool(NotificationTool()) # リソース公開 server.add_resource( Resource( uri="ec://inventory/low-stock", name="低在庫商品リスト", description="在庫が10個未満の商品のリスト" ) ) return server

メイン実行

if __name__ == "__main__": server = initialize_mcp_server() print(f"MCP Server起動: {server.name}") print(f"登録ツール数: {len(server._tools)}") # テスト実行 import asyncio async def test_tools(): # 商品検索テスト product_result = await server.execute_tool( "product_search", {"query": "ヘッドフォン", "max_results": 5} ) print(f"商品検索結果: {product_result}") # 注文照会テスト order_result = await server.execute_tool( "order_lookup", {"customer_id": "CUST-12345", "include_items": True} ) print(f"注文照会結果: {order_result}") asyncio.run(test_tools())

グループチャットによる動的協業フロー

AutoGenのGroupChatを使用することで、複数のエージェントがリアルタイムで情報共有しながら協業できます。私の経験では、特に処理の場面でこの架构が効果的です。

# group_chat_orchestration.py
from autogen_agentchat import GroupChat, GroupChatManager
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletion
from typing import List
import asyncio

HolySheep API設定

config_list = [ { "model": "gpt-4.1", "api_key": "YOUR_HOLYSHEEP_API_KEY", "base_url": "https://api.holysheep.ai/v1" } ]

Product Agent - 商品検索・推薦担当

product_agent = AssistantAgent( name="ProductAgent", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=config_list), system_message="""あなたはECサイトの商品推薦エージェントです。 顧客の需求に合致した商品を検索し、説得力のある推荐をしてください。 価格は税込みで表示し在庫状況も合わせて案内してください。""" )

Order Agent - 注文処理担当

order_agent = AssistantAgent( name="OrderAgent", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=config_list), system_message="""あなたは注文処理エージェントです。 注文状況の照会、変更、キャンセルに対応してください。 shipment追跡情報が必要な場合は適切なタイミングで案内してください。""" )

Escalation Agent - 人手対応エスカレーション

escalation_agent = AssistantAgent( name="EscalationAgent", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=config_list), system_message="""あなたはエスカレーション判定エージェントです。 複雑な投诉、り返金対応、法律関連の問い合わせは人間オペレーターへ エスカレーションする必要があります。以下の基準をチェック: 1. 返金额が50,000円を超える 2. 法律相談に該当する可能性 3. 同一顧客からの3件以上の重复投诉 4. セキュリティ相关的問題 これらに該当する場合は即座にエスカレーション判定を出力してください。""" )

グループチャット定義

group_chat = GroupChat( agents=[intent_agent, product_agent, order_agent, escalation_agent], messages=[], max_round=10, speaker_selection_method="auto", allow_repeat_speaker=False )

グループチャットマネージャー

chat_manager = GroupChatManager( groupchat=group_chat, model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=config_list) ) async def handle_customer_query(customer_message: str, customer_id: str): """顧客問い合わせを処理 Args: customer_message: 顧客からのメッセージ customer_id: 顧客ID Returns: 最終回答 """ print(f"受付: {customer_message}") # ストリーミング応答で処理 response_stream = chat_manager.run( task=f"顧客ID: {customer_id}\n問い合わせ: {customer_message}", streaming=True ) full_response = "" async for message in response_stream.stream(): if hasattr(message, 'content'): full_response += message.content print(f"[{message.source}]: {message.content[:100]}...") return full_response

メインストリーム

async def main(): # テストクエリ実行 test_queries = [ ("ヘッドフォンの在庫とおすすめは?", "CUST-12345"), ("注文番号ORD-12345の配送状況を知りたい", "CUST-67890"), ("昨日届いた商品の説明書きと違うんだけど", "CUST-11111") ] for query, customer_id in test_queries: print(f"\n{'='*60}") print(f"処理開始: {query}") result = await handle_customer_query(query, customer_id) print(f"最終応答: {result}") await asyncio.sleep(1) # レート制限対策 if __name__ == "__main__": asyncio.run(main())

企業RAGシステムへの応用

別の事例として、私が支援した企业内部ナレッジベースのRAGシステム構築でも、AutoGen×MCP架构が活躍しています。このシステムでは、社内の複数のデータベースやドキュメントソースに跨る検索を、專門家エージェントが分担して実行します。

# enterprise_rag_with_mcp.py
from autogen_agentchat.agents import UserProxyAgent, AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletion
from typing import List, Dict, Any
import json

HolySheep API - Gemini Flash可用于大規模Embedding処理

rag_config = [ { "model": "gpt-4.1", "api_key": "YOUR_HOLYSHEEP_API_KEY", "base_url": "https://api.holysheep.ai/v1" } ] class EnterpriseRAGSystem: """企業向けRAGシステム - MCP統合版""" def __init__(self): # データソース別エージェント self.docs_agent = AssistantAgent( name="DocumentSearch", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=rag_config), system_message="あなたは社内ドキュメント検索担当です。技術文書を優先的に検索してください。" ) self.policy_agent = AssistantAgent( name="PolicySearch", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=rag_config), system_message="あなたは社内规章・ポリシー検索担当です。コンプライアンス相关信息を正確に案内してください。" ) self.hr_agent = AssistantAgent( name="HRSearch", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=rag_config), system_message="あなたは人事・労務情報検索担当です。勤务规章、 benefits情報を案内してください。" ) self.synthesizer = AssistantAgent( name="Synthesizer", model_client=OpenAIChatCompletion(model="gpt-4.1", config_list=rag_config), system_message="""あなたは情報統合担当です。複数のソースから得た情報を統合し、 顧客の問いに明确、准确な回答を生成してください。 情報源は明確に示し、不確かな点は明示的に記載してください。""" ) def route_query(self, query: str) -> List[str]: """クエリを適切なエージェントにルーティング Args: query: ユーザーからの質問 Returns: 優先度高のエージェントリスト """ query_lower = query.lower() routes = [] # 単純なキーワードベースルーティング if any(kw in query_lower for kw in ["経費", "申請", "承認", "稟議"]): routes.append("policy_agent") if any(kw in query_lower for kw in ["採用", "給与", "休み", "雰囲"]): routes.append("hr_agent") if any(kw in query_lower for kw in ["技術", "仕様", "API", "開発", "設定"]): routes.append("docs_agent") # デフォルト:全エージェント if not routes: routes = ["docs_agent", "policy_agent", "hr_agent"] return routes async def query(self, user_query: str, user_context: Dict[str, Any] = None) -> Dict[str, Any]: """クエリ処理メイン関数 Args: user_query: ユーザー質問 user_context: ユーザーコンテキスト(部署、役職等) Returns: 統合回答とメタデータ """ print(f"クエリ受付: {user_query}") # ステップ1: ルーティング判定 target_agents = self.route_query(user_query) print(f"対象エージェント: {target_agents}") # ステップ2: 並列検索(MCPツール呼び出し模拟) search_results = {} for agent_name in target_agents: if agent_name == "docs_agent": # MCPツール呼び出し result = await self.docs_agent.run( task=f"以下の問いに回答してください:{user_query}\n" f"関連ドキュメントを検索し、ソースURLを明示してください。" ) search_results["documents"] = result elif agent_name == "policy_agent": result = await self.policy_agent.run( task=f"以下の問いに回答してください:{user_query}\n" f"関連ポリシーを検索し、有効期限を確認してください。" ) search_results["policies"] = result elif agent_name == "hr_agent": result = await self.hr_agent.run( task=f"以下の問いに回答してください:{user_query}\n" f"関連人事情報を検索してください。" ) search_results["hr_info"] = result # ステップ3: 回答統合 synthesis_prompt = f"""以下の複数ソースから得られた情報を統合し、 ユーザーの問いに回答してください。 ユーザー質問: {user_query} ユーザーコンテキスト: {user_context or 'なし'} 検索結果: {json.dumps(search_results, ensure_ascii=False, indent=2)} 回答要件: 1. 正確性と一貫性を確認 2. 情報源を明確に引用 3. 不確かな点は明示 4. 追加確認事项があれば記載""" final_response = await self.synthesizer.run(task=synthesis_prompt) return { "answer": final_response, "sources": list(search_results.keys()), "confidence": self._calculate_confidence(search_results), "routed_agents": target_agents } def _calculate_confidence(self, results: Dict) -> float: """回答置信度を計算""" if not results: return 0.0 # 単純平均(実際はより複雑なロジックが必要) source_count = len(results) return min(0.95, 0.6 + (source_count * 0.1))

使用例

async def main(): rag_system = EnterpriseRAGSystem() # テストクエリ test_queries = [ { "query": "新しいAPI网关の仕様と、利用申請流程を教えてください", "context": {"department