微软刚开源的多智能体协作框架,我用3个实战案例彻底搞懂了AutoGen
为什么这个项目值得关注
在人工智能飞速发展的今天,单一AI助手的局限性越来越明显。当我们需要完成一个复杂的任务时,往往需要协调多个AI模型、多个工具,甚至多个人类参与者。传统的方式是将所有逻辑硬编码在一起,导致代码臃肿、难以维护,而且缺乏灵活性。
微软AutoGen的出现,正是为了解决这个痛点。它是一个专门为构建多智能体协作系统而生的开源框架,核心思想是通过自然语言对话来协调多个AI智能体,让它们像人类团队一样分工合作、互相补充。
AutoGen的核心优势体现在以下几个方面:
多智能体协作:AutoGen允许你创建多个具有不同角色和能力的AI智能体。这些智能体可以通过自然语言进行交流,共同解决复杂问题。比如,一个智能体负责数据分析,另一个负责代码编写,第三个负责结果验证。
人机协作:与传统自动化流程不同,AutoGen支持人类在关键环节参与决策。你可以设定规则让AI在遇到特定情况时暂停,等待人类确认后再继续执行。这种设计在需要高精度、高安全性的场景中尤为重要。
灵活的对话模式:框架支持多种对话模式,包括一对一、多对一、多对多等。你可以根据任务需求自由组合智能体之间的关系拓扑。
工具集成能力:AutoGen内置了代码执行、函数调用等工具支持。智能体可以直接执行Python代码、调用外部API,实现真正的自动化工作流。
降低开发门槛:相比从零构建多智能体系统,AutoGen提供了高层次的抽象和丰富的预置模板。你只需要关注业务逻辑,而不需要处理底层的通信和协调细节。
目前AutoGen已经在GitHub上获得了超过35000颗星,数千个开源项目基于它构建,覆盖了自动化办公、数据分析、智能客服、代码开发等多个领域。无论是个人开发者还是企业团队,都能从中受益。
环境搭建:快速入门AutoGen
在开始之前,我们需要先搭建好开发环境。AutoGen对Python版本有要求,建议使用Python 3.8及以上版本。
第一步:创建虚拟环境
打开终端,执行以下命令创建一个独立的Python虚拟环境:
python -m venv autogen-env
# 激活虚拟环境
# Linux/Mac系统
source autogen-env/bin/activate
# Windows系统
autogen-env\Scripts\activate
创建虚拟环境的好处是隔离项目依赖,避免不同项目之间的包冲突。如果你使用conda,也可以用conda create命令来创建环境。
第二步:安装AutoGen核心包
AutoGen的包结构经过调整,核心功能集中在autogen-agentchat包中:
pip install autogen-agentchat
对于需要使用代码执行功能的读者,还需要安装代码执行相关的依赖:
pip install "autogen-agentchat[anthropic]"
这里安装的是anthropic版本的包,它包含了更丰富的工具支持。如果你只需要基本的对话功能,可以不安装这个额外依赖。
第三步:配置API密钥
AutoGen支持多种大语言模型提供商,包括OpenAI、Azure OpenAI、Anthropic等。你可以选择自己方便的提供商进行配置:
import os
# OpenAI配置
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
# 如果使用Azure OpenAI服务
os.environ["AZURE_OPENAI_API_KEY"] = "your-azure-key"
os.environ["AZURE_OPENAI_API_VERSION"] = "2024-02-01"
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://your-resource.openai.azure.com"
建议将API密钥存储在环境变量中,而不是硬编码在代码里。这样既安全,也方便在不同环境间切换。
第四步:验证安装
安装完成后,我们来验证一下环境是否正确配置:
import autogen_agentchat
import autogen_agentchat.agents
print(f"AutoGen版本: {autogen_agentchat.__version__}")
# 尝试创建一个简单的助手实例
from autogen_agentchat.agents import AssistantAgent
test_agent = AssistantAgent(name="test", model_client=None)
print("环境配置成功!")
如果以上代码能够正常执行而没有报错,说明安装成功,可以开始后续的学习了。
IDE配置建议
推荐使用VS Code或PyCharm作为开发工具。这两个IDE都有良好的Python支持,包括代码补全、语法高亮、调试功能等。在调试AutoGen应用时,能够逐步执行代码、查看变量值会非常有用。
如果使用VS Code,记得安装Python扩展和Pylance扩展,它们能显著提升编码体验。对于较长的对话流程,开启Jupyter插件支持会让调试过程更加直观。
核心概念详解
深入了解AutoGen之前,我们需要先掌握几个核心概念。这些概念构成了整个框架的基础,理解它们是构建复杂应用的前提。
智能体(Agent)
智能体是AutoGen中最基本的执行单元。每个智能体都有自己独特的角色、能力和行为模式。在框架中,智能体被设计为可以接收消息、进行处理、生成响应的独立实体。
AutoGen提供了多种预置智能体类型:
AssistantAgent是最常用的通用助手类型。它基于大语言模型构建,能够理解自然语言指令并生成高质量的回复。你可以为它指定系统提示词,定义它的专业领域和行为风格。
UserProxyAgent模拟人类用户的行为。当需要人类输入或确认时,它就会派上用场。它可以自动回复用户消息,也支持暂停等待真实用户输入。
RetrievalAgent专门用于处理文档检索任务。它能从知识库中查找相关信息,为对话提供上下文支持。
CodeExecutorAgent负责执行代码。它可以运行Python代码,并将执行结果反馈给其他智能体。
消息(Message)
消息是智能体之间交流的媒介。在AutoGen中,消息有多种类型:
TextMessage用于传递文本内容,是最基础的消息类型。
ImageMessage用于传递图片数据,支持多模态交互。
ToolCallMessage用于传递工具调用请求,包含函数名和参数信息。
ToolResultMessage用于返回工具执行结果。
这些消息类型共同构成了智能体间的通信协议。通过合理地组合消息类型,你可以实现各种复杂的信息交换模式。
团队(Team)
团队是多个智能体的容器。AutoGen中的团队定义了一组智能体以及它们之间的协作规则。团队负责管理智能体的生命周期、协调消息传递、控制任务流程。
一个团队可以包含任意数量的智能体,每个智能体可以担任不同的角色。团队内部定义了消息如何流转——可以是线性的、树状的,或者更复杂的网络结构。
任务(Task)
任务是对话要完成的具体目标。通常在启动团队时指定初始任务,团队会根据任务协调各个智能体的工作,直到任务完成或达到终止条件。
任务可以是简单的单轮问答,也可以是复杂的多步骤流程。AutoGen会根据任务性质自动选择合适的处理策略。
终止条件(Termination Condition)
终止条件定义了什么时候认为任务已经完成。框架提供了多种内置终止条件:
TextMentionTermination当消息中包含特定文本时触发,比如用户说“完成”或“结束”。
MaxMessageTermination限制最大消息数,防止无限对话。
TokenUsageTermination根据Token消耗量来判断是否终止。
你也可以自定义终止条件,根据具体业务需求灵活控制对话何时结束。
实战案例一:智能代码审查助手
现在我们进入实战环节。第一个案例是构建一个智能代码审查助手,它能够自动分析代码并提供改进建议。这个场景在真实开发中非常实用,也是AutoGen多智能体协作的经典应用。
场景描述
我们的代码审查团队由三个角色组成:
代码分析Agent负责理解代码结构和逻辑,识别潜在问题。
审查报告Agent汇总分析结果,生成结构化的审查报告。
质量评估Agent对代码质量进行综合评分,并给出改进优先级。
完整代码实现
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.messages import TextMessage
from autogen import FunctionCall
# 定义代码分析Agent
code_analyst = AssistantAgent(
name="代码分析师",
model_client=model_client,
system_message="""你是一位资深的代码分析师,专精于代码可读性、
性能优化和安全漏洞检测。你的职责是深入分析代码,找出潜在问题,
并用专业的技术语言描述你的发现。"""
)
# 定义审查报告生成Agent
report_generator = AssistantAgent(
name="报告生成器",
model_client=model_client,
system_message="""你是一位技术文档专家,擅长将复杂的技术分析
转化为清晰易懂的报告格式。你会把代码分析的结果整理成结构化
的报告,包含问题描述、严重程度、修复建议等内容。"""
)
# 定义质量评估Agent
quality_scorer = AssistantAgent(
name="质量评估师",
model_client=model_client,
system_message="""你是一位代码质量专家,负责对代码进行综合评分。
你会从可读性、可维护性、性能、安全性等维度评估代码质量,
给出0-10的评分,并列出需要优先处理的Top 3问题。"""
)
# 定义终止条件
termination = TextMentionTermination("审查完成")
# 创建团队
code_review_team = RoundRobinGroupChat(
participants=[code_analyst, report_generator, quality_scorer],
termination_condition=termination
)
# 待审查的示例代码
sample_code = '''
def process_user_data(data):
result = []
for item in data:
# 潜在的安全问题:直接使用用户输入
exec("processed = " + item["value"])
result.append(processed)
return result
'''
# 启动审查流程
async def run_review():
task = f"请审查以下Python代码:\n\n{sample_code}\n\n请按照以下步骤进行:\n1. 代码分析师进行深入分析\n2. 报告生成器整理审查报告\n3. 质量评估师给出综合评分\n4. 最后输出'审查完成'"
async for message in code_review_team.run(task=task):
if isinstance(message, TextMessage):
print(f"\n{'='*60}")
print(f"【{message.source}】说:")
print(message.content)
print('='*60)
# 执行审查
import asyncio
asyncio.run(run_review())
运行结果解读
当上述代码执行后,你会看到一个完整的协作审查流程:
首先,代码分析师会指出exec函数的安全风险,建议使用ast.literal_eval或json.loads替代。它还会指出循环中没有错误处理机制,以及类型注解缺失等问题。
接着,报告生成器会将这些发现整理成结构化格式,包含问题标题、描述、代码位置、影响范围、建议方案等字段。
最后,质量评估师会给出一个综合评分,比如“可维护性5分,安全性3分,总体质量4分”,并列出需要立即修复的安全漏洞作为Top 1优先项。
整个过程完全自动完成,不需要人工干预。如果你需要人类参与确认关键决策,只需要在团队配置中添加一个UserProxyAgent并设置适当的暂停条件即可。
案例延伸:添加人工确认环节
在生产环境中,代码审查往往需要人工确认才能执行修复操作。下面展示如何在关键节点插入人工确认:
from autogen_agentchat.agents import UserProxyAgent
# 添加人类审核员
human_reviewer = UserProxyAgent(
name="人工审核员",
input_function=input # 使用标准输入获取人工回复
)
# 修改终止条件,需要人工确认
termination_with_human = (
TextMentionTermination("审核通过") |
TextMentionTermination("审核拒绝")
)
# 重新创建团队,加入人工审核员
enhanced_team = RoundRobinGroupChat(
participants=[code_analyst, report_generator, quality_scorer, human_reviewer],
termination_condition=termination_with_human
)
这样配置后,系统会在质量评估完成后暂停,等待人工审核员确认。只有当人工输入“审核通过”或“审核拒绝”时,流程才会继续或终止。
实战案例二:自动化数据分析和可视化
第二个案例展示如何构建一个自动化数据分析助手。用户只需要提供原始数据和问题,助手就能自动完成数据分析、生成图表、输出结论的全流程。
场景设计
这个案例涉及四个智能体的协作:
数据理解Agent负责读取数据文件,理解数据结构和字段含义。
数据分析Agent执行统计分析和数据处理。
可视化Agent生成数据图表。
报告撰写Agent整合分析结果,生成最终报告。
完整代码实现
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import MagenticOneGroupChat
from autogen_agentchat.conditions import MaxMessageTermination
import pandas as pd
# 初始化模型客户端
model_client = OpenAIChatClient(model="gpt-4o")
# 数据理解Agent
data_understanding_agent = AssistantAgent(
name="数据理解专家",
model_client=model_client,
system_message="""你专精于数据探索和理解。你会读取CSV或Excel文件,
分析数据结构、数据类型、缺失值情况,并总结数据集的主要特征。
你能快速把握数据全貌,为后续分析奠定基础。"""
)
# 数据分析Agent
data_analysis_agent = AssistantAgent(
name="数据分析专家",
model_client=model_client,
system_message="""你是统计分析和机器学习专家。你会使用Python
的pandas、scipy、sklearn等库进行数据分析,包括描述性统计、
相关性分析、趋势分析、异常检测等。你输出的代码必须健壮,
能正确处理各种边界情况。"""
)
# 可视化Agent
visualization_agent = AssistantAgent(
name="可视化专家",
model_client=model_client,
system_message="""你是数据可视化专家,擅长使用matplotlib、
seaborn、plotly等库创建美观且有信息量的图表。你会根据数据
特点选择最合适的图表类型,确保图表清晰、易读、有洞察力。"""
)
# 报告撰写Agent
report_agent = AssistantAgent(
name="报告撰写专家",
model_client=model_client,
system_message="""你是商业分析报告撰写专家。你会整合数据分析
结果和可视化图表,用清晰、专业的语言撰写分析报告。报告
需要包含执行摘要、关键发现、数据支撑和行动建议等部分。"""
)
# 创建团队,使用MagenticOne模式,支持更复杂的协作
data_analysis_team = MagenticOneGroupChat(
participants=[
data_understanding_agent,
data_analysis_agent,
visualization_agent,
report_agent
],
max_turns=20
)
# 用户查询示例
user_query = """
请分析附件中的sales_data.csv文件,回答以下问题:
1. 月度销售趋势如何?
2. 哪些产品类别贡献了最多的营收?
3. 客户的复购率是多少?
4. 生成可视化图表并保存到charts文件夹
"""
# 创建示例数据文件
import os
os.makedirs("charts", exist_ok=True)
# 生成示例销售数据
sales_data = pd.DataFrame({
"date": pd.date_range("2024-01-01", periods=90, freq="D"),
"product": ["电子产品", "服装", "食品", "家居"][:3] * 30,
"category": ["A类", "B类", "C类"][:3] * 30,
"sales": [100 + i * 5 + (i % 7) * 10 for i in range(90)],
"customer_id": [f"C{i//3}" for i in range(90)]
})
sales_data.to_csv("sales_data.csv", index=False, encoding="utf-8-sig")
# 执行分析任务
async def run_data_analysis():
async for message in data_analysis_team.run(task=user_query):
if isinstance(message, TextMessage):
print(f"\n{message.source}:")
print(message.content)
asyncio.run(run_data_analysis())
关键技术点解析
这个案例展示了几个AutoGen的高级特性:
MagenticOneGroupChat是一种更灵活的小组聊天模式。与RoundRobin不同,它允许智能体根据任务需要自主决定何时发言,而不是严格按顺序轮转。这种模式更适合复杂任务的协作。
代码执行在这个案例中至关重要。数据分析Agent生成的分析代码需要真正执行才能得到结果。AutoGen可以配合代码执行器使用:
from autogen_agentchat.agents import CodeExecutorAgent
# 添加代码执行器
code_executor = CodeExecutorAgent(
name="代码执行器",
sandbox="local" # 或 "docker", "cloud"
)
# 在团队中使用
data_analysis_team = MagenticOneGroupChat(
participants=[
data_understanding_agent,
data_analysis_agent,
code_executor,
visualization_agent,
report_agent
],
max_turns=25
)
加入代码执行器后,智能体生成的分析代码会由它实际执行,结果会自动反馈回对话中。这实现了真正的端到端自动化。
生成图表的处理
可视化Agent生成的图表需要保存到文件,而不是仅在内存中显示。框架推荐的做法是在Agent的系统提示词中强调输出格式:
visualization_agent = AssistantAgent(
name="可视化专家",
model_client=model_client,
system_message="""你是数据可视化专家。生成图表时必须:
1. 使用plt.savefig()保存到指定路径,路径通过参数传递
2. 添加中文支持:plt.rcParams['font.sans-serif'] = ['SimHei']
3. 确保图表尺寸合适:figsize=(12, 6)或更大
4. 添加标题和轴标签
5. 保存后打印文件路径确认"""
)
这样配置后,每次生成图表都会自动保存到charts文件夹,便于后续查看和使用。
实战案例三:智能客服对话系统
第三个案例是构建一个智能客服对话系统,它能自动回答用户咨询,必要时转接人工客服,并能整合知识库提供精准答案。
场景设计
客服系统包含以下组件:
问题分类Agent负责理解用户意图,将问题分类到不同主题。
知识库检索Agent从产品文档、FAQ等资料中查找相关信息。
回答生成Agent整合检索结果,生成专业、友好的回答。
满意度评估Agent在对话结束时评估用户满意度,判断是否需要人工跟进。
完整代码实现
from autogen_agentchat.agents import AssistantAgent, UserProxyAgent
from autogen_agentchat.teams import SelectorGroupChat
from autogen_agentchat.conditions import TextMentionTermination
# 初始化
model_client = OpenAIChatClient(model="gpt-4o")
# 问题分类Agent
question_classifier = AssistantAgent(
name="问题分类员",
model_client=model_client,
system_message="""你是客户问题分类专家。用户发送消息后,你需要判断:
- 产品咨询:询问产品功能、规格、使用方法等
- 订单问题:物流查询、退换货、支付问题等
- 技术支持:账号问题、系统故障、功能异常等
- 投诉建议:不满表达、改进建议等
- 闲聊:日常对话、问候等
只回复分类名称,不要添加其他内容。"""
)
# 知识库检索Agent
knowledge_retriever = AssistantAgent(
name="知识库检索员",
model_client=model_client,
system_message="""你是产品知识库管理员。你的任务是:
1. 根据用户问题,从知识库中检索相关信息
2. 如果找到相关信息,用中文完整回复
3. 如果知识库没有对应信息,回复"未找到相关信息"
模拟知识库内容如下:
【产品A】价格99元,支持7天无理由退换货,一年质保
【产品B】价格199元,专业级配置,30天退换货
【物流政策】下单后48小时内发货,默认快递7天内送达
【退换货流程】联系客服申请,审核通过后寄回商品"""
)
# 回答生成Agent
response_generator = AssistantAgent(
name="回复生成员",
model_client=model_client,
system_message="""你是资深客服代表,擅长用专业、友好、有耐心的语气
与客户交流。你会根据检索到的知识库内容,生成完整、准确、友好
的回复。如果信息不足,你会礼貌地建议客户联系人工客服。"""
)
# 满意度评估Agent
satisfaction_evaluator = AssistantAgent(
name="满意度评估员",
model_client=model_client,
system_message="""你是客服质量监控专员。在对话结束时,你需要评估:
1. 问题是否得到解决(是/否/部分解决)
2. 用户情绪状态(正面/中性/负面)
3. 是否需要人工跟进(是/否)
输出格式:{是否解决}|{情绪}|{是否跟进}
例如:否|负面|是"""
)
# 人工客服代理
human_agent = UserProxyAgent(
name="人工客服",
input_function=input
)
# 创建团队
customer_service_team = SelectorGroupChat(
participants=[
question_classifier,
knowledge_retriever,
response_generator,
satisfaction_evaluator,
human_agent
],
selection_strategy="round_robin",
termination_condition=TextMentionTermination("对话结束"),
max_turns=10
)
# 模拟客服对话
async def run_customer_service():
user_queries = [
"你好,我想了解一下产品A的价格和退换货政策",
"好的,谢谢",
]
# 模拟第一轮对话
print("=== 用户首次咨询 ===")
async for message in customer_service_team.run(
task=f"用户咨询:{user_queries[0]}"
):
if isinstance(message, TextMessage):
print(f"[{message.source}]: {message.content}")
# 重置团队进行满意度评估
customer_service_team.reset()
print("\n=== 满意度评估 ===")
async for message in customer_service_team.run(
task="对话已结束,请评估本次服务满意度"
):
if isinstance(message, TextMessage):
print(f"[{message.source}]: {message.content}")
asyncio.run(run_customer_service())
SelectorGroupChat的高级用法
这个案例使用了SelectorGroupChat,它是AutoGen中非常强大的组队模式。它的特点是有一个选择器(Selector)来决定下一个发言的智能体是谁。
选择策略可以是预定义的,也可以自定义:
from autogen_agentchat.teams import SelectorGroupChat
from autogen_core.models import ChatCompletionClient
# 自定义选择策略:根据上下文智能选择下一个发言者
def custom_selector(messages, available_agents):
# 获取最近的消息和当前状态
last_message = messages[-1] if messages else None
# 根据对话阶段选择合适的Agent
if "知识库检索员" in last_message.content:
return "回复生成员" # 检索完成,生成回复
elif "回复生成员" in last_message.content:
return "满意度评估员" # 回复完成,评估满意度
else:
return "问题分类员" # 默认从分类开始
# 使用自定义选择策略
team = SelectorGroupChat(
participants=agents,
selection_strategy=custom_selector,
termination_condition=termination
)
这种设计使得对话流程可以非常灵活,既能按照预设流程执行,也能在运行时根据状态动态调整。
多轮对话的状态管理
客服场景通常需要多轮对话,这带来了状态管理的挑战。AutoGen提供了对话历史管理机制:
# 获取对话历史
async def get_conversation_history(team):
history = []
async for message in team.chat_history:
history.append({
"source": message.source,
"content": message.content,
"type": type(message).__name__
})
return history
# 提取关键信息存入上下文
def extract_context(history):
context = {
"user_intent": None,
"resolved": False,
"needs_human": False
}
for msg in history:
if "问题分类员" in msg["source"]:
context["user_intent"] = msg["content"]
elif "满意度评估员" in msg["source"]:
parts = msg["content"].split("|")
if len(parts) == 3:
context["resolved"] = parts[0] == "是"
context["needs_human"] = parts[2] == "是"
return context
通过管理对话上下文,我们可以实现更智能的后续处理,比如自动记录会话、生成工单、触发后续跟进等。
常见使用场景
除了前面演示的三个案例,AutoGen在许多实际场景中都有广泛应用。
场景一:自动化测试生成
AutoGen可以构建一个自动化测试生成团队。一个Agent负责理解代码功能需求,另一个Agent负责设计测试用例,第三个Agent负责编写测试代码并执行验证。这种方式比人工编写测试更加全面,而且能持续发现边界情况的bug。
# 自动化测试团队示例
test_designer = AssistantAgent(
name="测试设计员",
model_client=model_client,
system_message="""你是软件测试专家。你会根据需求文档设计
完整的测试用例,覆盖正常流程、边界条件、异常情况。
测试用例需要包含输入、预期输出、测试目的。"""
)
test_coder = AssistantAgent(
name="测试编码员",
model_client=model_client,
system_message="""你是Python测试专家。你会使用pytest框架
编写单元测试和集成测试。测试代码需要遵循pytest规范,
包含清晰的断言和错误信息。"""
)
# 执行测试生成任务
test_task = """
请为以下函数设计测试用例并编写pytest测试代码:
def calculate_discount(price, discount_rate, is_member):
'''
计算折后价格
- price: 原价,必须为正数
- discount_rate: 折扣率,0-1之间
- is_member: 是否会员
返回:折后价格
'''
if not isinstance(price, (int, float)) or price <= 0:
raise ValueError("价格必须为正数")
if not 0 <= discount_rate <= 1:
raise ValueError("折扣率必须在0-1之间")
final_price = price * (1 - discount_rate)
if is_member:
final_price *= 0.9 # 会员额外9折
return round(final_price, 2)
"""
场景二:文档自动化处理
企业日常产生大量文档,如合同、报告、邮件等。AutoGen可以构建文档处理流水线:提取关键信息、格式转换、内容汇总、生成摘要。
# 文档处理团队
document_extractor = AssistantAgent(
name="信息提取员",
model_client=model_client,
system_message="""你是文档分析专家。你会从各类文档中提取
结构化信息,包括日期、金额、人物、事件等关键要素。
输出格式为JSON,方便后续处理。"""
)
document_summarizer = AssistantAgent(
name="摘要生成员",
model_client=model_client,
system_message="""你是专业的文档摘要专家。你会根据提取的
信息,生成简洁准确的文档摘要,突出核心要点。
摘要长度控制在200字以内。"""
)
场景三:代码文档生成
为现有代码生成文档是耗时的工作。通过AutoGen,可以让一个Agent理解代码逻辑,另一个Agent生成规范的文档说明。
# 代码文档生成示例
documentation_team = RoundRobinGroupChat(
participants=[
code_analyst,
doc_writer
],
termination_condition=MaxMessageTermination(max_messages=10)
)
doc_task = """
请为以下代码生成docstring和使用示例:
class DataPipeline:
def __init__(self, source_type: str):
self.source_type = source_type
self.transformations = []
def add_transform(self, func: callable):
self.transformations.append(func)
return self
def run(self, data):
result = data
for transform in self.transformations:
result = transform(result)
return result
"""
场景四:智能研究助手
构建一个自动化研究助手,能够从互联网搜集信息、分析数据、撰写研究报告。
research_team = MagenticOneGroupChat(
participants=[
search_agent, # 搜索和收集资料
analysis_agent, # 分析和整理信息
writing_agent # 撰写报告
],
max_turns=30
)
research_query = """
请研究以下主题并撰写报告:
主题:大型语言模型在金融行业的应用现状与前景
要求:
1. 搜集最新的行业应用案例
2. 分析主要的应用场景和技术挑战
3. 评估市场发展趋势
4. 给出投资建议和风险提示
"""
最佳实践与技巧
在实际项目中应用AutoGen时,积累了一些实用经验,分享给大家。
提示词工程技巧
系统提示词是定义Agent行为的关键。好的提示词应该清晰、具体、一致。
# 推荐的结构化提示词
good_system_message = """
【角色定义】
你是[具体角色名称],负责[具体职责]。
【能力边界】
- 擅长:[列举主要能力]
- 不擅长:[诚实说明限制]
【工作原则】
1. [第一条原则]
2. [第二条原则]
3. [第三条原则]
【输出格式】
当[触发条件]时,输出格式为:
[格式说明]
【注意事项】
- [重要提醒1]
- [重要提醒2]
"""
# 避免的提示词写法
bad_system_message = """
你是一个AI助手,你应该尽力帮助用户。
尽你所能回答问题,做正确的事。
"""
提示词应该让Agent清楚地知道自己是谁、能做什么、不能做什么、以及如何输出结果。模糊的提示词会导致Agent行为不一致。
团队配置优化
团队配置直接影响协作效率和结果质量。
# 选择合适的团队模式
# 简单线性任务用RoundRobinGroupChat
simple_team = RoundRobinGroupChat(
participants=[agent1, agent2, agent3],
termination_condition=TextMentionTermination("完成")
)
# 复杂协作任务用MagenticOneGroupChat
complex_team = MagenticOneGroupChat(
participants=[designer, coder, tester, reviewer],
max_turns=20
)
# 需要智能路由时用SelectorGroupChat
routed_team = SelectorGroupChat(
participants=[classifier, expert_a, expert_b, coordinator],
selection_strategy="llm_based", # 基于LLM的智能选择
termination_condition=termination
)
错误处理机制
生产环境中,优雅地处理错误至关重要。
async def robust_task_execution(team, task, max_retries=3):
for attempt in range(max_retries):
try:
result = []
async for message in team.run(task=task):
result.append(message)
if isinstance(message, ErrorMessage):
print(f"遇到错误:{message.content}")
team.reset()
break
return result
except Exception as e:
print(f"第{attempt+1}次尝试失败:{str(e)}")
if attempt == max_retries - 1:
raise
team.reset()
await asyncio.sleep(2 ** attempt) # 指数退避
async def main():
try:
results = await robust_task_execution(
my_team,
"复杂的任务描述",
max_retries=3
)
print("任务成功完成")
except Exception as e:
print(f"所有尝试均失败:{str(e)}")
# 触发降级方案或通知运维
asyncio.run(main())
性能优化建议
对于大规模或高频使用场景,需要注意性能优化。
# 1. 复用模型客户端
model_client = OpenAIChatClient(model="gpt-4o")
# 创建多个Agent时复用同一个客户端
agent1 = AssistantAgent(name="A", model_client=model_client)
agent2 = AssistantAgent(name="B", model_client=model_client)
agent3 = AssistantAgent(name="C", model_client=model_client)
# 2. 设置合理的Token限制
team = MagenticOneGroupChat(
participants=agents,
max_output_tokens=4096, # 限制单次输出
temperature=0.7
)
# 3. 使用缓存
from functools import lru_cache
@lru_cache(maxsize=100)
def get_cached_response(query_hash):
# 对于重复查询返回缓存结果
pass
# 4. 并行处理独立任务
async def parallel_execution():
tasks = [
team1.run(task="任务1"),
team2.run(task="任务2"),
team3.run(task="任务3")
]
results = await asyncio.gather(*tasks)
return results
调试技巧
调试多智能体系统有时比较困难,以下技巧可以帮助定位问题。
# 1. 启用详细日志
import logging
logging.basicConfig(level=logging.DEBUG)
autogen_logger = logging.getLogger("autogen")
autogen_logger.setLevel(logging.DEBUG)
# 2. 保存完整对话历史
async def debug_team_run(team, task):
conversation = []
async for message in team.run(task=task):
conversation.append({
"type": type(message).__name__,
"source": message.source,
"content": message.content[:500] if hasattr(message, 'content') else str(message)
})
print(f"[{message.source}] {message.content[:100]}...")
# 保存完整对话
import json
with open("conversation_log.json", "w", encoding="utf-8") as f:
json.dump(conversation, f, ensure_ascii=False, indent=2)
return conversation
# 3. 单Agent测试
# 先单独测试每个Agent,确保它们的行为正确
async def test_single_agent(agent, test_messages):
for msg in test_messages:
response = await agent.on_messages([TextMessage(content=msg, source="test")])
print(f"输入:{msg}")
print(f"输出:{response.content}")
生产环境部署指南
将AutoGen应用部署到生产环境需要考虑更多因素。
Docker部署
创建一个Dockerfile来容器化你的应用:
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
curl \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV LOG_LEVEL=INFO
# 运行应用
CMD ["python", "main.py"]
对应的requirements.txt文件:
autogen-agentchat>=0.2.0
openai>=1.0.0
python-dotenv>=1.0.0
API服务化
将AutoGen功能封装成RESTful API,方便其他系统调用:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional, List
import asyncio
app = FastAPI(title="AutoGen API", version="1.0.0")
# 请求模型
class ChatRequest(BaseModel):
message: str
agent_type: str = "assistant"
context: Optional[dict] = None
class ChatResponse(BaseModel):
response: str
sources: Optional[List[str]] = None
confidence: Optional[float] = None
# 初始化Agent
model_client = OpenAIChatClient(model="gpt-4o")
agent = AssistantAgent(name="api_assistant", model_client=model_client)
@app.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest):
try:
full_message = request.message
if request.context:
full_message = f"上下文:{request.context}\n\n用户:{request.message}"
response = await agent.on_messages([
TextMessage(content=full_message, source="user")
])
return ChatResponse(response=response.content)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health_check():
return {"status": "healthy"}
# 启动服务
# uvicorn main:app --host 0.0.0.0 --port 8000
监控与日志
生产环境必须做好监控和日志记录:
import structlog
from prometheus_client import Counter, Histogram, generate_latest
# 结构化日志配置
structlog.configure(
processors=[
structlog.stdlib.filter_by_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.StackInfoRenderer(),
structlog.processors.format_exc_info,
structlog.processors.UnicodeDecoder(),
structlog.processors.JSONRenderer()
],
context_class=dict,
logger_factory=structlog.stdlib.LoggerFactory(),
cache_logger_on_first_use=True,
)
logger = structlog.get_logger()
# Prometheus指标
request_count = Counter(
'autogen_requests_total',
'Total requests',
['agent_type', 'status']
)
request_duration = Histogram(
'autogen_request_duration_seconds',
'Request duration',
['agent_type']
)
async def monitored_run(task, agent_type):
request_count.labels(agent_type=agent_type, status="started").inc()
with request_duration.labels(agent_type=agent_type).time():
try:
result = await agent.run(task=task)
request_count.labels(agent_type=agent_type, status="success").inc()
logger.info("task_completed", agent_type=agent_type)
return result
except Exception as e:
request_count.labels(agent_type=agent_type, status="error").inc()
logger.error("task_failed", agent_type=agent_type, error=str(e))
raise
总结与资源链接
通过这篇文章,我们系统地学习了微软AutoGen多智能体协作框架的使用方法。从环境搭建、核心概念,到三个完整的实战案例,再到最佳实践和部署指南,你应该已经具备了使用AutoGen构建复杂AI应用的能力。
AutoGen的最大价值在于将多智能体协作的理念大众化。它让开发者不需要深入了解分布式系统、消息队列等底层技术,就能构建出强大的AI协作系统。无论是简单的问答助手,还是复杂的自动化工作流,AutoGen都能提供合适的解决方案。
关键要点回顾
多智能体协作是AutoGen的核心。多个AI Agent通过自然语言对话分工合作,可以完成远超单一Agent能力的复杂任务。
团队配置决定了协作模式。RoundRobinGroupChat适合顺序执行的任务,MagenticOneGroupChat适合复杂协作场景,SelectorGroupChat支持智能路由。
人类参与是可选但重要的环节。设置UserProxyAgent可以在关键节点暂停,等待人工确认后再继续。
错误处理和状态管理是生产环境的关键。完善的异常捕获、优雅的降级策略、清晰的对话历史管理,都是可靠系统的必备要素。
推荐阅读资源
AutoGen官方文档提供了最权威的使用指南,地址是 https://microsoft.github.io/autogen/
AutoGen GitHub仓库包含最新的代码示例和社区贡献的插件。
Awesome AutoGen页面收集了基于AutoGen的优秀项目,是学习进阶的好去处。
相关开源项目推荐
微软的另一力作Semantic Kernel,为构建AI应用提供了另一种选择,它更侧重于技能编排和内存管理。
LangGraph是LangChain生态中的多智能体框架,采用了图结构来表示Agent工作流。
CrewAI是另一个值得关注的框架,它以”代理”和”任务”为核心概念,设计简洁易用。
下一步学习建议
建议从官方示例仓库开始,逐个运行体会不同场景的效果。然后选择自己感兴趣的领域,动手改造示例代码。遇到问题时,先查阅官方文档和GitHub Issues,那里通常有解决方案。
多智能体AI是一个快速发展的领域,新的框架、新的范式不断涌现。保持学习的心态,多动手实践,你一定能在这个领域找到属于自己的创新点。
祝你学习愉快,创作出令人惊艳的AI应用!
评论区