【】RAG4Code

What to Retrieve for Effective Retrieval-Augmented Code Generation? An Empirical Study and Beyond

摘要:仓库级别的代码生成仍然充满挑战,这主要归因于复杂的代码依赖关系以及大型语言模型(LLMs)在处理长上下文时的局限性。尽管检索增强生成(RAG)框架已被广泛采用,但不同类型检索信息的有效性——包括上下文代码、API 以及相似代码片段——尚缺乏系统性的分析。通过在两个基准上的实证研究,我们发现:上下文代码与潜在的 API 信息能够显著提升 LLM 的表现,而检索到的相似代码片段往往引入噪声,甚至会导致性能下降高达 15%。基于这一初步结果,我们提出 AllianceCoder一种新颖的上下文整合方法,该方法借助链式思维提示(chain-of-thought prompting)将用户查询分解为若干实现步骤,并通过语义描述匹配的方式检索 API。在 CoderEvalRepoExec 上的广泛实验表明,AllianceCoder 达到了最新的最优性能,相较现有方法在 Pass@1 上提升幅度最高可达 20%。本研究不仅提供了一个用于探索在 RAG 代码生成中“应当检索何种信息”的实验框架,同时也开源了复现包(可访问 https://anonymous.4open.science/r/AllianceCoder),以推动后续研究。

DroidCoder: enhanced android code completion with context-enriched retrieval-augmented generation

摘要:Android 是目前最受欢迎的移动操作系统。然而,Android 开发往往需要大量编码,尤其是在涉及生命周期回调和 UI 控件等独特特性时。现有的代码补全方法通常采用检索增强生成(Retrieval-Augmented Generation, RAG),为预训练的代码大型语言模型(Code LLMs)提供上下文信息以完成补全。尽管此类方法已取得显著进展,但在 Android 开发场景下其效果仍然有限。这是因为 Android 开发的特性使得现有检索机制难以有效提取并提供足够的上下文信息。为此,我们提出 DroidCoder,一种新型的 Android 代码补全框架。该框架利用 Android 开发特性和代码片段的上下文信息来丰富 RAG,同时引入专门设计的损失函数对模型进行微调,使其能够更好地利用增强上下文的 RAG 来执行 Android 代码补全我们在三种基础模型和不同类型的应用上对该方法进行了评估,并与两种最新的代码补全方法进行了比较。实验结果表明,DroidCoder 在行级和多行级代码补全任务上显著优于基线方法,并有效提升了补全代码的质量。

RLCoder: reinforcement learning for repository-level code completion

摘要:Android 是目前最受欢迎的移动操作系统。然而,Android 开发往往需要大量编码,尤其是在涉及生命周期回调和 UI 控件等独特特性时。现有的代码补全方法通常采用检索增强生成(Retrieval-Augmented Generation, RAG),为预训练的代码大型语言模型(Code LLMs)提供上下文信息以完成补全。尽管此类方法已取得显著进展,但在 Android 开发场景下其效果仍然有限。这是因为 Android 开发的特性使得现有检索机制难以有效提取并提供足够的上下文信息。为此,我们提出 DroidCoder,一种新型的 Android 代码补全框架。该框架利用 Android 开发特性和代码片段的上下文信息来丰富 RAG,同时引入专门设计的损失函数对模型进行微调,使其能够更好地利用增强上下文的 RAG 来执行 Android 代码补全。我们在三种基础模型和不同类型的应用上对该方法进行了评估,并与两种最新的代码补全方法进行了比较。实验结果表明,DroidCoder 在行级和多行级代码补全任务上显著优于基线方法,并有效提升了补全代码的质量。

GraphCoder: enhancing repository-level code completion via code context graph-based retrieval and language model

摘要仓库级代码补全的性能依赖于对通用知识与仓库特定知识的有效利用。尽管代码大型语言模型(Code LLMs)在通用代码补全任务中展现了卓越的能力,但由于缺乏仓库特定知识,它们在仓库级补全任务中的表现往往不尽如人意。为了解决这一问题,我们提出 GraphCoder,一种检索增强的代码补全框架,它通过基于图的检索—生成过程,将 LLM 的通用代码知识与仓库特定知识有机结合。具体而言,GraphCoder 通过构建 代码上下文图(Code Context Graph, CCG) 来更准确地捕捉补全目标的上下文。该图包含代码语句之间的控制流关系、数据依赖与控制依赖,相较于现有检索增强方法中常见的基于序列的上下文表示,CCG 能够以更结构化的方式表征补全目标的语境。在此基础上,GraphCoder 采用由粗到细的检索过程,从当前仓库中定位与补全目标上下文相似的代码片段。实验结果表明,GraphCoder 在效果和效率上均优于基线检索增强方法:在精确匹配(Exact Match, EM)方面,代码匹配平均提升 +6.06,标识符匹配提升 +6.23,同时在时间和空间开销上也更为高效。

Retrieval augmented code generation and summarization

摘要:在软件开发过程中,开发者需要编写大量源代码与文档。在此过程中,开发者往往会回忆起他们过去写过的部分代码或代码摘要,并将其应用到新的实现或文档撰写中。为了模拟这种代码或摘要生成行为,我们提出了一种检索增强框架 REDCODER,它能够从检索数据库中检索相关代码或摘要,并将其作为补充信息提供给代码生成或代码摘要模型。REDCODER 的独特之处体现在两个方面。首先,它扩展了最新的稠密检索技术,用于高效地搜索相关的代码或摘要。其次,它能够适用于不同类型的检索数据库,包括只含单模态信息(仅代码或仅自然语言描述)的数据库,以及包含双模态信息(代码—描述对)的数据库。我们在 Java 和 Python 的两个代码生成与摘要基准数据集上进行了实验和广泛分析,实验结果表明,该检索增强框架表现优异,验证了所提出方法的有效性。

Rango: adaptive retrieval-augmented proving for automated software verification

摘要:使用形式化验证工具(如 Coq 等证明助理)能够构建高质量的软件。然而,验证过程通常需要大量专业知识和手工努力来编写证明。近期的研究开始探索利用机器学习与大型语言模型(LLMs)来自动化证明综合。这些研究表明,自动识别相关前提(如引理和定义)对于证明综合具有重要价值。我们提出 Rango,一个面向 Coq 的全自动证明综合工具。Rango 不仅能够自动识别相关前提,还能从当前项目中检索相似证明,并在综合过程中加以利用。其核心机制是在证明的每一步引入检索增强:自动确定应纳入上下文的证明与前提,并结合经过微调的 LLM,从而适应不同项目以及证明过程中动态变化的状态。此外,我们构建了一个新数据集 CoqStoq,涵盖 2,226 个开源 Coq 项目和 196,929 个来自 GitHub 的定理,其中既包含训练数据,也包含由高质量项目整理而成的评测基准。在该基准上,Rango 成功为 32.0% 的定理合成了证明,比此前最先进的工具 Tactician 多证明了 29% 的定理。进一步的评估结果还显示,Rango 在上下文中引入相关证明可使可证明定理数量提升 47%