LocAgent:一款開源的輔助代碼定位的程序員工具
LocAgent是什么?
LocAgent 是由斯坦福大學、耶魯大學和南加州大學等機構聯合開發的代碼定位框架。它通過將代碼庫解析為有向異構圖,捕捉代碼的結構和依賴關系,從而幫助開發者快速準確地找到需要修改的代碼部分。
核心技術
圖基代碼表示:LocAgent 將代碼庫解析為一個有向異構圖,其中節點代表代碼庫中的實體(如文件、類、函數等),邊則表示這些實體之間的關系(如文件之間的導入關系、函數之間的調用關系以及類之間的繼承關系)。這種圖結構能夠揭示隱藏在代碼中的復雜依賴關系,為后續的代碼定位任務提供了堅實的基礎。
多跳推理機制:基于大型語言模型(LLM)的多跳推理能力,LocAgent 可以穿透多層依賴關系,定位問題代碼的根源。例如,在處理復雜的代碼庫時,即使目標代碼沒有在問題描述中明確提及,LocAgent 也能通過圖結構進行推理,找到相關的代碼實體。
稀疏層次索引:LocAgent 通過稀疏層次實體索引來增強其搜索能力。這種索引機制為圖中的每個節點創建了多個索引,包括基于實體 ID 的索引、基于實體名稱的索引以及基于 BM25 算法的倒排索引。這些索引能夠幫助 LocAgent 在幾秒鐘內快速定位到與問題描述相關的代碼實體,即使在大型代碼庫中也能保持高效的性能。
主要功能
快速定位問題代碼:根據自然語言描述的問題(如錯誤報告、功能請求、性能問題或安全漏洞),LocAgent 能夠快速定位到代碼庫中需要修改的具體文件、類、函數或代碼行。
多類型問題支持:LocAgent 支持多種類型的軟件開發和維護任務,包括錯誤修復、功能添加、性能優化和安全漏洞修復。
智能依賴分析:自動追蹤代碼實體間的復雜調用關系。
性能表現
在 SWE-Bench-Lite 數據集上,LocAgent 使用 Qwen2.5-32B 模型時,文件級定位準確率達到了 92.7%,相比 Claude-3.5 的 86.13% 有顯著提升。
在 Loc-Bench 數據集上,LocAgent 實現了 84.59% 的 Acc@5 和 87.06% 的 Acc@10 文件級定位準確率。
LocAgent 的成本效益也非常高,使用 Qwen2.5-7B 模型時,每個樣本的成本僅為 0.05 美元,相比 Claude-3.5 的 0.66 美元,成本降低了約 86%。
應用場景
錯誤修復:快速定位導致錯誤的代碼位置,減少調試時間。
功能添加:幫助開發者找到需要添加新功能的代碼位置。
性能優化:定位影響性能的代碼部分,進行優化。
安全漏洞修復:快速找到安全漏洞相關的代碼,及時修復。
技術原理
圖基代碼表示
LocAgent 將代碼庫解析為有向異構圖,節點代表代碼實體(文件、類、函數等),邊表示調用、繼承等依賴關系。這種結構能捕捉復雜代碼庫的層次結構和語義關聯。
多層索引檢索體系
實體 ID 索引:支持精確匹配(如搜索特定類或方法)。
語義模糊索引:基于 BM25 算法,允許自然語言查詢(如“處理訂單支付的邏輯”)。
結構特征索引:通過代碼骨架特征(如函數參數列表)支持“按結構找相似”。
三大智能工具
SearchEntity:通過關鍵詞觸發智能掃描,結合 NLP 提取核心實體并返回匹配結果。
TraverseGraph:沿調用鏈、繼承鏈等關系進行多跳遍歷,穿透復雜依賴關系。
RetrieveEntity:檢索實體的完整屬性(代碼內容、文件路徑等),輔助深度分析。
LocAgent 的使用方法
環境準備
安裝依賴:LocAgent 依賴于 Python 環境,需要安裝 Python 3.8 及以上版本。此外,還需要安裝一些 Python 包,如 torch、transformers 等。可以通過以下命令安裝:
pip install -r requirements.txt
下載代碼庫:LocAgent 支持多種數據集,如 SWE-Bench_Lite 和 Loc-Bench 等。可以根據需求選擇合適的數據集,并將其下載到本地。例如:
git clone https://github.com/czlll/SWE-bench_Lite.git
代碼庫解析
生成圖索引:LocAgent 需要將代碼庫解析為有向異構圖,并生成圖索引。可以通過以下命令完成:
python parse.py --dataset czlll/SWE-bench_Lite --repo_path ./SWE-bench_Lite --index_dir ./index
其中,--dataset 指定數據集名稱,--repo_path 指定代碼庫路徑,--index_dir 指定生成的圖索引保存路徑。
啟動 LocAgent
運行腳本:啟動 LocAgent 進行代碼定位,可以使用以下命令:
python run.py --localize --dataset czlll/SWE-bench_Lite --repo_path ./SWE-bench_Lite --index_dir ./index --use_function_calling True
其中,--localize 表示啟動定位過程,--use_function_calling 啟用 LLM 的函數調用功能。
評估結果
評估定位結果:定位完成后,結果將保存在 JSONL 文件中。可以使用 LocAgent 提供的評估工具對結果進行評估。例如:
python evaluation/run_evaluation.py --result_file ./results.jsonl
其中,--result_file 指定定位結果文件路徑。
Github項目:https://github.com/gersteinlab/LocAgent