こんにちは、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つの主要なコンポーネントで構成されます:
- MCP Host:LLMアプリケーション(AutoGenスタジオ等)
- MCP Client:ホストとサーバー間の通信を管理
- MCP Server:ツールやリソースを提供(S3、PostgreSQL、Slack等)
実践的ユースケース:EC AI客服システム
前述のECサイトの事例を基に、AutoGenとMCPの統合実装を詳しく見ていきましょう。このシステムでは、以下の3つの専門エージェントが协働します:
- Intent Agent:問い合わせ意図の分類とエスカレーション判断
- Product Agent:商品データベースへのRAG検索と推薦
- Order Agent:注文状況の照会・変更処理
# 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