随着 GitHub Copilot 等 AI 驱动的助手的出现,软件开发领域见证了一场范式转变。然而,现有的解决方案并未充分利用 IDE 中的所有潜在功能,例如构建、测试、执行代码、git 操作等。因此,它们受到其有限功能的限制,主要专注于在基于聊天的界面内建议代码片段和文件操作。
为了填补这一空白,我们提出了 AutoDev——一个完全自动化的 AI 驱动的软件开发框架,旨在自主规划和执行复杂的软件工程任务。AutoDev 使用户能够定义复杂的软件工程目标,这些目标被分配给 AutoDev 的自主 AI 智能体(AI Agent)来实现。这些 AI 智能体可以在代码库上执行各种操作,包括文件编辑、检索、构建过程、执行、测试和 git 操作。他们还可以访问文件、编译器输出、构建和测试日志、静态分析工具等。
这使 AI 智能体能够在全面理解所需上下文信息的情况下,以完全自动化的方式执行任务。此外,AutoDev 通过将所有操作限制在 Docker 容器内来建立一个安全的开发环境。该框架包含护栏,以确保用户隐私和文件安全,允许用户在 AutoDev 中定义特定的允许或受限制的命令和操作。
在我们的评估中,我们在 HumanEval 数据集上测试了 AutoDev,获得了有希望的结果,Pass@1 分别为 91.5% 和 87.8%,用于代码生成和测试生成,证明了其在自动化软件工程任务中的有效性,同时保持安全和用户控制的开发环境。
1 引言
随着开发人员越来越多地采用 AI 助手(例如 Chat GPT)来完成他们的开发任务,生产力收益变得显而易见。AI 编码助手已进一步发展到集成开发环境 (IDE) 中,例如 GitHub Copilot,它们在聊天界面和文件中直接提供代码建议。
然而,这些 AI 编码助手尽管已集成到 IDE 中,但功能有限,并且缺乏上下文感知[3, 6]。它们通常不会利用所有 IDE 功能,例如调用 linter、编译器或执行命令行操作,因此,开发人员仍然需要手动验证语法并确保 AI 生成的代码的正确性、执行代码库和检查错误日志。
AutoDev 通过提供自主 AI智能体直接在存储库中执行文件编辑、检索、构建、测试和 CLI 命令等操作的能力来实现用户定义的目标,从而弥合了这一差距,从而能够自主完成复杂的任务。AutoDev 提供以下关键特性:
-
通过对话管理器跟踪和管理用户和 AI智能体对话的能力
-
一组定制的工具库来完成各种代码和 SE 相关目标
-
通过智能体调度程序安排各种 AI智能体协同工作以实现共同目标的能力
-
通过评估环境执行代码和运行测试的能力
(图1 AutoDev 使 AI智能体能够通过在存储库中执行几个动作来实现给定的目标)
图 1 说明了 AutoDev 工作流的高级示例。用户定义一个目标(例如,测试一个特定方法)。AI智能体(AI Agent)在新文件中编写测试并启动测试执行命令,所有这些都在安全的评估环境(Eval Environment)中进行。然后将测试执行的输出(包括失败日志)纳入对话中。AI智能体分析其输出、触发检索命令,通过编辑文件合并检索到的信息,并重新调用测试执行。最后,评估环境提供有关“测试执行是否成功和用户目标是否完成”的反馈。
整个过程由 AutoDev 自主编排,除了设置初始目标之外,无需开发人员干预。相比之下,使用集成到 IDE 中的现有 AI 编码助手(如GitHub copilot),开发人员将必须手动执行测试(例如,运行 pytest),向 AI 聊天界面提供失败日志,可能识别要合并的其他上下文信息,并在 AI 生成后重复验证操作修改后的代码。
AutoDev 从先前在自主 AI智能体领域的工作中汲取灵感。例如,AutoGen 是一个框架,它协调语言模型工作流并促进多个智能体之间的对话。AutoDev 通过超越对话管理并使智能体能够直接与代码存储库交互、自主执行命令和操作来扩展 AutoGen。同样,AutoDev 建立在 Auto-GPT 上,Auto-GPT 是一个用于自主任务执行的开源 AI智能体,它提供了代码和 IDE 特定功能,以支持执行复杂的软件工程任务。
(图2 AutoGen:https://microsoft.github.io/autogen/)
在我们的评估中,我们使用 HumanEval 数据集评估了 AutoDev 的功能,该数据集最初设计用于从自然语言描述(文档字符串)中生成代码。
此外,我们扩展了评估以包括测试用例生成任务,展示了 AutoDev 在处理各种软件工程目标方面的多功能性。结果表明了其优秀的性能,AutoDev 在代码生成和测试生成方面分别获得了 91.5% 和 87.8% 的 Pass@1 高分。这些结果强调了 AutoDev 在自动化软件工程任务中保持安全和用户控制的开发环境的有效性。
2. AutoDev 设计
一旦初始配置完成,AutoDev 便会将功能组织为四组(如图3所示):
-
跟踪和管理用户和智能体对话的对话管理器;
-
智能体可用的各种代码和 IDE 相关工具的工具库;
-
调度各种智能体的agent调度程序;
-
启用执行操作的评估环境。
(图3 AutoDev 架构)
下面我们详细解释每种功能。
2.1 规则、操作和目标配置
用户通过 yaml 文件配置规则和操作来启动进程。这些文件定义了 AI智能体可以执行的可用命令(操作)。用户可以通过启用/禁用特定命令来利用默认设置或细粒度权限,从而根据其特定需求定制 AutoDev。此配置步骤允许精确控制 AI智能体的功能。在此阶段,用户可以定义 AI智能体的数量和行为,分配特定职责、权限和可用操作。例如,用户可以定义一个“开发者”智能体和一个“审阅者”智能体,让它们协作朝着一个目标努力。
在配置规则和操作之后,用户指定 AutoDev 要完成的软件工程任务或流程。例如,用户可以要求生成测试用例并确保它们在语法上正确、通过,并且不包含错误(这涉及编辑文件、运行测试套件、执行语法检查和找错工具)。
2.2 对话管理器
对话管理器负责初始化对话历史记录,它在监督正在进行的对话的高级管理中发挥着关键作用。它负责决定何时中断进程,并确保用户、AI智能体和整个系统之间的无缝通信。它维护一个对话对象,其中包括 AI智能体的消息和来自评估环境的操作结果。
2.2.1 解析器
解析器(Parser)解释由智能体生成的响应,以预定义格式提取命令和参数。它确保指令格式正确,验证参数的数量和准确性(例如,文件编辑命令需要文件路径参数)。如果解析失败,错误消息将注入对话中,从而阻止对存储库的进一步操作。通过执行特定的智能体权限和进行额外的语义检查,进一步分析成功解析的命令。它确保建议的操作符合用户指定的细粒度权限。如果命令通过审查,对话管理器将在工具库中调用相应的操作。
2.2.2 输出组织器
输出组织器(Output Organizer)处理从评估环境接收到的输出。它选择关键信息,例如状态或错误,选择性地总结相关内容,并向对话历史记录中添加结构良好的消息。这确保用户对 AutoDev 的操作和结果有一个清晰且有条理的记录
2.2.3 对话结论
对话管理器(Conversation Conclusion)决定何时结束对话。这可能发生在智能体发出任务完成信号(停止命令)时、对话达到用户定义的最大迭代/令牌数时,或者在进程或评估环境中检测到问题时。
AutoDev 的综合设计确保了对 AI 驱动的开发进行系统化和可控的方法。
2.3 智能体调度
智能体调度(Agent Scheduler)负责编排 AI 智能体以实现用户定义的目标。智能体配置有特定的角色和可用命令集,协同工作以执行各种任务。调度程序采用各种协作算法,例如循环、基于令牌或基于优先级,以确定智能体参与对话的顺序和方式。具体而言,调度算法包括但不限于:
-
循环协作,它按顺序调用每个智能体,允许每个智能体执行预定的操作数;
-
基于令牌的协作,使智能体能够执行多项操作,直到它发出令牌表示完成其分配的任务;
-
基于优先级的协作,按照优先级顺序启动智能体。智能体调度程序调用一个特定的智能体,传递当前对话
2.4 工具库
AutoDev中的工具库(Tools Library)提供了一系列命令,使智能体能够对资源库执行各种操作,如文件编辑(File Editing)、检索(Retrieval)、构建和执行(Build&Execution)、测试与验证(Testing&Validation)、Git和通信(Communication)。这些工具旨在将复杂的操作、工具和实用程序封装在简单直观的命令结构中,例如,通过build和test <test_file>这样的简单命令,就能抽象出与构建和测试执行有关的复杂问题。
-
文件编辑:该类别包含用于编辑文件(包括代码、配置和文档)的命令,如写入、编辑、插入和删除,提供了不同程度的精细度。智能体可以执行从写入整个文件到修改文件中特定行的各种操作。例如,命令 write <filepath> <start_line>-<end_line> <content> 允许智能体用新内容重写一系列行。
-
检索:在这一类别中,检索工具包括grep、find和ls等基本CLI工具,以及更复杂的基于嵌入的技术。这些技术能让智能体查找类似的代码片段,从而提高他们从代码库中检索相关信息的能力。例如,retrieve <content> 命令允许智能体执行与所提供内容类似的基于嵌入的片段检索。
-
构建与执行:这类命令允许Agent使用简单直观的命令毫不费力地编译、构建和执行代码库。底层构建命令的复杂性已被抽象化,从而简化了评估环境基础架构中的流程。这类命令的示例包括:构建、运行 <file>。
-
测试与验证:这些命令使Agent能够通过执行单个测试用例、特定测试文件或整个测试套件来测试代码库。Agent可以执行这些操作,而无需依赖特定测试框架的底层命令。这类工具还包括校验工具,如筛选器和错误查找工具。这类命令的例子包括:检查语法正确性的 syntax <file> 和运行整个测试套件的 test。
-
Git:用户可以为Git操作配置细粒度权限。包括提交、推送和合并等操作。例如,可以授予Agent只执行本地提交的权限,或者在必要时将更改推送到源代码库。
-
通信:Agent可以调用一系列旨在促进与其他代理和/或用户交流的命令。值得注意的是,talk命令可以发送自然语言信息(不解释为版本库操作命令),ask命令用于请求用户反馈,而stop命令可以中断进程,表示目标已实现或Agent无法继续。
因此,AutoDev中的工具库为AI agent提供了一套多功能且易于使用的工具,使其能够与代码库进行交互,并在协作开发环境中进行有效交流。
2.5 评估环境
评估环境(Eval Environment)在Docker容器中运行,可以安全地执行文件编辑、检索、构建、执行和测试命令。它抽象了底层命令的复杂性,为Agent提供了一个简化的界面。评估环境会将标准输出/错误返回给输出组织器模块。
2.6 集成
用户通过指定目标和相关设置启动对话。对话管理器初始化一个对话对象,整合来自AI Agent和评估环境的信息。随后,对话管理器将对话分派给负责协调AI Agent行动的Agent调度器。作为AI Agent,语言模型(大型或小型 LM)通过文本互动提出指令建议。
命令操作界面( Commands Interface)包含多种功能,包括文件编辑、检索、构建和执行、测试以及 Git 操作。对话管理器会对这些建议的命令进行解析,然后将其引导至评估环境,以便在代码库中执行。这些命令在评估环境的安全范围内执行,并封装在 Docker 容器中。执行后,产生的操作将无缝集成到对话历史中,为后续迭代做出贡献。
这种迭代过程一直持续到AI Agent认为任务完成、用户干预发生或达到最大迭代限制为止。AutoDev 的设计确保了系统、安全地协调AI Agent,以自主和用户控制的方式完成复杂的软件工程任务。
3. 实证评估设计
在研究人员的实证评估中,评估了AutoDev在软件工程任务中的能力和有效性,研究它是否能够提升人工智能模型的性能,而不仅仅是简单的推理。此外,研究人员还评估了AutoDev在步骤数、推理调用和token方面的成本。
主要是确定了三个实验研究问题:
-
RQ1 : AutoDev 在代码生成任务中的效果如何?
-
RQ2 : AutoDev 在测试生成任务中的效果如何?
-
RQ3 : AutoDev 完成任务的效率如何?
RQ1 : AutoDev在代码生成任务中的效率如何?
研究人员使用Pass@k指标来衡量AutoDev的有效性,其中𝑘表示尝试的次数。成功解决的问题是指AutoDev生成的方法主体代码满足所有人工编写的测试。一次尝试相当于一次完整的AutoDev对话,其中涉及多个推理调用和步骤。
这与其他方法(如直接调用 GPT-4)形成鲜明对比,后者通常只涉及一次推理调用。有关多次推理调用和步骤的细节将在𝑅 𝑄 3 中进一步探讨。在本次评估中,研究人员设置𝑘 = 1,从而计算Pass@1,只考虑第一次尝试的成功率。
RQ2:AutoDev在测试生成任务中的效果如何?
对于这个研究问题,研究人员修改了HumanEval数据集,来评估AutoDev在生成测试方面的能力。研究人员考虑人工编写的解决方案,并放弃所提供的人工编写的测试。
他们指示AutoDev为重点方法生成测试用例,并根据测试成功率、重点方法的调用和测试覆盖率对其进行评估。研究人员报告Pass@1,如果测试通过并调用了焦点方法,则认为测试成功。此外,研究人员还将AutoDev测试的覆盖率与人工编写的测试覆盖率进行了比较。
RQ3:AutoDev 完成任务的效率如何?
在本研究问题中,研究人员将调查AutoDev完成SE任务的效率。研究人员分析了所需步骤或推理调用的数量、所使用命令的分布(如写入、测试)以及对话中使用的token总数。
AutoDev设置
在本次评估中,AutoDev基于GPT-4模型(gpt-4-1106-preview)与一个Agent保持一致的设置。
-
启用的操作包括文件编辑、检索和测试。
-
唯一可用的通信命令是表示任务完成的stop命令。
其他命令,如询问,都是禁用的,这就要求 AutoDev 在初始目标设定之外,在没有人类反馈或干预的情况下自主运行。
4. 实验结果
4.1 AutoDev在代码生成任务中的效率如何?
表1显示了,将AutoDev与两种替代方法和零样本基线进行了比较。
研究人员将AutoDev与语言智能体树搜索(LATS)和Reflexion 进行了比较,这两种方法是截至2024年3月HumanEval 排行榜上的两种领先方法。零样本基线(GPT-4)的结果取自OpenAI GPT-4技术报告。
AutoDev Pass@1率为91.5%,在HumanEval排行榜上稳居第二。
值得注意的是,这个结果是在没有额外训练数据的情况下获得的,这将AutoDev与LATS区分开来,后者达到了94.4%。此外,AutoDev框架将GPT-4性能从67%提升至91.5%,相对提升了30%。
这些结果体现出,AutoDev有能力显著提升大模型完成软件工程任务方面的表现。
4.2 AutoDev在测试生成任务中的效果如何?
AutoDev在针对测试生成任务修改的HumanEval数据集上,获得了87.8% Pass@1分数,与使用相同GPT-4模型的基线相比,相对提高了17%。AutoDev生成的正确测试(包含在Pass@1中)实现了99.3%的鲁棒覆盖率,与人工编写的测试的99.4%覆盖率相当。
4.3 AutoDev完成任务的效率如何?
图4显示了,AutoDev在代码生成和测试生成任务中使用的命令累积数,其中考虑到RQ1和RQ2中每个HumanEval问题的平均评估命令数量。
(图4 AutoDev在代码生成和测试生成任务中使用的命令累积数)
对于代码生成,AutoDev平均执行5.5条命令,其中包括1.8条写入操作、1.7条测试操作、0.92条停止操作(表示任务完成)、0.25条错误命令,以及最少的检索(grep、find、cat)、语法检查操作和通话通信命令。
在「测试生成」任务中,命令的平均数量与「代码生成」任务一致。不过,「测试生成」任务涉及的检索操作更多,错误操作的发生率也更高,因此每次运行的平均命令总数为6.5条。
在前两个问题中,为解决每个HumanEval问题而进行的AutoDev对话的平均长度分别为1656和1863个token。这包括用户的目标、来自AI智能体的信息和来自评估环境的响应。
相比之下,GPT-4(基线)的零样本在每个任务中平均使用200个token(估计值)生成代码,使用373个token生成测试。虽然AutoDev使用了更多的token,但大量token用于测试、验证和解释自己生成的代码,超出了基线方法的范围。
最后,AutoDev会产生与协调AI Agent、管理对话以及在Docker环境中执行命令相关的执行成本。接下来,一起看一下AutoDev如何执行测试生成任务。
开发者给到任务:设定生成遵循特定格式的pytest测试。
AutoDev智能体启动write-new命令,提供测试文件的文件路径和内容。随后,AutoDev智能体触发测试操作,AutoDev在其安全的Docker环境中运行测试,并给出测试执行报告JSON。
然后,AutoDev 智能体开始自主执行:
(图5 第 I 部分)
AutoDev智能体在pytest输出中发现了一个错误,认识到需要进行修复,以使测试与函数的预期行为保持一致。AutoDev智能体发出写入命令,指定文件路径和行号范围 (5-5),以重写错误的断言语句。随后,AutoDev智能体继续执行测试,并测试成功。
(图6 第 II 部分)
从上面例子中看得出,AutoDev能够自我评估生成的代码,并解决自身输出中的错误。此外,AutoDev可以帮助用户深入了解智能体的操作,并允许智能体在任务期间进行交流。
5 讨论
5.1 多智能体协作
AutoDev 支持任务中的多智能体协作,由Agent调度程序编排。在我们的评估中,鉴于 HumanEval 数据集相对简单,我们将设置限制为针对任务的单个 GPT-4 智能体。
然而,初步结果表明多智能体协作对更复杂任务的积极影响。通过对 AI 开发人员和 AI 审阅人员进行实验,每个开发人员和审阅人员都有不同的职责和可用操作,协作修复一个复杂的错误揭示了有趣的交互。
AI 审阅人员可以在代码验证操作执行之前预先识别出 AI 开发人员的错误并提供相关建议。
我们的未来计划包括扩展评估,以纳入更复杂的情况,在这些情况下,多智能体协作可以显著提高 AutoDev 的性能。
5.2 人在循环中(Human in the Loop)
AutoDev 允许 AI 智能体使用 talk 和 ask 命令分别传达任务进度或请求人类反馈。事实表明,这些命令已被证明对使用 AutoDev 的开发人员理解agent的意图和深入了解智能体的计划很有帮助。
添加 ask 命令是对我们试点研究期间开发人员要求的直接响应,他们希望在智能体对下一步操作不确定时能够提供反馈。
我们的未来计划包括在 AutoDev 循环中更深入地整合人类,允许用户中断智能体并提供快速反馈。
5.3 AutoDev 集成
我们的试点研究涉及开发人员使用 AutoDev 作为 CLI 命令,可以在 VSCode IDE 中观察对话。
展望未来,我们的目标是将 AutoDev 集成到 IDE 中,创造聊天机器人体验,并将其纳入 CI/CD 管道和 PR 审查平台。我们设想开发人员将任务和问题分配给 AutoDev,在 PR 系统中审查结果,并进一步简化软件开发工作流。
6 相关工作
我们的工作建立在广泛的文献基础之上,这些文献将 AI 应用于各种软件工程任务。在本节中,我们探索了最近的发展,并将 AutoDev 置于这一丰富的研究领域中。
6.1 软件工程中的 AI
人工智能,特别是大语言模型 (LLM) 在软件工程中的集成取得了重大进展。GPT-3、InstructGPT 和 GPT-4 等模型利用 Transformer 架构不仅可以理解和生成自然语言,还可以生成源代码。Gropher、Megatron-turing NLG 和 GPT-4 等 LLM 的海量参数规模使这些 AI 模型能够在各种任务中实现令人印象深刻的性能。
随着软件开发实践的不断发展,集成尖端技术对于提高开发人员的生产力变得至关重要。在当前显著的进步中,在集成开发环境 (IDE) 中利用 LLM 备受关注。LLM,包括 OpenAI 的 GPT-3.5 和 GPT-4 等杰出模型,以及 Code Llama 等强大的开源模型,展示了充当智能编程助手的潜力。
在本文中,我们介绍了 AutoDev——一个在安全开发环境中能够自主地完成软件工程任务的综合框架。AutoDev 通过提供一个通用工具库扩展了现有工作,使 AI 智能体能够自主执行复杂的任务,例如代码编辑、测试和集成。AutoDev 也是与 LLM 无关的,其基础设施允许具有不同参数大小和架构的不同 AI 模型协作完成给定任务。
6.2 软件工程中 LLM 的评估
评估软件工程任务中的 LLM 具有独特的挑战。传统的基于语言的指标,例如 BLEU,一直是先前研究的重点,评估是在 GLUE 和 BIGBench 等静态数据集上进行的。然而,这些指标通常无法捕捉语法正确性等基本编程方面和基于执行的指标,例如构建和测试。
CodeXGLUE 通过提供一个用于软件工程中 LLM 的综合评估平台来解决这些限制。它提供了一个多样化的基准数据集以及 CodeBERT 和 CodeGPT 等基线模型。HumanEval 通过关注 LLM 的功能正确性为该领域做出了贡献,引入了用 Python 手写的编程问题的基准数据集。
在最近的发展中,Copilot 评估体系利用了文献中的先前工作,旨在增强其贡献。与 HumanEval 类似,Copilot 评估体系考虑了代码执行,扩展了软件工程任务的范围(代码、测试和文档生成、工作空间理解和查询解决),并增加了用于评估的指标。该评估体系还涵盖了大型和实际的代码库。
虽然我们当前的评估依赖于 HumanEval 来评估 AutoDev 在两个编码任务中的有效性,但我们的未来工作旨在将此评估扩展到更具挑战性和实际意义的数据集,例如 Copilot 评估体系提供的那些数据集。
6.3 软件工程交互中的 AI
虽然先前的工作已经探索了 AI 和软件工程的交叉点,但很少有人深入研究 IDE 交互中的 AI 指导编程。本文介绍的 AutoDev 从现有文献中的工作中汲取灵感,同时增强了它们的贡献。值得注意的例子包括 Auto-GPT、LATS(语言代理树搜索)和 Reflexion,每一种都提出了 AI 驱动的任务的独特方法。
Auto-GPT 通过将 GPT-3.5 和 GPT-4 与配套机器人配对来操作,使用户能够针对特定目标来指导这些语言模型。配套机器人利用 GPT-3.5 和 GPT-4 以及各种程序来执行实现目标所需的步骤。
另一方面,LATS 是一个通用框架,它协同了 LLM 在规划、行动和推理方面的能力。受蒙特卡罗树搜索的启发,该搜索通常用于基于模型的强化学习,LATS 将 LLM 用作智能体、值函数和优化器,从而增强了决策制定。它引入了一个外部反馈环境,提供了一种深思熟虑且适应性强的解决问题机制。
Reflexion 引入了一个新颖的框架,通过语言反馈来强化语言智能体。Reflexion 智能体通过语言反映任务反馈信号,将其反思文本保存在情节记忆缓冲区中以改进决策制定。这个灵活的框架包含各种类型和来源的反馈信号,并在各种任务中表现出比基线agent有显著的改进,包括顺序决策制定、编码和语言推理。
AutoDev 将这些想法专门用于软件工程领域,提供了一个灵活的框架,允许 AI 智能体完全自主地完成复杂的 SE 任务。我们的工作旨在弥合传统软件工程实践和 AI 驱动的自动化之间的差距,促进开发人员和 AI智能体之间的协作。通过引入一个多功能工具库,AutoDev 赋予 AI智能体自主执行复杂任务的能力,为 AI 辅助软件开发领域提供了有希望的进步。
7 结论
在本文中,我们介绍了 AutoDev这个框架,它使 AI智能体能够自主地与存储库交互、执行操作并解决复杂的软件工程任务。
我们将提取与软件工程任务相关的上下文和验证 AI 生成的代码的责任从用户(主要是开发人员)转移到了 AI智能体自身。现在,智能体可以通过检索操作检索上下文,并通过构建、执行、测试和验证操作验证其代码生成。
开发人员在 AutoDev 框架中的角色从手动操作和验证 AI 建议转变为监督多智能体协作任务,并可以选择提供反馈。开发人员可以通过观察智能体之间用于通信的、正在进行的对话和存储库来监视 AutoDev 朝着目标取得的进展。
我们对 HumanEval 数据集的代码和测试生成评估展示了令人印象深刻的结果,代码生成的 Pass@1 得分为 91.5——在撰写本文时是排行榜上的第二好结果,并且在不需要额外训练数据的方法中是最好的。AutoDev 在测试生成中也表现出色,Pass@1 得分为 87.8%,通过测试覆盖率达到 99.3%。展望未来,我们未来工作的目标是将 AutoDev 作为聊天机器人体验集成到 IDE 中,并将其集成到 CI/CD 管道和 PR 审查平台中。