阿里巴巴提出CODEXGRAPH:打破大模型與代碼庫的壁壘,引領(lǐng)軟件工程新革命 精華
在現(xiàn)代軟件工程中,大型語言模型(LLMs)在處理獨(dú)立的代碼任務(wù)方面表現(xiàn)出色,例如HumanEval和MBPP,但在處理整個(gè)代碼庫時(shí)卻遇到了困難。這一挑戰(zhàn)促使研究人員探索在代碼庫規(guī)模上增強(qiáng)LLM與代碼庫的交互。目前的解決方案依賴于基于相似性的檢索或手動(dòng)工具和API,每種方法都有明顯的缺點(diǎn)?;谙嗨菩缘臋z索在復(fù)雜任務(wù)中往往回憶率低,而手動(dòng)工具和API通常是特定任務(wù)的,需要專家知識(shí),降低了它們?cè)诙鄻踊a任務(wù)和現(xiàn)實(shí)世界應(yīng)用中的通用性。
為了克服這些限制,我們引入了CODEXGRAPH,一個(gè)系統(tǒng),將LLM代理與從代碼庫中提取的圖數(shù)據(jù)庫接口集成在一起。通過利用圖數(shù)據(jù)庫的結(jié)構(gòu)屬性和圖查詢語言的靈活性,CODEXGRAPH使LLM代理能夠構(gòu)建和執(zhí)行查詢,允許進(jìn)行精確的、代碼結(jié)構(gòu)感知的上下文檢索和代碼導(dǎo)航。我們通過三個(gè)基準(zhǔn)來評(píng)估CODEXGRAPH的性能:CrossCodeEval、SWE-bench和EvoCodeBench。此外,我們開發(fā)了五個(gè)現(xiàn)實(shí)世界的編碼應(yīng)用。通過統(tǒng)一的圖數(shù)據(jù)庫模式,CODEXGRAPH在學(xué)術(shù)和現(xiàn)實(shí)世界環(huán)境中展示了競(jìng)爭(zhēng)性能和潛力,展示了其在軟件工程中的多功能性和有效性。
論文標(biāo)題:CODEXGRAPH: Bridging Large Language Models and Code Repositories via Code Graph Databases
機(jī)構(gòu):
- National University of Singapore
- Alibaba Group
- Xi’an Jiaotong University
論文鏈接:https://arxiv.org/pdf/2408.03910
項(xiàng)目地址:??https://github.com/modelscope/modelscope-agent/tree/master/apps/codexgraph_agent??
CODEXGRAPH系統(tǒng)介紹
CODEXGRAPH是一個(gè)創(chuàng)新的系統(tǒng),旨在通過圖數(shù)據(jù)庫接口將代碼庫與大型語言模型(LLM)橋接起來。該系統(tǒng)利用從代碼庫中提取的代碼圖,通過靜態(tài)分析技術(shù),將代碼符號(hào)和關(guān)系索引并存儲(chǔ)為圖數(shù)據(jù)庫中的節(jié)點(diǎn)和邊。這些節(jié)點(diǎn)和邊根據(jù)預(yù)定義的模式進(jìn)行組織,節(jié)點(diǎn)代表如模塊、類和函數(shù)等代碼符號(hào),邊則表示這些符號(hào)之間的關(guān)系,如包含、繼承和使用等。
CODEXGRAPH的核心功能是使LLM代理能夠構(gòu)建和執(zhí)行圖查詢,從而實(shí)現(xiàn)精確的代碼結(jié)構(gòu)感知上下文檢索和代碼導(dǎo)航。這種結(jié)構(gòu)的利用大大增強(qiáng)了LLM在處理復(fù)雜代碼庫任務(wù)時(shí)的性能,使其能夠有效地?cái)U(kuò)展到更大的代碼庫任務(wù)中。
詳細(xì)解析:構(gòu)建代碼圖數(shù)據(jù)庫
1. 從代碼庫中提取代碼圖
構(gòu)建代碼圖數(shù)據(jù)庫的第一步是從目標(biāo)代碼庫中提取代碼圖。這一過程通常涉及靜態(tài)分析技術(shù),掃描代碼庫中的每個(gè)文件,識(shí)別出代碼中的符號(hào)及其相互關(guān)系,并將這些信息作為節(jié)點(diǎn)和邊加入到圖數(shù)據(jù)庫中。例如,一個(gè)函數(shù)或類會(huì)被創(chuàng)建為一個(gè)節(jié)點(diǎn),而函數(shù)調(diào)用或類繼承則被視為邊。
2. 定義節(jié)點(diǎn)和邊的類型及其屬性
在CODEXGRAPH系統(tǒng)中,節(jié)點(diǎn)和邊的類型及其屬性是根據(jù)代碼的結(jié)構(gòu)和語義預(yù)先定義的。節(jié)點(diǎn)類型包括模塊、類、方法、函數(shù)、字段和全局變量等,每種類型的節(jié)點(diǎn)都有相應(yīng)的屬性,如名稱、文件路徑、代碼和簽名等。邊的類型則表示代碼元素之間的不同關(guān)系,如包含、繼承和使用等。這些定義確保了圖數(shù)據(jù)庫能夠準(zhǔn)確地反映代碼庫的結(jié)構(gòu)。
3. 索引和存儲(chǔ)過程的優(yōu)化
為了提高查詢效率和響應(yīng)速度,CODEXGRAPH在構(gòu)建代碼圖數(shù)據(jù)庫時(shí)進(jìn)行了索引和存儲(chǔ)優(yōu)化。首先,通過淺層索引快速捕捉代碼庫中的符號(hào)和關(guān)系,然后使用深度優(yōu)先搜索(DFS)等方法處理跨文件的復(fù)雜關(guān)系,確保圖中的邊完整無誤。此外,節(jié)點(diǎn)中不直接存儲(chǔ)代碼片段,而是存儲(chǔ)指向代碼片段的索引,這樣既節(jié)省了存儲(chǔ)空間,也加快了數(shù)據(jù)的檢索速度。
通過這些精心設(shè)計(jì)的步驟,CODEXGRAPH能夠高效地管理和查詢大規(guī)模代碼庫,支持復(fù)雜的代碼分析任務(wù),為開發(fā)人員和研究人員提供了一個(gè)強(qiáng)大的工具。
LLM代理與代碼圖數(shù)據(jù)庫的交互
在CODEXGRAPH系統(tǒng)中,LLM代理與代碼圖數(shù)據(jù)庫的交互是通過構(gòu)建和執(zhí)行圖查詢來實(shí)現(xiàn)的。這一過程充分利用了圖數(shù)據(jù)庫的結(jié)構(gòu)特性和圖查詢語言的靈活性,使得LLM代理能夠在代碼庫中進(jìn)行精確的、結(jié)構(gòu)感知的上下文檢索和代碼導(dǎo)航。
1. 代碼結(jié)構(gòu)感知搜索
CODEXGRAPH利用圖查詢語言的靈活性,構(gòu)建復(fù)雜且綜合的搜索條件。通過這種方式,LLM代理能夠有效地在代碼圖中導(dǎo)航各種節(jié)點(diǎn)和邊,執(zhí)行如“查找某個(gè)模塊下包含特定方法的類”或“檢索定義了某個(gè)類及其包含函數(shù)的模塊”的查詢。這種代碼結(jié)構(gòu)感知的搜索方式,提供了一種難以通過基于相似性的檢索方法或傳統(tǒng)的代碼特定工具和API實(shí)現(xiàn)的代碼檢索級(jí)別。
2. 寫后翻譯
在CODEXGRAPH中,LLM代理首先基于用戶提供的問題理解上下文并生成自然語言查詢,這些查詢隨后被專門的翻譯LLM代理轉(zhuǎn)換為形式化的圖查詢。這種分工使得主LLM代理可以專注于高層次的推理,同時(shí)確保圖查詢的語法正確性和優(yōu)化。通過這種“寫后翻譯”的策略,CODEXGRAPH提高了查詢的成功率,并改善了系統(tǒng)檢索相關(guān)代碼信息的能力。
3. 迭代管道
CODEXGRAPH采用迭代管道進(jìn)行LLM代理與代碼圖數(shù)據(jù)庫的交互,每一輪中,LLM代理根據(jù)用戶的問題和之前收集的信息制定多個(gè)查詢。這種迭代方法充分利用了LLM代理的推理能力,從而提高了解決問題的準(zhǔn)確性。
實(shí)驗(yàn)設(shè)置與評(píng)估
為了評(píng)估CODEXGRAPH的有效性,我們?cè)谌齻€(gè)具有代表性的代碼庫級(jí)基準(zhǔn)上進(jìn)行了測(cè)試:CrossCodeEval、SWE-bench和EvoCodeBench。通過這些基準(zhǔn),我們可以全面評(píng)估CODEXGRAPH在不同的編程任務(wù)中的表現(xiàn)。
1. 基準(zhǔn)
- CrossCodeEval: 用于評(píng)估多語言跨文件代碼完成的數(shù)據(jù)集。
- SWE-bench: 評(píng)估模型解決GitHub問題的能力。
- EvoCodeBench: 用于評(píng)估代碼生成的基準(zhǔn),包含詳細(xì)的注釋和評(píng)估指標(biāo)。
2. 主要結(jié)果
我們?cè)贑rossCodeEval Lite(Python)和SWE-bench Lite測(cè)試集上報(bào)告了CODEXGRAPH的主要結(jié)果,并在EvoCodeBench的完整測(cè)試集上進(jìn)行了評(píng)估。這些測(cè)試集的選擇旨在展示CODEXGRAPH在處理具有不同復(fù)雜度的任務(wù)時(shí)的性能。
3. 基線比較
我們將CODEXGRAPH與幾種基線方法進(jìn)行了比較,包括BM25和AUTOCODEROVER,這些基線在代碼任務(wù)中得到了廣泛認(rèn)可。此外,我們還評(píng)估了CODEXGRAPH在不同的大型語言模型(如GPT-4o、DeepSeek-Coder-V2和Qwen2-72b-Instruct)上的表現(xiàn),以測(cè)試其在處理長(zhǎng)文本、使用工具和生成代碼方面的能力。
通過這些實(shí)驗(yàn)設(shè)置和評(píng)估,我們能夠全面了解CODEXGRAPH在學(xué)術(shù)基準(zhǔn)和實(shí)際軟件工程任務(wù)中的表現(xiàn),展示了其在多種編程任務(wù)中的通用性和有效性。
CODEXGRAPH的實(shí)際應(yīng)用場(chǎng)景
1. 代碼調(diào)試和寫代碼注釋
CODEXGRAPH在實(shí)際應(yīng)用中表現(xiàn)出極大的靈活性和有效性,特別是在代碼調(diào)試和寫代碼注釋這兩個(gè)方面。例如,在代碼調(diào)試應(yīng)用中,CODEXGRAPH能夠通過迭代推理和信息檢索來診斷和解決錯(cuò)誤,提供針對(duì)性的修復(fù)建議。這一過程涉及使用圖查詢語言來分析代碼庫,識(shí)別問題原因,并推薦精確的修改措施。
在寫代碼注釋的應(yīng)用中,CODEXGRAPH利用代碼圖數(shù)據(jù)庫理解代碼的結(jié)構(gòu)和行為,從而生成詳盡且準(zhǔn)確的代碼注釋,增強(qiáng)代碼的可讀性和可維護(hù)性。這一功能對(duì)于理解復(fù)雜的代碼庫、識(shí)別依賴關(guān)系以及探索特定類、方法和函數(shù)的使用尤為有用。
2. 代碼生成和單元測(cè)試生成
CODEXGRAPH還擴(kuò)展到了代碼生成和單元測(cè)試生成領(lǐng)域。在代碼生成應(yīng)用中,它能夠自動(dòng)創(chuàng)建代碼以滿足新的需求,擴(kuò)展現(xiàn)有代碼庫的功能。而在單元測(cè)試生成應(yīng)用中,CODEXGRAPH能夠?yàn)橹付ǖ念惢蚝瘮?shù)生成單元測(cè)試,確保功能的徹底驗(yàn)證。這些功能通過迭代查詢和多跳推理,使CODEXGRAPH能夠在處理大型代碼庫時(shí)表現(xiàn)出高效和精確。
討論與總結(jié)
CODEXGRAPH通過將大型語言模型(LLMs)與代碼圖數(shù)據(jù)庫接口結(jié)合,克服了現(xiàn)有方法在靈活性和泛化能力上的限制,特別是在處理復(fù)雜的代碼庫和多樣化的代碼任務(wù)時(shí)。通過實(shí)現(xiàn)結(jié)構(gòu)化的代碼信息存儲(chǔ)和高效的查詢機(jī)制,CODEXGRAPH不僅提高了代碼任務(wù)的性能,還展示了其在學(xué)術(shù)和實(shí)際軟件工程任務(wù)中的廣泛適用性。
此外,CODEXGRAPH的設(shè)計(jì)允許進(jìn)行精確且結(jié)構(gòu)化的代碼檢索,這是傳統(tǒng)基于相似性的檢索方法和手動(dòng)工具/API難以實(shí)現(xiàn)的。通過這種方式,CODEXGRAPH極大地提升了代碼理解和操作的效率,為復(fù)雜的代碼庫任務(wù)提供了一種強(qiáng)大且靈活的解決方案。
總之,CODEXGRAPH通過其創(chuàng)新的設(shè)計(jì)和實(shí)現(xiàn),有效地解決了大型代碼庫中的多樣化代碼任務(wù),展示了其在自動(dòng)化軟件開發(fā)中提高準(zhǔn)確性和可用性的潛力。未來,隨著對(duì)更多編程語言的支持和數(shù)據(jù)庫構(gòu)建效率的進(jìn)一步優(yōu)化,CODEXGRAPH有望在軟件工程領(lǐng)域中發(fā)揮更大的影響。
本文轉(zhuǎn)載自 ??AI論文解讀??,作者:柏企
