AutoGen:对话驱动的多Agent框架 微软研究院的AutoGen开创了"对话即协作"的Agent范式。与LangGraph的图驱动不同,AutoGen将多Agent协作建模为一组Agent之间的对话,每个Agent有独立的角色和能力。
核心架构 Agent类型体系 from autogen import ( ConversableAgent, AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager ) # AssistantAgent: AI助手,有系统消息定义角色 researcher = AssistantAgent( name="Researcher", system_message="""你是一位AI研究分析师。 职责: 1. 分析用户需求 2. 搜索和整理相关信息 3. 提供结构化的分析报告 约束: - 基于事实,不编造 - 注明信息来源 - 区分事实和推测 """, llm_config={"model": "gpt-4o", "temperature": 0.3}, tools=[web_search, knowledge_base_search] ) # UserProxyAgent: 用户代理,可以执行代码 user_proxy = UserProxyAgent( name="User", human_input_mode="NEVER", # 不等待人类输入 code_execution_config={ "work_dir": "workspace", "use_docker": True, # 安全执行环境 "timeout": 60 } ) 对话管理 class ConversationManager: def __init__(self): self.conversations = {} self.termination_conditions = [] def add_termination(self, condition): """添加对话终止条件""" self.termination_conditions.append(condition) def check_termination(self, messages): for condition in self.termination_conditions: if condition.check(messages): return True return False # 常见终止条件 class MaxRoundsTermination: def __init__(self, max_rounds=10): self.max_rounds = max_rounds def check(self, messages): return len(messages) >= self.max_rounds class KeywordTermination: def __init__(self, keywords): self.keywords = keywords def check(self, messages): if messages: return any(kw in messages[-1]["content"] for kw in self.keywords) return False 多Agent协作模式 模式1:顺序对话 def sequential_conversation(task): """Agent按顺序处理任务""" # Agent 1: 分析需求 analysis = analyst.generate(f"分析以下任务:{task}") # Agent 2: 编写代码 code = coder.generate(f"基于以下分析编写代码:{analysis}") # Agent 3: 审查代码 review = reviewer.generate(f"审查以下代码:{code}") # Agent 4: 优化代码 if "问题" in review: final_code = coder.generate(f"根据审查意见优化代码:{review}") else: final_code = code return final_code 模式2:群聊协作 def group_chat_collaboration(task): """多Agent群聊协作""" agents = [ UserProxyAgent(name="User", human_input_mode="NEVER"), AssistantAgent(name="Planner", system_message="负责制定计划"), AssistantAgent(name="Coder", system_message="负责编写代码"), AssistantAgent(name="Tester", system_message="负责测试"), AssistantAgent(name="Reviewer", system_message="负责审查") ] group_chat = GroupChat( agents=agents, messages=[], max_round=20, speaker_selection_method="auto" # 自动选择下一个发言者 ) manager = GroupChatManager( groupchat=group_chat, llm_config={"model": "gpt-4o"} ) agents[0].initiate_chat(manager, message=task) 模式3:嵌套对话 def nested_conversation(task): """Agent内部发起子对话""" # 主Agent处理任务 main_agent = AssistantAgent( name="Main", system_message="你是项目经理,可以委托子任务给其他Agent" ) # 当主Agent遇到需要深入研究的子问题时 # 它可以发起一个子对话 def research_subtask(subtask): researcher = AssistantAgent( name="Researcher", system_message="你是研究员,擅长信息检索" ) result = researcher.generate(f"研究:{subtask}") return result # 主Agent可以在处理过程中调用子对话 main_agent.register_function( function_map={"research": research_subtask} ) 代码执行环境 安全执行 class SafeCodeExecutor: def __init__(self): self.docker_config = { "image": "python:3.11-slim", "timeout": 60, "memory_limit": "512m", "cpu_limit": 1.0, "network": "none", # 禁止网络访问 } self.allowed_packages = [ "numpy", "pandas", "matplotlib", "scipy", "scikit-learn" ] def execute(self, code): # 1. 静态检查 issues = self._static_check(code) if issues: return {"error": "代码检查未通过", "issues": issues} # 2. Docker执行 result = self._docker_exec(code) return result def _static_check(self, code): """静态安全检查""" forbidden = [ "import os", "import subprocess", "import socket", "open(", "__import__", "eval(", "exec(" ] issues = [] for pattern in forbidden: if pattern in code: issues.append(f"禁止使用: {pattern}") return issues 代码执行反馈循环 def code_feedback_loop(agent, task, max_attempts=3): """代码编写-执行-修正的反馈循环""" for attempt in range(max_attempts): # Agent生成代码 code = agent.generate(f"任务:{task}\n尝试:{attempt+1}") # 执行代码 result = executor.execute(code) if result["success"]: return code, result["output"] # 反馈错误,让Agent修正 feedback = f""" 代码执行失败: 错误信息:{result['error']} 请修正代码。 """ task = task + "\n\n" + feedback return None, "达到最大尝试次数" 高级特性 Agent可序列化 def save_agent_state(agent, path): """保存Agent状态,支持恢复""" state = { "name": agent.name, "system_message": agent.system_message, "llm_config": agent.llm_config, "chat_history": agent.chat_messages, "registered_tools": list(agent.tools.keys()) } with open(path, 'w') as f: json.dump(state, f) def load_agent_state(path): """从文件恢复Agent""" with open(path) as f: state = json.load(f) agent = AssistantAgent( name=state["name"], system_message=state["system_message"], llm_config=state["llm_config"] ) agent.chat_messages = state["chat_history"] return agent 自定义Agent行为 class CustomAgent(ConversableAgent): def __init__(self, name, **kwargs): super().__init__(name, **kwargs) self.register_hook("process_message_before_send", self._preprocess) self.register_hook("process_message_after_receive", self._postprocess) def _preprocess(self, message): """发送前预处理""" # 添加时间戳 message["content"] = f"[{datetime.now()}] {message['content']}" return message def _postprocess(self, message): """接收后处理""" # 记录消息日志 self._log(message) return message def _log(self, message): """消息日志""" with open("agent_log.jsonl", 'a') as f: f.write(json.dumps({ "timestamp": datetime.now().isoformat(), "sender": message.get("from"), "content": message["content"][:200] }) + "\n") 实际案例:数据分析Agent def build_data_analysis_agent(): """构建数据分析Agent系统""" # 数据科学家Agent data_scientist = AssistantAgent( name="DataScientist", system_message="""你是数据科学家,负责: 1. 理解用户的数据分析需求 2. 编写Python代码进行数据分析 3. 解释分析结果 使用pandas, numpy, matplotlib进行数据分析。 确保代码包含异常处理和数据验证。 """, llm_config={"model": "gpt-4o"} ) # 代码执行Agent code_runner = UserProxyAgent( name="CodeRunner", human_input_mode="NEVER", code_execution_config={ "work_dir": "analysis_workspace", "use_docker": "python:3.11-slim" }, system_message="你负责执行代码并返回结果。不生成代码,只执行。" ) # 启动分析 code_runner.initiate_chat( data_scientist, message="""分析销售数据: 1. 读取 /data/sales.csv 2. 按月统计销售趋势 3. 找出Top 10产品 4. 生成可视化图表 5. 输出分析报告 """ ) AutoGen vs 其他框架 维度 AutoGen LangGraph CrewAI 核心范式 对话驱动 图驱动 角色驱动 代码执行 内置Docker 需自定义 需自定义 多Agent 原生支持 需手动编排 支持 状态管理 对话历史 检查点 任务上下文 适合场景 研究探索 生产系统 快速原型 结语 AutoGen将多Agent协作还原为最自然的形式——对话。它的优势在于代码执行能力和灵活的对话管理。劣势在于控制精度不如图驱动框架。对于需要多专家协作探索的研究型任务,AutoGen是最佳选择。对于需要精确控制执行流程的生产系统,LangGraph更合适。选择框架的关键是匹配你的任务特性。
...