[論文閱讀] 人工智能 + 軟件工程 | 微信閉源代碼庫中的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
英文地址,請注明出處:http://en.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 應用用戶體驗的核心手段 —— 流暢的過渡動畫能讓頁面切換更自然,交互反饋動畫能讓操作更有質感。但動畫也是性能 “重災區”:掉幀、卡頓、內存暴漲等問題,往往源于對動畫原理和優化技巧的忽視。本文將從動畫性能的核心瓶…