【Agent】AutoGen:LLM驱动的多Agent对话框架

文章目录

  • 一、AutoGen简介
    • 1.1 AutoGen的特点
    • 1.2 AutoGen的实现
      • 1.2.1 可对话Agent
      • 1.2.2 对话编程
  • 二、基于AutoGen构建多智能体系统
    • 2.1 构建步骤
    • 2.1 协作模式
    • 2.2 通信模型
    • 2.3 人机协同
    • 2.4 具体示例
  • 参考资料

一、AutoGen简介

AutoGen是微软推出的一个Multi-Agent框架,允许用户创建和管理多个智能体,以协同完成复杂的任务。AutoGen具有 可定制可对话 的能力,同时支持 人类输入工具扩展 的能力。基于AutoGen可以简化、优化和自动化大型语言模型的工作流程。

  • Github 项目地址:https://github.com/microsoft/autogen
  • AutoGen 官方文档:https://microsoft.github.io/autogen/stable/
  • AutoGen 中文文档:https://www.aidoczh.com/autogen/stable/

1.1 AutoGen的特点

  • AutoGen最大的特点是其 可定制、可交互、可人工干预。每个Agent都可以具有不同的能力,通过多个Agent之间的对话可以解决它们的局限性。
  • AutoGen具有 高可扩展性,可以根据不同的场景,定义并实现所需的Agent类型(通过扩展子类实现)。
  • AutoGen将复杂的Multi-Agent简化为定义 一组具有特定能力和角色的Agent。用户可以定义Agent之间的互动行为,包含定义Agent角色,及其协同模式。例如,如果我们要构建一个工程团队,我们可能会有一个是工程师,另一个是项目经理,再有一个是质量保证等等。然后你需要定义Agent之间的互动行为,即当一个Agent从另一个Agent收到消息时该如何回复。所以你不仅仅是在定义Agent和角色,你还在定义它们如何协同工作。
  • AutoGen并不完全依赖于OpenAI的API(当然它自身提供了对OpenAI的API支持),只要提供了API,用户可以用Autogen对接任何LLM。
    在这里插入图片描述
    上图中,AutoGen使用多智能体对话实现了复杂的基于LLM的工作流。(左)AutoGen代理可以定制,可以基于LLM、工具、人员,甚至是它们的组合。(右上角)代理可以通过对话解决任务。(右下角)该框架支持许多其他复杂的对话模式。

1.2 AutoGen的实现

AutoGen的核心设计原则是使用多Agent对话来简化和整合多Agent工作流程。其旨在最大限度地提高实现Agent的可重用性。 AutoGen主要包含两个关键概念:可对话Agent和对话编程。

1.2.1 可对话Agent

在AutoGen中,可对话智能体是一个具有特定角色的实体,可以传递消息与其他可对话智能体之间发送和接收信息,例如启动或继续对话。它根据发送和接收的消息维护其内部上下文,并可以配置具有一组能力,例如由LLMs、工具或人类输入等启用。

虽然对大模型领域对 Agent 的定义有许多种,但 在 AutoGen 中,代理是一个能够发送消息、接收消息,并通过模型、工具、人类输入或它们的组合生成回复的实体。代理可以由模型(例如大型语言模型 GPT-4)、代码执行器(如 IPython 内核)、人类,或这些组件的组合构建。

(1)由LLMs、人类和工具提供支持的智能体能力

AutoGen支持根据需求灵活的赋予智能体各种能力,其能力可以是以下能力的单个或者多个之间的组合。

  • LLMs:基于LLMs的智能体,可以利用LLMs的许多优秀能力,如角色扮演、基于对话历史的简化性推理、提供反馈、根据反馈进行适应等。通过提示技术,这些能力支持以不同的方式组合起来,以增加智能体的技能和自主性。AutoGen还加强了LLM的推理能力,如结果缓存、错误处理、消息模板等。
  • 人类:AutoGen允许人类参与到智能对话中,具体取决于智能对的配置,可以在对话的某些回合征求人类输入。
  • 工具:AutoGen支持基于代码或函数来扩展其工具。

以AutoGen框架中的ConversableAgent代理为示例,它支持下面的组件:

  • 一个LLM列表
  • 一个代码执行器
  • 一个函数和工具执行器
  • 一个用于人工参与的组件
    在这里插入图片描述

下面的例子中构建一个打开GPT-4o-mini模型组件,关闭其他组件的 ConversableAgent

import os
from dotenv import load_dotenv
from autogen import ConversableAgent
load_dotenv()
api_key = os.getenv("API_KEY")
api_version = os.getenv("API_VERSION")
base_url = os.getenv("BASE_URL")
# Create an instance of ConversableAgent
agent = ConversableAgent("chatbot",llm_config={"config_list": [{"model": "gpt-4o-mini", "temperature": 0.9, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]},code_execution_config=False,  # Turn off code execution, by default it is off.function_map=None,  # No registered functions, by default it is None.human_input_mode="NEVER",  # Never ask for human input.
)

你可以向上述构建好的agent提问,并使用generate_reply方法获得代理对问题的回答:

agent.generate_reply(messages=[{"content": "给我讲一个童话故事.", "role": "user"}])
'从前,在一个遥远的王国里,住着一位美丽善良的公主,名叫小莉。小莉公主非常喜欢大自然,尤其是花朵和动物。王国的花园里种满了五彩缤纷的花朵,公主每天都会在花园中嬉戏,与小动物们玩耍。\n\n然而,王国的另一边住着一位邪恶的女巫,她非常嫉妒小莉公主的美丽和快乐。女巫决定要给公主一个教训,她施下了一个恶咒:每当白天的阳光落下,公主的花园就会被浓厚的黑暗笼罩,花朵会枯萎,小动物们也会逃离。\n\n小莉公主得知这个诅咒后,心中充满了忧虑。她决定去寻找能打破诅咒的办法。于是,公主踏上了旅程,她走过高山、穿越树林,最终来到了女巫的城堡。\n\n公主勇敢地敲响了城堡的大门。女巫见到小莉,冷冷一笑,问道:“公主,你来这里做什么?”小莉毫不畏惧地回答:“我来解除你的诅咒,给我的花园和小动物们带回光明。”\n\n女巫被公主的勇气所震撼,但她并不打算轻易放过小莉。女巫提出了三个难题,只有答对了,才能解除诅咒。小莉毫不退缩,认真思考每一个难题,凭着自己的智慧和对大自然的了解,最终成功解答了所有难题。\n\n女巫见状,心中不禁有些感动。她意识到,自己虽然拥有强大的魔法,但却没有小莉那样纯真的心灵。于是,女巫决定放弃她的恶意,将诅咒解除,并赠予公主一朵魔法花,这朵花可以带来永恒的光明。\n\n小莉公主带着这朵魔法花回到了自己的王国。当天晚上,公主将花放在花园中央,顿时,整个花园被温暖的光芒笼罩,花朵再次绽放,小动物们也纷纷回到了这里。\n\n从此以后,公主和女巫成为了朋友,女巫也用她的魔法来帮助王国的发展。而小莉公主则继续守护着她的花园,和大自然的所有生灵分享着快乐和爱。\n\n这个故事告诉我们,勇敢和智慧能够战胜邪恶,而爱与友谊能让世界变得更加美好。'

(2)Agent定制和合作

AutoGen允许通过重用或扩展内置智能体轻松创建具有专业能力和角色的智能体。

图2的黄色阴影区域提供了AutoGen中内置智能体的草图。

  • ConversableAgent类是最高级的智能体抽象,可以默认使用LLMs、人类和工具。
  • AssistantAgentUserProxyAgent是两个预配置的ConversableAgent子类,分别表示常见的使用模式。 AssistantAgent作为AI助手(由LLMs支持)和 UserProxyAgent 作为人类代理以征求人类输入或执行代码/函数调用(由人类和/或工具支持)。

在这里插入图片描述
图2:使用AutoGen实现多智能体对话的示意图。顶部子图示例AutoGen提供的内置智能体,这些智能体具有统一的对话接口并可进行自定义。中间子图显示了使用AutoGen开发具有自定义回复函数的双智能体系统的示例。底部子图说明了在程序执行期间从双智能体系统中产生的自动化智能体对话。

例如,在下面的示例中,我们通过设置代理的 system_message 来为两个代理分配不同的角色。

degang = ConversableAgent("Guodegang",system_message="你是相声演员郭德纲,你善于活灵活现的运用各种修辞手法,并辅以时事,将相声艺术的讽刺性发挥到极致",llm_config={"config_list": [{"model": "gpt-4o-mini", "temperature": 0.9, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]},human_input_mode="NEVER",  # Never ask for human input.
)
yuqian = ConversableAgent("Yuqian",system_message="你是相声演员于谦,你的台风儒雅沉稳,自然从容。与郭德纲嬉闹灵动,充强扮愣的喜剧风格相得益彰",llm_config={"config_list": [{"model": "gpt-4o-mini", "temperature": 0.7, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]},human_input_mode="NEVER",  # Never ask for human input.
)
yuqian.initiate_chat(degang, message="郭德纲, 快过农历新年了,我们以办年货为话题给大家伙讲个相声. 从我开始,今年消费降级了,我买年货前研究了几天的国家消费补贴政策,做了好久的攻略,但是一件年货也没有买,你说这个国家补贴真耽误事啊", role="user", max_turns=2)
Yuqian (to Guodegang):
郭德纲, 快过农历新年了,我快来以办年货为话题给大家伙讲个相声. 从我开始,今年消费降级了,我买年货前研究了几天的国家消费补贴政策,做了好久的攻略,但是一件年货也没有买,你说这个国家补贴真耽误事啊
--------------------------------------------------------------------------------
Guodegang (to Yuqian):
哎呀,消费降级,这可是个劲爆的话题呀!你看看,现在大家都在研究国家的消费补贴,像是考大学一样,准备做攻略,生怕错过了什么优惠。结果呢,研究了半天,年货一件没买,真是辛苦了你!
这年货啊,原本应该是买得欢快,结果现在变得像是参加马拉松一样,一路跑一路算账,心里还得默念:“这补贴到底能不能用啊?”一不小心,心里失落得跟过年买不到对联似的,愣是不知道该贴哪条。
再说这补贴政策,越是宣传得好,实际操作起来就像是空气一样,明明说着“买一送一”,结果你买的是一,送来的却是“等待”的心情!这到底是买年货,还是买个心情呢?
不过你说这年货,我觉得其实也是个心理安慰,买一点,过个年,心里舒坦。你想啊,买点糖果,觉得自己过年像个孩子,结果一看价格,心想:“哎呀,糖果都比金子贵!”这年头,年货可不是个便宜货啊,赶上了消费降级,真是要掂量掂量了!
可是咱们中国人过年,讲究的就是个热闹!没事儿咱也得来点bullshit,买点过年用的开心,结果变成了“国家补贴的牺牲品”,难不成过年还得学学消费心理学了?不如干脆过个“简约年”,简单随意,吃点饺子,喝点酒,也就那么回事了嘛!
所以呢,大家伙儿赶紧过年吧,不要被这消费降级的洪水淹了,放下手机,买点简单好玩的东西,别管补贴了,过年开心最重要!
--------------------------------------------------------------------------------
Yuqian (to Guodegang):
于谦: 哎呀,郭德纲,你这一说我就想起来了,这补贴的事儿真是个“坑”啊!我前几天也在网上看那些年货,结果点进去一看,价格跟我上次买的差不多,还没什么优惠,心里那个失落啊,简直像是过年没吃上饺子!
现在的人啊,过年不光是买年货,要研究这补贴政策,真的是把过年当成了“考试”,买得小心翼翼,生怕买贵了,结果买得越多越心慌。要是能把这智商用在买年货上,我估计能提前过上“富裕年”了!
而且啊,咱们传统的年货,像糖果、坚果、干果,这些东西本来就是图个心意,结果现在变得像是“奢侈品”,买个坚果还得计算每一颗的价格,真是的,连过年都变得精打细算了!我真希望能回到那个年代,随便买点儿东西,心里踏实,吃得开心。
不过说真的,过年最重要的就是个热闹,别让这些消费降级的事给搅和了。咱们可以简单过年,买点儿家里做的好吃的,围坐在一起,聊聊天,看看春晚,心里那叫一个美!不管补贴如何,咱们的年味儿得保留住,这才是过年的意义。
所以,我建议大家伙儿,别纠结于那些补贴了,买点简单的,开心过年,才是王道!你说是不是,郭德纲?
--------------------------------------------------------------------------------
Guodegang (to Yuqian):
郭德纲: 哎呀,于谦,你这一说我可是更有感触了!你瞧,补贴这事儿不就成了个“坑”吗?大家都在那研究,结果发现不过是个花样,心里那种失落感,简直就是过年没吃上饺子的感觉!我跟你说,过年吃饺子那可是我们中国人心中大事,没饺子了,年都没味儿了!
你说现在的人在网上买年货,真像是走进了迷宫,进去一看,满眼都是价格和各种“政策”,心里想着:“哎呀,我这是在买年货,还是在参加金融投资啊?”下单之前,得考虑各种因素,结果越想越麻烦,最后只好放弃,空手而归,真是太打击人了!
而且传统年货,像坚果、糖果,原本是为了图个喜庆,结果现在貌似需要个财务报表才能买,买个开心也是有门槛的!买坚果要算每颗的价格,这是什么,开店还是过年啊?要是再这么搞下去,过年得带上会计师,多尴尬啊,买点糖果居然还得请人来审核!
说到年味,那可真是我们过年的灵魂,不能让这些消费的烦恼给搅和了。其实,咱们简单过年,回归那种亲切感,自己家做点好吃的,围着一起聊聊天,看看春晚,这才是过年真正的精髓!不管这个补贴怎么搞,咱们心里的年味和团圆是无法割舍的。
所以说,大家伙儿,别再纠结那些补贴政策了。买点简简单单的,开心过年,才是王道!就像我们说的:“心宽体胖”,过年最重要的是个心情,钱虽然重要,但别让它影响了我们的欢乐!这样年才有意义,对吧?
--------------------------------------------------------------------------------
ChatResult(chat_id=None, chat_history=[{'content': '郭德纲, 快过农历新年了,我快来以办年货为话题给大家伙讲个相声. 从我开始,今年消费降级了,我买年货前研究了几天的国家消费补贴政策,做了好久的攻略,但是一件年货也没有买,你说这个国家补贴真耽误事啊', 'role': 'assistant', 'name': 'Yuqian'}, {'content': '哎呀,消费降级,这可是个劲爆的话题呀!你看看,现在大家都在研究国家的消费补贴,像是考大学一样,准备做攻略,生怕错过了什么优惠。结果呢,研究了半天,年货一件没买,真是辛苦了你!\n\n这年货啊,原本应该是买得欢快,结果现在变得像是参加马拉松一样,一路跑一路算账,心里还得默念:“这补贴到底能不能用啊?”一不小心,心里失落得跟过年买不到对联似的,愣是不知道该贴哪条。\n\n再说这补贴政策,越是宣传得好,实际操作起来就像是空气一样,明明说着“买一送一”,结果你买的是一,送来的却是“等待”的心情!这到底是买年货,还是买个心情呢?\n\n不过你说这年货,我觉得其实也是个心理安慰,买一点,过个年,心里舒坦。你想啊,买点糖果,觉得自己过年像个孩子,结果一看价格,心想:“哎呀,糖果都比金子贵!”这年头,年货可不是个便宜货啊,赶上了消费降级,真是要掂量掂量了!\n\n可是咱们中国人过年,讲究的就是个热闹!没事儿咱也得来点bullshit,买点过年用的开心,结果变成了“国家补贴的牺牲品”,难不成过年还得学学消费心理学了?不如干脆过个“简约年”,简单随意,吃点饺子,喝点酒,也就那么回事了嘛!\n\n所以呢,大家伙儿赶紧过年吧,不要被这消费降级的洪水淹了,放下手机,买点简单好玩的东西,别管补贴了,过年开心最重要!', 'role': 'user', 'name': 'Guodegang'}, {'content': '于谦: 哎呀,郭德纲,你这一说我就想起来了,这补贴的事儿真是个“坑”啊!我前几天也在网上看那些年货,结果点进去一看,价格跟我上次买的差不多,还没什么优惠,心里那个失落啊,简直像是过年没吃上饺子!\n\n现在的人啊,过年不光是买年货,要研究这补贴政策,真的是把过年当成了“考试”,买得小心翼翼,生怕买贵了,结果买得越多越心慌。要是能把这智商用在买年货上,我估计能提前过上“富裕年”了!\n\n而且啊,咱们传统的年货,像糖果、坚果、干果,这些东西本来就是图个心意,结果现在变得像是“奢侈品”,买个坚果还得计算每一颗的价格,真是的,连过年都变得精打细算了!我真希望能回到那个年代,随便买点儿东西,心里踏实,吃得开心。\n\n不过说真的,过年最重要的就是个热闹,别让这些消费降级的事给搅和了。咱们可以简单过年,买点儿家里做的好吃的,围坐在一起,聊聊天,看看春晚,心里那叫一个美!不管补贴如何,咱们的年味儿得保留住,这才是过年的意义。\n\n所以,我建议大家伙儿,别纠结于那些补贴了,买点简单的,开心过年,才是王道!你说是不是,郭德纲?', 'role': 'assistant', 'name': 'Yuqian'}, {'content': '郭德纲: 哎呀,于谦,你这一说我可是更有感触了!你瞧,补贴这事儿不就成了个“坑”吗?大家都在那研究,结果发现不过是个花样,心里那种失落感,简直就是过年没吃上饺子的感觉!我跟你说,过年吃饺子那可是我们中国人心中大事,没饺子了,年都没味儿了!\n\n你说现在的人在网上买年货,真像是走进了迷宫,进去一看,满眼都是价格和各种“政策”,心里想着:“哎呀,我这是在买年货,还是在参加金融投资啊?”下单之前,得考虑各种因素,结果越想越麻烦,最后只好放弃,空手而归,真是太打击人了!\n\n而且传统年货,像坚果、糖果,原本是为了图个喜庆,结果现在貌似需要个财务报表才能买,买个开心也是有门槛的!买坚果要算每颗的价格,这是什么,开店还是过年啊?要是再这么搞下去,过年得带上会计师,多尴尬啊,买点糖果居然还得请人来审核!\n\n说到年味,那可真是我们过年的灵魂,不能让这些消费的烦恼给搅和了。其实,咱们简单过年,回归那种亲切感,自己家做点好吃的,围着一起聊聊天,看看春晚,这才是过年真正的精髓!不管这个补贴怎么搞,咱们心里的年味和团圆是无法割舍的。\n\n所以说,大家伙儿,别再纠结那些补贴政策了。买点简简单单的,开心过年,才是王道!就像我们说的:“心宽体胖”,过年最重要的是个心情,钱虽然重要,但别让它影响了我们的欢乐!这样年才有意义,对吧?', 'role': 'user', 'name': 'Guodegang'}], summary='郭德纲: 哎呀,于谦,你这一说我可是更有感触了!你瞧,补贴这事儿不就成了个“坑”吗?大家都在那研究,结果发现不过是个花样,心里那种失落感,简直就是过年没吃上饺子的感觉!我跟你说,过年吃饺子那可是我们中国人心中大事,没饺子了,年都没味儿了!\n\n你说现在的人在网上买年货,真像是走进了迷宫,进去一看,满眼都是价格和各种“政策”,心里想着:“哎呀,我这是在买年货,还是在参加金融投资啊?”下单之前,得考虑各种因素,结果越想越麻烦,最后只好放弃,空手而归,真是太打击人了!\n\n而且传统年货,像坚果、糖果,原本是为了图个喜庆,结果现在貌似需要个财务报表才能买,买个开心也是有门槛的!买坚果要算每颗的价格,这是什么,开店还是过年啊?要是再这么搞下去,过年得带上会计师,多尴尬啊,买点糖果居然还得请人来审核!\n\n说到年味,那可真是我们过年的灵魂,不能让这些消费的烦恼给搅和了。其实,咱们简单过年,回归那种亲切感,自己家做点好吃的,围着一起聊聊天,看看春晚,这才是过年真正的精髓!不管这个补贴怎么搞,咱们心里的年味和团圆是无法割舍的。\n\n所以说,大家伙儿,别再纠结那些补贴政策了。买点简简单单的,开心过年,才是王道!就像我们说的:“心宽体胖”,过年最重要的是个心情,钱虽然重要,但别让它影响了我们的欢乐!这样年才有意义,对吧?', cost={'usage_including_cached_inference': {'total_cost': 0.007123949999999999, 'gpt-4o-mini-2024-07-18': {'cost': 0.007123949999999999, 'prompt_tokens': 24429, 'completion_tokens': 5766, 'total_tokens': 30195}}, 'usage_excluding_cached_inference': {'total_cost': 0.007123949999999999, 'gpt-4o-mini-2024-07-18': {'cost': 0.007123949999999999, 'prompt_tokens': 24429, 'completion_tokens': 5766, 'total_tokens': 30195}}}, human_input=[])

1.2.2 对话编程

AutoGen采用了对话编程,这是一种考虑两个概念的范式:

  1. 计算:即在多智能体对话中计算其响应的行为。
  2. 控制流程:即这些计算发生的顺序(或条件)。

AutoGen具有以下设计模式,以促进对话编程:

(1)自动智能体对话的统一接口和自动回复机制

  • AutoGen中的智能体具有统一的对话接口,用于执行相应的以对话为中心的计算,包括用于发送/接收消息的发送/接收函数和用于基于接收到的消息采取行动和生成响应的生成回复函数。
  • AutoGen还引入并默认采用智能体自动回复机制来实现以对话驱动的控制:一旦智能体接收到来自另一个智能体的消息,它会自动调用生成回复并将回复发送回发送者,除非满足终止条件。
  • AutoGen提供基于LLM推理、代码或函数执行或人类输入的内置回复函数。还可以注册自定义回复函数来自定义智能体的行为模式,例如在回复发送者智能体之前与另一个智能体进行对话。在这种机制下,一旦注册了回复函数并初始化了对话,对话流程就会自然引发,因此智能体对话会在没有任何额外控制平面的情况下自然进行,即不需要一个专门控制对话流程的模块。

(2)结合编程和自然语言的控制

AutoGen允许在各种控制流管理模式中使用编程和自然语言:

  • 通过LLM的自然语言控制:在AutoGen中,可以通过使用自然语言提示基于LLM的智能体来控制对话流程。例如,AutoGen中内置的AssistantAgent的默认系统消息使用自然语言指示智能体修复错误并重新生成代码,如果先前的结果表明存在错误的话。
  • 编程语言控制:在AutoGen中,可以使用Python代码来指定终止条件、人类输入模式和工具执行逻辑,例如自动回复的最大次数。还可以注册编程的自动回复函数来使用Python代码控制对话流程,如图2中标识为“Conversation-Driven Control Flow”的代码块所示。
  • 自然语言和编程语言之间的控制转换:AutoGen还支持自然语言和编程语言之间的灵活控制转换。可以通过调用包含某些控制逻辑的LLM推理来从代码转换为自然语言控制;或通过LLM提议的函数调用从自然语言转换为代码控制。

在对话编程范式中,可以实现各种模式的多智能体对话。除了具有预定义流程的静态对话外,AutoGen还支持具有多个智能体的动态对话流程。AutoGen提供了两种实现这一目标的常用方法:

  1. 自定义生成回复函数:在自定义生成回复函数中,一个智能体可以保持当前对话,并根据当前消息和上下文与其他智能体进行对话。
  2. 函数调用:LLM根据对话状态决定是否调用特定的函数。通过向调用的函数发送消息给其他智能体,LLM可以驱动动态的多智能体对话。此外,AutoGen还通过内置的GroupChatManager支持更复杂的动态群组对话,它可以动态选择下一个发言者,并将其响应广播给其他智能体。

二、基于AutoGen构建多智能体系统

2.1 构建步骤

构建复杂的多智能体对话系统涉及如下两点:

  • 定义一组具有专门功能和角色的可对话智能体。
  • 定义智能体之间的交互行为,即一个智能体在接收来自另一个智能体的消息时应如何响应。

基于AutoGen框架构建多智能体系统分为三步,开发人员要做的就是明确任务,创建Agent,把这些Agent融合到一起。

第一步,创建Agent:

  • 支持创建和管理不同类型的 Agent,包括特定任务的专家、通用助手、策略制定者等。
  • 能够为每个 Agent 指定不同的角色、任务和权限,以确保分工明确。
  • 提供 Agent 定制选项,以满足不同任务的特定需求。

第二步,提供对话环境:

  • 提供一个虚拟的对话空间,让 Agent 之间可以相互沟通和协作。
  • 支持多方对话和协作,包括文本、音频或视频形式。
  • 自动记录对话内容和决策过程,以便回顾和审查。

第三步,对话内容管理:

  • 引导 Agent 的讨论方向,以确保讨论围绕目标进行。
  • 提供实时监控工具,帮助发现潜在问题,并及时给予纠正和调整。
  • 设置规则和约束条件,以保持对话和协作的质量和效率。
  • 提供对对话内容的搜索和过滤功能,以便快速查找相关信息。

2.1 协作模式

AutoGen所适用的场景示例:

在这里插入图片描述

Autogen支持以下多种协作模式:

  • 主从模式(群聊):需要一个核心的Agent负责整个流程,其它Agent负责接受信息并将结果返回给主Agent,如:狼人杀场景,法官掌控整个流程;
  • 合作模式:Agent之间关系相对平等,一般是线性关系,如:软件开发场景下的架构师、产品经理、开发人员和测试人员是平等协作关系;
  • 竞争模式:Agent之间的关系是竞争或对抗的关系,如:狼人杀场景,预言家和狼人是竞争关系,辩论场景的双方辩手。

2.2 通信模型

AutoGen支持同步和异步的通信,其通信的消息类型是字典或字符串,消息可以包含内容(必填)、被调用函数、消息作用(function或assistant)、上下文(用于OpenAI API调用)等。

消息的传播方式,在一对一的场景下需要指定对应的recipient/sender;在群聊场景下,需要实现消息的广播。

2.3 人机协同

AutoGen支持了多个Agent间交互、协同的能力,同时支持人工干预其中。当前典型的交互方式是通过 UserProxyAgent 里设置human_input_mode参数,从而在 AssistantAgent 每次返回结果时给予反馈。

在这里插入图片描述

2.4 具体示例

例子: 两个对话代理
我们创建了一个名为assistant的AssistantAgent来充当助手角色,并创建了一个名为user_proxy的UserProxyAgent来作为人类用户的代理,共同完成一个简单的任务

import os
from autogen import AssistantAgent, UserProxyAgent
from autogen.coding import LocalCommandLineCodeExecutorconfig_list = [{"model": "gpt-4o-mini", "temperature": 0.9, "api_type": "azure", "api_key": api_key, "base_url": base_url, "api_version": api_version}]# create an AssistantAgent instance named "assistant" with the LLM configuration.
assistant = AssistantAgent(name="assistant", llm_config={"config_list": config_list})# create a UserProxyAgent instance named "user_proxy" with code execution on docker.
code_executor = LocalCommandLineCodeExecutor(work_dir="coding")
user_proxy = UserProxyAgent(name="user_proxy", code_execution_config={"executor": code_executor})# the assistant receives a message from the user, which contains the task description
user_proxy.initiate_chat(assistant,message="""Plot a chart of NVDA and TESLA stock price change YTD.""",
)
user_proxy (to assistant):

Plot a chart of NVDA and TESLA stock price change YTD.


assistant (to user_proxy):

To plot a chart of NVDA (Nvidia) and TSLA (Tesla) stock price changes year-to-date (YTD), we will follow these steps:

  1. Install the necessary libraries (yfinance for fetching stock data and matplotlib for plotting).
  2. Fetch the YTD stock prices for NVDA and TSLA.
  3. Plot the data using matplotlib.

Let’s start with the first step by installing the required libraries. Please execute the following code:

# filename: install_packages.sh
pip install yfinance matplotlib

Once the installation is complete, we’ll proceed to fetch the stock data and plot the chart. Here’s the code for that step:

# filename: plot_stock_chart.py
import yfinance as yf
import matplotlib.pyplot as plt
from datetime import datetime# Define the stocks and the date range
tickers = ['NVDA', 'TSLA']
start_date = datetime(datetime.now().year, 1, 1)# Fetch the stock data
data = yf.download(tickers, start=start_date)# Plot the adjusted close prices
plt.figure(figsize=(10, 5))
plt.plot(data['Adj Close']['NVDA'], label='Nvidia (NVDA)')
plt.plot(data['Adj Close']['TSLA'], label='Tesla (TSLA)')
plt.title('YTD Stock Prices of NVDA and TSLA')
plt.xlabel('Date')
plt.ylabel('Adjusted Close Price ($)')
plt.legend()
plt.grid(True)
plt.tight_layout()# Save the plot
plt.savefig('ytd_stock_prices.png')
plt.show()

Please execute the second code block after successfully installing the required packages.


user_proxy (to assistant):

Traceback (most recent call last): File “/home/hj/workspaces/dc/autogen-v0.2/coding/plot_stock_chart.py”, line 14, in plt.plot(data[‘Adj Close’][‘NVDA’], label=‘Nvidia (NVDA)’) File “/usr/local/lib/python3.10/site-packages/pandas/core/frame.py”, line 4101, in getitem return self._getitem_multilevel(key) File “/usr/local/lib/python3.10/site-packages/pandas/core/frame.py”, line 4159, in _getitem_multilevel loc = self.columns.get_loc(key) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/multi.py”, line 3040, in get_loc loc = self._get_level_indexer(key, level=0) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/multi.py”, line 3391, in _get_level_indexer idx = self._get_loc_single_level_index(level_index, key) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/multi.py”, line 2980, in _get_loc_single_level_index return level_index.get_loc(key) File “/usr/local/lib/python3.10/site-packages/pandas/core/indexes/base.py”, line 3812, in get_loc raise KeyError(key) from err KeyError: ‘Adj Close’


assistant (to user_proxy):

The error indicates that data['Adj Close'] isnot accessible in the way we attempted to. This can happen if the data returned from Yahoo Finance isnot structured as expected. Let’s take an alternative approach to ensure we correctly extract the adjusted close prices.

We’ll modify the code to check the structure of the returned data and access the prices correctly. Please execute the following updated code:

# filename: plot_stock_chart.py
import yfinance as yf
import matplotlib.pyplot as plt
from datetime import datetime# Define the stocks and the date range
tickers = ['NVDA', 'TSLA']
start_date = datetime(datetime.now().year, 1, 1)# Fetch the stock data
data = yf.download(tickers, start=start_date)# Check the structure of the data
print(data.head())# Plot the adjusted close prices
plt.figure(figsize=(10, 5))
for ticker in tickers:plt.plot(data['Close'][ticker], label=f'{ticker} Close Price')plt.title('YTD Stock Prices of NVDA and TSLA')
plt.xlabel('Date')
plt.ylabel('Close Price ($)')
plt.legend()
plt.grid(True)
plt.tight_layout()# Save the plot
plt.savefig('ytd_stock_prices.png')
plt.show()

In this version, we print the head of the data to inspect its structure, andthen we access the Close prices instead of the Adj Close. Please execute the code again.

在这里插入图片描述

上面这个例子中,助手代理能够为给定的任务编写python代码,而用户代理则需要执行生成的代码,并根据设置自动或手动运行代码。大体的流程如下:

在这里插入图片描述

  • 更多代码示例,参考:AutoGen入门-让两个AI自行聊天完成任务

参考资料

  • 【多Agent洞察】04-AutoGen:通过多Agent对话来构建LLM应用的智能体
  • AGI|AutoGen入门食用手册,搭建你的智能体流水线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94736.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乙巳年闰六月十六凌晨感怀

乙巳年闰六月十六凌晨感怀 一段历程一段情,儿郎峥嵘儿郎行。 岁月流金建功业,春秋风尚能潮赢。 路途苦乐人生度,评说成败当下名。 百年孤寂留水墨,千载独步守安宁。

Redis 分布式Session

一、引入依赖引入spring-session-data-redis依赖&#xff0c;不需要指定version&#xff0c;默认和springboot的version保持一致<!-- Spring Session Redis --> <dependency><groupId>org.springframework.session</groupId><artifactId>spring…

JAVA实现附件分片上传

项目需求由于文件服务器的限制&#xff0c;单次调用文件上传接口上传的附件的大小不能超过500MB&#xff0c;对于超过500MB的附件需要分片上传程序示例private Boolean uploadFile(File uploadFile, String uploadUrl, List<Object> fileList) {final long CHUNK_SIZE 5…

PyTorch环境安装

pytorch安装 建议&#xff08;非常强烈的那种&#xff09;用Anaconda创建一个虚拟环境&#xff0c;用于运行安装你的PyTorch conda create -n universal python3.9 1. 基础认知 cuDNN&#xff08;CUDA Deep Neural Network library&#xff09;是 NVIDIA 开发的用于深度学习…

机场风云:AI 云厂商的暗战,广告大战一触即发

文 | 大力财经机场广告牌背后&#xff0c;一场决定云计算未来格局的隐形战争已悄然打响。当你匆匆走过首都机场T3航站楼的通道&#xff0c;巨幅屏幕上“阿里云&#xff1a;开源的力量”与不远处“百度智能云&#xff1a;AI落地领导者”的广告交相辉映。它们精准锁定着日均10万的…

MLE-STAR:谷歌AI推出的机器学习工程新范式,一种搜索驱动、精准优化的智能代理

最近看到 Google AI 发布了一个叫 MLE-STAR&#xff08;Machine Learning Engineering via Search and Targeted Refinement&#xff09;的新系统&#xff0c;说实话&#xff0c;第一眼看完论文和相关介绍后&#xff0c;我是有点震撼的。这不只是一次简单的“LLM 自动化”拼凑…

3-防火墙

防火墙 一 防火墙概述防火墙概述防火墙是一个位于内部网络与外部网络之间的安全系统&#xff08;网络中不同区域之间&#xff09;&#xff0c;是按照一定的安全策略建立起来的硬件或软件系统&#xff0c;用于流量控制的系统&#xff08;隔离&#xff09;&#xff0c;保护内部网…

python opencv 调用 海康威视工业相机(又全又细又简洁)

1.准备工作 准备一个海康相机 下载MVS 和SDK 海康机器人-机器视觉-下载中心 2.python MVS示例 &#xff08;说明&#xff1a;MVS里有很多python示例&#xff0c;可以直接运行&#xff0c;但没有用opencv&#xff09; 下载完MVS后&#xff0c;我们打开路径安装路径 我的&#…

计算机基础·linux系统

Finalshell 用于远程操控vmware中的linux系统 获取虚拟机的IP地址 ifconfig命令&#xff0c;重启系统后IP地址可能会变化&#xff01;问题&#xff1a;vmware子系统没有网络连接 winRservices.msc启动这些服务问题&#xff1a;配置正确但是finalshell连接失败 更新子系统中的ss…

8.结构健康监测选自动化:实时数据 + 智能分析,远超人工

第一次接触结构健康自动化监测系统&#xff0c;感觉成本很高&#xff0c;比人工好在哪里&#xff1f; 人工检测是依靠目测检查或借助于便携式仪器测量得到的信息&#xff0c;但是随着整个行业的发展&#xff0c;传统的人工检测方法已经不能满足检测需求&#xff0c;从人工检测到…

【慕伏白】Android Studio 配置国内镜像源

文章目录配置HTTP代理修改 gradle 镜像地址修改 maven 镜像源重新同步配置HTTP代理 进入File --> Settings --> Appearance & Behavior --> System Settings --> HTTP Proxy 勾选 Auto-detect proxy settings --> Automatic proxy configuration URL &…

Spring Cloud系列—LoadBalance负载均衡

上篇文章&#xff1a; Spring Cloud系列—Eureka服务注册/发现https://blog.csdn.net/sniper_fandc/article/details/149937589?fromshareblogdetail&sharetypeblogdetail&sharerId149937589&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link …

如何使用 pnpm创建Vue 3 项目

✅ 一、什么是 pnpm&#xff1f; pnpm 是一种更快、更高效的 Node 包管理工具&#xff0c;替代 npm 或 yarn&#xff0c;具有&#xff1a; 更快的安装速度更节省磁盘空间&#xff08;包复用&#xff09;严格的依赖管理二、使用 pnpm 创建 Vue 项目的完整流程 ✅ 第一步&#xf…

Vite vs. vue-cli 创建 Vue 3 项目的区别与使用场景

Vite vs. vue-cli 创建 Vue 3 项目的区别与使用场景 Vite 和 vue-cli 都是 Vue 官方推荐的脚手架工具&#xff0c;但它们的架构、构建方式和适用场景有所不同。以下是它们的对比&#xff1a;1. 核心区别对比项Vite (推荐&#x1f525;)vue-cli (传统)构建工具基于 ESM Rollup基…

VC6800智能相机:赋能智能制造,开启AI视觉新纪元

在工业自动化与智能化浪潮奔涌的今天&#xff0c;精准、高效、智能的视觉检测已成为提升生产力和品质的关键核心。VC6800智能相机应运而生&#xff0c;它不仅仅是一部相机&#xff0c;更是一个集强大视觉硬件与前沿AI算法于一身的 “工业智眼”&#xff0c;正深刻改变着各个领域…

(Python)Python爬虫入门教程:从零开始学习网页抓取(爬虫教学)(Python教学)

一、爬虫基础概念 什么是爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;是一种自动获取网页内容的程序&#xff0c;它像蜘蛛一样在互联网上"爬行"&#xff0c;收集和提取数据。 爬虫应用场景&#xff1a; 搜索引擎&#xff08;Google、百度&#…

dify前端源码部署详细教程

这两天突发奇想&#xff0c;能不能dify源码部署我只部署个前端&#xff0c;后端、数据库什么的还是原来docker部署dify的本地部署和遇到的问题。按逻辑来说应该是行得通的&#xff0c;我就亲自操作了下试下。 我这边就以我以前使用docker部署好的1.3.1版本为例。docker安装参考…

Web地图服务规范,WMS服务是什么

Web地图服务规范&#xff0c;WMS服务是什么&#xff1f; WMS&#xff0c;全称 Web Map Service (网络地图服务)&#xff0c;是有OGC(开放地理空间信息联盟)制定的一项标准化协议。他的核心功能是允许客户端&#xff08;比如网页浏览器或者GIS桌面软件&#xff09;通过互联网或者…

北京手机基站数据分享:9.3万点位+双格式,解锁城市通信「基础设施地图」

今天分享的是——​​2023年7月北京市手机基站数据&#xff08;shpcsv双格式&#xff09;​​。92,785个基站点位&#xff08;覆盖全市16区&#xff09;&#xff0c;WGS84坐标系直接能用&#xff0c;shp格式适配GIS软件&#xff0c;csv格式方便Excel/Pandas分析&#xff01;文末…

Druid学习笔记 01、快速了解Druid中SqlParser实现

文章目录前言介绍Druid代码目录介绍模块一&#xff1a;Parser模块二&#xff1a;Druid_SQL_AST在Druid SQL Parser中有哪些AST节点类型?熟悉常用的AST节点组成常用的SQLExpr有哪些&#xff1f;常用的SQLStatemment&#xff1f;SQLTableSourceSQLSelect & SQLSelectQuerySQ…