ChatDev:基于多智能体协作的软件开发框架深度解析
概述
ChatDev(Communicative Agents for Software Development)是一个通过智能体间对话协同完成特定软件开发任务的开源项目。该项目参考了斯坦福小镇(Stanford Town)的记忆流机制以及 CAMEL 的任务导向型对话方案,将软件开发流程抽象为多个智能体的对话型任务。
整个开发流程被划分为设计、编程、测试、文档编写四个主要环节。每个环节可拆分为多个执行步骤,其中每个步骤由两个角色的智能体通过对话合作来完成。
系统配置与初始化
在进入主要流程前,需要定义三类配置文件。源码提供了默认配置,用户可根据需求覆盖部分配置。配置文件从顶层到底层依次为:
- ChatChainConfig:定义了整个任务链的所有步骤和执行顺序(phrase),以及所有参与的智能体角色。
- 默认任务链包含以下步骤:
DemandAnalysis->LanguageChoose->Coding->CodeCompleteAll->CodeReview->Test->EnvironmentDoc->Manual。 - 参与智能体角色包括:CEO、CFO、CPO、CCO、CTO、Programmer、Reviewer、Tester 等。
- 默认任务链包含以下步骤:
- PhaseConfig:下钻到每个步骤,分别定义了每个步骤的 Prompt 指令,以及参与的两个 Agent 角色。
- RoleConfig:下钻到每个角色,分别定义了每个角色的 Prompt 指令。
初始化配置文件后,即可进入软件开发的四个主要流程。
核心开发流程
1. Design(产品设计)
产品设计环节负责把用户需求转化成项目方案,包括两个原子步骤:CEO 和 CPO 进行需求分析和产品设计,CEO 和 CTO 选择编程语言。
以 CEO 和 CPO 之间关于需求分析的对话实现为例,该过程融合了 CAMEL 的 Inception Prompting 和斯坦福小镇的记忆流和自我反思机制来完成任务导向的对话。
-
Role Assignment(角色分配) 首先初始化参与 phase 的两个智能体角色,并生成初始 Prompt(Inception Prompt)。包括用户需求(task_prompt)、本阶段的任务描述(phase_prompt)和两个智能体的角色描述(role_prompt)。基于初始指令,之后两个智能体会通过对话相互为对方生成指令,而人工参与的部分只有最初的角色描述和任务描述。 产品涉及环节的具体指令中,需求分析阶段的任务指令使用了 Few-Shot 技术,给出不同的产品形态(例如图片、文档、应用等)实现方式,并明确了对话的两个智能体的讨论主题,以及终止讨论的条件,即确定产品形态。
-
Memory Stream(记忆流) 在代码实现中,对话直接使用上文对话 history 作为输入。只有当输入上文长度超长的时候,会保留 Inception prompt 和最近的 N 轮对话。这种机制确保了上下文的有效管理。
-
Self-Reflection(自我反思) 在此论文中,Self-Reflection 更像是会议总结模块。当多轮对话完成,但是并未出现对话停止符号时,可以触发总结模块,把前面的多轮对话作为上文,来总结对话得到的结论,用于后续步骤的进行。
2. Coding(编程)
编程环节包括两个基本步骤:后端写代码,和前端设计交互界面。编程环节最大的难点就是如何避免模型幻觉,最大程度保证代码的正确性,以及在多轮对话中如何进行复杂长代码的编写和修改。
代码编写步骤的核心指令要求 CTO 智能体给程序员智能体的指令是:以面向对象的编程语言 Python 为基础,先给出核心类和方法。程序员智能体会按照指令以 Markdown 为语法进行代码和注释的编写。之后代码编写环节会循环执行 N 次多轮对话,不断对代码进行更新优化。
为了优化复杂代码的编写效果,论文在代码编写环节引入了 Version Control 环节。在每一步代码编写完成后,会使用 difflib 对两版代码进行比对,并从记忆流中删除旧版本的代码。这样对话会永远基于最新的代码版本进行,对最新代码进行不断更新。


