代碼語義搜索算法哪家強?華為云UniXcoder-VESO-v1問鼎CodeXGLUE榜單第一
?隨著語言大模型技術的發(fā)展,一系列語言大模型在自然語言處理任務上取得了巨大的成功,為源代碼處理任務提供了技術基礎,這些模型已經(jīng)應用于代碼摘要和代碼語義搜索。華為云PaaS技術創(chuàng)新團隊基于UniXcoder模型,在公開測試數(shù)據(jù)集(CodeXGLUE)上的代碼搜索任務評測結果上取得突破,在CodeXGLUE榜單上排名中第一。
按照查詢語句的類型,代碼搜索可以分為代碼關鍵字搜索和代碼語義搜索。代碼關鍵字搜索主要通過索引代碼實體(如類、方法、變量等),查詢定位代碼實體的定義及引用;代碼語義搜索的目標是支持開發(fā)人員基于自然語言方式來描述代碼特性,從而進行相關代碼的推薦與搜索。在開發(fā)人員編程過程中幫助其查找最佳代碼示例實踐和庫使用示例,從而開發(fā)者可以通過功能描述搜索到代碼。
目前,大多數(shù)代碼搜索引擎僅支持代碼關鍵字搜索,這需要開發(fā)者了解他們正在搜索的代碼,例如類名、函數(shù)名、API調(diào)用等等,這具有很大的局限性。多數(shù)用戶通常通過搜索代碼示例來指導他們完成特定的編碼任務,他們更傾向于使用自然語言來描述待編碼實現(xiàn)的功能,從而借鑒開源社區(qū)中已存在的相關代碼片段。代碼語義搜索可以支持開發(fā)人員在不知道類或函數(shù)名稱的情況下使用自然語言方式來描述所需的代碼功能。借助于語言模型及不同自然語言之間的映射關系,開發(fā)者甚至可以基于中文描述搜索出包含英文功能描述的代碼片段。
隨著語言大模型(Large Language Model, LLM)技術的發(fā)展,一系列語言大模型(如BERT?[1]、XLNet?[2]、GPT?[3]、RoBERTa?[4]等)在自然語言處理任務上取得了巨大的成功,為源代碼處理任務提供了技術基礎。這些模型已經(jīng)應用于代碼摘要和代碼語義搜索,打敗了以前的最先進方法。語義搜索背后的想法是將語料庫中的所有條目,無論是句子、段落還是文檔,都編碼到向量空間中。在搜索時,查詢被編碼到相同的向量空間中,并找到語料庫中最近的向量。這些條目應與查詢具有高度的語義重疊。代碼語義搜索使用編碼大模型將查詢及代碼片段編碼成向量,使得語義相關或相近的代碼片段和查詢在向量空間內(nèi)落在相近的位置。如下圖所示:

有很多算法使用不同的編碼器對代碼片段和查詢進行編碼,最新和最有希望的研究集中在通用編碼器和解碼器上,這些編碼器和解碼器使用相同的神經(jīng)網(wǎng)絡來編碼所有編程語言代碼片段和文本。
Salza等人?[5]基于原始BERT[1]模型,用多種編程語言代碼預訓練一個新的BERT模型,并用兩個編碼器(一個處理自然語言,另一個處理代碼片段)精調(diào)該模型,首先證明了處理自然語言的基于Transformer架構的模型可以被直接應用到代碼搜索任務中。
CodeBERT?[6]是在自然語言和編程語言序列數(shù)據(jù)上進行訓練的大型語言模型之一,它在代碼搜索方面表現(xiàn)較為出色。此外,還發(fā)展演化出RoBERTa?[4]、TreeBERT?[7]、GraphCodeBERT?[8]、UniXcoder?[9]等在代碼搜索方面表現(xiàn)出色的自然語言與編程語言結合訓練的模型。
華為云PaaS技術創(chuàng)新團隊基于UniXcoder模型,通過混淆代碼片段、增加海量開源代碼作為訓練集、提高批尺寸等精調(diào)方法,實現(xiàn)了UniXcoder-VESO-v1算法,該算法在公開測試數(shù)據(jù)集(CodeXGLUE?[10])上的代碼搜索任務評測結果上取得突破:平均倒數(shù)排序值(MRR)達到0.58,CodeXGLUE榜單上排名中第一(如下圖所示: UniXcoder-VESO-v1, 詳見https://microsoft.github.io/CodeXGLUE/)。 我們將持續(xù)推進該工作的技術創(chuàng)新與突破,會選擇合適方式披露內(nèi)部技術細節(jié),如感興趣,歡迎持續(xù)關注我們的訂閱號文章。

文章來自?PaaS技術創(chuàng)新Lab,PaaS技術創(chuàng)新Lab隸屬于華為云,致力于綜合利用軟件分析、數(shù)據(jù)挖掘、機器學習等技術,為軟件研發(fā)人員提供下一代智能研發(fā)工具服務的核心引擎和智慧大腦。我們將聚焦軟件工程領域硬核能力,不斷構筑研發(fā)利器,持續(xù)交付高價值商業(yè)特性!加入我們,一起開創(chuàng)研發(fā)新“境界”?。?strong>詳情歡迎聯(lián)系?mayuchi1@huawei.com;guodongshuo@huawei.com)
PaaS技術創(chuàng)新Lab主頁鏈接:https://www.huaweicloud.com/lab/paas/home.html
參考文獻
[1]. Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL-HLT (1) 2019: 4171-4186
[2]. Zhilin Yang, Zihang Dai, Yiming Yang, Jaime G. Carbonell, Ruslan Salakhutdinov, Quoc V. Le: XLNet: Generalized Autoregressive Pretraining for Language Understanding. NeurIPS 2019: 5754-5764
[3]. Tom B. Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, Sandhini Agarwal, Ariel Herbert-Voss, Gretchen Krueger, Tom Henighan, Rewon Child, Aditya Ramesh, Daniel M. Ziegler, Jeffrey Wu, Clemens Winter, Christopher Hesse, Mark Chen, Eric Sigler, Mateusz Litwin, Scott Gray, Benjamin Chess, Jack Clark, Christopher Berner, Sam McCandlish, Alec Radford, Ilya Sutskever, Dario Amodei: Language Models are Few-Shot Learners. NeurIPS 2020
[4]. Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov: RoBERTa: A Robustly Optimized BERT Pretraining Approach. CoRR abs/1907.11692 (2019)
[5]. Pasquale Salza, Christoph Schwizer, Jian Gu, Harald C. Gall: On the Effectiveness of Transfer Learning for Code Search. IEEE Trans. Software Eng. 49(4): 1804-1822 (2023)
[6]. Zhangyin Feng, Daya Guo, Duyu Tang, Nan Duan, Xiaocheng Feng, Ming Gong, Linjun Shou, Bing Qin, Ting Liu, Daxin Jiang, Ming Zhou: CodeBERT: A Pre-Trained Model for Programming and Natural Languages. EMNLP (Findings) 2020: 1536-1547
[7]. Xue Jiang, Zhuoran Zheng, Chen Lyu, Liang Li, Lei Lyu: TreeBERT: A tree-based pre-trained model for programming language. UAI 2021: 54-63
[8]. Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tufano, Shao Kun Deng, Colin B. Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, Ming Zhou: GraphCodeBERT: Pre-training Code Representations with Data Flow. ICLR 2021
[9]. Daya Guo, Shuai Lu, Nan Duan, Yanlin Wang, Ming Zhou, Jian Yin: UniXcoder: Unified Cross-Modal Pre-training for Code Representation. ACL (1) 2022: 7212-7225
[10].?https://microsoft.github.io/CodeXGLUE/