探索AutoGen的GroupChat
在浅尝AutoGen中,展示了如何使用AutoGen进行简单的对话。
这篇博客中记录一下如何利用AutoGen的GroupChat开发一个相对复杂的功能。
GroupChat中的角色设置
假设我们要开发一个前后端分离的个人博客网站,一般来说,这个团队中会有一个产品经理,一个前端开发,一个后端开发,当然,还有一个老板。
如果想要完成这样一个任务,使用在浅尝AutoGen中的方法是不行的,这个时候就可以使用GroupChat。
AutoGen官方关于GroupChat有一个简单的demo,可以快速浏览一下知道大致的结构。
简单来说,GroupChat就是一群大模型Agent在对话,但是可以赋予每个Agent不同的角色,比如产品经理。同时,也允许人类参与这个对话过程。
下面是代码全文:
1 | import os |
代码中有4个AssistantAgent,分别是hp(人类代理),bk(后端开发工程师),ft(前端开发工程师)和一个pm(产品经理)。
hp(人类代理)实际上就是我,其实可以不配置这个角色,但是我希望我可以参与其中,并且控制整个过程。我给human_input_mode这个参数设置为ALWAYS
,也就是说每次调用这个Agent的时候,都需要人为介入。
bk、ft和pm是一个开发团队中常见的角色,system_message就是预设的Prompt。
我在几个预设的prompt中,分别赋予了Agent不同的角色以及期待他们拥有的特质。
如何选择每一次发言的Agent
上面的内容介绍了如何在GroupChat中配置不同角色的Agents,那么如何决定每次应该由哪一个Agent发言呢?
AutoGen提供了一个叫做StateFlow的方法,这个方法比较强大,可以让开发者根据自己的需求完全自定义。但是官方没有提供很完善的案例教程,只有一些博客和论文,我还没有深入研究,我使用的是另外一种相对简单一点的方法,叫做Finite-State Machine (FSM,即有限状态机)。具体的文档可以参考FSM GroupChat
简单来说,每个Agent有一个description参数,可以用自然语言在这个参数中描述清楚你希望这个Agent在什么场景下被调用,然后由大模型根据这些description信息以及上一轮的对话信息决定下一轮应该由哪个Agent发言。
比如下面的hp这个Agent:
1 | hp = AssistantAgent( |
我希望每一次任何其他Agent发言之后都呼叫这个人类代理Agent,以便我可以在review大模型Agent的输出之后及时给出反馈,如果我没有任何想要想要调整的地方,直接输入继续
就可以了。
使用FSM GroupChat时,除了description要好好写之外,还需要维护一个Graph。我的理解就是调用关系。
比如我在这个案例中维护的Graph如下:
1 | graph_dict = {} |
我对于这个Graph的理解是,允许user_proxy这个Agent发言之后调用pm或者hp其中的一个Agent,pm发言之后,允许调用bk、ft和hp其中的一个。
如何终止对话
程序运行之后,如何优雅地终止Agents之间的对话呢?
在这个案例中,有两个方法。
max_round
实例化GroupChat时,有一个max_round参数,这个参数设定了可以进行多少轮对话,到达这个次数之后对话就会终止。1
2
3
4
5
6
7
8group_chat = GroupChat(
agents=agents,
messages=[],
max_round=10,
allowed_or_disallowed_speaker_transitions=graph_dict,
allow_repeat_speaker=None,
speaker_transitions_type="allowed",
)人为终止
由于在这个案例中,有一个人类代理Agent(hp),所以也可以在轮到hp Agent发言时,直接使用自然语言说终止对话,也可以正常终止整个对话流。
至于实际运行效果,大家可以实际试试,其中的大模型可以换成国内的Kimi或者阿里的通义,都是可以很好地兼容OpenAI的的SDK,切换比较容易。
从我自己的测试情况来看,基本上可以在10分钟内开发处一个MVP版本,后面可以人工在这个版本上做一些修改,大概两三个个小时就能做出一个还不错的博客网站了。
提升效果的小技巧
特别提一下,在initiate_chat中,把需求描述的越详细,上面这个工作流的效果越好,而且还能节省大量的费用。
下面是两个不同的案例。
坏案例
1
2
3
4
5user_proxy.initiate_chat(
manager,
message="开发一个适用于个人的博客站点",
clear_history=True,
)好案例
1
2
3
4
5user_proxy.initiate_chat(
manager,
message="开发一个适用于个人的博客站点,要支持如下功能:1.使用markdown编写博客,2.免登录的评论功能,3.限流功能,每秒不能访问超过5次,4.首页分为博客、标签、关于三个板块,可以借鉴Hexo Next主题的风格",
clear_history=True,
)
上面是我测试过的两个初始需求,第二个效果明显好于第一个,不仅最终生成的结果好,交互的次数也比第一次少,可以介绍调用大模型的费用,尤其是当大模型是GPT-4o或者claude 3.5 sonnet的时候,还是挺贵的。