ChatDev 是一个开源多Agent编程框架的项目,是由国内AI初创企业面壁智能打造的一个虚拟软件公司,由各种具有不同角色的Agent运作, 包括CEO(首席执行官)、CPO(首席产品官)、CTO(首席技术官)、程序员、代码审查员、测试员和艺术设计师等。这些Agent组成了一个多代理组织结构, 这家虚拟公司被设定了一个使命是”通过编程革新数字世界”。ChatDev内部的Agent通过参与专门的功能研讨会(通过Chain组合)进行协作, 从需求分析,设计、编码、测试和到最终的文档编写,依次完成软件开发各个阶段的任务。
一、Agent工作流程介绍:
默认流程
如上图ChatChain默认流程所示,ChatDev按以下顺序生成软件:
需求分析: 决定软件的模
语言选择: 决定编程语言
编码: 编写代码
代码完成: 完成缺失的函数/类
代码审查: 审查和修改代码
测试: 运行软件并根据测试报告修改代码
环境文档: 编写环境文档
手册: 编写手册
详细流程拆解
(抱歉,考虑手机竖屏排版效果,截成3张图,如需原图放大看,可以留言联系作者哈)
注意事项:
Code test阶段在本地执行,没有隔离的docker环境,有一定的安全风险。
test阶段碰到生成的代码异常,会导致整个ChatDev进程中断,任务失败。
如:“write a blog about how gpt works”, 生成了一些torch 代码,环境冲突出现异常。
默认配置会生成带GUI的程序,在远程服务器上运行时会碰到 “no display name and no $DISPLAY environment variable”系统错误,也会导致整个ChatDev 进程被迫中断。可以在CompanyConfig目录下的ChatChainConfig.json文件中设置”gui_design”: “False”, 这样就不会生成GUI界面的程序
2. Art 流程
与默认流程相比,Art设置在CodeCompleteAll之前增加了一个名为Art的阶段。Art阶段首先会讨论图像资源的名称和描述,然后使用图片生成模型根据描述生成图像
Human-Agent-Interaction 人机交互流程
与默认流程相比,人机交互流程可以让用户扮演一个reviewer,让programmer根据用户的意见去修改代码
二、关于Agent 及流程定制:
ChatDev提供三个粒度级别的定制:
Customize ChatChain
Customize Phase
Customize Role
以下架构图说明三者之间的关系:
新的定制可以放到CompanyConfig/目录下新建一个目录,然后在依次配置:
ChatChainConfig.json, 控制了 ChatDev 的整个开发过程,包括每个步骤属于哪个阶段(Phase),每个阶段需要循环多少次,是否需要反思等。
PhaseConfig.json, 控制了每个阶段,对应于 ChatDev 项目中的 chatdev/phase.py 或 chatdev/composed_phase.py。Python 文件实现了每个阶段的具体工作逻辑。这里的 JSON 文件包含了每个阶段的配置,例如背景提示、参与该阶段的员工等。
RoleConfig.json 包含了每个员工(Agent)的配置。目前,它只包含了每个员工的prompt背景提示。
Customize ChatChain (难度简单)
复用原有的phase,只是把流程进行调整,例如更改迭代轮数,执行顺序等,只需更改ChatChainConfig.json文件即可
Customize Role (难度简单)
只需更改RoleConfig.json文件即可,主要用于更改Agent的名称和prompt背景提示。
Customize Phase (难度中难)
可以对代码修改,自定义一些阶段(Phase), 提供更多的灵活性。需要做以下两步:
实现一个Phase类(在最简单的情况下,只需要修改一个函数),扩展Phase类。
在PhaseConfig.json中配置这个阶段,包括编写阶段提示和为这个阶段分配角色。
其中Phase分为两种类型:
Simple Phase
简单理解为完成一种独立任务的Phase,比如需求分析,编码等,需要在PhaseConfig.json中进行配置。实现步骤,例如:
class LanguageChoose(Phase): def __init__(self, **kwargs): super().__init__(**kwargs)
def update_phase_env(self, chat_env): self.phase_env.update({“task”: chat_env.env_dict[‘task_prompt’], “modality”: chat_env.env_dict[‘modality’], “ideas”: chat_env.env_dict[‘ideas’]})
def update_chat_env(self, chat_env) -> ChatEnv: if len(self.seminar_conclusion) > 0 and “<INFO>” in self.seminar_conclusion: chat_env.env_dict[‘language’] = self.seminar_conclusion.split(“<INFO>”)[-1].lower().replace(“.”, “”).strip() elif len(self.seminar_conclusion) > 0: chat_env.env_dict[‘language’] = self.seminar_conclusionelse: chat_env.env_dict[‘language’] = “Python”return chat_env
代码实现步骤:
继承Phase类
实现update_phase_env,从变量chat_env字典中(Phase类中已经定义好了Key)选出这个Phase所需要的变量(在之前的Phase已经得到了)。
根据seminar_conclusion(理解为Agent的回复)是否包含关键回复,来更新本Phase所需要的产生的变量。
PhaseConfig.json 配置如下:
“LanguageChoose”: { “assistant_role_name”: “Chief Technology Officer”, “user_role_name”: “Chief Executive Officer”, “phase_prompt”: [ “According to the new user’s task and some creative brainstorm ideas listed below: “, “Task: \”{task}\”.”, “Modality: \”{modality}\”.”, “Ideas: \”{ideas}\”.”, “We have decided to complete the task through an executable software implemented via a programming language. “, “As the {assistant_role}, to satisfy the new user’s demand and make the software realizable, you should propose a concrete programming language. If python can complete this task via Python, please answer Python; otherwise, answer another programming language (e.g., Java, C++, etc,).”, “Note that we must ONLY discuss the target programming language and do not discuss anything else! Once we all have expressed our opinion(s) and agree with the results of the discussion unanimously, any of us must actively terminate the discussion and conclude the best programming language we have discussed without any other words or reasons, using the format: \”<INFO> *\” where \”*\” represents a programming language.” ]}
Compose Phase
将多个Simple Phase组合在一起,例如code review和review modification 组合在一起。这种Phase不需要配置PhaseConfig.json,但是需要在ChatChainConfig.json中进行配置。实现步骤,例如:
class Test(ComposedPhase): def __init__(self, **kwargs): super().__init__(**kwargs)
def update_phase_env(self, chat_env): self.phase_env = dict()
def update_chat_env(self, chat_env): return chat_env
def break_cycle(self, phase_env) -> bool: if not phase_env[‘exist_bugs_flag’]: log_visualize(f”**[Test Info]**\n\nAI User (Software Test Engineer):\nTest Pass!\n”) return True else: return False
这里增加一个break_cycle,用于退出多个simple phase之间的循环。
ChatChainConfig.json 配置如下:
{ “phase”: “CodeReview”, “phaseType”: “ComposedPhase”, “cycleNum”: 2, “Composition”: [ { “phase”: “CodeReviewComment”, “phaseType”: “SimplePhase”, “max_turn_step”: -1, “need_reflect”: “False” }, { “phase”: “CodeReviewModification”, “phaseType”: “SimplePhase”, “max_turn_step”: -1, “need_reflect”: “False” } ] }
三、Bedrock Claude3 与ChatDev集成
原版ChatDev在代码层面直接使用了OpenAI SDK,默认使用的是gpt-3.5模型,用户可以通过–model 参数切换成gpt-4模型。Claude 3 系列模型,具有200k上下文,更高的性价比,更快的推理速度,更高的智能水平,因此更加适合做multi-agent场景。我们将ChatDev fork之后进行了修改,加入了对Claude 3 的支持。
使用步骤:
准备好一台装有python 3.10+以上的Linux或者Window 本地主机或者EC2
安装aws cli,并配置ak,sk。参考文档
Bedrock 开启 Claude3模型访问权限,参考文档
Clone 代码
git clone https://github.com/xiehust/ChatDev.git
Clone 代码库后,进入目录ChatDev 安装依赖包
cd ChatDevpip3 install -r requirements.txt
运行run.py, 开始接需求干活。通过–model calude-3-sonnet 或者 claude-3-haiku。
这里我们的一句话需求是”given a website url, crawl the content and convert to markdown file, if there have images in the page, please keep the image link and convert to markdown format.” 生成一个爬虫工具,输入网页,转成markdown文件,并保留里面的链接。
python3 run.py –task “given a website url, crawl the content and convert to markdown file, if there have images in the page, please keep the image link and convert to markdown format.” –name “html2md” –model claude-3-sonnet
也可以启用图像化的日志portal来实时观察详细的日志, 以下命令会启动一个web sever
python3 visualizer/app.py访问 http://127.0.0.1:8000/
完成之后,会在WareHouse 目录下生成一个项目目录
以及代码行数,文件数,token消耗,时间等统计
📃**num_code_files**=4
🏞**num_png_files**=0
📚**num_doc_files**=4
📃**code_lines**=87
📋**env_lines**=-1
📒**manual_lines**=-1
🗣**num_utterances**=14
🤔**num_self_reflections**=0
❓**num_prompt_tokens**=7750
❗**num_completion_tokens**=3468
🌟**num_total_tokens**=11218
进入生成的项目目录,运行
pip3 install -r requirements.textpython main.py>>Enter the website URL: https://aws.amazon.com/cn/blogs/china/fine-tune-gpt-j-using-an-amazon-sagemaker-hugging-face-estimator-and-the-model-parallel-library/
我们输入一篇amazon blog,转成md格式
转换完成之后效果如下:
确实是用Markdown格式,而且保留了图片的链接。👍👍
结论:
ChatDev作为一个基于聊天的端到端软件开发框架, 利用大型语言模型赋予多角色扮演能力,来促进软件开发过程中涉及的多个角色之间的有效沟通和协作,验证了一句话需求到完整可执行代码文件的可行性。但是ChatDev距离实际生产还有很大距离,现阶段只能适合对一些相对较小,比较独立的任务,快速生成一个项目原型。例如本例子中的小爬虫工具,官方例子给的一些小游戏,小应用等(官方论文中表示,在70个测试任务中,生成的代码文件一般在2~8个,总代码量在39-359行)。另外,这个框架还不支持引入外部知识库来增强代码或者文档写作,例如连接本地代码库作为外部知识库,通过RAG的方式来增强生成的代码,使得更符合已有的代码风格,依赖库,api等。
暂无评论内容