当前位置: 首页 > news >正文

别再只玩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 pyautogen

AutoGen的核心概念是可对话智能体(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. 构建周报生成智能体系统

单一智能体的能力有限,我们将设计一个由三个智能体协作的系统:

  1. 用户代理(UserProxyAgent):代表人类用户,负责触发任务和最终确认
  2. 分析师(AnalystAgent):负责提取关键信息并结构化数据
  3. 撰写人(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 性能优化技巧

在实际使用中,我发现以下几个优化点能显著提升体验:

  1. 缓存机制:为重复查询添加本地缓存
from functools import lru_cache @lru_cache(maxsize=100) def query_calendar(date: str): # 实现同上
  1. 异步处理:对耗时操作使用异步
import asyncio async def async_query_calendar(date: str): # 异步实现
  1. 验证中间结果:添加数据校验步骤
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:

  1. 添加任务数据库
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()
  1. 创建任务管理智能体
task_manager = AssistantAgent( name="Task_Manager", llm_config={"model": "gpt-4"}, system_message="""你负责任务跟踪。请: 1. 从对话中识别任务项 2. 更新数据库 3. 生成任务状态报告""" )

在实际项目中,这种多智能体协作模式比单一ChatGPT对话强大得多。例如,我们的周报生成系统可以:

  • 自动关联JIRA等项目管理工具
  • 智能识别工作优先级
  • 生成可视化图表
  • 支持多轮交互修改

遇到最多的问题是智能体间的通信协议不一致。解决方案是定义严格的消息格式规范,比如所有结构化数据必须包含"type"字段标识数据类型。另一个常见痛点是工具调用的可靠性,我们通过添加重试机制和备用方案来提升稳定性。

http://www.jsqmd.com/news/947012/

相关文章:

  • 如何做微信投票链接,云帆投票小程序快速搭建教程 - 投票小程序
  • AI核心知识——蒸馏
  • ssm游戏美术外包管理信息系统(10152)
  • 别再只盯着M.2了!老设备升级4G上网,用MiniPCIe接口的4G模块真香(附AM400P实测)
  • 告别密码地狱:用Keycloak 18分钟搞定企业级单点登录与权限管理(Spring Boot实战)
  • 如何用PDFMathTranslate在30分钟内完成学术论文的精准翻译
  • OpenClaw ACPX 配置实战:打通 OpenCode 调用的上下文绑定关键路径
  • M2.7工程化落地:面向研发工程师的AI工作流闭环模型
  • 别再死磕OLED了!用STM32F103驱动HMI串口屏,5分钟搞定交互界面(附完整代码)
  • 手把手教你用Arduino UNO给ATmega168P烧录Bootloader(附USBasp备用方案)
  • EduCoder平台自动化运维小记:多账号签到与答案同步的实践与思考
  • 实战演练:基于快马AI构建高可靠kafka订单事件驱动微服务系统
  • CVE-2026-42945漏洞分析及复现
  • 告别串口打印:用STM32 HAL库+DS18B20做个OLED屏显温度计(Keil工程开源)
  • 树莓派新手必看:用手机热点替代电脑,户外也能玩转(附VNC配置)
  • 踩坑实录:poi-tl处理Word模板分页与图片时,我遇到的3个坑及解决方案
  • AI编程祛魅:从功能幻觉到零故障工作流的实战指南
  • 【Azure App Service】应用服务中的SNAT (Source Network Address Translation 源网络地址转化)
  • 【深入理解计算机系统】第一章(计算机系统漫游)笔记
  • 彻底理清 B+ 树页分裂与页合并对大批量写入 MySQL分库分表与分区表的设计抉择 数据时吞吐量的影响路径
  • ssm员工在线知识培训考试平台(10153)
  • 从Copilot到Agent:我的团队如何用ChatDev在3天内“自动化”了一个内部工具
  • AD软件大电流布线必备:一招把Top层铺铜“变成”阻焊开窗,告别焊盘锡量不足的烦恼
  • Python 爬虫进阶技巧:元数据 meta 标签提取辅助爬虫页面判重
  • 保姆级教程:在嵌入式Linux上实战I3C SDR模式的热加入与带内中断(附代码避坑)
  • 拆解Botsch经典算法:手写半边结构,一步步实现Isotropic Remeshing(附C++代码)
  • 深入GL3224固件升级工具:如何手动添加Flash芯片支持(以Winbond W25Q16为例)
  • NarratoAI完整教程:三步掌握AI视频解说制作神器
  • ESP8266从联网到传数据:一条AT指令搞定WiFi连接与TCP通信(实战避坑)
  • 用STM32F103C8T6搞定74HC165扩展16个按键(附完整代码和接线图)