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