当前位置: 首页 > 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.rkmt.cn/news/1458513.html

相关文章:

  • OpenClaw ACPX 配置实战:打通 OpenCode 调用的上下文绑定关键路径
  • 别再只盯着M.2了!老设备升级4G上网,用MiniPCIe接口的4G模块真香(附AM400P实测)
  • 踩坑实录:poi-tl处理Word模板分页与图片时,我遇到的3个坑及解决方案
  • 【Azure App Service】应用服务中的SNAT (Source Network Address Translation 源网络地址转化)
  • 【深入理解计算机系统】第一章(计算机系统漫游)笔记
  • ssm员工在线知识培训考试平台(10153)
  • 从Copilot到Agent:我的团队如何用ChatDev在3天内“自动化”了一个内部工具
  • ESP8266从联网到传数据:一条AT指令搞定WiFi连接与TCP通信(实战避坑)
  • Android混合开发避坑指南:WebView与H5通信的5种姿势与安全实践
  • DDD-013:仓储(Repository)
  • 从Demo到量产:Davinci工程添加自定义模块与变体文件的完整指南(以BRS模块为例)
  • 企业级AI角色扮演对话系统
  • 钢材表面缺陷检测实战工程:含NEU-DET数据集与YOLOv5/v8多版本训练配置
  • 零基础如何学会Appium自动化测试
  • 用MATLAB复现DWA算法:从二维到三维,手把手教你搞定无人机避障路径规划
  • 保姆级教程:华为交换机DHCP地址池配置与查询全流程(含防IP冲突指南)
  • 别再死记硬背CSRF原理了!用Pikachu靶场实战Get/Post/Token三种攻击,手把手教你复现
  • Arduino读取FlySky接收机PWM信号:从硬件连接到代码实现
  • 别再到处找地图JSON了!手把手教你用ECharts-GL + 阿里云DataV下载并配置离线3D地图
  • WeChatExporter终极指南:3步永久保存你的微信聊天记录,告别数据丢失
  • Halcon region转图像踩坑实录:region_to_bin、region_to_label、region_to_mean到底怎么选?
  • 快手无水印下载终极指南:KS-Downloader完整使用教程
  • Python 爬虫分布式实战:Redis + 多进程爬虫实现分布式数据采集与任务分片
  • 从‘nvidia-smi’到跑通第一个CUDA核函数:给Python开发者的CentOS服务器GPU编程初体验
  • 自制Digispark开发板:从ATtiny85芯片到USB可编程硬件的完整实践
  • 别再只盯着GPS了!手把手教你用Arduino解析北斗/GPS模块的NMEA 0183数据(附完整代码)
  • 3步搞定Mac鼠标指针个性化:Mousecape完整使用指南
  • 告别玄学:给你的STM32 Bootloader跳转函数加个‘安全检查清单’(含代码详解)
  • 智能客服响应延迟骤降92%,企业AI工具整合避坑清单,仅剩最后87份内部文档模板
  • C++编写的BMP条形码定位与数字解码工具集(含预处理、频域增强与形态学操作)