[论文笔记] ChatDev:Communicative Agents for Software Development

Communicative Agents for Software Development(大模型驱动的全流程自动化软件开发框架)

会议arxiv 2023
作者Chen Qian Xin Cong Wei Liu Cheng Yang
团队Tsinghua University
论文地址https://arxiv.org/pdf/2307.07924.pdf
代码地址https://github.com/OpenBMB/ChatDev/blob/main/
简介一种基于聊天的软件开发框架ChatDev

作者希望提出的自然语言到软件框架的潜力可以照亮将llm集成到软件开发中的新可能性,并标志着自然语言处理、软件工程和集体智能领域新前沿的曙光。

Introduction

image.png
软件工程需要一种有系统的、有纪律的方法来开发、操作和维护软件系统。近年来,深度学习技术的发展促使研究人员探索其在软件工程中的应用,旨在提高有效性、效率和降低成本。
在一步生成一个软件系统时,缺乏任务特异性会让llm感到困惑。软件开发中的细粒度任务,例如分析用户/客户需求和选择编程语言,提供了llm所处理的高级任务所缺乏的指导思想。其次,在决策过程中缺乏质证,造成重大风险。
ChatDev遵循经典的瀑布模型,将设计流程分为:设计、编码、测试和文档编写,每个阶段会有多个不同角色的代理。ChatDev利用一个chat chain,将每个阶段分为原子子任务,在聊天链中,每个节点代表一个特定的子任务,两个角色参与上下文感知、多回合讨论,以提出和验证解决方案。

Contributions

  • 提出了一种基于聊天的软件开发框架ChatDev,仅通过指定一项任务,就会依次处理设计、编码、测试和文档编写。通过语言交流来统一过程,简化了软件开发,消除了每个阶段对特定模型的需求。
  • 提出了聊天链来将开发分解成顺序的原子子任务,每个子任务需要两个角色之间的协作交互和相互检查。
  • 为了缓解代码幻觉等问题,引入了一种叫“思想指导机制”,通过执行角色转换,指导者将特定代码修改思想注入到指令中,以实现更精确的指导。
  • 实验结果证实了ChatDev带来的效率以及成本收益。

ChatDev

Main Problem

每个阶段需要多个角色之间进行有效的交流沟通,在确定交互顺序以及参与的相关个体等提出了较大的挑战。

Chat Chain

软件开发过程的四个不同的阶段:设计、编码、测试和文档化。在设计阶段,通过协作头脑风暴产生创新想法,并定义技术设计需求。编码阶段包括源代码的开发和检查,而测试阶段将所有组件集成到一个系统中,并利用解释器的反馈信息进行调试。文档化阶段包括环境规范和用户手册的生成。

image.png
整个体系分为阶段级和聊天级,阶段级即软件开发过程的四个不同的阶段,聊天级在每个阶段会分为多个原子聊天对话,由当前阶段所需人员参与讨论。

Designing

image.png

Role Assignment

System prompts用于角色扮演过程中给每个代理分配角色,并且这些提示在对话开始前将角色分配给代理。Instructor最初扮演CEO的角色,参与互动,Assistant扮演CPO的角色,执行任务并提供回答。为了实现角色的专门化,还给代理提供了inception prompting,使代理能够履行其角色的设定。Instructor和Assistant包含有关指定任务和角色、通信协议、终止标准和防止不良行为(指令冗余、无信息响应、无限循环等)的约束。

Memory Stream

  • 通过memory stream是一种机制,维护之前的对话记录。
  • 通过提示来建立通信协议,如当双方达成一致时,会生成满足特定格式要求的结束信息()。

Self Reflection

总的来说就是,当观察到对话双方达成一致的时候,没有触发预定义的结束的通信协议(),这时需要进行reflection,让一个新的提问者发起一个新的聊天,将对话双方的聊天记录给Assistant,要求其从对话中获取信息摘要。

Coding

编码阶段有三个预定义的角色:CTO、programmer和art designer。聊天链将编码阶段分解为顺序的原子聊天任务,例如生成完整的代码(CTO和程序员)和设计图形用户界面(设计师和程序员)。
编程环节包括两个基本步骤:后端写代码,和前端设计交互界面。编程环节最大的难点就是如何避免模型幻觉,最大正度保证代码的正确性,以及在多轮对话中如何进行复杂长代码的编写和修改。
代码编写步骤的核心指令如下,CTO智能体给程序员智能体的指令是:以面向对象的编程语言python为基础,先给出核心类和方法。程序员智能体会按照指令以markdown为语法进行代码和注释的编写。之后代码编写环节会循环执行N次多轮对话,不断对代码进行更新优化。
image.png

Code Management

为了处理复杂的软件系统,ChatDev使用面向对象的编程语言。ChatDev引入了“版本演化”机制来限制角色之间对最新代码版本的可见性,而从内存流中丢弃较早的代码版本,版本逐步进化消除了代码幻觉。

Thought Instruction

image.png
传统的回答问题可能导致不准确或不相关的信息,特别是在代码生成中,天真的指令可能导致意想不到的幻觉。在生成代码时,这个问题变得尤为严重。为了解决这个问题,提出了一种“思维指导”的机制,灵感来源于“思维链提示”。这种机制包括在指令中明确地解决特定的问题解决思想。(如交换角色,询问哪些没有实现,然后切换回来让其更精确的执行)

Testing

测试阶段分为三个角色:Programmer、Reviewer和Tester。该过程由顺序的原子聊天任务组成,包括同行评审(程序员和评审员)和系统测试(程序员和测试员)。
在实践中,观察到允许两个代理仅根据来自解释器的反馈消息进行通信并不能得到一个无bug的系统。程序员的修改可能不会严格遵循反馈,从而导致幻觉。为了解决这个问题,还是采用了Thought Instruction机制,不过这种是迭代进行,直到其认为潜在的错误已经被消除了,系统能够成功运行。(本质上是黑盒测试)

Documenting

image.png
文档编写阶段分为三个角色:CEO、CPO、CTO和Programmer。
CTO指示Programmer为环境依赖项提供配置说明,从而产生一个类似requirements.txt的文档。本文档支持用户独立配置环境。同时,CEO向CPO传达需求和系统设计,CPO生成用户手册。

Experiments

Setup

  • 使用“gpt3.5-turbo-16k”,temperature设置为0.2
  • 在编码阶段,最多允许5次代码完成尝试,评审者被允许5次聊天提出修改。
  • 对于基于Python的系统,使用Python 3.8.16作为测试的解释器

Dataset

Camel组织了一个指令跟随对话数据集,它跨越了20种编程语言、50个领域和每个领域50个任务。从这个广泛的任务集中,随机选择了70个任务,包括具体的和相对抽象的案例。

Main Results

image.png

  • #Code Files:代码文件夹数量
  • #Asset Files:外部文件数量
  • #Document Files:生成文档数量
  • #Lines of Source Codes:生成源代码行数
  • #Lines of Dependencies:环境依赖数(外部软件组件)
  • #Lines of User Manual:软件用户手册行数
  • #Version Updates:版本迭代次数
  • #Software Re-development:开发周期

Duration Analysis

image.png
平均耗时为409.84秒,最长耗时为1030秒。

Dialogue Statistics

image.png
ChatDev开发一个软件需要36,902.23个提示token,11,567.37个完成token,以及总共48,469.60个token。软件生产的平均总成本大约是0.15693美元,平均每款软件的设计师成本为0.1398美元,而每款软件平均包含8.74个图形创作。因此,CHATDEV的平均软件开发成本为0.2967美元。

Reviewer-Programmer Dialogue Analysis

image.png

在代码审查期间,Reviewer和Programmer交流中最经常讨论的问题是“未实现的方法”(34.85%)。这种挑战通常出现在复杂模型的代码生成中,核心功能通常会接收占位符标签(如Python中的“pass”)以进一步完成。此外,对话框经常讨论“未导入的模块”的主题(19.70%)。这个问题源于代码生成的本质,生成的代码往往会忽略次要的细节。然而,在代码生成的上下文中,确保代码的可执行性变得至关重要。幸运的是,本文提出的thought instruction机制通过迫使Reviewer识别不完整的方法并要求Programmer填充它们,有效地解决了这些问题。这种机制可以应用于其他场景,在这些场景中,任务是基于大型模型完成的,但缺少某些部分。有趣的是,Reviewer还强调了代码健壮性的重要性。他们强调了将来处理潜在异常时的注意事项,并提供了避免重复类别的提示(3.03%)。此外,Reviewer还提供了关于代码中未使用类的建议(1.52%),识别无限循环(1.52%),并强调适当的环境初始化的必要性(1.52%)。

Tester-Programmer Dialogue Analysis

image.png

Tester和Programmer之间最常见的调试问题是“模块未找到”(45.76%),占了将近一半的情况。这反映了该模型忽略非常细微细节的倾向,尽管它们很简单。幸运的是,通过本文提出的thought instruction机制,通常可以通过导入所需的类或方法轻松解决此类错误。第二常见的错误类型是“属性错误”和“未知选项”,各占15.25%。“attribute error”是类属性使用错误,“unknown option”是方法调用参数错误。另一种常见的错误类型是“import error”,它类似于“未找到模块”,主要是由import语句中的错误引起的,比如导入了错误的类或使用了错误的导入路径。除了这些常见的错误类型外,ChatDev还能够检测相对罕见的错误类型,比如初始化不正确的GUI(5.08%)、错误的方法调用(1.69%)、缺少文件依赖关系(1.69%)、未使用的模块(1.69%)、装饰器语法错误(1.69%)等等。

Case Study

Gomoku

image.png
如果人类用户不满意art designer创建的图像,他们可以灵活地在ChatDev完成软件后手动替换原始图像。

image.png
The example of making programming language choices in designing.

Conclusion

Problems

  • 即使将大模型的temperature设置为很低的值,仍然存在内部的随机性,所以这项技术比较适合开放和创造性的软件生产场景。
  • 有些生成的软件无法满足用户需求,可能是因为不清楚用户的需求和文本或代码固有的随机性。
  • 直接生成的图像可能不总是在逐渐增强GUI的美观性,过多的复杂性还可能影响用户体验。
  • 大型语言模型可能会显示出固有的偏见,导致生成的代码模式不一定与真正的程序员解决问题的思路一致。此外,生成的软件目前缺乏对敏感文件操作的恶意意图识别。
  • 这项研究可能会对初级程序员来说有帮助,但对于复杂或大规模的软件,存在非常大的挑战性。

ChatDev利用LLMs来促进软件开发过程中涉及的多个角色之间的有效通信和协作。通过使用聊天链将开发过程分解为顺序的原子子任务,其支持细粒度焦点,并促进每个子任务的期望输出。此外,Thought Instruction机制通过在代码完成、检查和测试期间指导程序员进行特定的代码修改,减轻了与代码幻觉相关的挑战。

Practice

Quick Start

  1. clone code
git clone https://github.com/OpenBMB/ChatDev.git
项目结构:
├── CompanyConfig # Configuration Files for ChatDev, including ChatChain, Phase and Role config json.
├── WareHouse # Folder for generated software
├── camel # Camel RolePlay component
├── chatdev # ChatDev core code
├── misc # assets of example and demo
├── online_log # Demo Folder
├── run.py # Entry of ChatDev
├── requirements.txt
├── README.md
└── wiki.md
  1. set up environment
conda create --name chatdev_env python=3.9 -y -i https://pypi.tuna.tsinghua.edu.cn/simple
conda activate ChatDev_conda_env

cd ChatDev
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. set openAI API Key
# macos or linux
export OPENAI_API_KEY="your_OpenAI_API_key"
# windows
$env:OPENAI_API_KEY="your_OpenAI_API_key"
  1. build software
# macos or linux
python3 run.py --task "[description_of_your_idea]" --name "[project_name]"
# windows
python run.py --task "[description_of_your_idea]" --name "[project_name]"

all params

usage: run.py [-h] [--config CONFIG] [--org ORG] [--task TASK] [--name NAME] [--model MODEL]

argparse

optional arguments:
  -h, --help       show this help message and exit
  --config CONFIG  Name of config, which is used to load configuration under CompanyConfig/; Please see CompanyConfig Section below
  --org ORG        Name of organization, your software will be generated in WareHouse/name_org_timestamp
  --task TASK      Prompt of your idea
  --name NAME      Name of software, your software will be generated in WareHouse/name_org_timestamp
  --model MODEL    GPT Model, choose from {'GPT_3_5_TURBO','GPT_4','GPT_4_32K'}
  1. run software
# macos or linux
cd WareHouse/project_name_DefaultOrganization_timestamp
python3 main.py
# windows
python run.py --task "[description_of_your_idea]" --name "[project_name]"

所有生成的软件都在WareHouse/NAME_ORG_timestamp下:
image.png

目录结构:
├── 20230822165503.log # log file
├── ChatChainConfig.json # Configuration
├── PhaseConfig.json # Configuration
├── RoleConfig.json # Configuration
├── todo.prompt # User query prompt
├── meta.txt # Software building meta information
├── main.py # Generated Software Files
├── manual.md # Generated Software Files
├── todo_app.py # Generated Software Files
├── task.py # Generated Software Files
└── requirements.txt # Generated Software Files

Multi-Agent

目前LLM应用上主要分为三个方面:

  • 直接回复用户的问题(主要使用的是模型的“内部知识”)
  • 通过外部知识库或搜索引擎结果来结合上下文去进行回复(主要使用的是模型分析总结的能力)
  • 让模型作为一个智能体,结合Prompt以及外部工具或多个智能体交互来完成特定任务

第三种Agent现如今非常火,是目前LLM应用上的一个重要方向。其本质是通过结合大量预定义的Prompt(角色扮演、职责之类的)以及指导式的Prompt(流程控制,协作之类的)来完成多个智能体的交互,以及结合外部工具来完成各种复杂的任务。

大部分Agent项目的共同点:

  • CoT Prompt:思维链Prompt,对任务进行拆分。
  • Self-Reflection:自反思机制,比如ChatDev的自反思机制,在智能体对话双方达成一致的时候,正常情况下会触发“通信协议”,然后进行终止对话,而其自反思机制会介入第三方,让第三方智能体去提出进行总结的问题,将这个问题还有两个智能体的对话历史记录交给Assistant这个智能体去回答总结之后的决策。(这一做法能够有效的让Assistant反思整个对话流程所产生的结论)
  • Memory Stream:记忆可以看成“长期记忆”以及“短期记忆”,可以把Prompt里的内容看成“短期记忆”,“长期记忆”就是那些外部存储的对话记录。(由于LLM输入信息有长度限制,当聊天进行比较久的时候,模型容易遗忘之前对话的内容,所以需要将对话内容进行外部存储。获取长期记忆的方法最常见的有“语义搜索”,通过embedding模型,对所有的对话信息进行向量化,之后进行交互的时候同样将其进行向量化,然后通过相似度匹配来获取最相似的“记忆”文本)
  • Divide and Conquer:将大任务拆分成多个原子子任务,就像ChatDev将任务流程化,每个流程又有多个原子任务;这种做法可以让模型更好的完成任务。

Agent在其他方向的应用:

  • Behaviour simulation(行为模型)

Generative agents: Interactive simulacra of human behavior(利用沙盒环境创建多个生成代理来模拟可信的人类行为)
Recagent: A novel simulation paradigm for recommender systems(使用多个代理来模拟推荐场景下用户的行为)

  • Data construction(数据构建)

Multi-party chat: Conversational agents in group settings with humans and models(通过分配不同角色的agent来收集和评估多方对话)
CAMEL: communicative agents for “mind” exploration of large scale language model
society(提出了一个角色扮演框架,利用代理为复杂任务生成多样化和详细的指令)

  • Performance improvement(性能提升)

In-context impersonation reveals large language models’ strengths and biases(发现让agent承担不同的角色可以提高其性能)
Improving factuality and reasoning in language models through multiagent debate(通过利用多agent体辩论提高了事实正确性和推理准确性)
Encouraging divergent thinking in large language models through multi-agent debate(利用多agent相互辩论来解决自我反省中的思维退化问题)

更多的Agent Paper:https://github.com/zjunlp/LLMAgentPapers

开源多智能体项目:

  • AutoGPT:比较早期的一个项目
  • Generative Agents:斯坦福小镇
  • AgentSims:国内开源的类似斯坦福小镇(在类似ChatGPT的LLM在社区流行之后,如何评估大语言模型(LLM)的能力是一个悬而未决的问题。现有的评估方法存在以下缺点:(1)评估能力有限;(2)基准脆弱;(3)指标不客观。我们建议基于任务的评估,即LLM代理在模拟环境中完成任务,是解决上述问题的一劳永逸的解决方案)
  • MetaGPT:类似ChatDev的软件开发多智能体框架
  • CAMEL:任务导向型,沟通式多智能体协同框架,ChatDev的基础

引用

Github ChatDev Readme
解密Prompt系列18. LLM Agent之只有智能体的世界 - 风雨中的小七 - 博客园
GitHub - DSXiangLi/DecryptPrompt: 总结Prompt&LLM论文,开源数据&模型,AIGC应用
AutoGPT与LLM Agent解析
大模型应用的另一范式:大模型智能体

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

旅游系统-软件与环境

运行 1.下载软件并进行环境配置 2.导入项目包以及SQL文件 (1)VsCode 管理员运行打开 a.新建terminal 注意: 1.执行 npm config set registry https://registry.npm.taobao.org 2.执行 npm install 3.执行 $env:NODE_OPTIONS“–openssl-legacy-provider” b.输入…

奇怪的比赛(Python,递归,状态压缩动态规划dp)

目录 前言:题目:思路:递归:代码及详细注释: 状态压缩dp:代码及详细注释: 总结: 前言: 这道题原本是蓝桥上的题,现在搜不到了,网上关于此题的讲解…

【SQL】1280. 学生们参加各科测试的次数 (笛卡尔积)

前述 知识点回顾:数据库中的四大join & 笛卡尔乘积(以MySQL为例) 笛卡尔积的两种写法 select * from stu,class; select * from stu cross join class; 题目描述 leetcode题目:1280. 学生们参加各科测试的次数 Code 写法…

【算法与数据结构】堆排序TOP-K问题

文章目录 📝堆排序🌠 TOP-K问题🌠造数据🌉topk找最大 🚩总结 📝堆排序 堆排序即利用堆的思想来进行排序,总共分为两个步骤: 建堆 升序:建大堆 降序:建小堆利…

SpringBoot项目通过触发器调度实现定时任务

文章目录 前言一、quartz是什么?二、quartz中核心概念三、集成步骤1.引入依赖2.demo样例a.定义一个任务参数实体类b.定义操作触发器、定时任务接口及实现c.作业实现d.结果截图 四、其他1.QuartzJobBean和Job区别2.注意事项3.作业(Job)和触发器…

2024年跨境电商大热门:哪个平台最具赚钱潜力?!

2024年,哪个跨境电商平台好做,这取决于多种因素,如平台的知名度、流量、用户基础、市场定位、费用结构以及个人或企业的具体需求和资源。以下是一些近期比较热门,表现突出的跨境电商平台,但请注意,每个平台…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅰ)

1.SQL概述 SQL(Structured Query Language)结构化查询语言,是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 SQL的动词 基本概念 基本表 :本身独立存在的表; SQL中一个关系就对应一个基本表&am…

分享最有效脱单方法【单身狗必看】

用这个方法找不到对象我倒立 ! 发送内容: "脱单神器", 实现今年脱单

# termux连接云服务器

连接服务器 ssh nameip termux使用 pkg install openssh

Java Swing游戏开发学习14

内容来自RyiSnow视频讲解 前言 这一节讲的是Custom Font定制字体,就是在游戏中显示文字的地方,使用特定的ttf字体文件进行文字显示,提升游戏体验。如果觉得arial字体可以接受,这一节可以跳过,或者认为它太普通&#…

Linux离线安装Docker-Oracle_11g

拉取oracle11g镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g创建11g容器 docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g查看容器是否创建成功 docker ps -a导出oracle容器,查看…

HarmonyOS入门学习

HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…

MCU技术的创新浪潮与产业变革

MCU技术的创新浪潮与产业变革 一、MCU技术的创新发展 MCU,即微控制器,作为现代电子设备的核心部件,一直在不断地创新与发展。随着科技的进步,MCU的性能得到了极大的提升,功能也越来越丰富。从8位到32位,再…

OpenCV4.9.0在Android 开发简介

查看:OpenCV系列文章目录(持续更新中......) 上一篇:使用 Clojure 进行 OpenCV 开发简介 下一篇:暂无 引言: OpenCV是一个跨平台计算机视觉库,广泛用于图像处理、计算机视觉和机器学习等领域…

TinyEMU源码分析之虚拟机初始化

TinyEMU源码分析之虚拟机初始化 1 初始化结构参数2 配置RAM地址空间3 初始化设备4 拷贝BIOS和Kernel5 手动写入5条指令6 体验第一条指令的执行 本文属于《 TinyEMU模拟器基础系列教程》之一,欢迎查看其它文章。 本文中使用的代码,均为伪代码&#xff0c…

Java 面向对象编程进阶七(字符串 String )

目录 字符串 String String 基础 String 类和常量池 String 类常用的方法 String 类常用方法一 String 类常用方法二 字符串相等的判断 字符串 String String 是我们开发中最常用的类,我们不仅要掌握 String 类常见的方法,对于 String 的 底层实现…

Vue.js+SpringBoot开发智能教学资源库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…

多进程数据库不适合作为hive的元数据库

简介 “今天发现一个比较奇怪的现象,因为博主不熟悉mysql,所以在安装hive的使用了postgresql作为hive的元数据库,在测试几个连接工具对hive进行链接,后面再测试的时候发现链接不上了,并且报错日志如下:” …

【记录39】html element-ui 加载

环境 html使用element-ui组件、用vue框架搭建 方法一: 方法二(推荐) 将相关资源下载下来,在对应的html文件中相对路径引入。注意:css加载放在js之前

导航栏还是侧栏?flutter 跨平台适配指南

介绍 引言:Flutter 的跨平台特性 Flutter 是由 Google 开发的一款跨平台应用开发框架,它具有许多优点,包括性能优异、开发效率高以及良好的用户体验等。其中,最引人注目的特性之一就是其出色的跨平台能力。通过编写一套代码&…