Rambo:增强基于RAG的仓库级方法体补全
《Information and Software Technology》:Rambo: Enhancing RAG-based repository-level method body completion
【字体:
大
中
小
】
时间:2026年09月09日
来源:Information and Software Technology 4.6
编辑推荐:
# 摘要
代码补全在软件开发中至关重要,它通过根据上下文预测代码片段来辅助开发人员。在众多补全任务中,方法体补全(Method Body Completion, MBC)尤为具有挑战性,因为它需要根据方法签名和上下文生成完整的方法体。在大型代码仓库中,该任务变得更加困难,因
# 摘要
代码补全在软件开发中至关重要,它通过根据上下文预测代码片段来辅助开发人员。在众多补全任务中,方法体补全(Method Body Completion, MBC)尤为具有挑战性,因为它需要根据方法签名和上下文生成完整的方法体。在大型代码仓库中,该任务变得更加困难,因为方法体必须整合仓库特定的元素,例如自定义API、模块间依赖关系以及项目特定的编码规范。在本文中,我们提出了Rambo,一种基于RAG的新型仓库级MBC方法。与检索相似方法体不同,Rambo能够识别关键的仓库特定元素,如类、方法和变量/字段,以及它们的相关用法。通过将这些元素及其相关用法纳入代码生成过程,Rambo确保了方法体更加准确且具有上下文相关性。我们在40个Java项目上使用领先的代码大语言模型进行的实验结果表明,Rambo在性能上显著超越了最先进的仓库级MBC方法,在BLEU指标上提升了高达46%,CodeBLEU指标上提升了57%,编译率提升了36%,精确匹配率提升了高达3倍。值得注意的是,Rambo在精确匹配率上超越了RepoCoder Oracle方法高达12%,为仓库级MBC任务树立了新的基准。
# 引言
代码补全是软件开发中一项关键任务,它通过根据当前上下文建议下一个代码单元来辅助程序员[1]、[2]、[3]、[4]、[5]。最近,代码大语言模型(Code LLMs)[6]、[7]、[8]、[9](如CodeDex、Code Llama和DeepSeek Coder)已成为代码补全领域极具前景的工具,有望实现重复性任务的自动化并提高开发人员的生产效率。多个代码大语言模型已被部署为现代集成开发环境(IDE)中的自动补全插件,如GitHub Copilot和CodeGeeX2[10],并在一定程度上成功简化了现实世界中的软件开发活动[11]、[12]、[13]、[14]。
代码补全中最关键的任务之一是方法体补全(MBC),即根据方法签名和周围上下文生成方法的完整实现。MBC对于减少开发人员的手工工作量尤为重要,尤其是在方法实现复杂且耗时的大型项目中。与较小的补全任务(如行补全或API调用补全,涉及补全单行代码或预测API调用)不同,MBC需要生成可跨越多行代码的完整方法体,可能包含多个API调用。这些方法体通常是唯一的,需要对方法预期功能有更深入的理解。此外,仓库级MBC增加了另一层复杂性,因为它不仅需要生成方法体,还需要整合仓库特定元素,如用户定义的API、模块间依赖关系和项目特定的编码规范[11]、[12]、[15]、[16]。尽管难度很大,仓库级MBC仍然是软件开发中一项关键任务,在提高开发人员生产效率和在大型项目中维护代码质量方面发挥着重要作用。
为了解决仓库级代码补全的挑战,近期的一些方法采用了检索增强生成(Retrieval-Augmented Generation, RAG)策略。这些方法通过提供仓库特定知识来增强代码大语言模型在仓库级代码补全中的性能[15]、[16]、[17]、[18]。RepoCoder[15]采用基于相似性的检索器结合代码大语言模型,形成了一个迭代检索-生成流水线。该技术根据之前的代码或生成的代码行从仓库中检索相似的代码片段,将这些示例作为代码生成的额外上下文。此外,RepoHyper[17]和RLCoder[18]改进了在RepoCoder流水线中搜索相似代码的能力。然而,有用的相似代码在仓库中可能并不总是存在或无法被找到以供代码生成使用。事实上,Wu等人[16]报告称,使用RepoCoder流水线执行的检索中多达80%未能提升通用代码大语言模型的性能,甚至可能通过引入无关信息降低性能。这一问题对于MBC任务可能更为严重。方法体通常比较小的补全单元(如行补全任务中的代码行或API调用补全任务中的API调用)更具独特性。因此,当提供不相似的代码时,代码大语言模型可能会被无关的上下文误导,导致生成的方法体质量低下。
在本文中,我们提出了Rambo,一种用于方法体补全(MBC)的新型RAG方法。我们的方法基于这样一个理念:在特定仓库中正确构建方法体需要准确使用关键的仓库特定代码元素。与现有方法中仅检索相似方法体不同,Rambo专注于识别和检索关键的仓库特定元素,如已声明的类、方法、字段/变量,以及与被补全方法相关的用法。这些元素充当"材料",而它们的用法则充当"配方",用于将这些材料准确地纳入生成的方法体中。通过向代码大语言模型提供这些关键元素及其相关用法,Rambo使模型能够生成具有上下文准确性且符合仓库特定要求的方法体。
为了识别在仓库中完成给定待补全方法??所需的必需代码元素,一种朴素的解决方案可能是扫描整个代码库中所有可访问的元素,但这会引入过多的噪声。另一种方法可以关注具有相似签名或上下文的方法;然而,这些方法通常提供与??的功能目的不相关的元素,导致冗余并遗漏关键元素。为解决这一问题,Rambo生成一个草图体,为??提供一个大致的框架。该草图被分析以提取潜在的关键代码元素。然后,这些元素被用于在仓库中搜索已声明的相似类、方法和字段,这些被视为构建??方法体的关键代码元素。在Rambo中,为提高生成草图的相关性,草图代码需要与??具有相似的功能至关重要。换言之,草图应使用参数集产生类型正确的输出,并且代码结构应大致反映??的目的。为实现这一目标,我们通过在当前仓库中应用包含与方法??具有相似签名的方法的上下文的RAG来生成草图。
在识别了关键代码元素之后,Rambo搜索仓库中所有使用这些元素的方法。然后,这些用法根据它们与待补全方法??的相关性进行排序。在Rambo中,元素用法与??的相关性通过该用法与??的相似度来估计。最后,所识别关键代码元素的最相关用法被输入到代码大语言模型中以生成??的方法体。
我们进行了多项实验来评估Rambo在使用最先进代码大语言模型(包括DeepSeek Coder[7]、Code Llama[6]和GPT-3.5 Turbo[19])时的仓库级方法体补全性能。这些实验在40个Java项目中进行,共计674个仓库级MBC问题。我们的结果表明,Rambo在所有评估的代码大语言模型和指标上均显著超越了RepoCoder。具体而言,Rambo在各种性能指标上相比其他MBC方法取得了令人瞩目的提升,BLEU提升高达46%,CodeBLEU提升高达57%,编译率提升高达36%,精确匹配率提升高达3倍。令人瞩目的是,与Oracle RAG方法[15]相比,Rambo在精确匹配率上提升了高达12%,该方法估计了RepoCoder以及其他采用相同流水线的方法的性能上限。这一显著提升展示了Rambo在生成高质量方法体方面的卓越能力,并在仓库级方法体补全任务中树立了新的基准。
本文的贡献如下:
1. **提出Rambo**:我们提出了Rambo,一种专为仓库级方法体补全(MBC)设计的新型RAG方法,利用仓库特定知识增强代码大语言模型的性能。
2. **基于RAG的MBC的高级检索策略**:我们引入了一种新颖的检索机制,用于识别和利用关键的仓库特定代码元素,如类、方法和字段,以及它们的相关用法,以构建更加准确且具有上下文相关性的RAG方法体补全上下文。
3. **全面的评估与基准测试**:我们使用先进的代码大语言模型进行了广泛的实验,证明Rambo显著优于最先进的基于RAG的MBC技术,并将Rambo确立为MBC的新基准。
# 问题陈述
设??表示一个包含多个源文件的仓库,其中每个文件??包含一个或多个方法。每个方法??由其签名????和周围上下文????定义,上下文????包括左上下文??^left_??(方法之前)和右上下文??^right_??(方法之后)。仓库级方法体补全(MBC)的目标是根据给定方法??的签名????、上下文????和仓库特定信息??,生成方法体???_??,形式化表示为:
$$\hat{m}_b = \text{Repository-level method body completion with retrieval-augmented generation}$$
图1展示了我们提出的新型用于仓库级MBC的基于RAG的方法——Rambo的概述。一般来说,对于仓库??中文件??内的给定待补全方法??,Rambo首先检索相关的仓库特定上下文??_??,形式化表示为??_?? = retrieve(??, ??)。然后,Rambo利用代码大语言模型?,结合检索到的相关上下文和周围上下文??_??,生成方法体???_??,即???_?? = ?(??, ??_??, ??_??)。
在Rambo中,检索过程由两个主要步骤组成:关键代码元素识别与相关用法提取。
# 评估方法论
为了评估我们方法的仓库级方法体补全(MBC)性能,我们旨在回答以下研究问题:
**RQ1:准确性与比较。** Rambo在使用最先进的代码大语言模型[6]、[7]、[19]完成方法体时的准确性如何?与最先进的仓库级MBC方法[15]相比表现如何?
**RQ2:内在分析。** 我们方法的哪些方面如何影响Rambo的MBC性能,包括EEI和RUE阶段、代码嵌入等?
# 回答RQ1:准确性与比较
表2和表3展示了Rambo与使用几种代表性代码大语言模型的最先进方法在我们提出的基准和Defects4J上的MBC性能对比。可以看到,Rambo在In-File、RawRAG、RLCoder[18]、RepoCoder[15]甚至RepoCoder Oracle方面均表现出显著的提升。即使与其自身的Oracle(Rambo Oracle)相比,Rambo也保持了极具竞争力的性能。例如,在使用GPT-3.5 Turbo在Rambo基准上时,Rambo实现了...
# 相关工作
Rambo与仓库级代码补全研究密切相关,该研究利用整个代码仓库提供的更广泛上下文[15]、[16]、[17]、[18]、[38]、[39]、[40]、[41]。RepoPrompts[41]引入了一种方法,首先生成反映仓库结构和预定义相关上下文的提示,然后学习选择最可能产生预期输出的提示。在Wang等人[18]的工作中,检索有用上下文的任务被框定为...
# 结论
在本文中,我们提出了Rambo,一种专为仓库级方法体补全(MBC)设计的新型检索增强生成(RAG)方法。我们的方法以准确识别和利用关键的仓库特定代码元素为核心,显著增强了代码大语言模型在生成具有上下文相关性且语法正确的方法体方面的性能。我们的实验结果表明Rambo在所有关键指标上均表现卓越,包括BLEU...
# CRediT作者贡献声明
Tuan-Dung Bui:验证、软件、调查、数据整理、概念化。Thieu Luu:验证、软件、调查、数据整理、概念化。Thanh-Phat Nguyen:验证、软件、方法论、数据整理。Thu-Trang Nguyen:撰写——审阅与编辑、撰写——原始稿件、可视化、软件、方法论、概念化。Hieu Dinh Vo:撰写——审阅与编辑、监督、项目管理、资金获取、概念化。Son Nguyen:...
# 利益冲突声明
作者声明不存在任何可能影响本文所报告工作的已知竞争性财务利益或个人关系。
# 致谢
Son Nguyen得到了越南创新基金会(VINIF)博士后奖学金项目的资助,项目编号VINIF.2025.STS.13。
Tuan-Dung Bui | Thieu Luu | Thanh-Phat Nguyen | Thu-Trang Nguyen | Hieu Dinh Vo | Son Nguyen
越南河内越南国家大学工程与技术服务学院信息技术系
生物通微信公众号
生物通新浪微博
今日动态 |
人才市场 |
新技术专栏 |
中国科学人 |
云展台 |
BioHot |
云讲堂直播 |
会展中心 |
特价专栏 |
技术快讯 |
免费试用
版权所有 生物通
Copyright© eBiotrade.com, All Rights Reserved
联系信箱:
粤ICP备09063491号