别再只玩ChatGPT了!手把手教你用AutoGen搭建你的第一个AI Agent(附完整代码)
别再只玩ChatGPT了!手把手教你用AutoGen搭建你的第一个AI Agent(附完整代码)
厌倦了和ChatGPT一问一答的单调交互?想体验真正能自主完成任务的智能助手?今天我们就用微软开源的AutoGen框架,从零开始构建一个能自动生成周报的AI Agent。这个实战教程将带你完整走过环境配置、多智能体对话设计、工具调用集成的全流程,最后你会得到一个可直接运行的Python代码示例。
1. 环境准备与AutoGen基础
在开始构建Agent之前,我们需要先搭建好开发环境。AutoGen作为一个多智能体对话框架,对Python环境有一定要求:
# 创建Python虚拟环境(推荐3.8+版本) python -m venv autogen_env source autogen_env/bin/activate # Linux/Mac # autogen_env\Scripts\activate # Windows # 安装核心依赖 pip install pyautogenAutoGen的核心概念是可对话智能体(Conversable Agent),每个智能体都有以下关键特性:
- 对话能力:可以发送和接收消息
- 行为定制:能定义消息处理逻辑
- 工具调用:可以执行代码、调用API等
- 记忆机制:保留对话历史上下文
下面是一个最简单的智能体交互示例:
from autogen import AssistantAgent, UserProxyAgent # 创建用户代理(代表人类用户) user_proxy = UserProxyAgent(name="User") # 创建AI助手 assistant = AssistantAgent( name="Assistant", llm_config={ "model": "gpt-4", # 指定使用的LLM "temperature": 0.7 } ) # 发起对话 user_proxy.initiate_chat( assistant, message="帮我写一份本周工作总结,重点突出项目进展" )2. 构建周报生成智能体系统
单一智能体的能力有限,我们将设计一个由三个智能体协作的系统:
- 用户代理(UserProxyAgent):代表人类用户,负责触发任务和最终确认
- 分析师(AnalystAgent):负责提取关键信息并结构化数据
- 撰写人(WriterAgent):负责将结构化数据转化为自然语言报告
2.1 配置多智能体协作流程
首先定义各智能体的具体角色和行为:
from autogen import AssistantAgent, UserProxyAgent # 用户代理配置 user_proxy = UserProxyAgent( name="User_Proxy", human_input_mode="TERMINATE", # 在关键节点请求用户确认 max_consecutive_auto_reply=5, code_execution_config={"work_dir": "reports"} ) # 数据分析师智能体 analyst = AssistantAgent( name="Analyst", llm_config={ "model": "gpt-4", "temperature": 0.3, # 降低创造性,提高准确性 "system_message": """你是一个专业的数据分析师。你的任务是: 1. 从用户输入中提取关键工作项 2. 按[项目名称、进展状态、关键成果、存在问题]结构化数据 3. 将结构化数据传递给报告撰写人""" } ) # 报告撰写智能体 writer = AssistantAgent( name="Report_Writer", llm_config={ "model": "gpt-4", "temperature": 0.7, "system_message": """你是一位专业的商业报告撰写人。你的职责是: 1. 接收分析师提供的结构化数据 2. 转化为专业的周报格式 3. 确保报告包含:本周总结、成果展示、问题分析、下周计划 4. 使用Markdown格式输出,重点内容加粗显示""" } )2.2 设置智能体协作关系
AutoGen支持定义智能体之间的通信流程。我们将建立一个顺序工作流:
用户代理 → 分析师 → 撰写人 → 用户代理# 注册智能体间的回复关系 def _is_analyst_done(last_message): return "STRUCTURED_DATA" in last_message def _is_writer_done(last_message): return "FINAL_REPORT" in last_message # 设置回复关系 user_proxy.register_reply( [analyst, writer], reply_func=lambda recipient, messages, sender, config: ( "continue" if not _is_writer_done(messages[-1]["content"]) else "terminate" ), position=0 ) analyst.register_reply( writer, reply_func=lambda recipient, messages, sender, config: ( "continue" if not _is_analyst_done(messages[-1]["content"]) else "terminate" ) )3. 增强智能体功能:工具调用与记忆
基础对话能力之外,我们还需要为智能体添加实用功能。
3.1 集成外部工具调用
让智能体能够查询日历API获取会议记录:
from datetime import datetime # 定义日历查询工具 def query_calendar(date=None): """模拟日历API查询""" date = date or datetime.now().strftime("%Y-%m-%d") # 这里应该是实际API调用,示例使用模拟数据 return { "meetings": [ { "title": "项目A进度评审", "time": "2023-11-15 14:00", "participants": ["张三", "李四"], "outcome": "确定了下阶段里程碑" } ] } # 将工具注册到智能体 analyst.update_toolkit( tools=[ { "name": "query_calendar", "description": "查询指定日期的会议记录", "function": query_calendar } ] )3.2 实现短期记忆机制
为智能体添加对话历史记忆功能:
from autogen.agentchat.contrib.capabilities import TransformMessages # 添加记忆转换能力 memory = TransformMessages( max_turns=10, # 记住最近10轮对话 transform=lambda msg: f"[记忆]{msg['name']}说:{msg['content']}" ) memory.add_to_agent(analyst) memory.add_to_agent(writer)4. 完整代码实现与优化技巧
现在我们将所有组件整合成一个完整的周报生成系统。
4.1 完整实现代码
# weekly_report_agent.py import os from datetime import datetime, timedelta from autogen import AssistantAgent, UserProxyAgent from autogen.agentchat.contrib.capabilities import TransformMessages # 1. 配置智能体 user_proxy = UserProxyAgent( name="User_Proxy", human_input_mode="TERMINATE", max_consecutive_auto_reply=3, code_execution_config={"work_dir": "reports"}, system_message="""你是人类用户的代理。你的职责是: 1. 向分析师提供本周工作要点 2. 对最终报告进行确认或提出修改意见""" ) analyst = AssistantAgent( name="Data_Analyst", llm_config={ "model": "gpt-4", "temperature": 0.3, "functions": [ { "name": "query_calendar", "description": "查询会议记录", "parameters": { "type": "object", "properties": { "date": { "type": "string", "description": "查询日期,格式YYYY-MM-DD" } }, "required": [] } } ] }, system_message="""你是数据分析师。请执行: 1. 从用户输入提取关键工作项 2. 调用query_calendar获取会议记录 3. 输出结构化数据: ```json { "projects": [ { "name": "项目名称", "progress": "进展状态", "achievements": ["成果1", "成果2"], "issues": ["问题1", "问题2"] } ], "meetings": [ { "title": "会议标题", "outcome": "会议成果" } ] } ```""" ) writer = AssistantAgent( name="Report_Writer", llm_config={ "model": "gpt-4", "temperature": 0.7 }, system_message="""你是专业报告撰写人。请: 1. 将结构化数据转化为周报 2. 格式: # 周报 - {日期} ## 本周工作总结 - **项目A**: 进展... - **关键成果**: ... ## 会议纪要 - {会议标题}: {成果} ## 存在问题 - {问题描述} ## 下周计划 1. 计划1 2. 计划2 3. 使用Markdown格式,重要内容加粗""" ) # 2. 添加记忆功能 memory = TransformMessages(max_turns=8) memory.add_to_agent(analyst) memory.add_to_agent(writer) # 3. 定义工具函数 def query_calendar(date=None): """模拟日历API查询""" date = date or datetime.now().strftime("%Y-%m-%d") return { "meetings": [ { "title": "项目评审", "outcome": "确定了最终设计方案" } ] } # 注册工具 analyst.register_function( function_map={ "query_calendar": query_calendar } ) # 4. 设置代理关系 def _is_analyst_done(last_message): return "```json" in last_message def _is_writer_done(last_message): return "# 周报" in last_message user_proxy.register_reply( [analyst, writer], reply_func=lambda recipient, messages, sender, config: ( "continue" if not _is_writer_done(messages[-1]["content"]) else "terminate" ), position=0 ) analyst.register_reply( writer, reply_func=lambda recipient, messages, sender, config: ( "continue" if not _is_analyst_done(messages[-1]["content"]) else "terminate" ) ) # 5. 启动对话 user_proxy.initiate_chat( analyst, message="""以下是我本周工作: - 完成了项目A的原型设计,已通过初审 - 项目B的API开发遇到第三方服务延迟问题 - 参加了3次团队会议,讨论了Q4规划 请生成本周工作报告""" )4.2 性能优化技巧
在实际使用中,我发现以下几个优化点能显著提升体验:
- 缓存机制:为重复查询添加本地缓存
from functools import lru_cache @lru_cache(maxsize=100) def query_calendar(date: str): # 实现同上- 异步处理:对耗时操作使用异步
import asyncio async def async_query_calendar(date: str): # 异步实现- 验证中间结果:添加数据校验步骤
from pydantic import BaseModel class ProjectData(BaseModel): name: str progress: str achievements: list[str] issues: list[str]5. 部署与进阶扩展
5.1 本地化部署方案
将智能体系统部署为本地服务:
# app.py from flask import Flask, request, jsonify from weekly_report_agent import user_proxy, analyst, writer app = Flask(__name__) @app.route('/generate_report', methods=['POST']) def generate_report(): task_desc = request.json.get('task') user_proxy.initiate_chat( analyst, message=task_desc, silent=True ) last_msg = user_proxy.last_message() return jsonify({"report": last_msg["content"]}) if __name__ == '__main__': app.run(port=5000)5.2 扩展为任务管理系统
将周报生成器升级为任务管理Agent:
- 添加任务数据库
import sqlite3 def init_db(): conn = sqlite3.connect('tasks.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, project TEXT, description TEXT, status TEXT)''') conn.commit() conn.close()- 创建任务管理智能体
task_manager = AssistantAgent( name="Task_Manager", llm_config={"model": "gpt-4"}, system_message="""你负责任务跟踪。请: 1. 从对话中识别任务项 2. 更新数据库 3. 生成任务状态报告""" )在实际项目中,这种多智能体协作模式比单一ChatGPT对话强大得多。例如,我们的周报生成系统可以:
- 自动关联JIRA等项目管理工具
- 智能识别工作优先级
- 生成可视化图表
- 支持多轮交互修改
遇到最多的问题是智能体间的通信协议不一致。解决方案是定义严格的消息格式规范,比如所有结构化数据必须包含"type"字段标识数据类型。另一个常见痛点是工具调用的可靠性,我们通过添加重试机制和备用方案来提升稳定性。
