微软最新推出的大语言模型框架AutoGen,号称目前地表最强AI Agents。不知道有多少朋友和我一样,在感受了LangChain Agents的大力出奇迹后,又心痒难耐想把AutoGen搞起….
好吧,那就一起来吧。AutoGen在构建复杂的基于大语言模型工作流方面,挺好用的,大家可以看AutoGen:Enabling next generation large language model applications文档的介绍。我的天啊,LangChain还没有怎么搞熟,下一代的AutoGen就来了。
何为AutoGen
AutoGen是一个AI应用开发框架,允许使用多个代理程序,也就是Agents来开发具有相互对话能力,以解决任务度的大语言模型应用程序。简化了复杂的大语言模型工作流的编排、自动化和优化,它最大程的提高了大语言模型的性能。
什么神仙打架,八仙过海,各显神通,说的就是AutoGen吧。以后,我们的AI应用就是复仇者联盟,写代码的我们只要打下响指,一切搞定….
LLM工作流
设计、实施和优化一个能够充分发挥大语言模型潜力的工作流程是需要大量的工作和专业知识的。自动化这些工作流程具有极大的价值。随着开发人员开始开发越来越复杂的基于大语言模型应用程序,工作流会更加的复杂。AutoGen尝试在这些方面帮我们解决一些问题。
接下来,就让我们结合Getting Started | AutoGen (microsoft.github.io)来一起学习起来吧。
AutoGen
AutoGen允许以最少的Code,来构建基于多代理对话的LLM应用。下面,我们来看官方给的例子。在这个例子中,我们要搞明白AutoGen和agents 之间的关系,agents和agents是怎么相互对话的。
Multi agent conversation framework
- ConversableAgent
是一个基于对话的,其它可对话的代理。它管理着AssistantAgent、UserProxyAgent和GroupChatManager,它们分别代表不同的代理类型。
- AssistantAgent
在AutoGen中担任AI助手的角色。它会默认使用LLM,为用户编写代码(比如python),然后由用户执行。它还可以接收执行结果并提出更正或修改建议。
- UserProxyAgent
它就好像管家,当得到我们的授权后(征求我们的输入,或提供一些提示,比如是否继续还是退出?),会代理我们去做一些事情。它还具有执行代码和调用函数的能力(接收到的消息中),就好像您家大业大,您是王多鱼,那么管家也是需要指使人去修剪草坪,做饭 什么的,听起来太美好了….
- GroupChatManager
群组聊天管理器,它可以包含多个AssistantAgentUserProxyAgent。按功能逻辑,封装起来。
UserProxyAgent和AssistantAgent 自动对话Demo
上图,最左边是两个Agent,分别是Assistant Agent和User Proxy Agent。在中间,用户发出指令后,不再需要干预,这两种Agent就自动相互对话解决了问题。最右边,输出了结果。
为了更好的理解Agent间的自动对话,我们上代码。
Solving Tasks Requiring Web Info Demo
代码的python notebook 地址 [notebook](autogen/notebook/agentchat_web_info.ipynb at main · microsoft/autogen (github.com))
可以在colab上运行代码看效果。
- 首先我们来安装两个包,分别是AutoGen和docker。
%pip install pyautogen~=0.2.0b4 docker -q -U
- 加载配置列表
在配置列表中定义了模型和对应的API_KEY。
llm_config={
"timeout": 600,
"cache_seed": 42,
"config_list": config_list,
"temperature": 0,
}
# 根据自己的模型使用情况和API_KEY 设置
config_list = [
{
'model': 'gpt-3.5-turbo',
'api_key': '*****************************'
}
]
- 创建Agents
# create an AssistantAgent instance named "assistant"
assistant = autogen.AssistantAgent(
name="assistant", # 助理Agent
llm_config=llm_config # 配置
)
# create a UserProxyAgent instance named "user_proxy"
user_proxy = autogen.UserProxyAgent(
name="user_proxy", #代理Agent
human_input_mode="TERMINATE",
max_consecutive_auto_reply=10,
is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
code_execution_config={"work_dir":"web"},
llm_config=llm_config,
system_message="""Reply TERMINATE if the task has been solved at full satisfaction.Otherwise, reply CONTINUE, or the reason why the task is not solved yet.
"""
)
- 接下来两个Agent一起合作,通过一篇文章的链接,告诉我们谁应该来阅读这篇论文。
user_proxy.initiate_chat(
assistant,
message="""
Who should read this paper: https://arxiv.org/abs/2308.08155
"""
)
代码执行后,我们看下过程:
如上图,首先user_proxy,这个人类代理向assistant助手,提问谁应该来读这篇文章。
助理会尝试回答这个问题,需要了解论文中的内容和它上下文信息。它给到我们一段python脚本,去获得论文的内容,将摘要信息抽取出来,并告诉proxy 运行这段代码。
在这里user_proxy 就成功执行(execution succeeded)了刚刚assistant给的代码,
助理接下来根据这个摘要,来决定接下来哪些人是适合读这篇文章的。
最后给了我们一个输入框,告诉我们可以回车,或者是输入exit来终止这次会话。
由此可见,这次的任务绝大部份工作都是由user_proxy和assistant之间,通过对话自动完成的
总结
这就是AutoGen如何使用,帮助我们将大语言模型的工作流拆分成独立的、可控的、可调试的小的功能单元,以Agent的形式存在,Agent与Agent之间的基于对话的交流,完成自动化的,基于大语言模型工作流的执行。