别再只玩ChatGPT了!手把手教你用AutoGen搭建你的第一个AI Agent(附完整代码)
本文详细介绍了如何使用微软开源的AutoGen框架构建一个能自动生成周报的AI Agent。通过多智能体协作设计、工具调用集成和记忆机制实现,读者可以快速掌握从环境配置到完整代码实现的全部流程,体验超越ChatGPT的人机交互新方式。
别再只玩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. 构建周报生成智能体系统
单一智能体的能力有限,我们将设计一个由三个智能体协作的系统:
- 用户代理(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" 字段标识数据类型。另一个常见痛点是工具调用的可靠性,我们通过添加重试机制和备用方案来提升稳定性。
更多推荐



所有评论(0)