别再只玩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" 字段标识数据类型。另一个常见痛点是工具调用的可靠性,我们通过添加重试机制和备用方案来提升稳定性。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐