編輯:Panda W
本文帶你全面洞悉用LLM寫代碼的各式方法。
隨著 BERT 和 GPT 等預訓練 Transformer 的出現,語言建模近些年來取得了顯著進步。隨著大型語言模型(LLM)的規模擴展至數以千萬計的參數數量,LLM 開始展現出通用人工智能的跡象,它們的應用也已經不局限于文本處理。Codex 首次展現出了 LLM 在代碼處理方面的出色能力,之后更是出現了 Github Copilot 這樣的商業產品以及 StarCoder 和 Code LLaMA 等開源代碼模型。
但是,預訓練 Transformer 在代碼處理方面的應用可以追溯到僅解碼器(decoder-only)自回歸模型成為主流技術之前的時期,而這一領域還尚沒有一篇完整的綜述。
上海交通大學和螞蟻集團的一個研究團隊填補了這一空白。他們對用于代碼的語言模型進行了全景式的總結,覆蓋了 50 多個模型、30 多個下游任務和 500 多個相關研究成果。他們對代碼語言模型進行了分類,從在一般域上訓練的巨型模型到專門針對代碼理解或生成任務訓練的微型模型。
他們關注的重點是這些模型之間的關系和差異,并格外強調了在語言模型中集成特定于代碼的功能(例如抽象語法樹或數據流)以及從 NLP 領域借用過來的最新技術。
下面機器之心將介紹這一篇綜述論文。如果你想更全面地了解代碼語言模型的發展歷程,請一定不要錯過原論文。此外,該團隊還在 GitHub 上建了一個開放的相關文獻索引庫,以跟蹤和分享代碼 LLM 的最近成果。
- 論文地址:https://arxiv.org/pdf/2311.07989v1.pdf
- 文獻庫地址:https://github.com/codefuse-AI/Awesome-Code-LLM
背景
這一節,作者總結了基于 Transformer 的語言建模的基本知識,包括單向和雙向模型的共同目標,以及 NLP 中的一些流行模型和設計。
單向語言模型(也被稱為因果語言模型)是將句子的概率分解為每個 token 的條件概率與鏈式法則的乘積。
不同于因果語言模型,雙向語言模型的訓練目標是為文本獲得更好的上下文表征,而不是以自回歸的方式生成文本。
GPT 式的因果語言模型和 BERT 式的雙向語言模型各有其優點和缺點。GPT 雖可用于自回歸生成,但卻缺乏對輸入文本的雙向表征,因此不適用于翻譯和摘要等序列到序列任務(seq2seq)。另一方面,BERT 雖可產生雙向表征,但其預訓練的目標是掩碼填充,而非生成。
最基本的 Transformer 編碼器 - 解碼器架構將 GPT 和 BERT 各自的優點結合到了一起。T5 便是這樣一個模型,其預訓練過程使用了 span corruption,可被看作是掩碼式語言建模(MLM)的一種變體。
因果語言建模(CLM)和 MLM 等語言建模目標主要是訓練模型捕獲 token 層面的信息,而無法高效地建模文檔結構。因此,為了幫助模型學習全局信息,通常還會添加輔助目標,比如 BERT 的預訓練在使用 MLM 的同時還使用了下一句子預測(NSP)目標。
另外值得一提的是,盡管大多數預訓練語言模型研究都集中于設計訓練目標,但 Transformer 架構本身的低層實現也在不斷進步,獲得了更好的穩定性、性能和效率。
評估用于代碼的語言模型
過去十年中,軟件工程社區已經提出了多種不同的用于評估代碼模型的評估任務。CodeXGLUE 將大多數此類整合成了單一基準,其中涵蓋克隆檢測、缺陷檢測等代碼理解任務以及代碼修復、代碼轉譯、程序合成和代碼總結等序列到序列生成任務。但是,自 Chen et al. (2021) 引入了 HumanEval 和 Codex 之后,文本到代碼合成就被帶到了 NLP 社區的聚光燈下,并從此成為評估 LLM 的標準任務(圖 2)。
代碼處理的下游任務
在這篇綜述中,作者按照軟件工程的慣例,基于輸入 / 輸出的模態對代碼評估任務進行了分類,而這些類別又可歸總為 5 個大類:文本到代碼、代碼到代碼、代碼到文本、代碼到模式、文本到文本。下面將簡單列出這些任務,至于對這些任務的解釋,請參閱原論文。
文本到代碼任務以文本為輸入,輸出代碼。其中包括:代碼檢索、代碼合成、文本到 SQL、數學編程。
代碼到代碼任務以代碼為輸入,輸出代碼。其中包括:代碼搜索、代碼補全、代碼轉譯、代碼修復、填空測驗、代碼填充、代碼混淆、單元測試生成、斷言生成、模糊測試(Fuzzing)、類型預測。
代碼到文本任務以代碼為輸入,輸出文本。其中包括:代碼摘要、代碼審查、標識符預測。
代碼到模式任務是對代碼執行分類。其中包括:缺陷檢測、克隆檢測、代碼分類、代碼推理。
文本到文本任務以文本為輸入,輸出文本。其中包括:文檔翻譯、日志解析。
評估指標
代碼理解任務在形式上與自然語言理解任務相似,所使用的評估指標也類似,比如準確度、F1 和 MRR(Mean Reciprocal Rank),而標識符預測等短生成任務則可使用精準匹配的準確度進行評估。代碼到文本任務可使用文本生成任務的常用評估指標,比如 BLEU。
而涉及代碼生成的評估任務則更復雜。大多數早期研究都是評估句法正確度,即可成功解析的生成結果百分比。Chen et al. (2018) 反對此類指標,并提出了參照匹配(reference match)指標,即生成結果與參考結果完全一致的比例。Ren et al. (2020) 則提出了 CodeBLUE,這是 BLEU 的一種變體,其評估的是抽象語法樹(AST)和數據流的重疊范圍,可兼顧代碼的句法和語義。
但是,隨著這些年來代碼生成模型能力的提升,人們發現這些基于內容重疊度的指標已經不夠用了,因為執行同樣功能的代碼段可能在詞匯形式上大不相同。
因此,研究者將關注重點轉向了功能正確性。pass@k 就是其中的代表。該指標由 Kulal et al. (2019) 提出,并被 Chen et al. (2021) 加以優化,能夠無偏差地估計模型使用任意 k 個生成樣本通過程序的所有單元測試的幾率。該指標還可以泛化成 passn@k (Li et al., 2022),其將模型提交的數量限制到了 n,但允許根據輸入中給定的單元測試對 k 個樣本進行過濾。
程序合成
隨著這些年來代碼模型的進步,研究者的關注重點逐漸轉向了實踐中的程序合成任務。
2018 年的 CONCODE 是該領域的一個早期數據集,其中包含超過 10 萬條 JAVA 方法,并已經被整合到了 CodeXGLUE 基準中。
2021 年以來,相關數據集迅速增多,其中大部分都專注于 Python/ target=_blank class=infotextkey>Python 語言,比如 AppS、HumanEval、MBPP;而近期也有一些工作將 HumanEval 擴展到了其它編程語言。DS-1000 是一個更現實的 Python 數據集,專注于 NumPy 和 SciPy 等數據科學軟件庫,同時一些數學推理基準也已被轉換為編程任務,包括 MathQA-Python 和 GSM8K-Python。
代碼庫層面的評估
前面談到的大多數評估任務都僅限于單個文件甚至單個函數。
近期一些研究探索了利用代碼庫層面的上下文來進行代碼補全,而 Liu et al. (2023) 提出了用于評估這些系統的 RepoBench。最近,Bairi et al. (2023) 研究了難度更大的代碼庫層面的 API 遷移和時間編輯任務,Jimenez et al. (2023) 則引入了一個相應的基準 SWE-bench。
用于代碼的通用語言模型
自從語言模型的參數數量擴展到數以千億計,它們中的許多就已經展現出了非凡的編程能力,即便它們并不是專門針對代碼而設計或訓練的。Codex 之后,研究者發現只需繼續在代碼上進行預訓練,就能顯著提升語言模型的代碼性能。
現成可用的語言模型
大型語言模型的預訓練通常會使用數以萬億計的 token,遵循縮放律(scaling laws),而這巨量的文本數據中往往包含少量但不可忽視的多樣化代碼。比如 Pile 數據集包含 95GB 代碼(爬取自 GitHub 的 800GB 原始數據集);1.6 TB 的多語言預訓練數據集 ROOTS 也包含 163GB 代碼,涵蓋 13 種編程語言。這是兩個最大型的開源預訓練數據集,讓許多語言模型具備了編程能力。比如 GPT-J、GPT-NeoX 和 BLOOM 在 HumanEval 上都有不錯的表現。
LLaMA(其預訓練數據集包含 328GB 來自 GitHub 的代碼)在 HumanEval 指標上取得了 23.7 的 pass@1 表現,其后繼模型 LLaMA 2 得到了更高的 29.9。
另一方面,閉源模型的表現一般更好。比如 LaMDA 和 PaLM 在 HumanEval 上的 pass@1 性能分別為 14.0 和 26.2,而 GPT-4 的則達到了驚人的 67.0,這一成績直到最近都高于任何專門針對代碼預訓練或指令微調的模型。
最近的一大趨勢是使用更大的數據集訓練更小的模型,遵循修訂版的縮放律。
舉兩個例子:Baichuan 2 是使用 2.6T token 訓練出的 13B 模型,而 Qwen 則是用 3T token 訓練的 14B 模型。它們在 HumanEval 上的 pass@1 性能分別為 17.1 和 32.3。Li et al. (2023) 則表明 1.3B 的小模型也能獲得與更大型模型相當的編程能力,同時還能維持合理的一般文本處理能力,甚至也能顯現出一些涌現能力,比如思維鏈推理。他們的模型 Phi-1.5 的訓練使用了 ChatGPT 生成的 21B token 的教材數據以及取自 Stack Overflow 和 Refined Web 的 100B token 的已過濾網絡數據;其在 HumanEval 上的 pass@1 性能為 41.4。
表 1 給出了這些模型的性能表現。
在代碼上進行過額外預訓練的語言模型
伴隨著開創性的基準 HumanEval,Chen et al. (2021) 還開啟了將 LLM 用于代碼的時代。他們的貢獻是 Codex,這是一個 GPT-3 檢查點模型,但額外使用了 100B 的代碼 token 進行預訓練。這是最早的超十億參數規模的代碼模型之一。
之后出現的還有接連成為 HumanEval 和 MBPP 當前最佳的 PaLM-Coder 和 PaLM 2-S*。類似地,Lewkowycz et al. (2022) 用 38.5B token 的 arXiv 論文和數學內容訓練了 PaLM;Rozière et al. (2023) 則使用超過 500B 代碼 token 訓練 LLaMA 2 而得到了 Code LLaMA,其在 HumanEval 上的表現超過除 GPT-4 外的之前所有語言模型。
Liu et al. (2023) 又使用多任務微調(MFT)進一步訓練了 Code LLaMA,得到了 CodeFuse-CodeLLaMA,其在 HumanEval 上的 pass@1 性能為 74.4,超過了 OpenAI 報告的 GPT-4 的性能。
盡管這些模型基本都是使用 CLM 預訓練的 Transformer 解碼器,但研究者也在不斷改進這種架構,引入了并行注意力、MQA、RoPE 等新方法。
專用于代碼的語言模型
隨著 GPT 和 BERT 等預訓練 Transformer 在自然語言處理方面取得巨大成功,此類模型架構、學習范式和訓練目標很快被軟件工程社區采用,打造出了用于代碼理解和生成的專用模型。表 3 給出了這些預訓練模型的概況。
代碼訓練數據集
現在已經有許多大規模的代碼預訓練數據集,包括 CodeSearc.NET、CodeParrot、Stack;它們分別包含 20GB、50GB 和 3TB 代碼文檔(見表 2)。
編碼器
Kanade et al. (2020) 在代碼語料庫上重復了 BERT 的訓練過程,得到了 CuBERT。而 Feng et al. (2020) 則在 CodeSearchNet 上使用 MLM 和 ELECTRA 的 RTD 訓練得到了 CodeBERT。他們還利用了 CodeSearchNet 中的顯式「文本 - 代碼」對,并將它們分別用作 BERT 輸入的第一和第二段。
除了這些標準的訓練目標之外,研究者還引入了許多專為代碼任務設計的輔助目標。GraphCodeBERT 和 SynCoBERT 會從源代碼中提取圖(graph),各自對應于數據流圖和抽象語法樹,然后它們借此訓練模型來預測節點之間的類型關系;另外 SynCoBERT 和 Code-MVP 還在預訓練階段以標記的形式添加了類型推理。
另一個常用目標是對比學習:SynCoBERT 和 Code-MVP 會對比輸入的不同角度(比如代碼、注釋、AST 和經過轉換的代碼);而 DISCO 則會通過混淆等保留語義的變換來構建正例樣本對,通過注入人工錯誤來構建負例樣本對。
編碼器 - 解碼器
相比于僅編碼器模型,編碼器 - 解碼器自然更強大,因為它們可以用于條件文本生成,而它們的編碼器部分始終可以單獨用于執行需要僅編碼器架構的任務,例如回歸。
受編碼器 - 解碼器架構進步的激勵,研究社區已經提出了許多用于代碼處理的此類模型。
PyMT5 (Clement et al., 2020) 和 Mastropaolo et al. (2021) 在代碼語料庫上重復了 T5 的預訓練和多任務微調過程,而 Ahmad et al. (2021) 則提出了 PLBART,這是在 655GB 的 Java、Python 和自然語言組合數據上預訓練的 BART 模型。Lachaux et al. (2021) 認為 MLM 對于編程語言來說可能是一項過于簡單的任務,因為標識符名稱經常在單個上下文窗口中出現多次;他們提出了一種去混淆預訓練目標,即模型的訓練目標是將經過混淆的代碼轉換成原有形式。
基于這些之前的研究成果,Wang et al. (2021) 提出了 CodeT5,其預訓練使用了 T5 原有的 span corruption、標識符標記、掩碼式標識符預測、文本到代碼和代碼到文本生成。其后繼模型 CodeT5+ 則從 UL2 獲得了靈感,將因果語言建模(CLM)引入了預訓練過程,此外還有基于文本 - 代碼匹配的對比目標。
Li et al. (2022) 的 AlphaCode 也使用了多個訓練目標:其編碼器用 MLM 訓練,解碼器用 CLM 訓練,此外還有淺編碼器和深解碼器、多查詢注意力等架構上的調整;其模型規模也比 CodeT5 大很多,多達 410 億參數。
Chakraborty et al. (2022) 的 NatGen 的預訓練則使用了一個類似于去混淆的「自然化(naturalization)」目標:通過循環變換、死代碼注入和變量重命名等預定義操作生成語義上等效但不自然的代碼,然后訓練模型將這些不自然的代碼轉譯回其原始形式。
除了這些一般性預訓練目標之外,一些研究工作訓練 Transformer 編碼器 - 解碼器時的重點是代碼轉譯,這是 Transformer 模型在代碼方面的一個自然應用,畢竟 Transformer 架構最早就是 Vaswani et al. (2017) 為機器翻譯任務提出的。但是,不同于自然語言,代碼的并行數據很少。
為了解決這個問題,Rozière et al. (2020) 提出了 Transcoder,其首先使用 XLM 預訓練一個編碼器,然后使用這個編碼器初始化一個基本的 Transformer,再繼續使用去噪自動編碼(DAE)對其進行預訓練并轉譯回去;之后的 Szafraniec et al. (2023) 還使用了與語言無關的中間表征來增強這一過程。
除了訓練數據和目標之外,這些模型大多保留了 NLP 社區提出的原始架構,如表 3 所示。
解碼器
GPT-3 歷史的發布以及上下文學習方法出現之后,僅解碼器 Transformer 模型已經成為語言建模的主導技術。在代碼處理領域,也出現了許多類似使用 CLM 預訓練的模型,比如 GPT-C、CodeGPT、PolyCoder、CodeGen、PyCodeGPT、Pangu-Coder、CodeGeeX、Phi-1、CodeFuse、CodeShell、DeepSeek Coder。這些模型中有一些實驗了其它的訓練目標,比如 Pangu-Coder 用了 MLM 和 Masked CLM,但這樣的表現并不及僅使用 CLM 訓練的方法。Zan et al. (2022) 還提出了在草案(sketch)上進行持續訓練,也就是讓模型學習先生成程序的草案,然后再實際寫代碼。
盡管 Christopoulou et al. (2022) 報告說去噪目標的表現不及僅解碼器模型,但也有一些研究工作將去噪或多任務預訓練與解碼器架構結合到了一起。Incoder、SantaCoder 和 StarCoder 的訓練都使用了中間填入(FIM/fill-in-the-middle)目標(也被稱為因果掩碼),其本質上就是僅解碼器架構采用的 span corruption。這些填入目標有一個明顯優勢:它們可以讓模型有能力在推理時間填補輸入代碼中間的空白部分,而 CLM 只允許自回歸生成。但是,如表 4 所示,相比于 CodeGen 等僅 CLM 模型,這些目標也會提升模型在下游任務上的性能表現。
UniLM
一些研究者也將 UniLM 這另一種 Transformer 模型用在了代碼處理上。CugLM 通過交替的注意力掩碼使用了 CLM 和 MLM + NSP,而 UniXcoder 的訓練則使用了 CLM、MLM、Span Corruption 以及對比學習和文本 - 代碼雙向生成等輔助目標。但是,這兩個模型的規模都相對較小,因此這種架構究竟是否適合代碼處理還有待探索。
擴散模型
雖然目前主導文本生成領域的是 Transformer 架構,但也有一些研究者探索了使用計算機視覺領域的擴散模型(Diffusion Model)來生成文本。
近期的 CodeFusion 將擴散模型引入了代碼建模領域,并且研究表明:一個 7500 萬參數的擴散模型在三個代碼合成數據集上取得了優于 StarCoder、CodeT5+ 和 GPT-3 的表現。
用于代碼的指令微調和強化學習
跟隨自然語言領域的研究成果,代碼社區的研究者也已經在使用指令微調技術。Wang et al. (2023) 使用 InstructGPT 生成的 2 萬個指令數據對 CodeT5+ 進行了微調,得到了 InstructCodeT5+。WizardCoder 按照 WizardLM 的方法,將 2 萬代碼的 Alpaca 樣本演進成了一個 78K 的數據集,并使用其來微調 StarCoder。Pangu-Coder 2 也使用 WizardLM 的 Evol-Instruct 從 2 萬代碼的 Alpaca 生成了 6.8 萬個指令樣本,其還通過排名響應(Rank Responses)引入了強化學習來對齊測試與教師反饋(RRTF)。
OctoCoder 則采用了另一條路徑,其是使用 Git 提交歷史作為指令數據來微調 StarCoder 和 CodeGeeX2。更近期的 CodeFuse 還使用了多任務微調,顯式地將多個下游任務引入到了指令數據中。表 4 也給出了這些經過指令微調的代碼模型的性能。
在 NLP 領域,另一個與指令微調緊密關聯的技術是根據人類反饋的強化學習(RLHF),其在對齊 LLM 與人類價值方面發揮了重要作用。將強化學習用于代碼有一個很自然的優勢,因為編譯器可以自動為語言模型生成的代碼樣本生成反饋。
CodeRL 就是一個這樣的模型,其會為每個生成的程序定義四個層級的獎勵(即編譯錯誤、運行時錯誤、單元測試失敗、通過)以及由一個 critic 模型估計的細粒度的 token 層面的獎勵。其 actor 模型擴展自 CodeT5,然后再使用 REINFORCE 算法訓練。類似地,CompCoder 和 PPOCoder 使用近端策略優化(PPO)分別訓練了 CodeGPT 和 CodeT5,而 RLTF 則提出基于編譯器提供的報錯信息和位置給出細粒度反饋,并使用考慮了已通過測試案例比例的適應性反饋。
語言模型所用的代碼特征
編程語言和自然語言的一大主要差異是:前者是人工定義的,力求精確無歧義,并且需要在執行之前無錯誤地編譯(或解釋)。這樣一來,除了 CLM、MLM 和 Span Corruption 等詞匯操作之外,在設計代碼的預訓練目標方面會有更大的靈活性。
編程語言在句法特征等方面有很大的優勢。C、Python 和 Java 等每個主流編程語言都有現成可用的編譯器工具包,可以輕松且準確地提取出程序的語義信息,比如抽象語法樹(AST)、與語言無關的中間表征(IR)以及每個 token 的類型和控制 / 數據流圖(CFG/DFG)等輔助信息。因此,對于用于代碼的 Transformer 式語言建模,很多研究工作將這些特征整合進了他們的訓練流程。
抽象語法樹和中間表征
Jiang et al. (2021) 提出的 TreeBERT 是最早嘗試把 AST 用于基于 Transformer 的預訓練 - 微調框架的模型之一。這是一個 Transformer 編碼器 - 解碼器模型,其預訓練使用了 Tree MLM 和 Node Order Prediction。
之后還出現了 SynCoBER、SPT-Code 和 UniXcoder 等研究成果,詳見原論文。
在編譯流程中,AST 后面通常跟著與語言無關的中間表征,比如 LLVM IR。這種獨立于特定編程語言的特征讓它們非常適合作為轉譯中樞。
控制流和數據流
盡管研究已經證明 AST 和 IR 對特定任務(如代碼轉譯)來說很有用,但它們本質上是靜態的,就像源代碼一樣,并且可能無法捕獲僅在運行時揭示的代碼的語義屬性。而控制流和數據流等動態特征中包含這樣的語義。
類似于 AST,在預訓練 Transformer 興起之前,要使用專門的網絡來處理這樣的信息,比如 ProGraML 使用的消息傳遞神經網絡。但是不同于 AST,即使在預訓練 Transformer 變得主流之后,也少有研究探索這個方向。
GraphCodeBERT 就是這樣一項研究,其會為流圖中的變量創建特殊的 token 和位置嵌入,并將這個變量序列連接到文本和源代碼后面來構建模型輸入,其還使用了針對代碼和變量段定制的注意力掩碼。
類型
除了 AST、IR 和數據流,類型信息也會被用于輔助語言模型處理代碼。舉個例子,CugLM 在微調階段使用了類型信息來輔助單向 MLM (即有單向注意力掩碼的 MLM)的 token 預測:首先是根據最終 Transformer 層的表征預測掩碼 token 的類型,然后基于隱藏表征和預測的類型預測 token 本身。相比之下,CodeT5 和 SynCoBERT 的預訓練目標中都包含標識符標記,這可以被視為粗粒度的類型預測。
值得一提的是,Wang et al. (2022) 將上述的許多特征整合進了 Code-MVP:源代碼、文檔字符串、AST、CFG 以及通過標識符重命名、循環交換和死代碼插入等方式轉換過的源代碼。該模型是從 GraphCodeBERT 初始化,然后使用 MLM、細粒度的類型預測和不同角度的對比學習(比如文本與代碼、代碼與 AST、代碼與 CFG)來進行訓練。
軟件開發中的 LLM
隨著語言模型在軟件工程基準上創造新記錄,軟件工程技術也正反過來擴展語言模型的邊界,并將其帶入現實世界的開發周期。
使用編程工具擴展 LLM
NLP 社區的研究已經表明 LLM 可以學習使用外部工具,比如計算器、機器翻譯系統和搜索引擎。因此可以使用解釋器來增強 LLM 處理復雜推理任務的能力。PAL 和 PoT 都使用了 Python 解釋器來擴展 Codex,使其具備數值計算能力,而 ViperGPT 則是通過調用視覺 API 進行了進一步擴展,使其可以提取視覺輸入的信息并回答相關問題。
除了減輕抽象的推理任務中數值計算的負擔,解釋器也可對代碼生成過程本身提供反饋以及進行單元測試。CodeT 和 TiCoder 使用 Codex 來生成單元測試,這些測試運行在生成的代碼樣本上,可以提升模型在代碼合成上的性能。類似地,TransCoder-ST 通過執行代碼轉譯的外部單元測試增強了 TransCoder 和 DOBF。另外,單元測試的執行結果可作為代碼強化學習的自然監督信號。
值得一提的是,OpenAI 在 2023 年 3 月為 ChatGPT 發布了一個解釋器插件,該插件可以接受用戶的文件輸入,根據用戶指令生成代碼,并通過實時執行提供反饋。Zhou et al. (2023) 的研究表明這一功能讓 GPT-4 可以自我調試。
在 LLM 研究中,一個與使用工具緊密關聯的主題是作為智能體進行規劃,理論和實驗研究均表明這可以提升 LLM 的能力。Ruan et al. (2023) 發現 LLM 可以使用外部 SQL 生成器和 Python 生成器進行規劃來解決復雜任務,而 CodePlan 可通過自適應規劃執行代碼庫層面的編程。
另一類工作是使用 LLM 來創建用于代碼生成的多智能體系統,比如 self-collaboration、ChatDev 和 MetaGPT。在這些框架中,多個 LLM 各自扮演著不同的角色,比如編程者、審查者和管理者。這些角色相互交互,將代碼生成任務分為不同的階段(比如設計、寫代碼、測試和做文檔),并通過協作來完成復雜任務。
將 LLM 整合進軟件開發
隨著 LLM 的交互式編程能力的提升,研究者已經開始將其整合進軟件開發的整個過程中。
自動代碼補全是語言模型在軟件開發領域的最早期應用之一,因為這一任務只需要預測下一 token 的能力。即使是在語言模型的規模達到數十億參數之前,就已經有人將 Pythia 和 IntelliCode 等代碼補全系統整合進常用的 IDE 了。
不過近段時間,代碼語言模型的應用已經超越了簡單的代碼補全。GitHub Copilot 可以說是最流行的 AI 編程助理之一,其具備非常多功能,包括代碼生成、漏洞檢測和證書管理,而 CodeFuse 也將代碼生成、代碼轉譯、代碼注釋和測試用例生成整合成了單一的 IDE 插件,但是,隨著代碼語言模型越來越大,它們的客戶端部署和實時性能也遭遇了新的挑戰。
隨著 LLM 持續發展,基于它們構建應用本身也正在變成一項具有重要價值的任務。目前已經出現了許多針對此類應用的開源框架,包括 LangChain、AutoGPT 和 WorkGPT。
總結和挑戰
這份綜述系統性地回顧了使用預訓練 Transformer 語言模型處理代碼的歷史,并強調了它們與一般領域預訓練模型的關系,還進行了比較。
代碼建模的進步通常緊隨 NLP 的歷史進程:從 SMT 模型發展到 NMT 模型,然后到微調的預訓練 Transformer,最后到 LLM 的少樣本應用甚至現實世界產品中的自主智能體。
不用于自然語言,代碼的本質讓我們可以輕易從不同角度提取輔助信息,并利用解釋器和單元測試來獲取自動反饋。
在此基礎上,作者最后指出了當前代碼建模領域所面臨的一些挑戰:
- 為了將代碼 LLM 推進至下一階段,需要一些全面的基準
- 獲取高質量數據
- 將代碼特征整合進語言模型
- 將 LLM 用于更多代碼下游任務
- 其它可替代的模型架構和訓練目標
- 構建用于軟件開發整個生命周期的代碼 LLM 生態系統
- 與代碼 LLM 相關的安全和道德倫理問題