| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- #!/usr/bin/env python3
- """
- 多Agent协作示例 - Agent间通信与任务分配
- =====================================
- 这个文件展示了多个Agent如何协作完成复杂任务,包含:
- 1. 任务分解与分配
- 2. Agent间结果传递
- 3. 结果聚合与整合
- 4. 协作工作流设计
- 运行方法:
- python examples/multi_agent.py
- """
- import os
- import sys
- import asyncio
- from typing import Dict, Any, List, Optional
- from datetime import datetime
- from dotenv import load_dotenv
- # 加载环境变量
- load_dotenv()
- try:
- from langchain_openai import ChatOpenAI
- from langchain_core.prompts import ChatPromptTemplate
- except ImportError as e:
- print(f"❌ 缺少依赖包: {e}")
- print("请运行: pip install langchain langchain-openai python-dotenv")
- sys.exit(1)
- class TaskResult:
- """任务结果类"""
- def __init__(self, agent_name: str, task_name: str, success: bool,
- result: Any = None, error: str = None):
- self.agent_name = agent_name
- self.task_name = task_name
- self.success = success
- self.result = result
- self.error = error
- self.timestamp = datetime.now()
- def to_dict(self) -> Dict[str, Any]:
- return {
- "agent": self.agent_name,
- "task": self.task_name,
- "success": self.success,
- "result": self.result,
- "error": self.error,
- "timestamp": self.timestamp.isoformat()
- }
- class BaseAgent:
- """基础Agent类"""
- def __init__(self, name: str, specialty: str):
- self.name = name
- self.specialty = specialty
- api_key = os.getenv('DEEPSEEK_API_KEY')
- if not api_key:
- raise ValueError("请在.env文件中设置DEEPSEEK_API_KEY")
- self.llm = ChatOpenAI(
- model="deepseek-chat",
- api_key=api_key,
- base_url="https://api.deepseek.com",
- temperature=0.1
- )
- self.completed_tasks = []
- async def execute_task(self, task_name: str, **kwargs) -> TaskResult:
- """执行任务的通用方法"""
- raise NotImplementedError("子类必须实现execute_task方法")
- def record_task(self, task_result: TaskResult):
- """记录完成的任务"""
- self.completed_tasks.append(task_result)
- class DataAnalyzerAgent(BaseAgent):
- """数据分析Agent"""
- def __init__(self):
- super().__init__("DataAnalyzer", "数据分析与统计")
- self.analysis_prompt = ChatPromptTemplate.from_messages([
- ("system", "你是一个专业的数据分析师,擅长发现数据中的模式和趋势。"),
- ("user", "请分析以下数据:\n\n{data}\n\n请提供关键发现和趋势分析。")
- ])
- async def execute_task(self, task_name: str, **kwargs) -> TaskResult:
- try:
- data = kwargs.get("data", "")
- chain = self.analysis_prompt | self.llm
- result = await chain.ainvoke({"data": data})
- task_result = TaskResult(
- agent_name=self.name,
- task_name=task_name,
- success=True,
- result=result.content
- )
- self.record_task(task_result)
- return task_result
- except Exception as e:
- task_result = TaskResult(
- agent_name=self.name,
- task_name=task_name,
- success=False,
- error=str(e)
- )
- self.record_task(task_result)
- return task_result
- class ReportGeneratorAgent(BaseAgent):
- """报告生成Agent"""
- def __init__(self):
- super().__init__("ReportGenerator", "报告撰写与格式化")
- self.report_prompt = ChatPromptTemplate.from_messages([
- ("system", "你是一个专业的报告撰写专家,擅长将分析结果整理成清晰的报告。"),
- ("user", "基于以下分析结果生成一份完整的分析报告:\n\n{analysis_result}\n\n请包含:执行摘要、详细分析、结论和建议。")
- ])
- async def execute_task(self, task_name: str, **kwargs) -> TaskResult:
- try:
- analysis_result = kwargs.get("analysis_result", "")
- chain = self.report_prompt | self.llm
- result = await chain.ainvoke({"analysis_result": analysis_result})
- task_result = TaskResult(
- agent_name=self.name,
- task_name=task_name,
- success=True,
- result=result.content
- )
- self.record_task(task_result)
- return task_result
- except Exception as e:
- task_result = TaskResult(
- agent_name=self.name,
- task_name=task_name,
- success=False,
- error=str(e)
- )
- self.record_task(task_result)
- return task_result
- class QualityCheckerAgent(BaseAgent):
- """质量检查Agent"""
- def __init__(self):
- super().__init__("QualityChecker", "质量评估与验证")
- self.quality_prompt = ChatPromptTemplate.from_messages([
- ("system", "你是一个严格的质量检查专家,负责评估分析结果的质量和准确性。"),
- ("user", "请检查以下分析报告的质量:\n\n{report}\n\n请评估:1)准确性 2)完整性 3)清晰度 4)实用性。给出评分(1-10)和改进建议。")
- ])
- async def execute_task(self, task_name: str, **kwargs) -> TaskResult:
- try:
- report = kwargs.get("report", "")
- chain = self.quality_prompt | self.llm
- result = await chain.ainvoke({"report": report})
- task_result = TaskResult(
- agent_name=self.name,
- task_name=task_name,
- success=True,
- result=result.content
- )
- self.record_task(task_result)
- return task_result
- except Exception as e:
- task_result = TaskResult(
- agent_name=self.name,
- task_name=task_name,
- success=False,
- error=str(e)
- )
- self.record_task(task_result)
- return task_result
- class MultiAgentSystem:
- """多Agent协作系统"""
- def __init__(self):
- self.agents = {
- "analyzer": DataAnalyzerAgent(),
- "reporter": ReportGeneratorAgent(),
- "checker": QualityCheckerAgent()
- }
- self.workflow_history = []
- def get_agent(self, agent_type: str) -> BaseAgent:
- """获取指定类型的Agent"""
- return self.agents.get(agent_type)
- async def execute_workflow(self, data: str) -> Dict[str, Any]:
- """
- 执行完整的工作流:
- 1. 数据分析
- 2. 报告生成
- 3. 质量检查
- """
- print("🚀 开始多Agent协作工作流")
- print(f"📊 输入数据: {data[:50]}...")
- workflow_start = datetime.now()
- results = {}
- try:
- # 步骤1: 数据分析
- print("\n1️⃣ 执行数据分析...")
- analyzer = self.get_agent("analyzer")
- analysis_result = await analyzer.execute_task("data_analysis", data=data)
- results["analysis"] = analysis_result.to_dict()
- if not analysis_result.success:
- raise Exception(f"数据分析失败: {analysis_result.error}")
- print("✅ 数据分析完成")
- # 步骤2: 报告生成
- print("\n2️⃣ 生成分析报告...")
- reporter = self.get_agent("reporter")
- report_result = await reporter.execute_task(
- "report_generation",
- analysis_result=analysis_result.result
- )
- results["report"] = report_result.to_dict()
- if not report_result.success:
- raise Exception(f"报告生成失败: {report_result.error}")
- print("✅ 报告生成完成")
- # 步骤3: 质量检查
- print("\n3️⃣ 执行质量检查...")
- checker = self.get_agent("checker")
- quality_result = await checker.execute_task(
- "quality_check",
- report=report_result.result
- )
- results["quality"] = quality_result.to_dict()
- if not quality_result.success:
- raise Exception(f"质量检查失败: {quality_result.error}")
- print("✅ 质量检查完成")
- # 记录成功的工作流
- workflow_end = datetime.now()
- workflow_record = {
- "success": True,
- "start_time": workflow_start.isoformat(),
- "end_time": workflow_end.isoformat(),
- "duration": (workflow_end - workflow_start).total_seconds(),
- "steps_completed": 3,
- "results": results
- }
- self.workflow_history.append(workflow_record)
- print(f"\n🎉 工作流执行成功!总耗时: {workflow_record['duration']:.2f}秒")
- return {
- "success": True,
- "workflow": workflow_record,
- "final_report": report_result.result,
- "quality_assessment": quality_result.result
- }
- except Exception as e:
- workflow_end = datetime.now()
- error_msg = str(e)
- workflow_record = {
- "success": False,
- "start_time": workflow_start.isoformat(),
- "end_time": workflow_end.isoformat(),
- "duration": (workflow_end - workflow_start).total_seconds(),
- "error": error_msg,
- "results": results
- }
- self.workflow_history.append(workflow_record)
- print(f"\n❌ 工作流执行失败: {error_msg}")
- return {
- "success": False,
- "error": error_msg,
- "workflow": workflow_record
- }
- def get_system_status(self) -> Dict[str, Any]:
- """获取系统状态"""
- agent_status = {}
- for agent_type, agent in self.agents.items():
- agent_status[agent_type] = {
- "name": agent.name,
- "specialty": agent.specialty,
- "tasks_completed": len(agent.completed_tasks)
- }
- return {
- "agents": agent_status,
- "total_workflows": len(self.workflow_history),
- "successful_workflows": sum(1 for w in self.workflow_history if w["success"]),
- "failed_workflows": sum(1 for w in self.workflow_history if not w["success"])
- }
- def create_sample_data() -> str:
- """创建示例数据"""
- data = """
- 销售数据分析:
- - 2024年第一季度总销售额:150万元
- - 各月销售额:1月45万、2月50万、3月55万
- - 主要产品:A产品(40%)、B产品(35%)、C产品(25%)
- - 客户数量:新增客户120个,回头客80个
- - 地区分布:华北35%、华东30%、华南20%、其他15%
- 趋势观察:
- - 销售额逐月上升,增长率约11%
- - A产品销售占比略有下降
- - 新客户获取率稳步提升
- """
- return data.strip()
- async def main():
- """主函数 - 演示多Agent协作"""
- print("🚀 多Agent协作示例 - Agent间通信与任务分配")
- print("=" * 70)
- try:
- # 创建多Agent系统
- system = MultiAgentSystem()
- # 显示系统状态
- status = system.get_system_status()
- print("🤖 系统初始化完成")
- print(f"📊 可用Agent: {len(status['agents'])}个")
- for agent_type, info in status['agents'].items():
- print(f" • {info['name']}: {info['specialty']}")
- # 准备测试数据
- sample_data = create_sample_data()
- print("\n📋 测试数据:")
- print(sample_data)
- print("-" * 50)
- # 执行协作工作流
- result = await system.execute_workflow(sample_data)
- if result["success"]:
- print("\n📄 最终分析报告:")
- report_preview = result["final_report"][:300] + "..." if len(result["final_report"]) > 300 else result["final_report"]
- print(report_preview)
- print("\n⭐ 质量评估:")
- quality_preview = result["quality_assessment"][:200] + "..." if len(result["quality_assessment"]) > 200 else result["quality_assessment"]
- print(quality_preview)
- # 显示系统最终状态
- final_status = system.get_system_status()
- print("\n📊 执行统计:")
- print(f"总工作流数: {final_status['total_workflows']}")
- print(f"成功执行: {final_status['successful_workflows']}")
- print(f"失败执行: {final_status['failed_workflows']}")
- for agent_type, info in final_status['agents'].items():
- print(f"{info['name']}完成任务数: {info['tasks_completed']}")
- else:
- print(f"❌ 执行失败: {result['error']}")
- print("\n🎉 多Agent协作示例完成!")
- print("\n💡 多Agent协作学习要点:")
- print("1. 任务分解: 将复杂任务拆分为多个专门步骤")
- print("2. Agent分工: 每个Agent负责特定的专业任务")
- print("3. 结果传递: Agent间通过TaskResult传递数据")
- print("4. 错误处理: 任何一个环节失败都会终止整个流程")
- print("5. 状态跟踪: 记录每个Agent的执行历史")
- print("6. 协作编排: 设计合理的执行顺序和依赖关系")
- print("\n📚 下一步学习:")
- print("- 查看项目中的CompleteAgentFlow实现")
- print("- 学习PRACTICE_GUIDE.md中的Phase 4和5")
- print("- 尝试添加新的Agent类型到协作系统中")
- except Exception as e:
- print(f"❌ 运行出错: {e}")
- print("\n🔧 故障排除:")
- print("1. 检查.env文件中的API密钥")
- print("2. 确认网络连接正常")
- print("3. 检查Agent初始化是否成功")
- if __name__ == "__main__":
- asyncio.run(main())
|