
构建了一个包含100个示例的函数级评估基准,涵盖七个领域,通过手动注释上下文和注释来反映现实世界的代码补全场景。还收集了1669个内部项目作为检索数据库的来源,并开发了一种细粒度的数据预处理算法,用于从内部代码库中提取相关对象,并将其作为检索语料库的基本单位。

数据预处理算法:解决了C++项目中文件分割、递归依赖、自动生成代码和宏特定性等挑战。它通过提取类定义、函数定义/声明,并递归处理头文件依赖,同时转换宏定义为函数类似结构,从而构建出细粒度的检索语料库。

两种RAG方法:基于标识符的RAG和基于相似性的RAG。基于标识符的RAG通过检索相关类、函数和protobuf消息的定义来增强代码补全性能;基于相似性的RAG则通过提供与当前代码相似的代码片段来提升LLMs的代码补全性能。
实验设置:使用了五种不同的基于相似性的检索技术,包括一种基于词法的技术(BM25)和四种基于语义的技术(CodeBERT、UniXcoder、CoCoSoDa和GTE-Qwen)。还选择了26种参数规模从5亿到6710亿不等的开源LLMs评估,包括专门用于代码的模型和通用模型。例如:Qwen2.5-Coder-14B-Instruct、DeepSeek-V2.5-236B/21B、DeepSeek-V3-671B/37B、Llama-3.3-70B-Instruct、Qwen2.5-72B-Instruct、DS-Coder-V2-Instruct-236B/21B。
关键结论
-
RAG方法的有效性:两种RAG方法在闭源代码库中均表现出有效性,其中基于相似性的RAG性能优于基于标识符的RAG。
-
检索技术的影响:基于词法的BM25和基于语义的GTE-Qwen在代码补全中表现最佳。随着模型容量的增加,语义检索的有效性也随之提高。
-
检索技术的结合:词法和语义检索技术的结合(特别是BM25和GTE-Qwen)在大多数LLMs中实现了最佳性能,显示出混合方法在RAG基础代码补全中的价值。
-
开发者调查:通过开发者调查验证了RAG方法在实际开发环境中的实用性,确认了实验结果与开发者的实际经验一致。




A Deep Dive into Retrieval-Augmented Generation for Code Completion: Experience on WeChat
https://arxiv.org/pdf/2507.18515
(文:PaperAgent)