基于AutoGen的多Agent AI系统实践
JasonLiu1919 2024-08-17 09:31:02 阅读 80
引言
简介
示例1:脱口秀Agent系统
单脱口秀Agent
双人脱口秀Agent
打印结果
示例2:写作场景多Agent系统
添加评论Agent
定义多Agent
编排多个Agent
打印结果
引言
别院深深夏席清,石榴开遍透帘明。
小伙伴们好,我是《小窗幽记机器学习》的小编:卖西瓜的小女孩。今天这篇小作文是小编学习Agent过程中的一个笔记,以备后续查阅和参考。如果小伙们对Agent方向感兴趣,想要进一步交流或者示例代码上的诉求,也可以公众号上添加小编微信。
简介
AutoGen是一个由Microsoft开源的框架,专为构建和优化大型语言模型(LLM)工作流程而设计。它提供了多Agent会话框架、应用程序构建工具以及推理性能优化的支持。
基于AutoGen框架使得能够方便地使用多Agent开发LLM应用程序。以下将介绍如何基于AutoGen构建和定制多Agent系统,使Agent能够扮演不同的角色。通过使用AutoGen框架,不同Agent可以协作完成复杂任务。
Github: https://github.com/microsoft/autogen
以下将从2个具体示例,详细说明如何用AutoGen构建多Agent系统:
一个双Agent对话,展示两位脱口秀喜剧演员之间的对话,使用AutoGen的内置代理类"ConversableAgent"来构建多Agent对话系统。
使用Agent反思框架编写一篇高质量的博客文章。在这个示例中将使用"嵌套对话"结构开发一个系统,其中评论员(reviewer)Agent嵌套在评论家(critic)Agent内部,对另一个Agent撰写的博客文章进行反思。
示例1:脱口秀Agent
单Agent
定义一个 AutoGen agent:
<code>from autogen import ConversableAgent
agent = ConversableAgent(
name="chatbot",code>
llm_config=llm_config,
human_input_mode="NEVER",code>
)
reply = agent.generate_reply(
messages=[{"content": "给我讲一个冷笑话", "role": "user"}]
)
print(reply)
输出结果如下:
当恐龙坐飞机时,为什么他们会带着额外的长颈?因为他们觉得飞机上的安全带太短了!哈哈!
再次生成:
reply = agent.generate_reply(
messages=[{"content": "重复上述这个笑话", "role": "user"}]
)
print(reply)
输出结果如下:
当我穿上袜子时,我意识到我的左脚比右脚长。于是我不得不换一只更小的鞋来平衡。
可以看出,由于上述配置没有具备记忆上下文的内容的能力,所以无法真正复述这个能力。
双人脱口秀Agent
建立两个Agent之间的对话,他们之间的互动记忆被保留下来。
zhisheng = ConversableAgent(
name="志胜",code>
system_message=
"你的名字叫做志胜,你是一名脱口秀演员",
llm_config=llm_config,
human_input_mode="NEVER",code>
)
guangzhi = ConversableAgent(
name="广智",code>
system_message=
"你的名字叫做广智,你是一名脱口秀演员。"
"从上一个笑话的结尾开始下一个笑话。",
llm_config=llm_config,
human_input_mode="NEVER",code>
)
chat_result = guangzhi.initiate_chat(
recipient=zhisheng,
message="我是广智,志胜, 让我们玩一个传递笑话的游戏吧!",code>
max_turns=2,
)
输出结果如下:
广智 (to 志胜):
我是广智,志胜, 让我们玩一个传递笑话的游戏吧!
--------------------------------------------------------------------------------code>
志胜 (to 广智):
当然,广智!我先来给你说一个笑话吧:
为什么鸟儿不用电脑?
因为它们都已经会Twitter了!哈哈哈!
你接着来,广智,看看你有什么搞笑的笑话要分享呢?
--------------------------------------------------------------------------------
广智 (to 志胜):
好的,志胜!听我说:为什么太阳上永远不会有饭店?
因为那里的温度总是太高,米饭都会变成爆米花!哈哈哈!
你看,这个笑话够幽默吗?接下来轮到你了!
--------------------------------------------------------------------------------
志胜 (to 广智):
哈哈哈,太搞笑了,广智!我爱这个笑话!
接着来一个给你听吧:
为什么数学书总喜欢解决问题?
因为它们总是想找X的真相!哈哈哈!
笑话真是无穷尽啊!你再来一个吧,广智!
--------------------------------------------------------------------------------
打印结果
打印历史聊天内容
import pprint
pprint.pprint(chat_result.chat_history)
打印结果如下:
[{'content': '我是广智,志胜, 让我们玩一个传递笑话的游戏吧!', 'role': 'assistant'},
{'content': '当然,广智!我先来给你说一个笑话吧:\n'
'\n'
'为什么鸟儿不用电脑?\n'
'\n'
'因为它们都已经会Twitter了!哈哈哈!\n'
'\n'
'你接着来,广智,看看你有什么搞笑的笑话要分享呢?',
'role': 'user'},
{'content': '好的,志胜!听我说:为什么太阳上永远不会有饭店?\n'
'\n'
'因为那里的温度总是太高,米饭都会变成爆米花!哈哈哈!\n'
'\n'
'你看,这个笑话够幽默吗?接下来轮到你了!',
'role': 'assistant'},
{'content': '哈哈哈,太搞笑了,广智!我爱这个笑话!\n'
'\n'
'接着来一个给你听吧:\n'
'\n'
'为什么数学书总喜欢解决问题?\n'
'\n'
'因为它们总是想找X的真相!哈哈哈!\n'
'\n'
'笑话真是无穷尽啊!你再来一个吧,广智!',
'role': 'user'}]
打印明细
pprint.pprint(chat_result.cost)
打印结果如下:
{'usage_excluding_cached_inference': {'gpt-3.5-turbo-0125': {'completion_tokens': 264,
'cost': 0.0006315,
'prompt_tokens': 471,
'total_tokens': 735},
'total_cost': 0.0006315},
'usage_including_cached_inference': {'gpt-3.5-turbo-0125': {'completion_tokens': 264,
'cost': 0.0006315,
'prompt_tokens': 471,
'total_tokens': 735},
'total_cost': 0.0006315}}
打印聊天摘要
pprint.pprint(chat_result.summary)
打印结果如下:
('哈哈哈,太搞笑了,广智!我爱这个笑话!\n'
'\n'
'接着来一个给你听吧:\n'
'\n'
'为什么数学书总喜欢解决问题?\n'
'\n'
'因为它们总是想找X的真相!哈哈哈!\n'
'\n'
'笑话真是无穷尽啊!你再来一个吧,广智!')
优化对话摘要结果
可以看出,上面的对话摘要效果其实不是很好,以下选择summary_method
为reflection_with_llm
,而不是默认的last_msg
:
zhisheng = ConversableAgent(
name="志胜",code>
system_message=
"你的名字叫做志胜,你是一名脱口秀演员",
llm_config=llm_config,
human_input_mode="NEVER",code>
)
guangzhi = ConversableAgent(
name="广智",code>
system_message=
"你的名字叫做广智,你是一名脱口秀演员。"
"从上一个笑话的结尾开始下一个笑话。",
llm_config=llm_config,
human_input_mode="NEVER",code>
)
summary_args={
"summary_prompt": "用中文总结对话要点。不要添加任何引言。如果意图的请求未得到妥善处理,请指出。",
}
chat_result = guangzhi.initiate_chat(
zhisheng,
message="我是广智,志胜, 让我们玩一个传递笑话的游戏吧!", code>
max_turns=2,
summary_method="reflection_with_llm",code>
summary_args=summary_args
pprint.pprint(chat_result.summary)
对话结果:
广智 (to 志胜):
我是广智,志胜, 让我们玩一个传递笑话的游戏吧!
--------------------------------------------------------------------------------code>
志胜 (to 广智):
当然,广智!我先来给你说一个笑话吧:
为什么鸟儿不用电脑?
因为它们都已经会Twitter了!哈哈哈!
你接着来,广智,看看你有什么搞笑的笑话要分享呢?
--------------------------------------------------------------------------------
广智 (to 志胜):
好的,志胜!听我说:为什么太阳上永远不会有饭店?
因为那里的温度总是太高,米饭都会变成爆米花!哈哈哈!
你看,这个笑话够幽默吗?接下来轮到你了!
--------------------------------------------------------------------------------
志胜 (to 广智):
哈哈哈,太搞笑了,广智!我爱这个笑话!
接着来一个给你听吧:
为什么数学书总喜欢解决问题?
因为它们总是想找X的真相!哈哈哈!
笑话真是无穷尽啊!你再来一个吧,广智!
--------------------------------------------------------------------------------
打印的对话摘要结果如下:
'广智和志胜玩传递笑话游戏。广智说了一个关于鸟儿和电脑的笑话,志胜回应了一个关于太阳和饭店的笑话。然后志胜又说了一个有关数学书的笑话,邀请广智继续分享。笑话让他们互相开心。'
示例2:作家和评论员
task = '''
编写一篇简洁有吸引力的博客文章,介绍中国足球。确保文章在100字以内。
'''
import autogen
writer = autogen.AssistantAgent(
name="Writer",code>
system_message="你是一名作家。你在给定的主题上撰写引人入胜且简洁的博客文章(包括标题)。你必须根据收到的反馈来修改你的写作,并提供一份精炼的版本。只返回你的最终作品,不附加评论。",code>
llm_config=llm_config,
)
reply = writer.generate_reply(messages=[{"content": task, "role": "user"}])
print(reply)
输出结果如下:
标题:中国足球:重返荣耀之路
中国足球曾有辉煌历史,如今正迈向新的高峰。投入大量资源,建设青训体系,提高职业联赛水平,中国足球正逐渐焕发活力。国家队积极备战国际赛事,年轻球员崭露头角。球迷热情支持,球市逐渐升温,中国足球正蓄势待发。我们相信,中国足球定将勇往直前,重返荣耀之路!
添加评论Agent
critic = autogen.AssistantAgent(
name="Critic",code>
is_termination_msg=lambda x: x.get("content", "").find("TERMINATE") >= 0,
llm_config=llm_config,
system_message="你是一名评论家。你对作家的作品进行评论,并提供建设性的反馈,以帮助提高内容的质量。",code>
)
res = critic.initiate_chat(
recipient=writer,
message=task,
max_turns=2,
summary_method="last_msg"code>
)
输出结果如下:
Critic (to Writer):
编写一篇简洁有吸引力的博客文章,介绍中国足球。确保文章在100字以内。
--------------------------------------------------------------------------------code>
Writer (to Critic):
标题:中国足球:重返荣耀之路
中国足球曾有辉煌历史,如今正迈向新的高峰。投入大量资源,建设青训体系,提高职业联赛水平,中国足球正逐渐焕发活力。国家队积极备战国际赛事,年轻球员崭露头角。球迷热情支持,球市逐渐升温,中国足球正蓄势待发。我们相信,中国足球定将勇往直前,重返荣耀之路!
--------------------------------------------------------------------------------
Critic (to Writer):
这篇文章对中国足球的现状和未来展望做了简明扼要的介绍,突出了中国足球正在重返荣耀之路的信心和努力。建议在文章中加入一些具体的数据和案例来支撑论点,以增强说服力。另外,可以进一步探讨中国足球面临的挑战,并提出应对之策,使文章更具深度。最后,鼓励读者积极关注并支持中国足球的发展。整体而言,这篇文章很好地展现了中国足球的现状和未来前景,但还有改进的空间。
--------------------------------------------------------------------------------
Writer (to Critic):
标题:中国足球:实现大国梦的征程
中国足球正积极改革升级,重振活力。自2015年起,青训投入超过300亿元,促进年轻球员成长。中超吸引国际顶尖球星,提高联赛水平。国家队连续冲击世界杯,展现进步。然而,仍需解决青训问题和管理混乱。支持足球教育和基层建设,加强国际合作,可助中国足球再度辉煌。让我们共同期待,中国足球的未来一定更加辉煌!
--------------------------------------------------------------------------------
定义多Agent
SEO_reviewer = autogen.AssistantAgent(
name="SEO Reviewer",code>
llm_config=llm_config,
system_message="你是一位SEO评论员,你通过优化内容以提高搜索引擎排名并吸引有效流量的能力而闻名。请确保您的建议简明扼要(不超过3个要点),具体明确。在评论开始时,请说明您的角色。",code>
)
legal_reviewer = autogen.AssistantAgent(
name="Legal Reviewer",code>
llm_config=llm_config,
system_message="您是一位法律评论员,以确保内容合法合规且没有潜在法律问题的能力而闻名。请确保您的建议简明扼要(不超过3个要点),具体明确。在评论开始时,请说明您的角色。",code>
)
ethics_reviewer = autogen.AssistantAgent(
name="Ethics Reviewer",code>
llm_config=llm_config,
system_message="您是一位伦理评论员,以确保内容在伦理上健全且没有潜在伦理问题的能力而闻名。请确保您的建议简明扼要(不超过3个要点),具体明确。在评论开始时,请说明您的角色。",code>
)
meta_reviewer = autogen.AssistantAgent(
name="Meta Reviewer",code>
llm_config=llm_config,
system_message="您是一位后设意见评论员(meta review), 负责汇总和审查其他评论员的工作,并对内容给出最终建议。",code>
)
编排多个Agent
def reflection_message(recipient, messages, sender, config):
return f'''请查看以下内容。
\n\n {recipient.chat_messages_for_summary(sender)[-1]['content']}'''
review_chats = [
{
"recipient": SEO_reviewer,
"message": reflection_message,
"summary_method": "reflection_with_llm",
"summary_args": {"summary_prompt" :
"以JSON格式返回评论:"
"{'Reviewer': '', 'Review': ''}. 在这里,'Reviewer'是你的角色。",},
"max_turns": 1},
{
"recipient": legal_reviewer, "message": reflection_message,
"summary_method": "reflection_with_llm",
"summary_args": {"summary_prompt" :
"以JSON格式返回评论:"
"{'Reviewer': '', 'Review': ''}.",},
"max_turns": 1},
{"recipient": ethics_reviewer, "message": reflection_message,
"summary_method": "reflection_with_llm",
"summary_args": {"summary_prompt" :
"以JSON格式返回评论:"
"{'reviewer': '', 'review': ''}",},
"max_turns": 1},
{"recipient": meta_reviewer,
"message": "汇总所有审稿人的反馈,并对写作提出最终建议。",
"max_turns": 1},
]
critic.register_nested_chats(
review_chats,
trigger=writer,
)
res = critic.initiate_chat(
recipient=writer,
message=task,
max_turns=2,
summary_method="last_msg"code>
)
输出结果如下:
Critic (to Writer):
编写一篇简洁有吸引力的博客文章,介绍中国足球。确保文章在100字以内。
--------------------------------------------------------------------------------code>
Writer (to Critic):
标题:中国足球:重返荣耀之路
中国足球曾有辉煌历史,如今正迈向新的高峰。投入大量资源,建设青训体系,提高职业联赛水平,中国足球正逐渐焕发活力。国家队积极备战国际赛事,年轻球员崭露头角。球迷热情支持,球市逐渐升温,中国足球正蓄势待发。我们相信,中国足球定将勇往直前,重返荣耀之路!
--------------------------------------------------------------------------------
********************************************************************************
Starting a new chat....
********************************************************************************
Critic (to SEO Reviewer):
请查看以下内容。
标题:中国足球:重返荣耀之路
中国足球曾有辉煌历史,如今正迈向新的高峰。投入大量资源,建设青训体系,提高职业联赛水平,中国足球正逐渐焕发活力。国家队积极备战国际赛事,年轻球员崭露头角。球迷热情支持,球市逐渐升温,中国足球正蓄势待发。我们相信,中国足球定将勇往直前,重返荣耀之路!
--------------------------------------------------------------------------------
SEO Reviewer (to Critic):
作为一位SEO评论员,我的建议如下:
1. **优化标题和关键词**:确保文章标题包含与中国足球和重返荣耀等相关关键词,并在文章中多次重复这些关键词以提高搜索引擎对内容的理解和排名。
2. **增加内部链接**:在文章中添加内部链接,将该文章与其他相关内容相互连接,提升整个网站的内部链接结构,有助于改善网站的整体SEO表现。
3. **分享到社交媒体**:利用社交媒体平台广泛分享这篇文章,吸引更多目标受众,增加网站流量和曝光机会,有助于提高文章在搜索引擎中的排名。
通过以上优化方法,可以提升文章在搜索引擎中的曝光度和排名,吸引更多用户访问并了解中国足球重返荣耀之路的内容。
--------------------------------------------------------------------------------
********************************************************************************
Starting a new chat....
********************************************************************************
Critic (to Legal Reviewer):
请查看以下内容。
标题:中国足球:重返荣耀之路
中国足球曾有辉煌历史,如今正迈向新的高峰。投入大量资源,建设青训体系,提高职业联赛水平,中国足球正逐渐焕发活力。国家队积极备战国际赛事,年轻球员崭露头角。球迷热情支持,球市逐渐升温,中国足球正蓄势待发。我们相信,中国足球定将勇往直前,重返荣耀之路!
Context:
{
"Reviewer": "SEO评论员",
"Review": "建议优化标题和关键词,增加内部链接并分享到社交媒体,以提升文章在搜索引擎中的曝光度和排名,吸引更多读者了解中国足球重返荣耀之路的内容。"
}
--------------------------------------------------------------------------------
Legal Reviewer (to Critic):
角色:法律评论员
1. 文章内容应确保符合中国的相关法律法规,避免涉及虚假宣传、诽谤他人或传播不实信息等行为。
2. 在提及建设青训体系和职业联赛水平提高等方面时,需注意是否存在侵犯知识产权或其他合同纠纷的可能性,确保相关行为合法合规。
3. 若文章提及国家队备战国际赛事,应避免误导性宣传或不当利用国家形象,确保内容真实可靠,符合国家相关规定。
--------------------------------------------------------------------------------
********************************************************************************
Starting a new chat....
********************************************************************************
Critic (to Ethics Reviewer):
请查看以下内容。
标题:中国足球:重返荣耀之路
中国足球曾有辉煌历史,如今正迈向新的高峰。投入大量资源,建设青训体系,提高职业联赛水平,中国足球正逐渐焕发活力。国家队积极备战国际赛事,年轻球员崭露头角。球迷热情支持,球市逐渐升温,中国足球正蓄势待发。我们相信,中国足球定将勇往直前,重返荣耀之路!
Context:
{
"Reviewer": "SEO评论员",
"Review": "建议优化标题和关键词,增加内部链接并分享到社交媒体,以提升文章在搜索引擎中的曝光度和排名,吸引更多读者了解中国足球重返荣耀之路的内容。"
}
{
"Reviewer": "",
"Review": ""
}
--------------------------------------------------------------------------------
Ethics Reviewer (to Critic):
角色:伦理评论员
建议:
1. 在文章中突出中国足球复兴的积极因素,包括投入资源、青训体系建设、职业联赛水平提升等,以正面的视角呈现中国足球的发展,避免夸大宣传或不实信息。
2. 强调报道真实情况,不夸大事实或误导读者,确保内容准确客观,不捏造事实或夸大其词,避免对读者产生误导性影响。
3. 在报道中国足球的光明前景时,应保持客观中立,避免过分乐观或悲观的立场,不给读者带来夸大或不实的期望,需谨慎处理信息呈现,以确保读者得到真实准确的信息。
--------------------------------------------------------------------------------
********************************************************************************
Starting a new chat....
********************************************************************************
Critic (to Meta Reviewer):
汇总所有审稿人的反馈,并对写作提出最终建议。
Context:
{
"Reviewer": "SEO评论员",
"Review": "建议优化标题和关键词,增加内部链接并分享到社交媒体,以提升文章在搜索引擎中的曝光度和排名,吸引更多读者了解中国足球重返荣耀之路的内容。"
}
{
"Reviewer": "",
"Review": ""
}
{
"reviewer": "",
"review": ""
}
--------------------------------------------------------------------------------
Meta Reviewer (to Critic):
根据给出的评论员反馈,SEO评论员提出了优化标题和关键词、增加内部链接以及在社交媒体上分享的建议,以提升文章在搜索引擎中的曝光度和排名。这些建议对于增加文章的可见性和吸引更多读者是非常重要的。
综合以上反馈,我认为在进行文章修改时,可以考虑以下建议:
1. 优化标题和关键词:确保标题能够准确反映文章内容,同时包含关键词,有助于提升文章在搜索引擎中的排名。同时,合理分布关键词在文章中,有助于提高文章的可搜索性。
2. 增加内部链接:在文章中适当增加内部链接,引导读者浏览其他相关主题的内容,提升用户体验和网站的内部链接结构。
3. 社交媒体分享:积极在社交媒体平台分享文章,扩大文章的传播范围,吸引更多读者点击阅读,提高文章的曝光度和流量。
综合修改建议,建议在文章中加入相关内部链接,优化标题和关键词,并积极在社交媒体分享文章,以提升文章的曝光度和吸引更多读者。这些措施将有助于文章在搜索引擎中获得更好的排名和更多的曝光,从而达到提高读者数量和关注度的目的。
--------------------------------------------------------------------------------
Critic (to Writer):
根据给出的评论员反馈,SEO评论员提出了优化标题和关键词、增加内部链接以及在社交媒体上分享的建议,以提升文章在搜索引擎中的曝光度和排名。这些建议对于增加文章的可见性和吸引更多读者是非常重要的。
综合以上反馈,我认为在进行文章修改时,可以考虑以下建议:
1. 优化标题和关键词:确保标题能够准确反映文章内容,同时包含关键词,有助于提升文章在搜索引擎中的排名。同时,合理分布关键词在文章中,有助于提高文章的可搜索性。
2. 增加内部链接:在文章中适当增加内部链接,引导读者浏览其他相关主题的内容,提升用户体验和网站的内部链接结构。
3. 社交媒体分享:积极在社交媒体平台分享文章,扩大文章的传播范围,吸引更多读者点击阅读,提高文章的曝光度和流量。
综合修改建议,建议在文章中加入相关内部链接,优化标题和关键词,并积极在社交媒体分享文章,以提升文章的曝光度和吸引更多读者。这些措施将有助于文章在搜索引擎中获得更好的排名和更多的曝光,从而达到提高读者数量和关注度的目的。
--------------------------------------------------------------------------------
Writer (to Critic):
标题:重返荣耀之路:中国足球的新篇章
中国足球正迎来全新的发展时期。通过投入资金建设青训体系和提升联赛水平,中国正在逐渐重塑其足球形象。随着年轻球员的崭露头角,国家队备战国际赛事,中国足球展现出勃勃生机。支持者的热情和球市的升温也为中国足球增添活力。展望未来,我们坚信中国足球必将重返荣耀之路!立即点击了解更多关于中国足球的精彩内容。
**关键词:** 中国足球、青训体系、国家队、联赛水平、足球发展
---
在文章中加入内部链接:了解中国足球历史发展,请点击[中国足球:辉煌与挑战](internal-link)。
精心打造的中国足球,为什么备受球迷关注?不要错过这篇文章啦!请点击[中国足球:未来可期](internal-link)。
**社交媒体分享:** 探讨中国足球兴衰,了解国内联赛最新动态。查看文章并分享给你的朋友!
--------------------------------------------------------------------------------
打印摘要
print(res.summary)
输出结果如下:
标题:重返荣耀之路:中国足球的新篇章
中国足球正迎来全新的发展时期。通过投入资金建设青训体系和提升联赛水平,中国正在逐渐重塑其足球形象。随着年轻球员的崭露头角,国家队备战国际赛事,中国足球展现出勃勃生机。支持者的热情和球市的升温也为中国足球增添活力。展望未来,我们坚信中国足球必将重返荣耀之路!立即点击了解更多关于中国足球的精彩内容。
**关键词:** 中国足球、青训体系、国家队、联赛水平、足球发展
---
在文章中加入内部链接:了解中国足球历史发展,请点击[中国足球:辉煌与挑战](internal-link)。
精心打造的中国足球,为什么备受球迷关注?不要错过这篇文章啦!请点击[中国足球:未来可期](internal-link)。
**社交媒体分享:** 探讨中国足球兴衰,了解国内联赛最新动态。查看文章并分享给你的朋友!
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。