第2課:Agent系統架構與設計模式
課程目標
- 理解Agent的基本概念和特性
- 掌握多Agent系統的設計模式
- 學習Agent通信協議和消息傳遞
- 實踐創建簡單的Agent框架
課程內容
2.1 Agent基礎概念
什么是Agent?
Agent是一個具有自主性、反應性、社會性和主動性的計算實體,能夠:
- 自主性:獨立運行,無需人工干預
- 反應性:對環境變化做出響應
- 社會性:與其他Agent協作
- 主動性:主動發起行動
Agent的核心組件
┌─────────────────────────────────────┐
│ Agent │
├─────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 感知層 │ │ 決策層 │ │
│ │ Perception │ │ Decision │ │
│ └─────────────┘ └─────────────┘ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 執行層 │ │ 通信層 │ │
│ │ Execution │ │ Communication│ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────┘
2.2 Agent設計模式
1. 主從模式(Master-Slave)
Master Agent│┌────┼────┐│ │ │
Slave1 Slave2 Slave3
- 特點:集中式控制,簡單易實現
- 適用場景:任務分解、并行處理
- 缺點:單點故障,擴展性差
2. 對等模式(Peer-to-Peer)
Agent1 ←→ Agent2? ?Agent3 ←→ Agent4
- 特點:分布式控制,高可用性
- 適用場景:協作任務、分布式計算
- 缺點:協調復雜,一致性難保證
3. 層次模式(Hierarchical)
Top Agent│┌────┼────┐│ │ │
Mid1 Mid2 Mid3│ │ │
┌─┼─┐ ┌─┼─┐ ┌─┼─┐
│ │ │ │ │ │ │ │ │
L1 L2 L3 L4 L5 L6 L7 L8
- 特點:分層管理,職責明確
- 適用場景:大型系統、組織管理
- 缺點:通信開銷大,響應延遲
4. 聯邦模式(Federated)
Federation Manager│┌────┼────┐│ │ │
Group1 Group2 Group3│ │ │
┌─┼─┐ ┌─┼─┐ ┌─┼─┐
│ │ │ │ │ │ │ │ │
A1 A2 A3 A4 A5 A6 A7 A8
- 特點:分組管理,靈活擴展
- 適用場景:多域協作、模塊化系統
- 缺點:管理復雜,跨組協調困難
2.3 Agent通信協議
消息傳遞模式
- 同步通信:請求-響應模式
- 異步通信:發布-訂閱模式
- 廣播通信:一對多模式
- 多播通信:多對多模式
通信協議設計
// 消息格式定義
const MessageType = {REQUEST: 'request',RESPONSE: 'response',NOTIFICATION: 'notification',ERROR: 'error'
};class AgentMessage {constructor(type, from, to, content, id = null) {this.type = type;this.from = from;this.to = to;this.content = content;this.id = id || this.generateId();this.timestamp = Date.now();}generateId() {return Math.random().toString(36).substr(2, 9);}
}
實踐項目
項目1:基礎Agent框架
// agent.js
class Agent {constructor(id, name, capabilities = []) {this.id = id;this.name = name;this.capabilities = capabilities;this.state = 'idle';this.messageQueue = [];this.messageHandlers = new Map();}// 發送消息async sendMessage(to, type, content) {const message = new AgentMessage(type, this.id, to, content);// 這里應該通過通信層發送console.log(`${this.name} 發送消息到 ${to}:`, message);return message;}// 接收消息receiveMessage(message) {this.messageQueue.push(message);this.processMessages();}// 處理消息async processMessages() {while (this.messageQueue.length > 0) {const message = this.messageQueue.shift();await this.handleMessage(message);}}// 消息處理async handleMessage(message) {const handler = this.messageHandlers.get(message.type);if (handler) {await handler(message);} else {console.log(`${this.name} 收到未知類型消息:`, message);}}// 注冊消息處理器onMessage(type, handler) {this.messageHandlers.set(type, handler);}// 執行能力async executeCapability(capability, params) {if (this.capabilities.includes(capability)) {console.log(`${this.name} 執行能力: ${capability}`, params);// 這里實現具體的能力邏輯return { success: true, result: `執行了 ${capability}` };} else {throw new Error(`Agent ${this.name} 不具備能力: ${capability}`);}}
}
項目2:多Agent協作系統
// multi-agent-system.js
class MultiAgentSystem {constructor() {this.agents = new Map();this.messageRouter = new MessageRouter();}// 注冊AgentregisterAgent(agent) {this.agents.set(agent.id, agent);this.messageRouter.registerAgent(agent);console.log(`Agent ${agent.name} 已注冊`);}// 啟動系統start() {console.log('多Agent系統已啟動');this.agents.forEach(agent => {agent.state = 'running';});}// 停止系統stop() {console.log('多Agent系統已停止');this.agents.forEach(agent => {agent.state = 'stopped';});}// 獲取AgentgetAgent(id) {return this.agents.get(id);}// 廣播消息broadcast(type, content, excludeId = null) {this.agents.forEach((agent, id) => {if (id !== excludeId) {agent.receiveMessage(new AgentMessage(type, 'system', id, content));}});}
}// 消息路由器
class MessageRouter {constructor() {this.routes = new Map();}registerAgent(agent) {this.routes.set(agent.id, agent);}routeMessage(message) {const targetAgent = this.routes.get(message.to);if (targetAgent) {targetAgent.receiveMessage(message);} else {console.error(`目標Agent不存在: ${message.to}`);}}
}
項目3:任務協作示例
// task-collaboration.js
class TaskCollaborationSystem extends MultiAgentSystem {constructor() {super();this.tasks = new Map();this.taskQueue = [];}// 創建任務createTask(taskId, description, requirements) {const task = {id: taskId,description,requirements,status: 'pending',assignedAgents: [],results: []};this.tasks.set(taskId, task);this.taskQueue.push(task);this.assignTasks();}// 分配任務assignTasks() {while (this.taskQueue.length > 0) {const task = this.taskQueue.shift();const availableAgents = this.findAvailableAgents(task.requirements);if (availableAgents.length > 0) {this.assignTaskToAgents(task, availableAgents);} else {// 沒有可用Agent,重新加入隊列this.taskQueue.push(task);break;}}}// 查找可用AgentfindAvailableAgents(requirements) {const available = [];this.agents.forEach(agent => {if (agent.state === 'idle' && requirements.every(req => agent.capabilities.includes(req))) {available.push(agent);}});return available;}// 分配任務給AgentassignTaskToAgents(task, agents) {task.assignedAgents = agents.map(agent => agent.id);task.status = 'in_progress';agents.forEach(agent => {agent.state = 'busy';agent.receiveMessage(new AgentMessage('task_assignment','system',agent.id,{ taskId: task.id, description: task.description }));});}// 處理任務完成handleTaskCompletion(agentId, taskId, result) {const task = this.tasks.get(taskId);if (task) {task.results.push({ agentId, result });// 檢查是否所有Agent都完成了任務if (task.results.length === task.assignedAgents.length) {task.status = 'completed';this.consolidateResults(task);}}}// 整合結果consolidateResults(task) {console.log(`任務 ${task.id} 已完成,結果:`, task.results);// 釋放Agenttask.assignedAgents.forEach(agentId => {const agent = this.getAgent(agentId);if (agent) {agent.state = 'idle';}});// 繼續處理隊列中的任務this.assignTasks();}
}
項目4:使用示例
// example.js
async function main() {// 創建多Agent系統const system = new TaskCollaborationSystem();// 創建不同類型的Agentconst dataAgent = new Agent('data-001', '數據分析Agent', ['data_analysis', 'statistics']);const reportAgent = new Agent('report-001', '報告生成Agent', ['report_generation', 'formatting']);const emailAgent = new Agent('email-001', '郵件發送Agent', ['email_sending', 'notification']);// 注冊Agentsystem.registerAgent(dataAgent);system.registerAgent(reportAgent);system.registerAgent(emailAgent);// 設置消息處理dataAgent.onMessage('task_assignment', async (message) => {console.log(`${dataAgent.name} 收到任務: ${message.content.description}`);// 模擬任務執行await new Promise(resolve => setTimeout(resolve, 2000));system.handleTaskCompletion(dataAgent.id, message.content.taskId, '數據分析完成');});reportAgent.onMessage('task_assignment', async (message) => {console.log(`${reportAgent.name} 收到任務: ${message.content.description}`);await new Promise(resolve => setTimeout(resolve, 1500));system.handleTaskCompletion(reportAgent.id, message.content.taskId, '報告生成完成');});emailAgent.onMessage('task_assignment', async (message) => {console.log(`${emailAgent.name} 收到任務: ${message.content.description}`);await new Promise(resolve => setTimeout(resolve, 1000));system.handleTaskCompletion(emailAgent.id, message.content.taskId, '郵件發送完成');});// 啟動系統system.start();// 創建任務system.createTask('task-001', '分析銷售數據并生成報告', ['data_analysis', 'report_generation']);system.createTask('task-002', '發送通知郵件', ['email_sending']);// 等待任務完成await new Promise(resolve => setTimeout(resolve, 5000));system.stop();
}main().catch(console.error);
課后練習
- 基礎練習:實現一個簡單的聊天Agent系統
- 進階練習:創建支持任務分解的協作系統
- 挑戰練習:實現動態Agent發現和注冊機制
學習資源
- 多Agent系統設計模式
- Agent通信協議標準
- 分布式系統設計
下節課預告
下一課我們將學習大模型集成與API設計,了解如何將大模型能力集成到Agent系統中。
學習時間建議:3-4小時
難度等級:???☆☆
實踐重點:Agent框架設計和多Agent協作