环球首个AI程序员Devin的横空出世,可能成为软件和AI发展史上一个主要的节点。
它节制了全栈的技能,不仅可以写代码debug,训模型,还可以去美国最大求职网站Upwork上抢单。
一韶光,网友们惊呼,「程序员不存在了」?
乃至连刚开始攻读打算机学位的人也惶恐,「10倍AI工程师」对未来的事情影响。
除了Cognition AI这种明星初创公司,美国的各个大厂也早就在想办法用AI智能体降本增效了。
就在3月14日同一天,微软团队也发布了一个「微软AI程序员」——AutoDev。
论文地址:https://arxiv.org/pdf/2403.08299.pdf
与Devin这种极致追求效率和产出结果的方向有所不同。
AutoDev专为自主方案、实行繁芜的软件工程任务而设计,还能掩护Docker环境中的隐私和安全。
在此之前,微软已有主打产品GitHub Copilot,帮助开拓职员完成软件开拓。
然而,包括GitHub Copilot在内的一些AI工具,并没有充分利用IDE中所有的潜在功能,比如构建、测试、实行代码、git操作等。
基于谈天界面的哀求,它们紧张侧重于建议代码片段,以及文件操作。
AutoDev的出身,便是为了补充这一空缺。
用户可以定义繁芜的软件工程目标,AutoDev会将这些目标分配给自主AI智能体来实现。
然后,这些AI智能体可以对代码库实行各种操作,包括文件编辑、检索、构建过程、实行、测试和git操作。
乃至,它们还能访问文件、编译器输出、构建和测试日志、静态剖析工具等。
在HumanEval测试中,AutoDev分别在代码天生和测试天生方面,分别取得了91.5%和87.8% Pass@1的精良结果。
网友表示,AI编码发展太快了,2021年GitHub Copilot能办理28.8%的HumanEval问题,到了2024年,AutoDev直接办理了91.5%的问题。
不用人类插手,AutoDev自主完成任务
AutoDev事情流程如下图所示,用户定义一个目标,比如「测试特定方法」。
AI智能体将测试写入一个新文件,并启动测试实行命令,以上都在安全的评估环境中进行。
然后,测试实行的输出(包括失落败日志)将合并到对话中。
AI智能体剖析这些输出,触发检索命令,通过编辑文件合并检索到的信息,然后重新启动测试实行。
末了,Eval环境供应有关测试实行是否成功,以及用户目标完成情形的反馈。
全体过程由AutoDev自主折衷,除了设定初始目标之外,无须要开拓职员干预。
比较之下,如果现有的AI编码助手集成到IDE 中,开拓职员必须手动实行测试(比如运行pytest)、向AI谈天界面供应失落败日志、可能须要识别要合并的其他高下文信息,并重复验证操作确保AI天生修正后的代码后测试成功。
值得一提的是,AutoDev从以前许多在AI智能体领域的研究中汲取了灵感,比如AutoGen——编排措辞模型事情流并推进多个智能体之间的对话。
AutoDev的能力超越了对话管理,使智能体能够直接与代码存储库交互,自动实行命令和操作,从而扩展了 AutoGen。
同样,AutoDev的研究也借鉴了Auto-GPT。这是一种用于自主任务实行的开源AI智能体,通过供应代码和IDE特定功能来支持实行繁芜的软件工程任务。
AutoDev构架
上图是AutoDev架构的大略示意图。
AutoDev紧张由4个功能模块组成:
-用于跟踪和管理用户与代理对话的对话管理器(Conversation Manager);
-为代理供应各种代码和集成开拓环境干系工具的工具库(Tools library);
-用于调度各种代理的代理调度器(Agents Scheduler);
-以及用于实行操作的评估环境(Evaluation Environment)。
下面就给大家详细先容每种功能模块。
规则、行动和目标配置用户通过yaml文件配置规则和操作来启动流程。
这些文件定义了AI代理可以实行的可用命令(操作)。
用户可以通过启用/禁用特定命令来利用默认设置或细粒度权限,从而根据自己的特定需求量身定制AutoDev。
配置步骤目的是实现对AI代理能力的精确掌握。
在这一阶段,用户可以定义人工智能代理的数量和行为,分配特定的任务、权限和可用操作。
例如,用户可以定义一个 「开拓者 」代理和一个 「审核者 」代理,让它们协同事情以实现目标。
根据规则和操作配置,用户可以指定AutoDev要完成的软件工程任务或流程。
例如,用户可以哀求天生测试用例,并确保其语法精确、不包含缺点(这涉及编辑文件、运行测试套件、实行语法检讨和缺点查找工具)。
对话管理器(conversation manager)会话管理器卖力初始化会话历史,在对正在进行的会话进行高等管理方面发挥着关键浸染。它卖力决定何时中断对话进程,并确保用户、人工智能代理和全体系统之间的无缝互换。
它掩护和管理的对话工具,紧张包括来自代理的信息和来自评估环境(eval environment)的操作结果。
解析器
解析器阐明代理天生的相应,以预定格式提取指令和参数。它能确保指令格式精确,验证参数的数量和准确性(例如,文件编辑指令须要文件路径参数)。
如果解析失落败,就会在对话中注入缺点信息,阻挡对资源库的进一步操作。
通过逼迫实行特定的代理权限和进行额外的语义检讨,成功解析的命令会被进一步剖析。
它能确保建议的操作符合用户指定的细粒度权限。
如果命令通过审查,对话管理器就会调用工具库中的相应操作。
输出组织器
输出组织器模块紧张卖力处理从评估环境吸收到的输出。
它选择关键信息(如状态或缺点),有选择地总结干系内容,并将构造良好的信息添加到对话历史记录中。
这可确保用户对AutoDev的操作和结果有一个清晰、有条理的记录。
对话终止器
会话管理器决定何时结束会话。这可能发生在代理发出任务完成旗子暗记(停滞命令)、对话达到用户定义的最大迭代次数/token、或在进程或评估环境中检测到问题时。
AutoDev的全面设计确保了人工智能驱动开拓的系统性和可控性。
代理调度程序(Multi-Agents)
代理调度器卖力折衷人工智能代理,以实现用户定义的目标。
配置了特定角色和可用命令集的代理协同运行,实行各种任务。调度器采取各种协作算法,如循环、基于令牌或基于优先级的算法,来决定代理参与对话的顺序和办法。
详细来说,调度算法包括但不限于以下几种:
(i)循环协作,按顺序调用每个代理,让每个代理实行预天命量的操作;
(ii)基于令牌的协作,让一个代理实行多个操作,直到它发出一个令牌,表示完成了分配的任务;
(iii)基于优先级的协作,按照代理的优先级顺序启动代理。代理调度器通过当前对话调用特定代理。
代理
由OpenAI GPT-4等大型措辞模型(LLM)和为代码天生而优化的小型措辞模型(SLM)组成的代理通过文本自然措辞进行互换。
这些代理从代理调度程序(Agent Scheduler)吸收目标和对话历史,并根据规则和行动配置指定的行动做出相应。每个代理都有其独特的配置,有助于实现用户目标的整体进展。
工具库(Tools Library)AutoDev中的工具库供应了一系列命令,使代理能够对资源库实行各种操作。
这些命令旨在将繁芜的操作、工具和实用程序封装在大略直不雅观的命令构造中。
例如,通过build和test <test_file>这样的大略命令,就能抽象出与构建和测试实行有关的繁芜问题。
-文件编辑:该种别包含用于编辑文件(包括代码、配置和文档)的命令。
-该种别中的实用程序,如写入、编辑、插入和删除,供应了不同程度的风雅度。
-代理可以实行从写入全体文件到修正文件中特定行的各种操作。例如,命令 write <filepath> <start_line>-<end_line> <content> 许可代理用新内容重写一系列行。
检索:在这一种别中,检索工具包括grep、find和ls等基本CLI工具,以及更繁芜的基于嵌入的技能。
这些技能能让代理查找类似的代码片段,从而提高他们从代码库中检索干系信息的能力。
例如,retrieve <content> 命令许可代理实行与所供应内容类似的基于嵌入的片段检索。
-构建与实行:这类命令许可代理利用大略直不雅观的命令绝不费力地编译、构建和实行代码库。底层构建命令的繁芜性已被抽象化,从而简化了评估环境根本架构中的流程。这类命令的示例包括:构建、运行 <文件>。
-测试与验证:这些命令使代理能够通过实行单个测试用例、特定测试文件或全体测试套件来测试代码库。代理可以实行这些操作,而无需依赖特定测试框架的底层命令。
这类工具还包括校验工具,如筛选器和缺点查找工具。这类命令的例子包括:检讨语法精确性的 syntax <file> 和运行全体测试套件的 test。
-Git:用户可以为Git操作配置细粒度权限。包括提交、推送和合并等操作。例如,可以付与代理只实行本地提交的权限,或者在必要时将变动推送到源代码库。
-通信:代理可以调用一系列旨在促进与其他代理和/或用户互换的命令。值得把稳的是,talk命令可以发送自然措辞信息(不阐明为版本库操作命令),ask命令用于要求用户反馈,而stop命令可以中断进程,表示目标已实现或代理无法连续。
因此,AutoDev中的工具库为人工智能代理供应了一套多功能且易于利用的工具,使其能够与代码库进行交互,并在协作开拓环境中进行有效互换。
评估环境(Eval Environment)评估环境在Docker容器中运行,可以安全地实行文件编辑、检索、构建、实行和测试命令。
它抽象了底层命令的繁芜性,为代理供应了一个简化的界面。评估环境会将标准输出/缺点返回给输出组织器模块。
整合用户通过指定目标和干系设置启动对话。
对话管理器初始化一个对话工具,整合来自人工智能代理和评估环境的信息。随后,对话管理器将对话分派给卖力折衷人工智能代理行动的代理调度器。
作为人工智能代理,措辞模型(大型或小型 LM)通过文本互动提出指令建议。
命令界面包含多种功能,包括文件编辑、检索、构建和实行、测试以及 Git 操作。对话管理器会对这些建议的命令进行解析,然后将其勾引至评估环境,以便在代码库中实行。
这些命令在评估环境的安全范围内实行,并封装在 Docker 容器中。
实行后,产生的操作将无缝集成到对话历史中,为后续迭代做出贡献。
这种迭代过程一贯持续到代理认为任务完成、用户干预发生或达到最大迭代限定为止。
AutoDev 的设计确保了系统、安全地折衷人工智能代理,以自主和用户掌握的办法完成繁芜的软件工程任务。
实证评估设计在研究职员的实证评估中,评估了AutoDev在软件工程任务中的能力和有效性,研究它是否能够提升人工智能模型的性能,而不仅仅是大略的推理。
此外,研究职员还评估了AutoDev在步骤数、推理调用和token方面的本钱。
紧张是确定了三个实验研究问题:
- 1 : AutoDev 在代码天生任务中的效果如何?
- 2 : AutoDev 在测试天生任务中的效果如何?
- 3 : AutoDev 完成任务的效率如何?
1 : AutoDev在代码天生任务中的效率如何?研究职员利用Pass@k指标来衡量AutoDev的有效性,个中表示考试测验的次数。
成功办理的问题是指AutoDev天生的方法主体代码知足所有人工编写的测试。一次考试测验相称于一次完全的AutoDev对话,个中涉及多个推理调用和步骤。
这与其他方法(如直接调用 GPT-4)形成光鲜比拟,后者常日只涉及一次推理调用。有关多次推理调用和步骤的细节将在 3 中进一步磋商。在本次评估中,研究职员设置 = 1,从而打算Pass@1,只考虑第一次考试测验的成功率。
2:AutoDev在测试天生任务中的效果如何?对付这个研究问题,研究职员修正了HumanEval数据集,来评估AutoDev在天生测试方面的能力。
研究职员考虑人工编写的办理方案,并放弃所供应的人工编写的测试。
他们指示AutoDev为重点方法天生测试用例,并根据测试成功率、重点方法的调用和测试覆盖率对其进行评估。
研究职员报告Pass@1,如果测试通过并调用了焦点方法,则认为测试成功。
此外,研究职员还将AutoDev测试的覆盖率与人工编写的测试覆盖率进行了比较。
3:AutoDev 完成任务的效率如何?在本研究问题中,研究职员将调查AutoDev完成SE任务的效率。
研究职员剖析了所需步骤或推理调用的数量、所利用命令的分布(如写入、测试)以及对话中利用的token总数。
AutoDev设置在本次评估中,AutoDev基于GPT-4模型(gpt-4-1106-preview)与一个代理保持同等的设置。
启用的操作包括文件编辑、检索和测试。
唯一可用的通信命令是表示任务完成的stop命令。
其他命令,如讯问,都是禁用的,这就哀求 AutoDev 在初始目标设定之外,在没有人类反馈或干预的情形下自主运行。
实验结果
- 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有能力显著提升大模型完成软件工程任务方面的表现。
- AutoDev在测试天生任务中的效果如何?
AutoDev在针对测试天生任务修正的HumanEval数据集上,得到了87.8% Pass@1分数,与利用相同GPT-4模型的基线比较,相对提高了17%。
AutoDev天生的精确测试(包含在Pass@1中)实现了99.3%的鲁棒覆盖率,与人工编写的测试的99.4%覆盖率相称。
- AutoDev完成任务的效率如何?
图3显示了,AutoDev在代码天生和测试天生任务中利用的命令累积数,个中考虑到问题1和问题2中每个HumanEval问题的均匀评估命令数量。
对付代码天生,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会产生与折衷人工智能智能体、管理对话以及在Docker环境中实行命令干系的实行本钱。
接下来,一起看一下AutoDev如何实行测试天生任务。
开拓者给到任务:设定天生遵照特定格式的pytest测试。
AutoDev智能体启动write-new命令,供应测试文件的文件路径和内容。
随后,AutoDev智能体触发测试操作,AutoDev在其安全的Docker环境中运行测试,并给出测试实行报告JSON。
然后,AutoDev开始自主实行:
AutoDev智能体在pytest输出中创造了一个缺点,认识到须要进行修复,以使测试与函数的预期行为保持同等。
连续如图5所示,AutoDev智能体发出写入命令,指定文件路径和行号范围 (5-5),以重写缺点的断言语句。
随后,AutoDev智能体连续实行测试,并测试成功。
从上面例子中看得出,AutoDev能够自我评估天生的代码,并办理自身输出中的缺点。
此外,AutoDev可以帮助用户深入理解智能体的操作,并许可智能体在任务期间进行互换。
随着Devin、AutoDev等AI工程师的出身,程序员们的事情可能会一大部分实现自动化。