[论文阅读] 人工智能 + 软件工程 | 微信闭源代码库中的RAG代码补全:揭秘工业级场景下的检索增强生成技术

微信闭源代码库中的RAG代码补全:揭秘工业级场景下的检索增强生成技术

论文标题:A Deep Dive into Retrieval-Augmented Generation for Code Completion: Experience on WeChat

arXiv:2507.18515
A Deep Dive into Retrieval-Augmented Generation for Code Completion: Experience on WeChat
Zezhou Yang, Ting Peng, Cuiyun Gao, Chaozheng Wang, Hailiang Huang, Yuetang Deng
Comments: Accepted in ICSME 25 Industry Track
Subjects: Software Engineering (cs.SE)

在这里插入图片描述
一段话总结:本文对检索增强生成(RAG)在闭源代码库的代码补全中应用进行了系统研究,以微信的工业级闭源代码库(含1669个内部仓库)为研究对象,构建了包含100个示例的评估基准,评估了26个参数从0.5B到671B的开源大语言模型(LLMs)。研究比较了标识符基RAG相似性基RAG两种方法,发现两者在闭源代码补全中均有效,其中相似性基RAG表现更优;BM25(词汇检索)GTE-Qwen(语义检索) 在相似性基RAG中性能突出,且两者结合能产生最优结果。此外,开发者调查验证了这些发现的实际价值。

研究背景:代码补全的“闭源困境”与RAG的破局可能

想象一下,你是一家大型科技公司的程序员,每天要在公司内部的专有代码库里写代码。这些代码里满是公司独有的框架、业务逻辑和命名规则——就像只有内部员工才懂的“暗语”。这时候,你打开常用的代码补全工具,却发现它经常“说外行话”:要么推荐的代码风格和公司规范格格不入,要么根本看不懂那些自定义的函数和类。

这就是闭源代码库面临的现实问题。

代码补全作为提升开发效率的“利器”,早已被证明能让87%的专业开发者效率大增。近年来,大语言模型(LLMs)的爆发让代码补全能力突飞猛进,但这些模型大多是在开源代码库(如GitHub)上训练的。而闭源代码库(如微信的内部代码)有太多“私有信息”:自定义框架、专有业务逻辑、特殊编码习惯,和开源代码的“画风”差异很大。

这就好比用学了公开教材的学生去解公司内部考题——不是能力不够,是“水土不服”。

而检索增强生成(RAG)技术的出现,给了破局的可能。简单说,RAG就像给LLMs配了一个“专属搜索引擎”:在生成代码时,先从目标代码库里检索相关的代码片段或定义,再结合这些“上下文”生成更贴合的结果,而且不需要重新训练模型(保护隐私,还省资源)。

但问题是:RAG在开源场景里表现不错,在闭源场景还能用吗?哪种RAG方法更有效?不同的“检索方式”(比如按关键词找还是按语义找)搭配起来会不会更好?这正是这篇论文要解决的问题——以微信的工业级闭源代码库为研究对象,一探究竟。

在这里插入图片描述

主要作者及单位信息

  • Zezhou Yang,腾讯(广州,中国)
  • Ting Peng,腾讯(广州,中国)
  • Cuiyun Gao*(通讯作者),香港中文大学(香港,中国)
  • Chaozheng Wang,香港中文大学(香港,中国)
  • Hailiang Huang,腾讯(广州,中国)
  • Yuetang Deng,腾讯(广州,中国)

创新点:这篇论文的“独特价值”在哪里?

在RAG和代码补全的研究热潮中,这篇论文的创新之处尤为突出:

  1. 首次聚焦闭源代码库的系统研究:此前研究多基于开源代码库,而本文是首个在工业级闭源代码库(微信,1669个内部仓库)中,系统评估RAG用于代码补全的研究,填补了“闭源场景”的空白。

  2. 解决C++闭源项目的“数据预处理难题”:C++项目有很多“坑”——头文件依赖复杂、自动生成代码冗余、宏定义特殊等,论文提出了一套细粒度的预处理算法,能精准提取有效代码片段(如函数、类定义),解决了这些工业界实际问题。

  3. 发现词汇与语义检索的“互补密码”:通过实验发现,基于关键词的词汇检索(如BM25)和基于意义的语义检索(如GTE-Qwen)结果重叠极少,结合使用能大幅提升效果,这为工业界提供了明确的技术组合方案。

  4. 用开发者调查验证“实际价值”:不仅有实验数据,还通过3位资深开发者的调查,验证了技术在真实开发场景中的有效性,让研究结论更具落地意义。

在这里插入图片描述

研究方法和思路:一步步拆解“微信闭源代码补全实验”

为了搞清楚RAG在闭源场景的表现,研究团队做了一套“组合拳”实验,步骤清晰可复制:

第一步:搭好“考场”——构建评估基准

  • 从微信7个核心业务领域(如远程调用、消息队列、工具函数等)中,精选100个真实开发场景的函数作为“考题”。
  • 每个“考题”都由3位5年以上经验的开发者手动标注:相关上下文、难度(简单/困难),确保贴合实际开发需求。

第二步:备好“参考书”——构建检索语料

  • 收集微信1669个内部项目作为“参考书库”,涵盖不同业务和开发周期。
  • 重点解决C++项目的4大难题:
    • 文件分割:C++头文件内容多,直接用整个文件做检索单位太冗余,所以拆成函数、类定义等细粒度片段。
    • 递归依赖:头文件互相引用像“连环套”,通过递归处理所有依赖,避免漏信息。
    • 自动生成代码:protobuf生成的代码没用,直接从原始proto文件提取消息定义。
    • 宏定义:把C++的宏转换成类似函数的结构,方便检索和理解。

第三步:测试两种“解题思路”——实现RAG方法

  • 标识符基RAG:就像查“名词解释”。比如代码里出现一个陌生函数sendMsg,就去检索它的定义、参数、用法,让LLMs看懂这个“暗语”再补全。
  • 相似性基RAG:就像查“例题”。比如要补全一个消息队列相关的函数,就去搜代码库里类似功能的函数片段,让LLMs参考“例题”写代码。

第四步:用“不同学生”测试——选择26个LLMs

  • 涵盖从0.5B到671B参数的26个开源模型,既有代码专用模型(如Qwen-Coder、CodeLlama),也有通用模型(如Llama-3.3),全面测试RAG的适配性。

第五步:比较“不同检索工具”——测试5种检索技术

  • 词汇检索:用BM25(类似关键词搜索,看代码里的词匹配度)。
  • 语义检索:用CodeBERT、UniXcoder、CoCoSoDa、GTE-Qwen(类似“理解意思”搜索,看代码语义相似性)。

第六步:打分标准——评估指标

  • 用CodeBLEU(看代码结构和语义相似度)和Edit Similarity(看最少改多少字符能匹配正确代码)给补全结果打分。

主要贡献:这些发现对工业界有多重要?

这篇论文的成果可不是“实验室游戏”,而是能直接指导企业提升开发效率的“干货”:

  1. 闭源场景下RAG真的有用:两种RAG方法都能让代码补全效果提升,比如DeepSeek-V3模型用GTE-Qwen检索后,代码相似度指标(CodeBLEU)提升71.1%,编辑相似度提升33.3%。这意味着企业不用从头训练模型,用开源LLM加内部代码库就能提升补全效果。

  2. 相似性基RAG更胜一筹:比起查“名词解释”的标识符基RAG,查“例题”的相似性基RAG效果更好。比如Qwen2.5-Coder-1.5B用相似性基RAG,效果比标识符基高25%以上。

  3. 最佳“检索组合”出炉

    • 词汇检索(BM25)表现稳定,不管模型大小都好用。
    • 语义检索(尤其是GTE-Qwen)在模型够强时效果惊艳,而且特别擅长处理“不完整查询”(比如只写了一半的代码)。
    • 把BM25和GTE-Qwen结合,效果最佳(像同时用关键词和语义搜资料,覆盖更全)。比如DeepSeek-V3用这个组合,指标比单独用提升5%~10%。
  4. 保护隐私还省钱:用开源LLM加RAG,不用把内部代码给模型训练,既保护了闭源代码的隐私,又避免了训练大模型的高额成本。

详细总结:

一、研究背景与目的

  • 代码补全的重要性:代码补全能自动预测代码片段,显著提升开发者效率,87%的专业开发者在工业环境中受益。
  • RAG的作用:检索增强生成(RAG)通过检索目标代码库的相关上下文增强LLMs性能,无需参数更新,适用于闭源代码库(保护隐私、适应特定编码风格)。
  • 研究缺口:现有研究多基于开源代码库,闭源代码库因专有模式等特点存在挑战,需系统研究RAG在闭源场景的表现。
  • 研究对象:微信的闭源代码库(1669个内部仓库),构建包含100个示例(7个领域)的评估基准。

二、研究方法与实验设置

1. 数据预处理与语料构建
  • 挑战:C++项目的文件分割、递归依赖、自动生成代码、宏定义等问题。
  • 解决方案:提出细粒度算法,提取函数/类定义、处理递归依赖、转换宏为函数结构等。
2. RAG方法
RAG类型核心思路关键步骤
标识符基RAG检索标识符的定义帮助LLMs理解逻辑构建索引→提取需检索的标识符→构建提示词补全代码
相似性基RAG提供相似代码片段辅助补全构建索引(词汇/语义)→检索相似代码→构建提示词补全代码
3. 实验细节
  • LLMs:26个开源模型(0.5B-671B参数),包括代码专用(如Qwen-Coder)和通用模型(如Llama-3.3)。
  • 检索技术:词汇检索(BM25)、语义检索(CodeBERT、GTE-Qwen等)。
  • 评估指标:CodeBLEU(CB,考虑代码结构和语义)、Edit Similarity(ES,衡量编辑距离)。

三、实验结果与分析

1. RQ1:不同RAG方法的表现
  • 两种RAG均优于基础模型,相似性基RAG表现更优。例如,DeepSeek-V3用GTE-Qwen检索后,CB提升71.1%,ES提升33.3%。
  • 标识符基RAG中,函数定义检索效果最佳;相似性基RAG中,BM25和GTE-Qwen表现突出。
2. RQ2:检索技术对相似性基RAG的影响
  • 词汇检索(BM25)在各模型中表现稳定;语义检索效果随模型能力提升。
  • 多数技术在完整查询中更优,但GTE-Qwen在不完整查询(代码补全场景)中更优。
3. RQ3:不同检索技术的关系
  • 词汇与语义检索结果重叠少(如BM25与GTE-Qwen在100个示例中64个完全不同),互补性强。
  • 结合后效果更佳,如DeepSeek-V3用BM25+GTE-Qwen,CB达63.62,ES达75.26,优于单独使用。

四、开发者调查与研究贡献

  • 开发者调查:BM25+GTE-Qwen的组合评分最高,约半数案例中优于单独技术;主要错误为逻辑缺失或错误(52%)。
  • 贡献:系统研究闭源场景RAG、提出细粒度语料构建算法、验证检索技术互补性、开发者调查验证实际价值。

  1. 关键问题:

  2. 问题:在闭源代码补全中,标识符基RAG和相似性基RAG的核心区别是什么,哪种更有效?
    答案:标识符基RAG通过检索标识符(如函数、类)的相关定义帮助LLMs理解其逻辑和用法;相似性基RAG则检索与当前代码相似的实现(通过词汇或语义技术)。实验表明,两种方法均有效,但相似性基RAG表现更优,例如DeepSeek-V3使用相似性基RAG(GTE-Qwen)时,CodeBLEU和Edit Similarity分别比标识符基RAG提升约42.7%和18.4%。

  3. 问题:不同检索技术对相似性基RAG的影响有何差异,哪种技术更适合代码补全场景?
    答案:词汇检索(如BM25)在不同模型和查询类型中表现稳定;语义检索(如GTE-Qwen)的效果随模型能力提升。多数技术在完整代码片段查询中更优,但GTE-Qwen在不完整查询(代码补全的典型场景)中表现最佳,例如在DeepSeek-V3中,其CodeBLEU达60.28,显著高于其他语义检索技术。

  4. 问题:词汇检索(如BM25)和语义检索(如GTE-Qwen)为何能通过结合提升代码补全效果?
    答案:两者检索结果重叠极少(如在100个示例中,BM25与GTE-Qwen有64个完全不同的结果),说明它们捕获代码相似性的不同方面(词汇层面vs语义层面),具有互补性。结合后能覆盖更全面的信息,例如DeepSeek-V3使用BM25+GTE-Qwen时,CodeBLEU达63.62,高于单独使用任一技术。

总结:闭源代码补全,RAG这样用才高效

这篇论文以微信的工业级闭源代码库为“试验场”,系统回答了“RAG在闭源场景怎么用才有效”的问题:

  • 解决的核心问题:填补了RAG在闭源代码补全领域的研究空白,明确了不同方法和技术的效果。
  • 关键结论:相似性基RAG优于标识符基,BM25(词汇)和GTE-Qwen(语义)结合是“最优解”,且效果能被开发者实际感知(调查验证)。
  • 价值:为企业提供了一套低成本、高隐私的代码补全优化方案——用开源LLM+内部代码库+RAG,就能让代码补全更懂“公司方言”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90422.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ—仲裁队列

上篇文章: RabbitMQ集群搭建https://blog.csdn.net/sniper_fandc/article/details/149312481?fromshareblogdetail&sharetypeblogdetail&sharerId149312481&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 Raft一致性算法…

[2025CVPR-目标检测方向] CorrBEV:多视图3D物体检测

1. ​研究背景与动机​ 论文关注自动驾驶中相机仅有的多视图3D物体检测(camera-only multi-view 3D object detection)问题。尽管基于鸟瞰图(BEV)的建模近年来取得显著进展(如BEVFormer和SparseBEV等基准模型&#xf…

oracle 数据库批量变更数据 将a表字段批量更新为b表字段

需求:将excel表中的数据批量更新到 taccoinfo表中vc_broker字段0、备份:create table taccoinfo0724 as select vc_custno ,vc_broker from taccoinfo 1、创建临时表: create table taccoinfo0724_1 as select vc_custno ,vc_broker from…

vim-xcode 项目常见问题解决方案

vim-xcode 项目常见问题解决方案 项目基础介绍 vim-xcode 是一个开源项目,旨在通过 Vim 编辑器与 Xcode 项目进行交互。该项目允许开发者在 Vim 中直接构建、测试和运行 Xcode 项目,从而提高开发效率。vim-xcode 主要使用 Vimscript 编写,并依…

个性化网页计数器

需要一个服务器环境来存放我们的计数器脚本和数据库。对于初学者来说,PHP和MySQL是一个不错的组合,因为它们易于学习且广泛应用。接下来,我们开始编写PHP脚本。这个脚本的主要任务是接收来自网页的请求,并将访问信息存储到数据库中…

详解力扣高频SQL50题之1683. 无效的推文【入门】

传送门:1683. 无效的推文 题目 表:Tweets ----------------------- | Column Name | Type | ----------------------- | tweet_id | int | | content | varchar | ----------------------- 在 SQL 中,tweet_id 是这个表的主键。 content 只…

Spring Boot与Python的联动:实战案例解析

目录一、背景与需求二、技术准备2.1 Spring Boot 基础2.2 Python 环境搭建三、基于 RESTful API 的调用3.1 创建 Python Flask 应用3.2 创建 Spring Boot 应用3.3 测试与验证四、通过 ProcessBuilder 调用 Python 脚本4.1 创建 Python 脚本4.2 Spring Boot 中调用脚本4.3 注意事…

力扣刷题(第九十七天)

灵感来源 - 保持更新,努力学习- python脚本学习密钥格式化解题思路移除原字符串中的所有破折号,并将小写字母转换为大写。从后向前遍历处理后的字符串,每 K 个字符为一组。最后将各组逆序拼接,并用破折号分隔。class Solution:def…

ESP32入门实战:PC远程控制LED灯完整指南

引言:物联网远程控制基础 远程控制是物联网应用的基础功能之一,通过ESP32实现PC远程控制LED灯不仅是一个经典入门项目,更是理解网络通信、嵌入式开发和物联网交互的绝佳实践。本文将详细介绍如何通过WiFi和UDP协议,从零开始构建一…

主流摄像头协议及其开源情况,GB/T 28181协议介绍

一、主流摄像头协议及开源情况 1. RTSP(Real Time Streaming Protocol) 技术特性:基于TCP/UDP的实时流传输协议,支持双向通信(如暂停、播放控制)。应用场景:摄像头实时监控、视频点播系统。开源…

「iOS」——RunLoop学习

底层学习iOS--RunLoop学习RunLoop的概念RunLoop与线程的关系RunLoop的结构ModeObserverTimerSourceRunLoop 执行流程RunLoop 的应用1.AutoreleasePool是什么时候释放的2.触控事件的响应3.刷新界面4.线程保活小知识mach Port**Toll-Free Bridging(对象桥接&#xff0…

从零构建 Node20+pnpm+pm2 环境镜像:基于 Dockerfile 的两种方案及持久化配置指南

前言:在Node.js项目部署中,环境一致性和服务自动恢复是运维的核心需求。无论是本地开发还是生产部署,使用Docker封装Node20、pnpm(高效包管理)和pm2(进程守护)环境,能避免“本地能跑…

【Python机器学习】4.3. 模型优化

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 4.3.1. 实战中会遇到的问题 首先看一个例子: 根据任检测数据x1x_1x1​、x2x_2x2…

Impact rating 影响等级定义(学习笔记)

影响等级可以通过四个方面定义,包含安全性safety,经济型financial,操作性operational,和私密性privacy 即[S,F,O,P]这四个方面。每个方面又可以定义四个不同的等级,包含severe(严重的)&#xff…

同花顺前端潜在面试题目与答案

潜在面试题目与答案 以下是根据您提供的“岗位职责”和“岗位要求”整理出的潜在面试题目和参考答案。请注意,这些答案仅供参考,您需要根据自己的实际经验和理解进行更详细和个性化的阐述。 一、基础技术知识(Vue/前端工程化/HTML/CSS/JS&…

J2EE模式---组合实体模式

组合实体模式基础概念组合实体模式(Composite Entity Pattern)是一种企业级设计模式,属于 J2EE 模式的一种,其核心思想是将多个实体对象组合成一个更高层次的对象(组合实体),以简化客户端与这些…

基于CloudBase+React+CodeBudddy的云上智能睡眠应用开发实践

本文详细记录了如何利用CloudBase云开发平台、React前端框架和CodeBudddy智能编程技术栈,构建一个云端智能睡眠监测与分析系统。通过完整的项目实践,探索AIoT时代健康管理应用的开发范式。一、智能睡眠监测:云时代的健康守护者在快节奏的现代…

QML 模型

QML模型基础架构QML采用经典的Model-View-Delegate (MVD)​架构来分离数据与界面,这与MVC模式类似但更加适合声明式UI开发。在这个架构中:​Model​:负责管理数据,可以是简单的整数,也可以是复杂的C自定义模型​View​…

基于Trae IDE与MCP实现网页自动化测试的最佳实践

引言 在现代Web开发流程中,自动化测试已成为保障应用质量、提升开发效率的关键环节。Playwright作为一款新兴的测试框架,因其出色的跨浏览器支持能力和丰富的API特性,正逐渐成为自动化测试领域的主流选择。本文将详细介绍如何在葡萄城Trae ID…

Android 动画优化

动画是提升 Android 应用用户体验的核心手段 —— 流畅的过渡动画能让页面切换更自然,交互反馈动画能让操作更有质感。但动画也是性能 “重灾区”:掉帧、卡顿、内存暴涨等问题,往往源于对动画原理和优化技巧的忽视。本文将从动画性能的核心瓶…