核心发现
方法论
CERT将库导向代码生成拆为两个阶段:sketcher先把用户定义常量或名称匿名化,预测抽象代码草图;generator再接收“草图+原始上下文”,补全具体代码。两者均从PYCODEGPT或CODEGEN出发,在无标注库代码上持续预训练。sketcher采样200个候选草图并取众数,训练目标仍是自回归语言建模。
关键结果
- 在PandasEval上,PYCODEGPT-CERT的pass@1为28.42%,较PYCODEGPT的12.75%提升15.67个百分点;pass@10和pass@100分别为48.04%与60.96%,显示草图不仅提高首选答案,也改善候选覆盖。
- 在NumpyEval上,CODEGEN-CERT达到32.00% pass@1、49.45% pass@10和67.82% pass@100,分别比CODEGEN高12.69、8.56和7.24个百分点;110M参数的PYCODEGPT-CERT在PandasEval上还超过175B参数GPT-3的12.97%。
- 默认仅匿名化用户定义常量最有效;CERT-N和CERT-NC在PandasEval上的pass@1分别为23.66%和19.07%。sketcher草图精确匹配率较基线在PandasEval、NumpyEval分别高15.20和14.21个百分点。
研究意义
论文针对真实软件开发中“需要调用大量第三方库、却缺少成对文本—代码标注”的长期瓶颈。它说明未标注代码不仅能学习语法,还能通过API使用模式提供结构化监督。PandasEval和NumpyEval把库调用能力从通用HumanEval中分离出来,为研究更贴近数据分析实践的代码生成建立了可执行评测。结果表明,小模型结合领域持续预训练,可能以远低于超大模型的成本获得实用能力。
技术贡献
技术核心不是简单继续训练,而是构造两种互补训练语料。sketcher语料把原文件整体匿名化,学习从上下文预测API结构;generator语料将每个代码块按“草图块—真实块”交叉拼接,模拟草图提示下的细节恢复。该设计无需文本—代码对,也无需额外监督损失。实验还系统比较常量、名称及二者联合匿名化,揭示草图抽象程度与库任务性能之间的权衡。
新颖性
相较Coarse-to-Fine和PLOTCODER等依赖标注对进行微调的方法,CERT把草图思想迁移到无标注代码的持续预训练阶段。其新意在于以自动变换代码产生训练信号,并把库特定子语料作为知识载体,而非在全量通用代码上泛化草图模式。
局限性
- 评测仅覆盖Python的Pandas和NumPy,各自101题;结论对其他语言、库和更复杂多库组合的可迁移性尚未验证。
- sketcher、generator各训练100K步且需要抽取库文件、重写代码块;200次采样和多温度推理也增加计算成本,论文未提供完整推理开销分析。
- 匿名化规则依赖预定义符号,过度抽象会损失语义;CERT-NC性能下降说明草图并非越抽象越好。
未来方向
后续可扩展到更多库、跨库调用和多语言代码,研究自动发现匿名化粒度、结构感知分块及更强的检索增强。还应报告训练与推理成本,并结合静态分析、执行反馈或测试生成,让generator根据运行结果迭代修正草图和实现。
AI 总览摘要
代码生成模型通常依赖昂贵的文本—代码配对数据,但第三方库的数量巨大,难以为每个API场景标注足够样本。CERT关注这一缺口:库代码往往重复相似的调用结构,只是变量、常量和名称不同。论文据此提出一种无需配对标注的持续预训练方案,并构建PandasEval、NumpyEval两个各含101道题的真实库代码基准。
CERT包含sketcher和generator。前者把用户定义常量或名称替换为string、number、variable等预定义符号,学习预测抽象草图;后者把草图与上下文拼接,恢复具体实现。训练时,sketcher使用匿名化库文件,generator使用“草图代码块—原始代码块”交叉文件。模型从110M参数PYCODEGPT或350M参数CODEGEN出发,各持续训练100K步,不需要人工文本—代码对。
结果显示,PYCODEGPT-CERT在PandasEval上达到28.42% pass@1,相比12.75%的基线提升15.67个百分点;在NumpyEval上为31.47%,较基线提升13.43个百分点。CODEGEN-CERT在NumpyEval达到32.00%,较CODEGEN提升12.69个百分点。CERT还超过部分超大模型:PandasEval上110M参数模型的pass@1为28.42%,高于GPT-3的12.97%。不过,实验局限于两个Python库,且匿名化规则与额外采样带来成本。总体而言,论文展示了“结构先行、细节后补”如何把未标注代码转化为库使用知识。
深度分析
研究背景
预训练推动了CodeGPT、CodeParrot、GPT-Neo、Codex等代码模型的发展;Codex 12B在HumanEval达到28.81% pass@1。但HumanEval主要测试独立函数,不能充分衡量Pandas、NumPy等API密集型任务。现实中超过40%的带Python标签StackOverflow问题还带至少一个库标签,说明库使用是重要需求。
核心问题
目标是在给定自然语言注释、导入语句和变量上下文x时生成目标代码y。难点在于库数量多、API组合复杂、可靠文本—代码对稀缺;直接生成完整代码还容易在变量常量和调用结构上同时出错。论文探索如何仅利用未标注代码学习库特有的可复用结构。
核心创新
- ��提出CERT,将生成分为sketcher与generator。
- ��以自动匿名化构造草图监督,避免人工标注。
- ��从库特定子语料训练,而非仅依赖通用代码。
- ��通过交叉拼接草图块与真实块,模拟推理时的条件生成。
- ��发布PandasEval和NumpyEval,并使用测试执行定义正确性。
方法详解
- ��数据:从PYCODEGPT的13.0M Python文件中抽取约0.61M个Pandas文件和2.62M个NumPy文件。
- ��草图:对文件d执行匿名化,得到d̄;默认仅替换用户定义常量,也测试CERT-N和CERT-NC。
- ��sketcher:在d̄上持续预训练100K步,输入x、输出s;推理采样200个候选并取众数。
- ��generator:将d与d̄按完整函数或类切分为块,形成[d̄1,d1,…,d̄K,dK],持续预训练100K步。
- ��生成:先算s=MS(x),再算y=MG([s;x]);完整草图直接输出,空草图则仅使用x。
实验设计
基准来自高票且有采纳答案的StackOverflow帖子,经人工整理、润色和测试。PandasEval与NumpyEval各101题;函数题通常有20个测试用例,非函数题有1个。比较PYCODEGPT、CODEGEN、XL持续预训练模型、CodeT5、CodeGPT-Adapted、CodeClippy、CodeParrot,并报告pass@1/10/100。每题生成200个样本,使用Chen等人的无偏估计;训练窗口1024、学习率5e-4、FP16。
结果分析
PYCODEGPT-CERT在PandasEval为28.42/48.04/60.96%(pass@1/10/100),显著高于PYCODEGPT的12.75/37.80/59.65%。在NumpyEval,CODEGEN-CERT为32.00/49.45/67.82%,高于CODEGEN的19.31/40.89/60.58%。CERT对不同API数量的题目均稳定提升。CERTg在HumanEval仅为8.25% pass@1,说明库特定语料是关键。默认常量匿名化优于名称或联合匿名化。
应用场景
CERT适合数据分析助手、Notebook代码补全、StackOverflow问答辅助、企业内部Python脚本生成和API迁移工具。部署前需要目标库代码语料、可执行测试或静态检查,以及明确的安全隔离。其小模型优势适合本地IDE和受限算力环境,但生成结果仍须执行验证。
局限与展望
研究只验证Pandas和NumPy,不能证明对深度学习、数据库或跨语言库有效。预定义符号和人工分块可能依赖Python风格;复杂控制流、多个库联用和隐含数据语义仍可能失败。训练两个模型各100K步、推理采样200次会增加成本。未来应结合检索、执行反馈、自动草图学习和更多真实软件工程任务。
通俗解读 非专业人士也能看懂
把CERT想成一家做菜的厨房。顾客先说“用这袋米和蔬菜做一份炒饭”,普通厨师可能直接从头猜每个步骤,既要选锅,又要决定火候,还要处理食材名称,容易出错。CERT先安排一位“菜单设计师”:他不关心具体是哪袋米、哪种数字或名字,只画出“洗菜—下锅—翻炒—调味”的步骤草图。这就是sketcher。
接着,另一位“厨师”拿着草图和顾客提供的食材信息,把抽象步骤变成真正的菜:使用具体变量、具体数值和正确的Pandas或NumPy操作。这就是generator。训练时,厨房不需要顾客逐字说明每道菜,只要收集大量已经做过的菜,再把其中的食材名称临时换成通用标签,让两位员工分别练习看步骤和还原细节。
这种方法有效,是因为同一类菜常有相似做法。实验中,CERT让110M参数模型在PandasEval达到28.42%首个正确答案率,而原模型只有12.75%。但草图不能画得太粗,否则会丢掉重要信息;也不能把所有名字都抹掉。论文发现只隐藏用户常量通常最好。最后,真实厨房仍应试吃或检查,模型生成的代码也必须运行测试。
简单解释 像给14岁少年讲一样
想象你在游戏里搭建一座桥。题目告诉你桥要连接哪里、材料放在哪儿。一个普通机器人要一次性猜完整设计:木板数量、每块位置、颜色和编号,猜错一个细节就可能塌掉。CERT让它先画一张“桥梁草图”:这里放横梁,那里放支柱,先保证结构合理,再把具体数字和名字填进去。
它有两个小机器人。Sketcher负责画草图,Generator负责把草图变成能运行的代码。它们不是靠老师给出的无数标准答案学习,而是阅读大量已有Python代码。学习时,系统把变量名和数字换成“名字”“数字”这样的标签,让Sketcher专心学习常见结构;Generator则练习把抽象结构和真实代码配起来。
效果很酷:在PandasEval中,原来的110M参数模型第一次生成正确答案的概率是12.75%,CERT提高到28.42%;在NumPy任务中,350M参数CODEGEN-CERT达到32.00%。这说明先想“怎么搭”,再想“用哪些具体材料”,比一上来乱猜细节更稳。
当然它不是魔法。题目只测试Pandas和NumPy,复杂项目可能更难;如果草图删掉太多信息,机器人反而会迷路。所以实际使用时仍要运行测试,就像游戏里要检查桥能不能承重一样。未来它可以学习更多库,甚至根据报错自动修改代码。
术语表
Sketch / 代码草图
隐藏部分用户定义细节后的代码结构,保留API调用和控制流程。它代表可复用的库使用模式。
CERT先预测草图,再由generator填充具体常量和名称。
Continual pre-training / 持续预训练
在已有语言模型基础上,使用新的领域语料继续进行自回归训练。它不同于依赖人工标签的任务微调。
sketcher和generator均从PYCODEGPT或CODEGEN持续训练100K步。
Sketcher / 草图器
根据上下文预测目标代码抽象结构的模型。其输出可以是部分匿名代码,也可以是完整代码。
CERT使用200个候选草图的众数作为推理结果。
Generator / 生成器
以草图和原始上下文为条件,生成包含具体细节的完整代码模型。
训练语料按草图块与原始块交叉拼接构造。
pass@k
从每道题生成k个候选时至少一个正确的概率估计。论文每题生成200个样本,并用无偏公式计算。
主要报告PandasEval和NumpyEval的pass@1、pass@10、pass@100。
PandasEval / NumpyEval
面向Pandas和NumPy库代码生成的执行评测基准。每个基准包含101道来自StackOverflow的问题。
用于检验模型的库API调用与实际功能正确性。
开放问题 这项研究留下的未解疑问
- 1 CERT为何在不同库上的最优匿名化粒度不同?现有实验只比较三种人工规则,尚未建立能够根据API语义自动选择抽象层级的机制。
- 2 草图错误与最终代码错误之间的因果关系仍不清楚。generator有时能修正不完全正确的草图,但论文没有系统量化这一容错边界。
- 3 真实项目常同时调用多个库并依赖外部数据。如何结合检索、类型信息、执行反馈与安全约束,仍是开放问题。
应用场景
近期应用
IDE数据分析补全
开发者提供注释、导入语句和变量上下文后,CERT先预测Pandas或NumPy操作结构,再生成具体代码。企业可用内部库代码继续训练,并用单元测试过滤不安全或不可执行结果。
StackOverflow问答辅助
系统可把用户问题转成库调用草图,再生成解释和示例代码。部署需要检索相关API文档、执行测试并保留人工审核,以减少版本差异和错误调用。
远期愿景
可验证的多库编程代理
未来代理可先规划跨库草图,再调用检索、类型检查和运行反馈逐步实现任务。若能扩展到更多语言,将把无标注代码转化为可执行的软件工程知识。
原文摘要
Code generation is a longstanding challenge, aiming to generate a code snippet based on a natural language description. Usually, expensive text-code paired data is essential for training a code generation model. Recently, thanks to the success of pre-training techniques, large language models are trained on large-scale unlabelled code corpora and perform well in code generation. In this paper, we investigate how to leverage an unlabelled code corpus to train a model for library-oriented code generation. Since it is a common practice for programmers to reuse third-party libraries, in which case the text-code paired data are harder to obtain due to the huge number of libraries. We observe that library-oriented code snippets are more likely to share similar code sketches. Hence, we present CERT with two steps: a sketcher generates the sketch, then a generator fills the details in the sketch. Both the sketcher and the generator are continually pre-trained upon a base model using unlabelled data. Furthermore, we craft two benchmarks named PandasEval and NumpyEval to evaluate library-oriented code generation. Experimental results demonstrate the impressive performance of CERT. For example, it surpasses the base model by an absolute 15.67% improvement in terms of pass@1 on PandasEval. Our work is available at https://github.com/microsoft/PyCodeGPT.