AutoGen
【2023-10-10】微软发布AutoGen, github,多代理(Agent)任务框架,完成各种场景的复杂工作流任务,从GPT大语言模型近几个月高速迭代以来,最近这个概念很火。
微软和OpenAI一定商量好了
- 11月6日 OpenAI 在发布 Assistant,和 AutoGen 原有架构完美兼容。
- 11月11日 AutoGen 就 Commits GPTAssistantAgent
如果要做 multi-Agent,那么 AutoGen 架构一定是最正确的
AutoGen 介绍
微软公司发布了开源Python库AutoGen。
- AutoGen是“一个简化大语言模型工作流编排、优化和自动化的框架。AutoGen背后的基本概念是“代理”(agents)的创建,即由大语言模型(如GPT-4)提供支持的编程模块。这些智能体(agents)通过自然语言信息相互作用,完成各种任务。
- 【2024-2-8】AutoGen框架学习 飞书文档
AutoGen 设计
借助AutoGen,开发人员可以创建一个由代理(agents)组成的生态系统,这些代理专注于不同的任务并相互合作。
- AutoGen使用多代理(multi-agent)对话支持复杂的基于大语言模型的工作流。
- 左图:AutoGen代理是可定制的,可以基于大语言模型 、工具、人,甚至是它们的组合。
- 右图:智能体(agents)可以通过对话来解决任务。右边下图:这个框架支持许多额外的复杂对话模式。
- 将每个代理(agents)视为具有其独特系统指令的单个ChatGPT会话。
- 例如,可以指示一个代理充当编程助手,根据用户请求生成Python代码。另一个代理可以是代码审查器,它获取Python代码片段并对其进行故障排除。然后,可以将第一个代理的响应作为输入传递给第二个代理。其中一些代理甚至可以访问外部工具,比如ChatGPT插件,如Code Interpreter或Wolfram Alpha。
AutoGen提供工具来创建代理(agents)并自动交互。多代理(multi-agent)应用程序完全自主或通过“人工代理”进行调节,允许用户介入代理之间对话,监督和控制。在某种程度上,人类用户变成了监督多个人工智能代理的团队负责人。
对于代理框架必须做出敏感决策并需要用户确认的应用程序,人工代理非常有用。
- AutoGen 让用户在开始走向错误的方向时帮助调整方向。例如,用户可以从应用程序的初始想法开始,然后在代理的帮助下逐渐进行完善,并在开始编写代码时添加或修改功能。
- AutoGen 模块化架构也允许开发人员创建通用的可重用组件,这些组件可以组装在一起,以快速构建自定义应用程序。
多个AutoGen代理可以协作完成复杂的任务。
例如,人工代理可能会请求帮助编写特定任务的代码。编码助理代理(agents)可以生成并返回代码,然后代理可以使用代码执行模块并对代码进行验证。然后,这两个人工智能代理可以一起对代码进行故障排除并生成最终的可执行版本,而人类用户可以在任何时候中断或提供反馈。
这种协作方法可以显著提高效率。根据微软公司的说法,AutoGen可以将编码速度提高四倍。
AutoGen 内置代理
- 泛型
ConversableAgent
类- 这些代理能够通过交换消息来相互交谈以共同完成任务。代理可以与其他代理通信并执行操作。不同的代理在接收消息后执行的操作可能不同。
AssistantAgent
助手代理: 通用的AI助手,负责执行具体任务- 默认使用 LLM,但不需要人工输入或代码执行。
- 编写 Python 代码(在 Python 编码块中),供用户在收到消息(通常是需要解决的任务的描述)时执行。在后台,Python 代码是由 LLM(例如 GPT-4)编写的。它还可以接收执行结果并建议更正或错误修复。可以通过传递新的系统消息来更改其行为。LLM 推理配置可以通过 llm_config 进行配置。
UserProxyAgent
人类代理- 每个交互回合中,将人工输入作为代理的回复,并且还具有执行代码和调用函数的能力。
- 收到消息中检测到可执行代码块且未提供人类用户输入时,会自动 UserProxyAgent 触发代码执行。可将 code_execution_config 参数设置为 False 来禁用代码执行。默认基于 LLM 的响应处于禁用状态。可以通过设置为 llm_config 与推理配置对应的字典来启用它。When llm_config 设置为字典, UserProxyAgent 可以在不执行代码执行时使用 LLM 生成回复。
两个具有代表性的子类是 AssistantAgent 和 UserProxyAgent 。这两个代理可协同工作,构建强大的应用,如Chat GPT Plus代码解释器加插件的增强版本。
- 实用类
UserProxyAgent
用户直接交互的 Agent,不处理 Task。AssistantAgent
实际处理某些 Task 的 Agent,不直接与用户交互。GroupChatManager
管理群组对话,也不直接和用户交互。
- 抽象类
ConversableAgent
3 个实用 Agent 继承的类,绝大部分 Agent 的功能都写在这个里面,很长。Agent
是ConversableAgent
父类,很短,只定义了接口。
GroupChat
是有关群组对话的类,不是 Agent,它保存群成员和群消息,以及一些列拼凑 prompt 和message 的方法。
一步循环流程
- 用户把 Task 告诉 UserProxyAgent
- UserProxyAgent 把消息发送给 AssistantAgent;
- AssistantAgent 返回结果给 UserProxyAgent ,UserProxyAgent 决定下一步如何进行。
UserProxyAgent 和 AssistantAgent 都是一系列代码 + LLM,都有自己的 prompt(SystemMessage)。
- 但是 UserProxyAgent 有特殊权限:执行代码,而 AssistantAgent 不能运行。
- 这种权限控制写在代码里,而不是 prompt。
- 即使实际处理 Task 的 Agent 只有 1 个,但必须有 1 个 UserProxyAgent,也就是至少有 2 个 Agent。
assistant = AssistantAgent("assistant" ....)
user_proxy = UserProxyAgent("user_proxy" ....)
user_proxy.initiate_chat(assistant, ....)
代码理解
AutoGen 中的代理具有以下功能:
- 可对话:AutoGen 没有隔离代理,任何代理都可发送和接收来自其他代理的消息以启动或继续对话
- 可定制:AutoGen 代理可自定义, 集成 LLM、人员、工具或组合。
框架解析
autogen/agentchat/init.py 中定义多种智能体
- “
Agent
” 抽象类,定义了 name属性方法, reset,send/a_send,receive/a_reveive,generate_reply/a_generate_reply - “
ConversableAgent
”, 泛型, 通过交换消息共同完成任务。不同代理接收消息后执行的操作可能不同- Autogen框架中有两个默认代理:用户代理(user) 和助手代理 (assistant)。
- 两个具有代表性的子类是
AssistantAgent
和UserProxyAgent
。
- “
AssistantAgent
”, AI助手,通用AI助手,负责执行具体任务- 默认使用 LLM,但不需要人工输入或代码执行。
- 通过LLM编写 Python 代码,供用户在收到消息(要解决任务的描述)时执行。
- 接收执行结果并建议更正或错误修复。通过传递新系统消息来更改其行为。LLM 推理配置可以通过
llm_config
进行配置。
- “
UserProxyAgent
”, 人类代理,或用户代理,代表用户工作 (人类),可独立做决定或向用户请求输入。- 每个交互回合中,将人工输入作为代理回复,还具有执行代码和调用函数能力。收到的消息中检测到可执行代码块且未提供人类用户输入时,会自动 UserProxyAgent 触发代码执行。可以通过将
code_execution_config
参数设置为 False 来禁用代码执行。 - 默认情况下,基于 LLM 的响应处于禁用状态。设置为
llm_config
与推理配置对应的字典来启用它。 llm_config 设置为字典, UserProxyAgent 可以在不执行代码执行时使用 LLM 生成回复。
- 每个交互回合中,将人工输入作为代理回复,还具有执行代码和调用函数能力。收到的消息中检测到可执行代码块且未提供人类用户输入时,会自动 UserProxyAgent 触发代码执行。可以通过将
- “
GroupChat
”, - “
GroupChatManager
”
用户代理和助手代理之间的聊天被自动化,同时允许人工反馈或干预,实现了高效和灵活的任务完成方式。
图解
- GroupChatManager 不是 LLM Agent,没有「ManagerAgent」直接调用 OpenAI API 的代码证据,Manager 把群组消息重新组织后转发给其他 Agent ,自己调用 OpenAI API 。
- GroupChat 不是 Agent,包含了一些拼凑和更新 prompt 以及 message 文本的方法。Manager 会使用这些方法,并且把拼凑好的文本消息 send 给其他 Agent,并且消息的发送者是 speaker(其中一个AssistantAgent),而不是 Manager 自己
记忆单元 Memory
Memory记录Agent与其他Agent交互历史
- 信息隔离:没有对话过的agent看不到彼此信息
- 但ChatManager拥有所属agent聊天记录,消息广播给所有agent,所以能看到彼此信息
Tool 工具
- Tool calling: 通过 ConversableAgent.register_for_llm 方法向LLM注册tools。
- 通过 ConversableAgent.register_for_execution 向UserProxyAgent注册tool的执行。
ConversableAgent 关键环节
.initiate_chat(recipient: ? ...
# 对话开始时用 recipient 定义一个谈话对象 Agent
.send(message,recipient...
recipient.receive(message, ...)
# 把消息通过 .send 发送给谈话对象,谈话对象用 .receive 接收消息。
.receive
reply = self.generate_reply(messages, ...)
# 接收到消息后通过 generate_reply 里面有较长的处理步骤,会一直调到 OpenAIWrapper.create ,总之就是调到 OpenAI API 了,并得到 LLM 的推理和回复。
.send(reply, ...
# 把得到的 reply 通过 .send 发回给之前那个 Agent,这样完成一个循环。
ConversableAgent 注册函数、调用函数
# 注册
def register_reply( ...
self._reply_func_list.insert( ...
"reply_func": ?
# 这样就把函数插到了 _reply_func_list 里了,并且存在 "reply_func" 上
# 调用
def generate_reply( ...
for reply_func_tuple in self._reply_func_list:
reply_func = reply_func_tuple["reply_func"]
# 拿到所有的可调用的函数
if self._match_trigger(reply_func_tuple["trigger"], sender):
reply = reply_func(...
# 用 _match_trigger 去匹配一下名称,名称正确的话就直接调用那个函数
GroupChatManager 的关键环节
def run_chat:
speaker = ...
for agent in groupchat.agents:
if agent != speaker:
self.send(message, agent
# GroupChatManager 只有1个新增的函数方法就是 run_chat,它找到 1 个 speaker(是一个AssistantAgent),并且把 speaker 的消息发给群组里除了 speaker 之外的所有人。其余还有针对各种情况的判断处理就不深入了。
def __init__:
self.register_reply( GroupChatManager.run_chat, ...
# register_reply 是父类 ConversableAgent 的一个方法,允许注册新的函数功能,用来扩展 Agent 类型,GroupChatManager 的 run_chat 就是这样扩展进去的。之后新增的其他类型的 Agent 都在用这个方法扩展。
- 用户把 Task 告诉 UserProxyAgent,然后 UserProxyAgent 会把消息发送给 GroupChatManager;
- GroupChatManager 会作为群消息管理者,把适当的消息转发给适当的 AssistantAgent;
- AssistantAgent 接收到群消息,并且给出自己的推理;
- GroupChatManager 会拿到所有 AssistantAgent 的推理并发回给 UserProxyAgent。UserProxyAgent 来决定下一步如何进行,这样就完成一步的循环。
user_proxy = UserProxyAgent("user_proxy" ....
assistant1 = AssistantAgent("assistant1" ....
assistant2 = AssistantAgent("assistant2" ....
assistant3 = AssistantAgent("assistant3" ....
groupchat = autogen.GroupChat(agents=[user_proxy, assistant1, assistant2, assistant3], ...
manager = autogen.GroupChatManager(groupchat=groupchat, ...
user_proxy.initiate_chat(manager, ....
Autogen系列
应用场景
应用领域
【2024-1-14】Autogen 新手指南:基础概念和应用
官方公布的5大领域
- 代码生成、执行和调试
- 通过代码生成、执行和调试实现自动化任务解决
- 自动代码生成、执行、调试和人工反馈
- 使用检索增强代理自动生成代码和回答问题
- 使用基于 Qdrant 的检索增强代理自动生成代码和回答问题
- 多智能体协作(>3 智能体)
- 使用 GPT-4 + 多个人类用户自动解决任务
- 通过群聊自动解决任务(有 3 个群组成员代理和 1 个经理代理)
- 通过群聊自动实现数据可视化(有 3 个群组成员代理和 1 个经理代理)
- 通过群聊自动解决复杂任务(有 6 个群组成员代理和 1 个经理代理)
- 使用编码和规划代理自动解决任务
- 应用
- GPT-4 代理的自动国际象棋游戏和搭便车
- 从新数据中自动持续学习
- OptiGuide 用于供应链优化的大型语言模型.
- 工具使用
- Web 搜索:解决需要 Web 信息的任务
- 将提供的工具用作函数
- 使用 Langchain 提供的工具作为函数进行任务解决
- RAG:具有检索增强生成的群聊(具有 5 个组成员代理和 1 个经理代理)
- OpenAI 实用程序功能深入指南
- 代理教学
- 通过自动聊天向其他代理传授新技能和重用
- 向其他代理传授编码以外的新事实、用户偏好和技能
AutoGen的新应用程序示例:会话象棋(conversational chess)。它可以支持各种场景,因为每个玩家可以是大语言模型授权的AI、人类或两者的混合体。它允许玩家创造性地表达他们的动作,例如使用笑话,模因参考(meme references)和角色扮演,使棋类游戏对玩家和观察者来说更具娱乐性。
AutoGen还支持更复杂的场景和架构,例如大预言模型代理的分层安排。例如,聊天管理器代理可以调节多个人类用户和大语言模型代理之间的对话,并根据一组规则在它们之间传递消息。
具体
- Multi-Agent Conversation Framework
- AutoGen provides multi-agent conversation framework as a high-level abstraction. With this framework, one can conveniently build LLM workflows.
- Easily Build Diverse Applications
- AutoGen offers a collection of working systems spanning a wide range of applications from various domains and complexities.
- Enhanced LLM Inference & Optimization
- AutoGen supports enhanced LLM inference APIs, which can be used to improve inference performance and reduce cost.
举个示例:
- 比如构建一个法律资讯或电商客服系统时,AutoGen可以让一个AI代理负责收集客户提出的问题,另一个给出初步建议和回答。
- AutoGen同时还会将任务分解并分配给多个代理,一个代理负责查询数据库里的答案,一个代理会联网搜索实时最新数据进行比对,另一个代理负责对收集来的数据进行审核和纠正,还有的代理负责将汇总的数据进行格式化后并发给客户。
- 在整个过程中,AutoGen会把问题分解成多个任务,并自动分配给多个代理,同时支持人工抽样干预和反馈。与直接使用GPT AI聊天机器人不同的是,AutoGen支持多代理(AI、人、工具等)相互协作,使整个工作流更加高效。
其实代理Agent的设计一直是人工智能领域的焦点 过去的工作主要集中在增强代理的某些特定能力,比如符号推理,或者对于特定技能的掌握。 比如像国际象棋、围棋机器人等等。 这些研究更加注重算法的设计和训练策略,而忽视了大语言模型固有的通用能力的发展,比如知识记忆、长期规划、有效泛化和高效互动等。
AutoGen 构建的六个应用程序示例,包括数学问题解决、多智能体编码、在线决策制定、检索增强聊天、动态群聊以及对话式国际象棋。
基本配置
新建 OAI_CONFIG_LIST
文件,内容如下,并且将开发密钥填入<>后,保存文件。
- 配置列表的样子,可有多个API端点,所以可用多个模型。
- ① OpenAI: gpt-4和gpt-3.5-turbo,输入API密钥
- ② Azure API: 微软接口
- ③ 自定义模型
- 如果还没有OpenAI账户,请先注册。
config_list = [
{
"model": "gpt-4",
"api_key": os.environ.get("AZURE_OPENAI_API_KEY"),
"api_type": "azure",
"base_url": os.environ.get("AZURE_OPENAI_API_BASE"),
"api_version": "2023-03-15-preview",
},
{
"model": "gpt-3.5-turbo",
"api_key": os.environ.get("OPENAI_API_KEY"),
"api_type": "open_ai",
"base_url": "https://api.openai.com/v1",
},
{
"model": "llama-7B",
"base_url": "http://127.0.0.1:8080",
"api_type": "open_ai",
}
]
注意
- api_base 要更换为 base_url
twoagent.py 文件
- OAI_CONFIG_LIST_sample.json set-your-api-endpoints
#pip install pyautogen
from autogen import AssistantAgent, UserProxyAgent, config_list_from_json
# Load LLM inference endpoints from an env variable or a file
config_list = config_list_from_json(env_or_file="OAI_CONFIG_LIST")
# 初始化agent
assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})
user_proxy = UserProxyAgent("user_proxy", code_execution_config={"work_dir": "coding"})
# 启动任务
task = "Plot a chart of NVDA and TESLA stock price change YTD."
user_proxy.initiate_chat(assistant, message=task)
# This initiates an automated chat between the two agents to solve the task
运行
python test/twoagent.py
执行过程
- AssistantAgent 从 UserProxyAgent 接收到包含任务描述的消息。
- AssistantAgent 尝试编写Python代码来解决任务,并将响应发送给 UserProxyAgent。
- UserProxyAgent收到助手的回复,尝试通过征求人类输入或准备自动生成的回复来进行回复。
- 如果没有提供人类输入,UserProxyAgent将执行代码并将结果用作自动回复。
- AssistantAgent 随后为UserProxyAgent生成进一步的回应。
- 用户代理随后可以决定是否终止对话。如果不终止,则重复步骤3和4。
简易案例
简单Agent示例
- 比 LangChain 简单的多
import autogen
# 1、建立必要配置
config_list = [
{
"model": "Mistral-7B",
"api_base": "http://localhost:8000/v1",
"api_type": "open_ai",
"api_key": "NULL",
}]
# 2、大模型请求配置
llm_config = {
"request_timeout": 600,
"seed": 45, # change the seed for different trials
"config_list": config_list,
"temperature": 0,
"max_tokens":16000,
}
# 3、新建一个助理智能体
assistant = autogen.AssistantAgent(
name="assistant",
llm_config=llm_config,
is_termination_msg=lambda x: True if "TERMINATE" in x.get("content") else False,
)
#创建名为 user_proxy 的用户代理实例,这里定义为进行干预
user_proxy = autogen.UserProxyAgent(
name="user_proxy",
human_input_mode="TERMINATE",
max_consecutive_auto_reply=1,
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.""")
task1 = """今天是星期几?,还有几天周末?请告诉我答案。"""
user_proxy.initiate_chat(assistant,message=task1)
复杂案例
需求
今天是什么日期,比较Meta和Tesla的年初至今收益
用户代理和助手代理两种类型,完成如下任务
- 助手代理是增强版的代码解释器,生成、修改代码
- 用户代理负责执行,根据设置自动或手动运行代码
流程
- 两个代理不断互动,用户代理接收任务描述,助手写代码,用户代理执行代码并且将代码的结果返回助手,助手根据代码执行的反馈修改代码或者返回成功的结果,完成任务后,返回结束标志给到用户代理,用户代理关闭程序。
具体
助手对用户代理说:
“首先,让我们使用Python获取当前日期。”
因此写了一些Python代码来获取日期。接下来,获取Meta和Tesla的年初至今收益。用Python中的 yfinance 库来获取股票价格。
如果还没有安装,请通过在终端运行 pip install yfinance
来安装这个库。这是助手告诉我安装那个库,然而用户代理将执行这个操作。
实际上它给了代码,用Python代码获取Meta和Tesla年初至今收益的方法。所以写了代码,使用了那个库。这段代码将以百分比的形式打印Meta和Tesla的年初至今收益。
用户代理执行了代码,但遇到了一个bug。这个 bug 从用户代理传递给到助手代理,把问题传回了助手,试图让助手修复它。
助手回到用户:
“为了之前的疏忽我道歉,变量today在第一段代码中定义了,但在第二段中没有定义。让我们更正它。”
所以这里它实际上在纠正,这里是新代码,这里是代码输出。
实际上工作。Meta的年初至今收益,Tesla的年初至今收益,以百分比表示。
然后助手回到用户:
“很好,代码已经成功执行。”
然后助手基本上以非常易读的方式打包了信息。所以在2023年10月2日,也就是今天,Meta的年初至今收益约为140%,Tesla的年初至今收益为131%。
现在助手输出了 TERMINATE 标志,代表该任务已经成功完成了,然后它输出了终止响应。
用户代理执行 is_termination_msg 匿名函数,获取到TERMINATE 标志后,停止了对话。
# 创建一个助手代理
assistant = autogen.AssistantAgent(
name="assistant",
llm_config={
"seed": 42, # seed for caching and reproducibility
"config_list": config_list, # a list of OpenAI API configurations
"temperature": 0, # temperature for sampling
}, # configuration for autogen's enhanced inference API which is compatible with OpenAI API
)
# 创建一个用户代理
user_proxy = autogen.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, # set to True or image name like "python:3" to use docker
},
)
# 使用用户代理发起一个会话,设置助理代理assistant,发起第一条消息message
user_proxy.initiate_chat(
assistant,
message="""What date is today? Compare the year-to-date gain for META and TESLA.""",
)
autogen既可以使用OpenAI,也可以用本地LLM
from autogen import oai
# create a chat completion request
response = oai.ChatCompletion.create(
config_list=[
{
"model": "chatglm2-6b",
"api_base": "http://localhost:8000/v1",
"api_type": "open_ai",
"api_key": "NULL",
},
{
"model": "vicuna-7b-v1.3",
"api_base": "http://localhost:8000/v1",
"api_type": "open_ai",
"api_key": "NULL",
}
],
messages=[{"role": "user", "content": "Hi"}]
)
print(response)
# ----------- 自定义消息、参数 --------
response = oai.ChatCompletion.create(
config_list=[
{
"model": "baichuan2-7b",
"api_base": "http://localhost:8000/v1",
"api_type": "open_ai",
"api_key": "NULL",
}
],
messages=[
{"role": "system", "content": "你是一名资深的大语言模型领域的专家,精通模型架构原理和落地应用实践"},
{"role": "user", "content": "你好呀!"}
],
temperature=0.2,
top_k=1,
top_p=0.96,
repeat_penalty=1.1,
stop=["</s>"],
max_tokens=1024,
stream=False
)
print(response)
content = response.get("choices")[0].get("message").get("content")
print(content)
AutoGen 提供了 openai.Completion 或 openai.ChatCompletion 的直接替代,还添加了更多功能,如调优、缓存、错误处理和模板。例如,用户可以使用自己的调优数据,在预算范围内来优化 LLM 的生成内容。
# perform tuning
config, analysis = autogen.Completion.tune (
data=tune_data,
metric="success",
mode="max",
eval_func=eval_func,
inference_budget=0.05,
optimization_budget=3,
num_samples=-1,
)
# perform inference for a test instance
response = autogen.Completion.create (context=test_instance, **config)
【2024-2-4】实践通过, 本地工具调用
from autogen import AssistantAgent, UserProxyAgent, get_config_list, GroupChat, GroupChatManager
# =========== LLM 配置区 ===========
# config_list = get_config_list(["****"],
# ["****"], "azure",
# "2023-03-15-preview")
config_list = [
{
"model": "gpt-3.5-turbo-0613",
#"model": "gpt-4-0613",
"base_url": "https://****",
"api_type": "azure",
"api_key": "******",
}
]
llm_config = {
"config_list": config_list,
"temperature": 0.1,
"model": "gpt-35-turbo-16k",
}
# =========== Agent设置 ===========
weather = AssistantAgent(name="weather", llm_config=llm_config, )
travel = AssistantAgent(name="travel", llm_config=llm_config,)
# create a UserProxyAgent instance named "user_proxy"
user_proxy = UserProxyAgent(
name="user_proxy",
human_input_mode="TERMINATE",
is_termination_msg=lambda x: "tool_calls" not in x.keys(),
max_consecutive_auto_reply=10,
)
# =========== 本地工具调用 ===========
@user_proxy.register_for_execution()
@weather.register_for_llm(description="查询天气")
def query_weather(city: str) -> str:
return f"weather in {city} is sunny."
@user_proxy.register_for_execution()
@travel.register_for_llm(description="旅游推荐")
def travel_recommend(weather: str) -> str:
return f'结合天气{weather},我认为最好去爬山'
# =========== 群聊设置 ===========
group_chat = GroupChat(
agents=[user_proxy, weather, travel],
messages=[],
speaker_selection_method="auto",
allow_repeat_speaker=False,
max_round=12,
)
manager = GroupChatManager(
groupchat=group_chat,
is_termination_msg=lambda x: x.get("content", "").find("TERMINATE") >= 0,
llm_config=llm_config,
)
# =========== 启动会话 ===========
user_proxy.initiate_chat(
manager,
message="结合杭州的天气,给我推荐一些旅游的地方"
)
AutoGen 生态
AutoGen Studio
【2023-12-1】微软 AutoGen Studio: Interactively Explore Multi-Agent Workflows
AutoGen Studio 提供了一个更直观的用户界面,使得用户可以更容易地使用AutoGen框架来创建和管理AI智能体。
- 与CrewAI和MetaGPT相比,AutoGen Studio提供了可视化界面,对新手更友好
特性
- 智能体和工作流定义修改:用户可以在界面上定义和修改智能体的参数,以及通信方式。
- 与智能体的互动:通过UI创建聊天会话,与指定的智能体交互。
- 增加智能体技能:用户可以显式地为他们的智能体添加技能,以完成更多任务。
- 发布会话:用户可以将他们的会话发布到本地画廊。
AutoGen Studio的组成
- 构建部分(Build):定义智能体属性和工作流。
- 默认的三个Skill是生成图片、获取个人网页正文、找Arxiv的论文。
- 游乐场(Playground):与在构建部分定义的智能体工作流进行互动。
- 画廊(Gallery):分享和重用工作流配置和会话。
CrewAI、MetaGPT v0.6、Autogen Studio 区别
实践
- 背后通过 fastapi、uvicorn 启动Web并行服务, 详见代码
- sqlite3 本地数据库存储会话数据,详见代码
- 重置数据库 —— 删除
database.sqlite
- 删除用户信息 —— 删除文件夹
autogenstudio/web/files/user/<user_id_md5hash>
- 重置数据库 —— 删除
- 切换LLM、agent配置、skill信息 —— 修改默认配置文件 dbdefaults.json
- 查看中间信息 —— Web UI调试窗口,或
database.sqlite
文件
pip install autogenstudio # 安装
# Mac电脑需要 export OPENAI_API_KEY=<your_api_key>
#参数 host, port, workers, reload
autogenstudio ui --port 8081 # 启动Web UI
autogenstudio ui --port 8081 --host 10.92.186.159 # 其它域内机器可访问
AutoGen 问题
功能局限
案例都是单层调用,一层树结构,user_proxy调weather或traval;
如果有多层调用怎么办?
- ① 再加一个assistant专门用来判断以上工具执行结果,正确才返回给user_proxy
- ② 两个weather agent同时执行,根据二者结果一致性情况再决定是否调travel;
多agent间复杂调用,更有实用价值,但autogen好像没说清楚怎么设计
autogen 没有现成可以支持这种场景的实现。但是可以扩展speak_selector_mehod和ChatManager。
通过定义SOP来实现上述场景
会话信息传递
- 上一个agent的输出会自动append到历史中
System prompt中如何引用?
- workflow 这样的确定的编排的场景。而不是agent的动态编排
单次调用,如果是批量请求,每次都需要initiate_chat? 如何获取中途所有agent的消息?
- 如果是用户批量消息, 每次都 initiate_chat。 agent 消息可以看上面的memory相关,每个agent都拥有和其他agent的消息历史