论文阅读:Self-Collaboration Code Generation via ChatGPT

news2025/5/17 11:39:33

地址:Self-Collaboration Code Generation via ChatGPT

摘要

尽管大型语言模型(LLMs)在代码生成能力方面表现出色,但在处理复杂任务时仍存在挑战。在现实软件开发中,人类通常通过团队协作来应对复杂任务,这种策略能有效控制开发复杂度并提升软件质量。受此启发,本文提出一种基于 LLMs(以 ChatGPT 为例)的自协作代码生成框架。具体而言,通过角色指令:(1)多个 LLM 代理扮演不同的 “专家” 角色,每个角色负责复杂任务中的特定子任务;(2)指定协作和交互方式,使不同角色形成虚拟团队以协同完成工作,最终实现无需人工干预的代码生成任务。为有效组织和管理该虚拟团队,本文将软件开发方法论融入框架,构建了由三个 LLM 角色(分析师、编码员、测试员)组成的基础团队,分别负责软件开发的分析、编码和测试阶段。在多个代码生成基准测试中,实验结果表明,自协作代码生成的 Pass@1 分数相比基准 LLM 代理提升了 29.9%-47.1%。此外,本文还展示了自协作框架能够使 LLMs 高效处理单个 LLM 代理难以解决的复杂代码库级任务。

论文总结

1. 研究背景与目标
  • 现有 LLMs 在复杂代码生成任务中表现受限,而人类通过团队协作分解任务、提升质量。
  • 提出自协作框架,利用 LLMs 模拟团队分工(分析师、编码员、测试员),结合软件开发方法论(如瀑布模型)实现高效代码生成。
2. 核心方法
  • 分工模块(DOL):通过角色指令为 LLM 分配特定角色(如分析师负责需求分解,编码员生成代码,测试员反馈优化),使其以 “专家” 视角处理子任务。
  • 协作模块:引入黑板机制作为信息共享中枢,各角色通过自然语言交互,基于前序阶段结果迭代优化输出。例如,分析师生成设计文档→编码员基于文档编码→测试员反馈缺陷→编码员修复,形成闭环。
  • 实例化流程:采用简化瀑布模型,定义三阶段流水线(分析→编码→测试),角色间最大交互次数(MI)限制为 4 次,通过 JSON 格式输出确保结构化。
3. 实验与结果
  • 基准测试:在 HumanEval、MBPP、APPS、CoderEval 等基准上,自协作框架相比单 LLM 代理(如 ChatGPT)提升显著。例如,在 HumanEval 上 Pass@1 提升 29.9%,在 CoderEval 的复杂依赖任务中提升 47.1%。
  • 角色有效性:消融实验表明,三角色协同(分析师 + 编码员 + 测试员)效果最优,单独移除任一角色均导致性能下降。角色指令比无角色提示(如零样本提示)更有效,证明 “角色扮演” 能约束 LLM 生成空间,提升专业性。
  • 模型扩展性:在 GPT-4、CodeLlama 等模型上验证了框架的普适性,发现模型参数规模(如≥7B)和领域知识(如 CodeLlama 相比 Llama2)对协作效果有显著影响。
4. 应用与案例
  • 函数级任务:以 HumanEval 为例,分析师分解需求为子任务(如检查素数、生成斐波那契数列),编码员按计划生成代码,测试员发现边界条件错误并推动修复,最终通过所有测试用例。
  • 复杂任务:在游戏开发(如障碍躲避游戏)和网站开发(天气预报网站)中,自协作框架生成包含多文件(HTML/CSS/JS)的完整项目,功能覆盖率和代码质量显著优于单模型直接生成。
5. 结论与展望
  • 贡献:首次将软件开发方法论引入 LLM 协作,证明自协作能有效提升复杂代码生成的准确性和鲁棒性,为多智能体协作提供新范式。
  • 局限与未来:现有基准与真实开发场景存在差距,未来可引入人类专家轻量级干预,扩展至更多开发角色(如架构师、运维),并探索跨领域(如硬件设计、科学计算)的协作应用。

设计方法内容原理

1. 自协作框架整体架构

框架分为分工模块(DOL)协作模块,通过角色指令驱动 LLM 代理协同工作:

  • 输入:用户需求 x(自然语言描述)。
  • 输出:目标代码 y。
  • 核心逻辑其中,每个阶段S_i由特定角色R_j处理,通过黑板机制共享中间结果 s_t,迭代更新输出y_t = f(s_t, y_{<t}),直至满足终止条件(如测试通过或达到最大交互次数)。
2. 分工模块(DOL):角色指令与任务分解
  • 角色指令设计
    • 分析师(Analyst):负责需求抽象与分解,输出高层设计计划(如模块划分、接口定义)。 示例指令:“将需求分解为可实现的子任务,制定指导编码的高层计划,避免涉及具体实现细节。”
    • 编码员(Coder):根据设计计划生成代码,或根据测试反馈修复优化。 示例指令:“按照分析师提供的计划编写 Python 代码,确保效率、可读性和最佳实践;若收到测试报告,基于反馈修改代码且不引入新错误。”
    • 测试员(Tester):模拟测试过程,生成测试报告(如功能缺陷、边界条件问题)。 示例指令:“测试代码功能是否符合需求,记录问题并生成简洁报告,若代码通过测试,输出‘Code Test Passed’。”
  • 任务分解原则:基于软件开发方法论(如瀑布模型)将复杂任务线性划分为分析→编码→测试阶段,每个阶段由单一角色主导,确保职责分离。
3. 协作模块:黑板机制与交互流程
  • 黑板机制(Blackboard)
    • 存储多模态信息:需求文档、设计计划、代码草稿、测试报告等。
    • 交互流程
      1. 分析师解析需求 x,生成设计计划s_1并存入黑板。
      2. 编码员读取s_1,生成代码 s_2并返回黑板。
      3. 测试员读取s_2,生成测试报告 s_3(含 Bug 反馈)。
      4. 编码员根据s_3修复代码,生成s_4,重复直至s_t 通过测试或达到最大交互次数(MI=4)。
  • 交互形式:通过自然语言指令实现角色间通信,例如测试员反馈:“代码在处理空列表时返回错误结果,需添加边界条件检查。”

4. 实例化:基于瀑布模型的三角色团队
  • 阶段与角色映射
    开发阶段负责角色核心任务
    分析阶段分析师分解需求为子任务,生成模块设计与接口定义(如 UML 图、API 规格)。
    编码阶段编码员根据设计文档编写代码,支持多语言(如 Python/Java),输出可执行脚本。
    测试阶段测试员生成测试用例,验证功能正确性、鲁棒性,反馈缺陷(如语法错误、逻辑漏洞)。
  • 关键技术
    • 角色初始化:通过一次性角色指令定义职责,避免多轮交互中的上下文漂移。
    • 结构化输出:要求 LLM 以 JSON 格式生成中间结果,减少信息歧义,便于黑板解析和跨角色传递。
5. 理论基础与创新点
  • 模拟人类团队协作:通过分工降低任务复杂度,利用多角色校验提升代码质量(如分析师避免需求误解,测试员发现编码逻辑错误)。
  • 轻量化实现:无需模型微调或额外训练,仅通过提示工程复用 LLM 的通用能力,适用于多种 LLM(如 ChatGPT、GPT-4、CodeLlama)。
  • 可扩展性:支持动态调整角色数量和类型(如添加 “编译器” 角色或前端 / 后端分工),适配不同开发流程(如敏捷开发、DevOps)。

数据集来源

论文实验采用了 6 个公开的代码生成基准数据集,覆盖函数级到项目级任务,部分数据集还提供了扩展版本以增强测试难度。具体来源如下:

数据集来源 / 作者任务类型规模与特点
MBPPAustin et al., 2021Python 函数级编程任务427 个手动验证任务,含自然语言描述、代码解和 3 个自动化测试用例,覆盖编程基础和标准库功能。
HumanEvalChen et al., 2021Python 函数级编程任务164 个手写任务,包含函数签名、自然语言描述、用例、函数体及平均 7.7 个单元测试,由 OpenAI 提出。
MBPP-ETDong et al., 2023 (扩展版)Python 函数级任务(增强测试)MBPP 扩展版,每个任务新增 100 + 测试用例,侧重边缘情况,提升评估可靠性。
HumanEval-ETDong et al., 2023 (扩展版)Python 函数级任务(增强测试)HumanEval 扩展版,同上。
APPSHendrycks et al., 2021算法与编程问题(竞赛级难度)收集自 Codeforces、Kattis 等平台,包含 1000 + 复杂任务(平均 293.2 词描述),平均 21.2 个测试用例。
CoderEvalYu et al., 2024含依赖关系的代码生成任务(模拟真实开发)包含 Standalone(独立代码)、Plib-depend(库依赖)、Class-depend(类依赖)、File-depend(文件依赖)、Project-depend(项目依赖)5 类,评估代码在复杂依赖场景下的生成能力。

试验对照组设计

  1. 基线模型
    • 零样本 (Zero-Shot):直接使用原始 LLM(如 ChatGPT、GPT-4),无任何额外提示,仅输入任务描述:

      AlphaCode (1.1B) 是一种基于 transformer 的代码生成模型,在 2021 年 7 月 14 日之前对选定的公码进行了训练,可以解决一些基本的代码生成问题。

      Incoder (6.7B) 是一个统一的生成模型,它允许通过因果掩码语言建模训练目标从左到右生成代码和代码填充/编辑。

      CodeGeeX (13B) 是一个具有 130 亿个参数的大规模多语言代码生成模型,在 20 多种编程语言的大型代码语料库上进行了预训练。

      StarCoder (15.5B) 是一个代码 LLM,使用来自 GitHub 的许可数据(包括来自 80 的数据)进行训练+编程语言、Git 提交、GitHub 问题和 Jupyter 笔记本。

      CodeGen (16.1B)是一个受过 NL 和编程数据训练的 LLM,用于基于对话的程序合成。在本文中,我们采用 CodeGen-Multi 版本。

      PaLM Coder (540B)在代码上从 PaLM 540B 进行了微调,其中 PaLM 使用名为 Pathways 的机器学习系统,该系统可以在数千个加速器芯片上实现 LLM 的高效训练。

      CodeX (175B) ,也称为 code-davinci-002,是从 davinci 175B 对带有代码完成任务的多语言代码数据进行微调的。CodeX 也是为 Copilot(一个著名的商业应用程序)提供支持的主干模型。

      CodeX (175B) + CodeT 是 GPT-4 之前最先进的 (SOTA) 方法。CodeT 使用 LLM 为代码示例自动生成测试用例。它使用这些测试用例执行代码样本,并执行双重执行协议,同时考虑测试用例的输出一致性和代码样本之间的输出一致性。

      CodeLlama (34B)是一个用于代码生成任务的开放基础模型,源自基于 Llama 2 [55] 的持续训练和微调。

      ChatGPT  是 InstructGPT的兄弟模型,它被训练为遵循提示中的指令并提供详细的响应。我们通过 OpenAI 的 API 访问 ChatGPT。由于 ChatGPT 会定期接收更新,因此我们采用固定版本“gpt-3.5-turbo-0301”作为我们的基础模型,它不会接收更新,以最大限度地降低模型意外更改影响结果的风险。

      GPT-4  是一种大规模的多模态模型,可以接受图像和文本输入并生成文本输出。GPT-4 在各种基准测试中表现出人类水平的性能。

    • 单角色 (Single-Role):使用单一 LLM 代理,添加通用指令(如 "生成满足需求的代码")
    • 多轮对话 (Multi-Turn):允许 LLM 通过多轮交互优化输出,但无明确角色分工
  2. 实验组
    • 自协作框架 (Self-Collaboration):基于分工模块和协作模块,配置分析师 + 编码员 + 测试员三角色
    • 消融实验:依次移除分析师、编码员、测试员角色,验证各角色贡献
     3. 实验评价指标

                1. Pass@1:生成的代码通过所有测试用例的比例

                2. Pass@k:尝试 k 次生成中至少有一次通过的比例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025年PMP 学习十五 第10章 项目资源管理

2025年PMP 学习十五 第10章 项目资源管理 序号过程过程组1规划沟通管理规划2管理沟通执行3监控沟通监控 项目沟通管理包括为确保项目的信 息及时且恰当地规划、收集、生成、发布、存储、检索、管理、控制、监 警和最终处理所需的过程&#xff1b; 项目经理绝大多数时间都用于与…

如何使用易路iBuilder智能体平台快速安全深入实现AI HR【实用帖】

随着企业组织经营对降本、增效、提质的需求日益迫切&#xff0c;越来越多企业启动人力资源数智化转型战略。而在AI战略实际推进过程中&#xff0c;企业组织往往在选型、搭建、使用、管控等问题上面临困惑&#xff1a; 如何快速、低成本接入AI能力&#xff0c;实现人力资源管理…

免费实用的远程办公方案​

假如你需要快速检索出远程电脑文件并下载&#xff1f; 假如你需要访问远程电脑的共享文件夹&#xff1f; 假如你需要访问远程电脑的USB设备&#xff0c;例如软件加密狗、调试器、固件烧录器、U盘等&#xff1f; 本篇文章能够解决以上痛点。 这个方案非常实用&#xff0c;也很…

【springboot项目服务假死、内存溢出问题排查】

问题现象&#xff1a;springboot服务A刚启动时正常&#xff0c;但运行几个小时后就会接口请求无响应&#xff0c;但服务器网络、磁盘I/O和CPU都没有出现爆满的情况&#xff0c;且A服务日志没有异常报错。 线上SpringBoot假死现象 SpringBoot应用会出现无法访问的情况。具体的表…

Java 线程状态详解:从创建到销毁的完整旅途

前言 在 Java 多线程编程中&#xff0c;线程的状态管理是理解并发逻辑的核心。本文将用通俗的语言和代码示例&#xff0c;解析线程的6种状态及其转换条件&#xff0c;助你彻底掌握线程的生命周期。 一、线程的6种状态 状态含义NEW线程对象已创建&#xff0c;但未启动&#xf…

操作系统|| 虚拟内存页置换算法

题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先&#xff0c;产生一个随机的页面引用序列&#xff0c;页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…

Maven 项目构建时编译错误问题排查与解决

1. 问题描述 Maven 项目执行命令 mvn clean package 时出现编译错误&#xff0c;如下图所示 2. 问题分析 由于是源码编译错误&#xff0c;于是通过查看项目 pom.xml 文件&#xff0c;得到项目源码使用的 Java 版本为 21 <project xmlns"http://maven.apache.org/P…

安全生产调度管理系统的核心功能模块

安全生产调度管理系统是运用现代信息技术构建的智能化管理平台&#xff0c;旨在实现生产安全风险的全面管控和应急资源的优化调度。该系统通过整合物联网、大数据、人工智能等前沿技术&#xff0c;建立起覆盖风险监测、预警预测、指挥调度、决策支持的全链条安全管理体系。 一…

Linux进程信号(一)之信号的入门

文章目录 信号入门1. 生活角度的信号2. 技术应用角度的信号3. 注意4. 信号概念5.用kill -l命令可以察看系统定义的信号列表6. 信号处理常见方式 信号入门 1. 生活角度的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也…

基于springboot+vue的机场乘客服务系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 用户管理 航班信…

基于SpringBoot的房屋租赁管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

STM32外设AD/DA-基础及CubeMX配置

STM32外设AD/DA-基础及CubeMX配置 一&#xff0c;什么是AD/DA二&#xff0c;基础概念1&#xff0c;模拟 vs 数字2&#xff0c;AD转换1&#xff0c;分辨率 (Resolution)2&#xff0c;参考电压 (Reference Voltage, Vref)3&#xff0c;采样率 (Sampling Rate) 3&#xff0c;DA转换…

React Native简介

React Native 是由 Meta&#xff08;原 Facebook&#xff09;开源的跨平台移动应用开发框架&#xff0c;基于 React 和 JavaScript&#xff0c;允许开发者使用同一套代码库构建 iOS 和 Android 原生应用。通过 JavaScript 调用原生组件实现高性能渲染。 跨平台开发 共享 80%-9…

GCC 使用说明

参数 -fPIC ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段&#xff0c;告诉编译器产生与位置无关代码(Position-Independent Code)&#xff0c; 则产生的代码中&#xff0c;没有绝对地址&#xff0c;全部使用相对地址&#xff0c;故而代码可以被加…

Verilog HDL 语言整理

Verilog HDL 语言 Verilog HDL 简介 硬件描述语言Hardware Description Language是一种用形式化方法即文本形式 来描述和设计数字电路和数字系统的高级模块化语言 Verilog HDL&#xff08;Hardware Description Language&#xff09;是一种硬件描述语言&#xff0c;用于建模…

车道线检测----Lane-ATT

本文针对车道线检测----Lane-ATT论文所有细节进行阐述&#xff0c;有帮助的话点个收藏关注吧 保持对车道的关注&#xff1a;注意力引导的车道检测 摘要 但许多方法在保持实时效率方面存在问题&#xff0c;这对于自动驾驶车辆至关重要。在本文中&#xff0c;我们提出了LaneATT…

linux安装宝塔面板到数据盘

操作很简单&#xff0c;假如数据盘挂载在cipan1&#xff0c;在数据盘新建目录www&#xff0c;为了方便对应。 执行一下命令&#xff0c;创建软连接 ln -s /cipan1/www www 此时&#xff0c;根目录就出现了www文件夹 下面正常安装宝塔即可

【基础】Windows开发设置入门7:PowerShell的相关概念和使用

前言 大家熟悉的docker、Python&#xff0c;但对于Windows上有一套开配合开发的相对底层的环境设置&#xff0c;包括powershell、winget、WSL、还有开发驱动器什么的&#xff0c;我准备系统学一下&#xff0c;不然地基不牢&#xff0c;也盖不起冲天高楼~ 本节&#xff0c;介绍…

芯片生态链深度解析(一):基础材料篇——从砂砾到硅基王国的核心技术突围

【开篇&#xff1a;芯片——现代文明的“炼金术”】 当您滑动手机屏幕、驾驶新能源汽车、甚至用AI生成一幅画时&#xff0c;是否想过这些科技奇迹都始于一粒沙子&#xff1f;芯片&#xff0c;这个边长不足2厘米的黑色薄片&#xff0c;正是通过将砂砾提纯为高纯度硅锭&#xff…

一款利用ADB (安卓调试桥)来控制手机的玩机工具

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/f36ed8ff62f74 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDmKCq4u-CygjX9Tcn3fxEA1?pwdwf3t# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…