摘要:華為雲PaaS技術創新團隊基於UniXcoder模型,在公開測試資料集(CodeXGLUE)上的程式碼搜尋任務評測結果上取得突破,在CodeXGLUE榜單上排名中第一。
本文分享自華為雲社群《程式碼語義搜尋演算法哪家強?華為雲UniXcoder-VESO-v1演算法取得突破,問鼎CodeXGLUE榜單第一名》,作者:華為雲軟體分析Lab 。
按照查詢語句的型別,程式碼搜尋可以分為程式碼關鍵字搜尋和程式碼語義搜尋。程式碼關鍵字搜尋主要透過索引程式碼實體(如類、方法、變數等),查詢定位程式碼實體的定義及引用;程式碼語義搜尋的目標是支援開發人員基於自然語言方式來描述程式碼特性,從而進行相關程式碼的推薦與搜尋。在開發人員程式設計過程中幫助其查詢最佳程式碼示例實踐和庫使用示例,從而開發者可以透過功能描述搜尋到程式碼。
目前,大多數程式碼搜尋引擎僅支援程式碼關鍵字搜尋,這需要開發者瞭解他們正在搜尋的程式碼,例如類名、函式名、API呼叫等等,這具有很大的侷限性。多數使用者通常透過搜尋程式碼示例來指導他們完成特定的編碼任務,他們更傾向於使用自然語言來描述待編碼實現的功能,從而借鑑開源社群中已存在的相關程式碼片段。程式碼語義搜尋可以支援開發人員在不知道類或函式名稱的情況下使用自然語言方式來描述所需的程式碼功能。藉助於語言模型及不同自然語言之間的對映關係,開發者甚至可以基於中文描述搜尋出包含英文功能描述的程式碼片段。
隨著語言大模型(Large Language Model, LLM)技術的發展,一系列語言大模型(如BERT [1]、XLNet [2]、GPT [3]、RoBERTa [4]等)在自然語言處理任務上取得了巨大的成功,為原始碼處理任務提供了技術基礎。這些模型已經應用於程式碼摘要和程式碼語義搜尋,打敗了以前的最先進方法。語義搜尋背後的想法是將語料庫中的所有條目,無論是句子、段落還是文件,都編碼到向量空間中。在搜尋時,查詢被編碼到相同的向量空間中,並找到語料庫中最近的向量。這些條目應與查詢具有高度的語義重疊。程式碼語義搜尋使用編碼大模型將查詢及程式碼片段編碼成向量,使得語義相關或相近的程式碼片段和查詢在向量空間內落在相近的位置。如下圖所示:
有很多演算法使用不同的編碼器對程式碼片段和查詢進行編碼,最新和最有希望的研究集中在通用編碼器和解碼器上,這些編碼器和解碼器使用相同的神經網路來編碼所有程式語言程式碼片段和文字。
Salza等人 [5]基於原始BERT[1]模型,用多種程式語言程式碼預訓練一個新的BERT模型,並用兩個編碼器(一個處理自然語言,另一個處理程式碼片段)精調該模型,首先證明了處理自然語言的基於Transformer架構的模型可以被直接應用到程式碼搜尋任務中。
CodeBERT [6]是在自然語言和程式語言序列資料上進行訓練的大型語言模型之一,它在程式碼搜尋方面表現較為出色。此外,還發展演化出RoBERTa [4]、TreeBERT [7]、GraphCodeBERT [8]、UniXcoder [9]等在程式碼搜尋方面表現出色的自然語言與程式語言結合訓練的模型。
華為雲PaaS技術創新團隊基於UniXcoder模型,透過混淆程式碼片段、增加海量開原始碼作為訓練集、提高批尺寸等精調方法,實現了UniXcoder-VESO-v1演算法,該演算法在公開測試資料集(CodeXGLUE [10])上的程式碼搜尋任務評測結果上取得突破:平均倒數排序值(MRR)達到0.58,CodeXGLUE榜單上排名中第一(如下圖所示: UniXcoder-VESO-v1, 詳見https://microsoft.github.io/CodeXGLUE/)。 我們將持續推進該工作的技術創新與突破,會選擇合適方式披露內部技術細節,如感興趣,歡迎持續關注我們的訂閱號文章。
文章來自:PaaS技術創新Lab,PaaS技術創新Lab隸屬於華為雲,致力於綜合利用軟體分析、資料探勘、機器學習等技術,為軟體研發人員提供下一代智慧研發工具服務的核心引擎和智慧大腦。我們將聚焦軟體工程領域硬核能力,不斷構築研發利器,持續交付高價值商業特性!加入我們,一起開創研發新“境界”!(詳情歡迎聯絡 mayuchi1@huawei.com;guodongshuo@huawei.com)
PaaS技術創新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/