CodeT5
CodeT5是由Salesforce研究院提出的代码预训练模型,属于基于Transformer的编码器—解码器结构,2021年发表于自然语言处理会议EMNLP。它在T5架构基础上引入标识符感知的去噪预训练任务,使模型能够区分并还原代码中的变量名、函数名等标识符,同时兼顾代码理解与代码生成两类任务。研究者用约835万个函数、8种编程语言的数据完成预训练,并在CodeXGLUE基准的14个子任务上取得当时的最好结果。
定义
CodeT5是一种面向编程语言的预训练模型,采用编码器—解码器(encoder-decoder)的Transformer结构,由Salesforce研究院的Yue Wang、Weishi Wang、Shafiq Joty与Steven C. H. Hoi提出,成果发表于2021年11月举行的自然语言处理实证方法会议(EMNLP)[1]。它同时接受纯代码输入和“自然语言—代码”成对输入,通过预训练获得编程语言与自然语言的通用表示,再经微调完成具体任务[2]。
与只使用编码器或只使用解码器的早期代码模型不同,CodeT5把代码理解与代码生成放在同一框架内处理,并支持多任务学习[1]。其核心设计是把代码中由开发者命名的标识符当作重要线索,让模型在预训练阶段学习识别这类词元,并在它们被遮蔽后还原[2]。按公开资料,原始CodeT5包含CodeT5-small与CodeT5-base两个规模的检查点,参数约为6000万与2.2亿。
原理
CodeT5沿用T5的编码器—解码器框架。预训练数据中的代码片段若不附带注释,就以单模态形式输入;若带有开发者书写的说明文字,则把自然语言序列与代码序列用分隔符拼接后一同送入编码器[2]。为了让模型抓住代码特有的信息,研究者把代码解析为抽象语法树,据此标出每个词元是否为标识符,形成一串二值标签[2]。
在目标函数上,CodeT5组合了三项任务:掩码跨度预测(MSP)随机遮蔽长度不等的代码片段,要求解码器依据哨兵标记复原;标识符标注(IT)判断各词元是否属于标识符;掩码标识符预测(MIP)把同一标识符的所有出现位置替换为同一哨兵标记,再由模型还原[2]。在此基础上,模型还在代码与注释构成的成对数据上做双向对偶生成训练,即由代码生成注释、由注释生成代码,以加强两种模态之间的对齐[2]。
消融实验显示,去掉任一项预训练目标都会使多数任务的表现下降,其中去掉掩码跨度预测对生成类任务影响最大,去掉掩码标识符预测则对代码缺陷检测的损害最明显,说明它们分别侧重语法信息与语义信息[2]。下游使用时,所有任务都被统一改写为序列到序列的生成形式,输入代码或自然语言,输出目标文本[3]。
发展历程
CodeT5的预训练语料以CodeSearchNet为主,涵盖Python、Java、JavaScript、Ruby、Go、PHP 6种语言的单模态与双模态数据,作者另外从开源代码托管平台收集了C与C#的数据,使覆盖语言达到8种,预训练实例合计约835万个[4]。论文于2021年9月以预印本形式公开,同年稍后在EMNLP 2021正式发表,页码为8696至8708[5]。研究团队在代码托管平台公开了源码与预训练检查点[1]。
2023年,同一团队推出后继系列CodeT5+,由Yue Wang、Hung Le、Akhilesh Deepak Gotmare、Nghi D. Q. Bui、Junnan Li与Steven C. H. Hoi合作完成,发表于EMNLP 2023[6]。CodeT5+在原有编码器—解码器结构上增加模块组合方式,可分别以仅编码器、仅解码器或编码器加解码器的形态运行,并把规模从2.2亿、7.7亿扩展至20亿、60亿与160亿参数[7]。
应用
CodeT5的典型用法是针对具体任务做微调。论文在CodeXGLUE基准上评测了代码缺陷检测、克隆检测两项理解任务,以及代码摘要、代码生成、代码翻译、代码精化等生成任务,并报告在14个子任务上取得当时的最好成绩[2]。研究工作还把多个任务合并训练,用任务控制码作为输入前缀,验证了多任务学习在代码精化等任务上的可行性[2]。
在工程侧,Salesforce曾以CodeT5为基础做出一个编辑器插件演示,为Apex开发者提供由自然语言描述生成代码、按函数名补全函数体、为函数生成自然语言摘要三项功能[8]。研究者也把CodeT5作为基线,用于自动程序修复、代码注释生成等方向的实验与改进[9]。公开的预训练权重可从模型托管平台获取,并以序列到序列模型的形式加载[4]。
局限
原始CodeT5的规模有限。据公开的对比数据,CodeT5-base约2.23亿参数,base与large两档分别为2.2亿与7.7亿,输入与输出长度上限均为512个词元[7]。这一体量使其在零样本场景下的能力有限,多数任务需要额外微调才能发挥作用,预训练检查点本身主要用于下游微调而非直接使用[4]。
预训练目标之间也存在取舍。论文指出,双向对偶生成任务对自然语言与代码之间的转换有帮助,但对代码到代码的生成任务以及部分理解任务没有增益,甚至可能带来轻微下降,其副作用是使模型更偏向自然语言—代码类任务[2]。此外,训练语料取自开源仓库中的代码与注释,其中可能带有性别、种族等刻板印象,并被模型继承下来;预训练本身也需要相当可观的计算资源[2]。模型卡同时说明,该发布仅面向研究用途,团队并未针对所有下游场景做设计与评估[4]。
参见
参考资料
- aclanthology.org 上的网页 [引用日期2026-10-29]
- arxiv.org 上的网页 [引用日期2026-10-29]
- arxiv.org 上的网页 [引用日期2026-10-29]
- codet5-base [引用日期2026-10-29]
- citations [引用日期2026-10-29]
- citations [引用日期2026-10-29]
- README [引用日期2026-10-29]
- license: openrail [引用日期2026-10-29]
- openArticlePDF [引用日期2026-10-29]