关注我们,深度学习LLM应用
了解了轻量级的OpenAI Swam、重量级的LangGraph、易用又不失强大的CrewAI后,今天一起来看出自名门的AutoGen。AutoGen是微软公司推出的用于构建多智能体对话式系统的高级框架,用来创建多个AI Agent协作以解决问题的LLM应用。 本文内容:
- 五分钟读懂AutoGen
- AutoGen实现多智能体Demo
- AutoGen小结
微软在全新的AutoGen v0.4版本中进行了重新设计开发,提供了一个事件驱动、可扩展的分布式多智能体开发与运行框架,该版本目前处于开发中,后续我们将用独立文章为大家预览新版本。
1
五分钟读懂AutoGen
AutoGen可以帮你快速构建一个多Agent通过对话进行有机协作的小型生态系统。在这个系统中,多个Agent借助对话来实现分工、分享与启发,最后完成输入的任务或问题。说人话就是:
多个Agent边聊天边工作,配合完成复杂任务。
需要注意的是,在AutoGen中,人类也可以特殊的身份成为团队的一员。当然,这个成员的特殊能力就是可以“不够智能”: 需要人类给出回应,而非让LLM回应。
【概念理解】
如何“聊着聊着”就把问题解决了呢?看下面的例子:
这个双Agent系统中,我们让“儿子”与“父亲”聊天,答案自然就包含在了对话之中(AutoGen会总结最终结果)。
这是一个复杂点的多Agent场景 :
三个Agent的团队完成一个调查报告的协作过程:一个负责搜索整理,一个负责审查反思,一个负责制作最终报告。
【工具使用】
会用工具是Agent的基本特征(不能只聊天不干活),在AutoGen中,有两种常见的工具:
- 函数工具(包括API调用)
- 代码工具:就是让Agent当码农,并在本地或者docker执行
一个借助代码工具来完成任务的例子:
注意这里的代码编写和代码执行是由不同的Agent负责,这也是AutoGen在使用工具上不同于其他框架的地方: 工具的提出与执行是由不同的Agent来完成。
【聊天模式】
聊天也要有秩序,所以最后来了解AutoGen目前版本中的三种基础聊天模式:
1. 双人模式
两个智能体相互聊天的模式:
2. 连续聊天模式
举一个例子,比如玩一个大家抽签比大小的游戏,主持人让每个人依次抽签,最后再让裁判来判决结果:
简单的说,就是一个Agent连续与多个Agent聊天,且每次聊天的结果会带入到下一个聊天中,最后完成任务。
3. 群聊模式
当有一堆Agent在一起聊天时,问题来了,谁是下一个发言者?AutoGen提供了多种决策机制,比如 轮流、随机、人工决定、以及默认的由LLM来决定, 另外还允许定制自己的决策算法(比如有人说脏话就禁言:))。
群聊模式中,需要一个团队管理者,来负责协调与决策下一个发言者。
以上是AutoGen的基础聊天模式,初此之外,AutoGen还提供了 嵌套聊天的模式:就是把一个多Agent系统“打包”成一个Agent,用到另一个更大的系统中。
这里揭示了AutoGen与CrewAI的一点区别: AutoGen多个Agent的协作相对更灵活,但也多了一些随机性(高度依赖LLM决策);CrewAI默认采用顺序任务编排,牺牲了灵活性,但多了些确定性。
2
AutoGen实现多智能体Demo
现在我们来实现之前的多智能体Demo:
这个层级模式刚好匹配AutoGen的群聊模式,这里直接给出核心代码:
.....
from autogen import ConversableAgent,GroupChat,GroupChatManager,AssistantAgent,UserProxyAgentweb_searcher = ConversableAgent( name="web_searcher", system_message="你是一个搜索助手,会根据输入的关键词进行网络搜索. ", llm_config={"config_list": [{"model": "gpt-4o-mini"}]},)web_searcher.register_for_llm(name="web_search_tool", description="网络搜索工具")(web_search_tool)emailer = ConversableAgent( name="emailer", system_message="你是一个邮件助手,会根据输入的收件人、主题和正文发送邮件. ", llm_config={"config_list": [{"model": "gpt-4o-mini"}]},)emailer.register_for_llm(name="email_tool", description="邮件发送工具")(email_tool)user_proxy = ConversableAgent( name="user_proxy", system_message="你是一个善于回答问题的AI助手,并会执行python代码或进行工具调用。如果没有具体的输入任务,请直接回复DONE", llm_config={"config_list": [{"model": "gpt-4o-mini"}]}, human_input_mode="NEVER",)user_proxy.register_for_execution(name="web_search_tool")(web_search_tool)user_proxy.register_for_execution(name="email_tool")(email_tool)group_chat = GroupChat( agents=[web_searcher,emailer,user_proxy], messages=[], max_round=6)group_chat_manager = GroupChatManager( groupchat=group_chat, system_message="你是一个智能的团队管理者,会根据输入任务与历史消息决定下一步的任务,并选择合适的团队成员来完成。", llm_config={"config_list": [{"model": "gpt-4o-mini"}]}, is_termination_msg=lambda msg: 'DONE' in msg.get("content"),)
这里省略了两个工具模拟函数(web_search_tool,email_tool)。其他解释如下:
- 创建web_searcher与emailer两个Agent,并注册tools,这是AutoGen中工具使用的机制
- 创建一个user_proxy的Agent。这是一个不同于其他框架的模式,这个Agent将代表人类提出任务与要求,同时工具的执行(代码与函数)需要这个独立的Agent来完成
- 创建团队与团队管理者,这部分有点类似CrewAI
- 注意这里用来结束聊天的小技巧:借助is_termination_msg这个参数
一切准备就绪,我们来分配任务:
chat\_result = user\_proxy.initiate\_chat(group\_chat\_manager,
message="搜索今天黑神话悟空的最新消息,发到我邮箱aa@bb.com")
观察运行的输出:
注意看 Next Speaker 的选择,是由chat_manager根据任务进展的自动选择:
- 先选择web_searcher搜索网络(实际执行:user_proxy)
- 然后选择emailer发送邮件(实际执行:user_proxy)
- 最后chat_manager判断任务已经结束,终止群聊
3
AutoGen小结
尽管AutoGen也是面向多智能体系统设计的开放框架,但相对基于角色扮演的CrewAI更复杂些。当然,从功能角度也更加强大(不考虑CrewAI新的Flows特性),毕竟CrewAI目前的多智能体协作还只支持顺序与层次两种方式。
【优点】
- 大厂出品,更有技术保障
- 天然面向多智能体系统而设计
- 基于对话的协作,更自然与直观
- 较强的功能与扩展性,适应多种领域任务
- 支持多种灵活的对话模式、任务分解模式
- 有较为完善的人类参与的协作机制
- 提供了AutoGen Studio低代码平台
- 文档与社区较完善
【缺点】
AutoGen在设计上与CrewAI一样都属于高度依赖于LLM自身来实现多智能体协作的框架,因此存在类似的问题:
- 复杂流程自定义编排的能力不足(期待正在开发的0.4版本)
- Agent之间的对话协作可能产生黑盒子效应,较大的不确定性
- 使用非OpenAI API兼容的本地LLM略麻烦
- 工具判断与执行的分离不太符合习惯
整体上对AutoGen的使用建议是,更适合如下场景与条件:
- 有较好的LLM开发技术基础
- 典型的多Agent应用场景,不建议在如RAG这样的需求中使用
- 非常适合有人类参与协作监督的场景,比如团队创作、软件编程等
最重要的是,由于全新设计重写的AutoGen 0.4版本已经在路上,没入坑的还是等等吧。
end
福利时间
为了帮助LLM开发人员更系统性与更深入的学习RAG应用,特别是企业级的RAG应用场景下,当前主流的优化方法与技术实现,我们编写了 《基于大模型的RAG应用开发与优化 — 构建企业级LLM应用》 这本长达 500页 的开发指南,与大家一起来深入到LLM应用开发的全新世界。
更多细节,点击如下链接了解
现在购,享 50%折扣
交流请识别以下名片