🤖 既然一个 AI 干不完活,那就雇一个“团队”吧:AutoGen 多智能体实战指南

关键词:AutoGen, Multi-Agent, 多智能体, AI 团队, 自动化工作流

大家好,我是飞哥!👋

上周我们讲了 LlamaIndex,它帮我们解决了“数据看不懂”的问题。
但这周,我们面临一个新的挑战:任务太复杂

试想一下,如果你让 ChatGPT 帮你“写一份特斯拉的行业研报,要有最新新闻,还要有股价趋势图,最后生成 PDF”。
大概率它会回复你一段文字,但既没有实时数据,也没有图表,更别提 PDF 了。

为什么? 🤯
因为这不仅是一个“问答任务”,而是一个“复合工作流”。它需要:搜索、阅读、写代码、画图、排版。
让一个 AI 模型(比如 GPT-4)同时扮演这么多角色,它很容易“精神分裂”。

💡 解决方案
如果一个实习生干不好,那就组建一个专家团队
这就是 Multi-Agent (多智能体) 的核心思想。今天我们要用的神器,就是微软开源的 AutoGen


1. 为什么你需要 AutoGen?(Why)

生动类比 🍎:

  • Single Agent (单体 AI) = 全能实习生 🎓。什么都懂一点,但让他独立负责一个大项目,容易顾此失彼,做着做着就跑题了。
  • Multi-Agent (AutoGen) = 正规军编制 💂‍♂️。
    • 项目经理 (Planner) 📅 负责拆解任务。
    • 情报员 (Data Fetcher) 🕵️‍♂️ 专门负责上网搜资料。
    • 绘图师 (Plotter) 🎨 专门负责画股价走势图。
    • 分析师 (Analyst) 🧠 专门负责深度分析。
    • 主笔 (Writer) ✍️ 专门负责写文章。
    • 校对员 (Proofreader) 🧐 负责检查质量。
    • 还有 用户代理 (UserProxy) 👮‍♂️ —— 也就是你(或者你的替身),负责最后拍板和执行代码。

核心价值
AutoGen 允许你定义这些角色,并且让它们在一个“微信群”里自动对话。你只需要发一句指令,它们就会自己开会、吵架(讨论)、干活,直到把任务完成。


2. 核心概念提炼 (Skeleton) 🦴

2.1 两个基本原子

在 AutoGen 的世界里,一切皆 Agent,但主要分为两类:

  1. UserProxyAgent (人类代理) 🧑‍💼:

    • 身份:代表“雇主”或“执行者”。
    • 特技能执行代码!当 AI 写出 Python 代码时,它负责运行并反馈结果。
    • 比喻:带枪的监工。
  2. AssistantAgent (AI 助理) 🤖:

    • 身份:基于 LLM 的智能体。
    • 特技能思考、能写代码
    • 比喻:聪明的打工人。

2.2 聊天模式 (GroupChat) 💬

如果不加控制,5 个 AI 在群里可能会乱说话。
所以我们需要 GroupChatManager(群管理员)。
它就像“主持人”,根据当前的聊天记录,决定下一个该谁发言


3. 准备工作:搭建舞台 🛠️

在开始指挥你的 AI 军团之前,我们需要先安装必要的“军需物资”。

3.1 安装依赖

打开终端,运行以下命令:

pip install "pyautogen<0.4" duckduckgo-search matplotlib pandas python-dotenv

依赖包大起底:

  • pyautogen:微软 AutoGen 的核心库,我们的“指挥部”,负责管理所有 Agent。
  • duckduckgo-search:免费的搜索引擎工具,不需要 API Key 就能让 AI 上网,是 Data Fetcher 的“千里眼”。
  • matplotlib:Python 最经典的绘图库,Plotter 用它来画股价走势图。
  • pandas:数据处理神器,相当于“Python 版的 Excel”。我们用它来读取和清洗下载下来的股票数据。

3.2 配置“军费” (DeepSeek Config)

AutoGen 支持 OpenAI 格式的 API。飞哥强烈推荐使用 DeepSeek (深度求索),不仅代码能力强悍,最重要的是国内直连、无需魔法,获取 Key 非常方便!

我们需要定义一个 llm_config 字典,它就像是发给 AI 的“聘书”。

import os

# 💡 飞哥提示:生产环境请使用环境变量,不要把 Key 硬编码在代码里!
# export DEEPSEEK_API_KEY="sk-..."
llm_config = {
    "model": "deepseek-chat",  # DeepSeek V3 (或使用 deepseek-coder)
    "api_key": os.environ.get("DEEPSEEK_API_KEY"),
    "base_url": "https://api.deepseek.com", # 关键:指向 DeepSeek 的服务器
}

4. 实战项目:全自动“行业研报生成团队” 🚀

我们要搭建一个包含 4 个 AI 的精英团队,完成一份关于“特斯拉股价”的研报。

4.1 团队架构图

AI 专家团

UserProxy\n管理员/执行者

GroupChatManager\n群聊主持人

Planner\n规划师

Data Fetcher\n情报员

Plotter\n绘图师

Analyst\n分析师

Writer\n主笔

Proofreader\n校对员

4.2 核心代码拆解

第一步:给 Data Fetcher 装备“武器” (联网搜索) 🔎

AI 自己是没法上网的,我们需要给它注册一个工具 (Tool)

# 定义搜索函数
def search_web(query: str) -> str:
    from duckduckgo_search import DDGS
    with DDGS() as ddgs:
        results = list(ddgs.text(query, max_results=5))
        return str(results)
第二步:定义 Plotter (绘图专家) 🖌️

为了保证图表能稳定生成,我们定义一个专门的 generate_chart 函数,并交给 Plotter 使用。

def generate_chart(ticker: str) -> str:
    # ... (省略具体绘图代码,使用 matplotlib) ...
    return "Chart saved to coding/chart.png"

plotter = AssistantAgent(
    name="Plotter",
    system_message="你是绘图师。调用 generate_chart 画图。",
    llm_config=llm_config,
)
第三步:定义 Analyst (大脑) 🧠

Analyst 不再需要自己写代码画图,而是专注于分析

analyst = AssistantAgent(
    name="Analyst",
    system_message="""你是资深金融分析师。
    根据 Data_Fetcher 提供的新闻和 Plotter 提供的图表数据摘要,进行深度分析。
    """,
    llm_config=llm_config,
)
第四步:组建群聊并开工 🗣️
# 拉群
groupchat = GroupChat(
    agents=[user_proxy, planner, fetcher, plotter, analyst, writer, proofreader],
    messages=[],
    max_round=20
)

4.3 完整代码 (Copy & Run) 📋

为了方便大家直接上手,我把上面的碎片代码整合成了一个完整的、可运行的脚本。
注意:这里配置了 DeepSeek API,并使用了 AutoGen 最新版 (v0.2+) 推荐的工具注册写法。

复制保存为 autogen_team.py,确保配置好环境变量 DEEPSEEK_API_KEY 后运行:

import os
import pandas as pd
import matplotlib.pyplot as plt
from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager, register_function
from duckduckgo_search import DDGS

# 1. 配置 LLM (DeepSeek)
llm_config = {
    "model": "deepseek-chat", 
    "api_key": os.environ.get("DEEPSEEK_API_KEY"),
    "base_url": "https://api.deepseek.com",
}

# 2. 定义工具函数
def search_web(query: str) -> str:
    """搜索互联网获取最新信息"""
    print(f"\n🔍 [搜索中] {query}...")
    with DDGS() as ddgs:
        results = list(ddgs.text(query, max_results=5))
        return str(results)

def generate_chart(ticker: str) -> str:
    """从 Stooq 获取数据并绘图"""
    print(f"\n🎨 [绘图] {ticker}...")
    try:
        # 使用 Stooq 数据源 (无需 Key)
        url = f"https://stooq.com/q/d/l/?s={ticker}.US&i=d"
        df = pd.read_csv(url, parse_dates=["Date"], index_col="Date")
        df = df.sort_index().tail(10) # 取最近10天
        
        # 确保工作目录存在
        work_dir = "coding"
        os.makedirs(work_dir, exist_ok=True)
        save_path = os.path.join(work_dir, "chart.png")

        plt.figure(figsize=(10, 6))
        plt.plot(df.index, df["Close"], marker="o")
        plt.title(f"{ticker} Stock Price")
        plt.grid(True)
        plt.savefig(save_path)
        plt.close()
        return f"Chart saved to {save_path}"
    except Exception as e:
        return f"Error: {e}"

# 3. 定义 Agents
user_proxy = UserProxyAgent(
    name="User_Proxy",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=10,
    is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
    code_execution_config={"work_dir": "coding", "use_docker": False},
)

planner = AssistantAgent(
    name="Planner",
    system_message="你是任务规划师。指挥 Fetcher 搜新闻 -> Plotter 画图 -> Analyst 分析 -> Writer 写报告 -> Proofreader 校对。校对通过后回复 TERMINATE。",
    llm_config=llm_config,
)

fetcher = AssistantAgent(
    name="Data_Fetcher",
    system_message="你是情报员。调用 search_web 搜新闻。",
    llm_config=llm_config,
)

plotter = AssistantAgent(
    name="Plotter",
    system_message="你是绘图师。调用 generate_chart 画图。",
    llm_config=llm_config,
)

analyst = AssistantAgent(
    name="Analyst",
    system_message="你是分析师。根据新闻和图表数据进行深度分析。",
    llm_config=llm_config,
)

writer = AssistantAgent(
    name="Writer",
    system_message="你是主笔。撰写 Markdown 报告,必须插入图片 ![Chart](chart.png)。",
    llm_config=llm_config,
)

proofreader = AssistantAgent(
    name="Proofreader",
    system_message="你是校对员。检查 Markdown 格式和图片引用。合格回复“校对通过”。",
    llm_config=llm_config,
)

# 4. 注册工具
register_function(search_web, caller=fetcher, executor=user_proxy, name="search_web", description="Search news")
register_function(generate_chart, caller=plotter, executor=user_proxy, name="generate_chart", description="Draw chart")

# 5. 组建团队
groupchat = GroupChat(
    agents=[user_proxy, planner, fetcher, plotter, analyst, writer, proofreader],
    messages=[],
    max_round=20
)
manager = GroupChatManager(groupchat=groupchat, llm_config=llm_config)

# 6. 开始任务
print("🚀 AI 团队已就位...")
user_proxy.initiate_chat(
    manager,
    message="分析 Tesla (TSLA) 最近一周的股价趋势和新闻,生成图表和中文简报。"
)

4.4 运行效果预览 🎬

当你运行这段代码时,你会看到控制台里发生神奇的一幕:

  1. Planner 跳出来说:“我们要分三步走:先搜新闻,再画图,最后写报告。”
  2. Data Fetcher 说:“收到,我调用 search_web 搜到了以下 5 条新闻…”
  3. Plotter 说:“正在调用 generate_chart 生成图表。”
    • (UserProxy 默默在后台运行了代码,生成了 chart.png)
  4. Analyst 说:“新闻和图表我都有了,我认为…”
  5. Writer 说:“根据分析,我写好了这篇报告…”
  6. Proofreader 说:“校对通过,报告完美。”
  7. UserProxy:任务结束。

5. 避坑指南 (Best Practices) ⚠️

  1. 模型智商很重要

    • AutoGen 极度依赖模型的指令遵循能力
    • DeepSeek V3 在代码生成和逻辑推理上表现优异,而且网络访问稳定,不用担心连不上 OpenAI 的问题。
    • 尽量避免使用小参数模型(如 7B 以下),否则 Agent 经常会忘记调用工具。
  2. 无限循环死局

    • 有时候两个 Agent 会互相客气:“你先请”,“不不你先请”。
    • 解决:在 System Message 里明确规定“终止条件”,比如“任务完成后回复 TERMINATE”。
  3. Docker 保护

    • 因为 UserProxy 会真正在你的电脑上执行代码(包括删除文件!)。
    • 生产环境务必开启 use_docker: True,把它们关在沙箱里。

6. 飞哥总结 📝

LlamaIndex 让我们拥有了“最强大脑”(知识库),而 AutoGen 让我们拥有了“三头六臂”(执行团队)。

现在的你,已经不是一个人在写代码了。你是一个AI 军团的指挥官

下期预告
团队有了,但怎么保证他们按公司规定的 SOP(标准作业程序)干活,而不是乱发挥?
下周我们将进入 LangGraph 的世界,学习如何构建有状态、可控的工作流

关注飞哥,带你从“写代码”进化到“设计智能体”!🚀

创作不易,记得👇关注飞哥👇 ,点赞、收藏哦~~,下篇见👋

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐