AutoCodeRover是一种结合大型语言模型(LLMs)与复杂代码搜索功能的自动化程序改进方法,通过抽象语法树(AST)表示程序结构,利用迭代搜索和故障定位技术,显著提升了程序修复和功能添加的效率与准确性。
1. 研究背景- 自动化软件开发的追求:软件工程领域长期追求自动化开发过程,随着大型语言模型(LLMs)的进步,自动化编程潜力逐渐显现。LLMs如GitHub Copilot等工具能将自然语言需求转换为完整程序,取得了显著进展。
- 程序改进的需求:软件工程不仅涉及编码,还包括程序改进,如软件维护(修复错误)和软件演化(添加功能)。这些任务通常需开发者手动进行,耗时且易出错。为提高效率并减少人为错误,研究者提出全自动程序改进方法,旨在解决GitHub等平台上的实际软件问题。
- 现有技术的评估:对基于搜索的、基于语义的和基于模式/学习的程序修复技术等现有自动化软件工程技术进行评估,发现这些技术在特定领域取得成功,但在解决更广泛、从零开始的真实软件问题方面仍面临挑战。AutoCodeRover的提出旨在通过自动化方式提高解决这些问题的效率和准确性,推动软件工程领域向更高级别的自动化迈进。
2. 创新贡献- 结合大型语言模型与代码搜索:AutoCodeRover将大型语言模型(LLMs)的强大自然语言处理能力与复杂的代码搜索功能相结合,通过代码搜索API增强对代码上下文的理解,提供了一种新的自动化程序改进方法。
- 抽象语法树(AST)的应用:与传统的基于文件的软件项目视图不同,AutoCodeRover使用AST作为程序表示,使工具能够更深入地理解代码结构和问题的根本原因。
- 迭代搜索策略:采用迭代搜索策略,通过逐步细化搜索来收集项目上下文,有效避免了信息过载,提高了搜索的精确性。
- 故障定位技术的整合:通过使用频谱基于故障定位(SBFL)技术,AutoCodeRover能够更准确地定位到可能存在问题的代码位置,提高了修复的准确性和效率。
3. 实现设计AutoCodeRover的技术实现设计包括以下几个关键组件:
- 上下文检索Agent:用LLM分析问题描述,提取关键词,并调用代码搜索API来收集相关的代码上下文。
- 层级代码检索:一组用于检索代码库中类、方法和代码片段的API,基于AST分析运行,负责检索代码上下文。
- 故障定位和分析增强:使用SBFL技术来识别可能的故障位置,并在上下文检索阶段提供额外的“外部分析工具结果”。
- 补丁生成代理:利用收集到的代码上下文来生成补丁,如果补丁无法通过测试套件,则进入重试循环。
4. 实验结果- 有效性提升:在SWE - bench - lite数据集上的实验结果显示,AutoCodeRover在解决GitHub问题方面的有效性显著提高,比AI社区的最新努力提高了超过20%。
- 时间效率:AutoCodeRover平均在10分钟内解决单个GitHub问题,而开发者平均需要2.77天,显示出AutoCodeRover在时间效率上的显著优势。
- 故障定位的增益:通过整合SBFL技术,AutoCodeRover在单次运行中解决问题的效率从16%提高到20%,证明了故障定位技术在提高自动化程序改进中的有效性。
5. 总结展望- AutoCodeRover的意义:AI在软件工程方面的应用备受关注,近年来Github Copilot等激发了人们使用LLMs自动生成代码的兴趣,但LLMs生成的代码可能存在错误或漏洞,需要自主的过程来改进代码。AutoCodeRover的关键区别在于它有意识地尝试注入软件工程视角,通过整合使用AST作为程序表示、利用程序结构进行迭代代码搜索以及在可构建测试用例时使用基于测试的故障定位,在解决真实GitHub问题方面表现出显著的功效。
- 对未来软件行业的启示:如今LLMs无法产生足够安全和可靠的代码以便集成到真实软件项目中,因此有必要自动改进代码,LLMs可在这方面发挥作用。未来的工作需要进一步关注像AutoCodeRover这样的工具与人类程序员对话的适当时机。开发人员可能需要在未来的软件行业中转变角色,同时审查与基于LLMs的工具的不同对话以实现各种软件工程活动。未来可能会看到更多的全生命周期软件工程师,他们能够处理软件系统的整个生命周期。