北大用ChatGPT组建了个开发团队:大模型分饰多角色,协同完成软件开发任务

本文主要是介绍北大用ChatGPT组建了个开发团队:大模型分饰多角色,协同完成软件开发任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

9393266ce62fe597e46836519bb3c014.jpeg

来源:北京大学李戈教授的研究团队

人类可以通过合作的方式解决复杂问题,这种模式同样适用于 AI 领域。

「一个人的能力有限,一支团队的力量无限」,这一句话在现实世界的软件开发中体现的淋漓尽致。对于复杂的任务,人们通过团队合作策略来解决。但在 AI 世界中,这样的模式是否也适用呢?

今年4月,北京大学李戈教授团队提出了一种全新的 self-collaboration(自合作)模式。它允许多个大模型扮演不同的角色,组成了一个无需人类参与的软件开发团队,通过大模型间的合作和交互,自主完成整个软件开发流程,甚至包括一些复杂的代码生成任务。

6eb4204e8371c6db493040c7bb1561f4.jpeg

论文链接:https://arxiv.org/pdf/2304.07590.pdf

论文发表时间:2023/4/15

尽管大型语言模型 (简称为:大模型) 在代码生成方面已经展示出了惊人的能力,但是在处理复杂任务上仍然存在挑战。在现实中的软件开发过程中,人们通常通过协同团队工作的策略来解决复杂的任务,这种策略能够显著地控制开发的复杂性并提高软件的质量。

受此启发,研究者提出了一个使用大模型进行代码生成的 self-collaboration 框架。具体来说,通过角色指令,1) 多个大型语言模型扮演不同的 "专家" 角色,每个模型负责处理复杂任务中的特定子任务;2) 规定合作和交互的方式,使不同的角色形成一个虚拟团队,帮助彼此完成工作,最终无需人为干预就能共同完成代码生成任务。

为了有效地组织和管理这个虚拟团队,研究者巧妙地将软件开发方法论中的瀑布模型融入到了框架中,组建了一个由三个 ChatGPT 角色(即分析师、程序员和测试员)组成的基础团队,实施软件开发过程中的分析、编码和测试阶段。

实验结果表明,与直接利用大模型代码生成相比,self-collaboration 代码生成的性能大幅提升,甚至让 GPT-3.5 超越了 GPT-4。此外,研究者还展示了 self-collaboration 能使大模型有效地处理更复杂的实际代码项目,而这些项目往往是直接代码生成难以解决的。

82cd45f58280d2762d192d53c1f89b63.jpeg

图1:用于代码生成的 Self-collaboration 框架及其实例。

此项研究开创了一种新的使用人工智能语言模型进行软件开发的路径,将人工智能与软件开发过程的各个阶段紧密结合,既提高了开发效率,也保证了软件的质量。通过利用 ChatGPT 等 LLMs 的潜力,可以为模型间合作和交互提供更强大的支持,从而促进虚拟团队在处理复杂软件开发任务方面的成功。这种 self-collaboration 框架为自动代码生成提供了一种新的、更高效的方法,有助于推动软件开发领域的创新和进步。此外,这项工作还可以作为未来研究各个领域的自我合作方法以及开发更先进、更专业的虚拟团队来处理更复杂任务的基础。

下面具体介绍一下 Self-collaboration 框架以及在该框架基础上按照软件开发方法论组建虚拟团队的实例。

Self-collaboration 框架

给定需求 x,利用大模型执行 Self-collaboration 以生成输出 y。该任务定义为b0c79cdeb5710f6f56a727d0fe5bd9bb.jpeg。Self-collaboration 框架由两部分组成:分工和合作。

在分工部分,研究者运用先验知识将复杂任务分解为一系列阶段 23775eb8fa1930a5b8d63ec612baebcc.png并构建一些不同的角色e1a6e2bbac63abbb3f2b87cba86d228f.jpeg,这些角色基于大模型和角色指令。每个阶段 8471e299e430f15128d725f971c06c09.png由一个或多个角色 2f20bba5d3213a38ccb14aec578ca685.png负责。

众所周知,大模型对上下文非常敏感,因为它们在训练时,被要求根据前面的文字预测后续文字。因此,一种广泛使用的方式是通过指令或提示来控制大模型的生成。研究者采用特定类型的指令为大模型分配身份和职责,被称为角色指令。具体来说,研究者要求大模型扮演与其职责紧密相关的特定角色并且传达这个角色应该执行的详细任务。

使用角色指令的优势在于它们仅需要在交互开始时被提供一次。在随后的交互中,传达的只是意图,而不是指令和意图的组合。因此,角色指令提升了后续沟通合作的整体效率和清晰度。

在合作部分,研究者关注于促进在 self-collaboration 框架内承担不同角色的大模型之间的有效交互。每个大模型在其指定角色指令的指导下,通过履行其分配的职责为整体任务做出贡献。随着阶段的进展,大模型与其他大模型交流他们的输出,交互信息并输出 y 。

利用角色指令,可以有效控制大模型的输出格式。结合语言模型的基础方面,这可以初步建立大模型之间的通信。

合作部分可以形式化为:

ba26a671221432d3a82a2af09b8482a6.jpeg

其中 d74ea502404595e72a9a83225883deab.jpeg是阶段2f397cd0af6c41b0ccfb04362d7f423a.jpeg的输出,fc6d36f3b2f505697f3aa23baf0a7e17.jpeg表示 c4e102bd66760392f9e0a55a8a553951.jpeg前提阶段的输出,c1400836bb7e5e0dc8154df1483e7d81.jpeg表示 e02626de4fb5b2a327fa9e02bcd6a21b.jpeg对应的角色。请注意,如果阶段 7dedbf521ffa4c4deb00aae49909e196.jpeg之间的关系不是线性关系,self-collaboration 框架可以并行化。计算 8f7622ab535946f0504b9f2189dcbb87.jpeg被视为合作,其中角色 04a2b5cc028b9af8da7e5c00ef1854a6.jpeg 与每个前面阶段的角色合作生成 1177b13775ab2a526197b79cf2863c3f.jpeg。输出 y 随着阶段 ee8de01c09d4c4d1e57369129bb14bf5.jpeg的进展迭代更新:

dc407327b415d67413693e69c1ad594c.jpeg

其中 f 是一个更新函数。为了促进有效合作,研究者建立了一个共享黑板,每个角色从中获取所需的信息以完成各自的任务 ce79e22ef8b87279a1d5696a1aab5de0.png。算法 1 给出了 self-collaboration 框架的完整算法。

7b1ee8a3fc9544a8f8a9e462a9c80c11.jpeg

实例化

研究者将软件工程方法论中的经典瀑布模型引入到自协作框架中,使代码生成的团队协作更加高效。具体来说,研究者设计了一个由分析、编码和测试三个阶段组成的简化瀑布模型,作为自协作代码生成的实例。该实例的工作流程遵循瀑布模型从一个阶段流向下一阶段,如果发现问题,则返回上一阶段进行细化。因此,研究者建立了一个基本团队,包括分析师、编码员和测试员,负责分析、编码和测试阶段,如图 1(右)所示。这三个不同的角色被分配以下任务:

分析师:分析师的目标是制定高层次的 plan 并专注于指导程序员编写程序,而不是深入研究实现细节。给定需求 x,分析师将 x 分解为几个易于解决的子任务,以方便程序员直接实施,并制定概述实施主要步骤的 plan。

程序员:作为该团队的核心角色,程序员将在整个开发过程中接收来自分析师的 plan 或来自测试人员的测试报告。因此,研究者通过角色说明将两项主要职责分配给程序员:1. 编写满足指定要求的代码,遵守分析师提供的 plan。2. 修复或细化代码,考虑到测试人员反馈的测试报告反馈。编码器角色指令的详细信息如图 2 所示。

测试员:测试员获取程序员编写的代码,然后记录包含各个方面(例如功能性、可读性和可维护性)的测试报告。研究者提倡模型模拟测试过程并生成测试报告,而不是生成测试用例然后通过执行手动测试代码,从而促进交互并避免额外的工作。

研究者为该实例制定了角色指令来扮演这三个角色。编码器角色指令的示例如图 2 所示。在本例中,角色指令不仅包括角色描述(角色及其职责),还包括团队描述和用户需求,它们将共同初始化 ChatGPT 代理,从而设置 ChatGPT 的行为。该实例仅在阶段c3b453df3362a4682002f1540774e19f.jpeg为 coding 时更新输出7daf6299c236653e217fcea910dc949b.jpeg,并且此开发过程在测试人员确认ca251a9bd617b6a285f4924413ecfb86.jpeg满足要求时结束。

80a48d012c6b968b0a464b95f3e791ab.jpeg

实验结果

e496dbd1ef54b5632df8374d8e1064d8.jpeg

研究者将 self-collaboration 代码生成与各种最先进(SOTA)方法进行比较,实验结果表明,self-collaboration 框架显著提高了基础大模型的性能。值得注意的是,即使是一个简单的三人团队(包括分析师、程序员和测试员),基于 ChatGPT (GPT-3.5) 的 self-collaboration 代码生成在四个代码生成基准测试中也取得了最佳性能,甚至超过了 GPT-4。考虑到基础大模型本身的差距,将 self-collaboration 框架应用于更强大的模型,例如 GPT-4,将产生更好的结果。

a15c151af9b7d12f1174cb342e7be455.jpeg

研究者进一步研究了仅使用自然语言描述的代码生成,这种设置更贴近实际的软件开发。在此设置下,研究者比较了由 self-collaboration 框架实例化的初等团队中每个 ChatGPT 角色的表现,如表 2 所示。实验结果表明,与仅使用程序员角色相比,无论是二位角色还是三位角色组建的团队,性能都有显著提高。

e7b0b9bd1f1f95eb7701be46156618f9.jpeg

研究者还研究了在不同模型大小下大模型的自合作能力。研究者评估了 self-collaboration 方法在处理复杂任务时的有效性,特别是那些对直接代码生成具有挑战性的任务。对于此类任务,研究者采用 self-collaboration 策略作为解决方案。如图 6 所示,随着模型规模的扩大,大模型的 coding 能力通常呈现出增加的趋势,而自合作能力在 7B 参数量左右开始显现出来,随后不断提升。实验结果表明自合作有助于激发大模型的潜在智能。

5daf27b5a2d279b876924f496d756d2b.jpeg

此外,研究者展示了一个 self-collaboration 代码生成示例,如图 4 所示。在这份测试报告中,测试员指出所实现的代码可能会导致从列表中删除重复元素,从而可能导致某些边缘测试用例失败。因此,建议从实现的代码中删除行 “lst = list (set (lst))”。程序员随后根据测试报告中的反馈删除了 “lst = list (set (lst))” 行。在最后一次交互中,测试员确认修改后的代码已经通过所有测试,满足要求,至此代码生成过程结束。

5a3397d3bc550d23b727e72a37d69ec9.jpeg

0eb51c6630543ef2a3d9a7be17f1d36f.jpeg

研究者还将 self-collaboration 框架应用于更复杂的实际代码项目的两个例子,分别是游戏开发和网页制作,如图 5 和图 9 所示。self-collaboration 可以生产完整的游戏逻辑和令人满意的游戏界面,对于天气预报网页的开发,也可以正确调用外部天气接口,实现所有功能。而直接代码生成则并没有覆盖所有要求的功能并且存在 bug,效果不佳。

总之,self-collaboration 框架在代码生成任务中表现出显著的性能提升,与单一角色相比,多角色团队能够更有效地处理各种问题和挑战。这种方法为自然语言处理和代码生成领域提供了新的研究方向,值得进一步探讨和优化。未来的工作可能包括对更多角色和更强大模型的探索,以及将 self-collaboration 框架应用于其他自然语言处理任务。

结论

在该工作中,研究者提出了一种 self-collaboration 框架,其目的是通过合作和交互方法来增强大模型的问题解决能力。具体而言,研究者探索了 ChatGPT 在促进基于团队的代码生成和合作方面的软件开发过程中的潜力。为此,研究者组建了一个由三个不同的 ChatGPT 角色组成的初等团队,目的是全面解决代码生成任务。为了评估 self-collaboration 框架的有效性和泛化性能,研究者针对各种代码生成基准进行了广泛实验。实验结果提供了大量证据支持 self-collaboration 框架的有效性和普适性。研究者认为,让模型能够组建自己的团队并合作完成复杂的任务是实现 AGI 的关键一步。

未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)大脑研究计划,构建互联网(城市)大脑技术和企业图谱,为提升企业,行业与城市的智能水平服务。每日推荐范围未来科技发展趋势的学习型文章。目前线上平台已收藏上千篇精华前沿科技文章和报告。

  如果您对实验室的研究感兴趣,欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”

7825a5c867bd93061ae4a1f23a4a2380.jpeg

这篇关于北大用ChatGPT组建了个开发团队:大模型分饰多角色,协同完成软件开发任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532978

相关文章

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir