PanGu-Coder: Program Synthesis with Function-Level Language Modeling

TL;DR

PanGu-Coder以两阶段函数级训练,在HumanEval上317M模型pass@1达17.07%。

cs.LG 🟡 进阶级 2022-07-23 23 次浏览
Fenia Christopoulou Gerasimos Lampouras Milan Gritta Guchun Zhang Yinpeng Guo Zhongqi Li Qi Zhang Meng Xiao Bo Shen Lin Li Hao Yu Li Yan Pingyi Zhou Xin Wang Yuchi Ma Ignacio Iacobacci Yasheng Wang Guangtai Liang Jiansheng Wei Xin Jiang Qianxiang Wang Qun Liu
程序合成 代码语言模型 PanGu-α 函数级建模 功能正确性

核心发现

方法论

模型采用PanGu-α的单向、仅解码器Transformer,并增加Query Layer,以位置嵌入查询下一词表示。阶段一用Causal Language Modeling(CLM)在Python原始数据上训练188B tokens;阶段二从docstring–函数体配对数据出发,联合CODE-CLM与Docstr-MLM或Docstr-MCLM,强化自然语言到代码的条件生成。

关键结果

  • HumanEval上,317M模型达到pass@1/10/100=17.07/24.05/34.55%,超过同规模CodeX 300M的13.17/20.37/36.27%(pass@1、10更高)。2.6B模型为23.78/35.36/51.24%,pass@1高于CodeX 2.5B的21.36%。
  • MBPP上,317M与2.6B模型分别取得pass@1=16.20%和23.00%;2.6B超过6.7B InCoder的19.40%,且上下文仅1024、训练数据147GB,显示数据与上下文效率。
  • 模型使用n=200次采样和Chen等人的无偏pass@k估计;较低k表现尤其强,但pass@100落后CodeGen Mono,作者推测较短上下文限制了长程序与长描述建模。

研究意义

论文把代码生成评价从表面相似度进一步聚焦到可执行功能正确性。结果说明,中等规模模型通过函数级数据组织、目标函数设计和针对性预训练,可以在较少数据、较小上下文下达到大型代码模型的竞争力。这为资源受限的企业部署、IDE辅助编程和可控代码生成提供了证据,也提示模型规模并非唯一决定因素。

技术贡献

核心贡献包括:将PanGu-α的Query Layer用于Python程序合成;提出CLM预训练加函数级对齐训练的两阶段方案;在阶段二分离docstring与代码损失,定义CODE-CLM、Docstr-MLM和Docstr-MCLM组合;通过AST抽取函数、签名、docstring并去重;使用Temperature与Nucleus Sampling评估功能正确性,并对缺失依赖执行自动导入以减少评测偏差。

新颖性

创新不在于首次使用Transformer生成代码,而在于把松散网络代码转化为函数级自然语言—代码样本,并针对“输入描述、输出函数体”的结构重新设计训练损失。相较仅连续拼接数据并做CLM的GPT类模型,PanGu-Coder明确区分上下文理解和代码续写目标,形成更贴近text-to-code的预训练流程。

局限性

  • 当前只支持英文提示和Python输出;函数级训练常缺少全局依赖,因此生成代码可能无法直接运行,论文用自动导入补救,不能完全替代真实工程环境。
  • 上下文窗口固定为1024,长描述、复杂算法和长函数易受截断或记忆不足影响,导致pass@100低于使用更长上下文和更多数据的CodeGen Mono。

未来方向

后续可扩展到多种编程语言、完整项目上下文和真实依赖环境;结合竞争编程与持续集成测试进行PanGu-Coder-FT微调;进一步研究更长上下文、检索增强、执行反馈和阶段二损失权重,以提升复杂程序和高k采样成功率。

AI 总览摘要

程序合成的目标,是让模型根据自然语言问题写出真正能运行的代码。传统代码模型往往依赖巨大数据和长上下文,并且文本相似不等于功能正确。PanGu-Coder选择更细粒度的函数级任务:输入英文docstring和函数签名,输出Python函数体,并以HumanEval与MBPP中的隐藏测试判断程序是否解决问题。

模型基于PanGu-α解码器架构,顶部增加Query Layer。训练分两阶段:第一阶段以CLM在GitHub抽取的Python数据上学习通用代码结构,共188B tokens;第二阶段只使用docstring—函数配对,联合CODE-CLM、Docstr-MLM或Docstr-MCLM,使模型更专注于“描述到实现”的映射。数据通过AST解析、长度过滤和函数体去重获得,最终预训练数据约147GB。

结果显示,317M模型在HumanEval上pass@1为17.07%,高于CodeX 300M的13.17%;2.6B模型pass@1为23.78%,高于CodeX 2.5B的21.36%。在MBPP上,2.6B模型达到23.00%,超过6.7B InCoder的19.40%。不过,其1024-token上下文和函数级数据造成长程序、依赖管理及高k采样的弱点。研究的意义在于证明,结构化样本与目标函数设计能够部分替代盲目扩大模型、数据和上下文规模。

深度分析

研究背景

GPT、GPT-Neo、CodeX、CodeGen和InCoder推动了代码生成,但多数模型依靠海量GitHub数据与较长上下文。HumanEval和MBPP进一步把评价转向隐藏测试下的功能正确性。PanGu-Coder继承PanGu-α,面向英文到Python函数生成,探索更高效的函数级训练。

核心问题

给定自然语言描述、函数签名及可选示例,模型需生成能通过未见单元测试的函数体。难点包括自然语言意图到算法实现的映射、语法与依赖正确性、长程序建模,以及从噪声网络代码中提取可靠监督信号。

核心创新

  • ��以AST抽取docstring、签名和函数体,构造<descr><python><eoc>格式。
  • ��阶段一CLM学习连续代码分布;阶段二把配对样本单独输入,使用CODE-CLM聚焦输出。
  • ��以Docstr-MLM和Docstr-MCLM补充描述建模,避免只预测docstring的浪费。
  • ��用Query Layer和Nucleus Sampling支持高效生成与功能评测。

方法详解

  • ��数据:从GHTorrent关联的GitHub仓库抽取约6500万Python文件,去重、过滤后约147GB。
  • ��表示:SentencePiece词表约42K;模型为317M和2.6B参数,均使用1024上下文。
  • ��阶段一:随机初始化,Adam(β1=0.9、β2=0.95、权重衰减0.01),CLM训练188B tokens。
  • ��阶段二:过滤docstring少于19词、函数体超过400词或长度比超过32的样本,最多训练1M步、约42B tokens。
  • ��生成:使用temperature与nucleus sampling,直到<eoc>;每题采样200个程序。

实验设计

评测采用HumanEval的164道Python题目,平均每题7.7个隐藏测试,以及MBPP的974题(474训练、500测试)。指标为Chen等人的无偏pass@1、pass@10、pass@100。比较对象包括CodeX、CodeGen、AlphaCode、GPT-Neo和InCoder;不同k使用不同temperature与nucleus参数。

结果分析

HumanEval中,317M模型为17.07/24.05/34.55%,2.6B为23.78/35.36/51.24%。前者pass@1超过CodeX 300M的13.17%,后者超过CodeX 2.5B的21.36%。MBPP中2.6B为23.00/43.60/59.64%,优于InCoder 6.7B的19.40% pass@1。优势集中在低k,高k受上下文限制。

应用场景

可用于IDE中的docstring到函数实现、教学编程辅助、竞赛代码草稿和自动补全。实际部署需加入静态检查、沙箱执行、依赖解析和CI测试;模型当前仅支持英文Python,适合函数级而非完整仓库级生成。

局限与展望

训练样本来自docstring,语义质量和算法覆盖不稳定;函数体脱离项目上下文会遗漏导入、配置和状态。1024上下文不利于长代码,且自动导入会使评测比真实运行环境更宽松。未来应加入项目级检索、执行反馈、多语言数据、长上下文和PanGu-Coder-FT的持续集成训练。

通俗解读 非专业人士也能看懂

把模型想成一间会写菜谱的厨房。第一阶段,厨师阅读了大量Python“菜谱”和厨房记录,学会基本刀法、火候和常见搭配;这相当于从连续代码中学习一般结构。第二阶段,给厨师看“客人的要求”和“菜名”,并让它只练习做出最终菜品,同时偶尔遮住要求中的几个词,训练它根据上下文补全意思。

真正的考核不是看菜谱像不像,而是让别人品尝成品:HumanEval有164道题,MBPP有974道题,每个题目都有隐藏测试。PanGu-Coder 2.6B在HumanEval第一次尝试成功率为23.78%,在MBPP为23.00%。它还用较小的厨房和较短的工作台完成训练,因此成本更低。

但它更像“会做一道菜”的厨师,而不是能管理整家餐厅的主厨。若缺少调料、工具或前置准备,代码可能运行失败;遇到很长的菜单和复杂流程,也可能忘记前面的信息。

简单解释 像给14岁少年讲一样

想象你在给游戏里的机器人下指令:“写一个求两个数最大公约数的函数。”机器人不能只写出看起来像代码的东西,而要真的通过隐藏关卡测试。PanGu-Coder就是这种机器人:它先读了很多GitHub上的Python代码,学会常见写法;然后专门练习把函数说明和函数名字变成函数内容。

它有两个大小版本:317M和2.6B。HumanEval像一套164道编程闯关题,317M版本第一次就成功17.07%;2.6B版本成功23.78%。在MBPP上,2.6B达到23.00%,还超过更大的InCoder。为了尝试更多答案,每道题会生成200个候选,再计算至少一个答对的概率。

模型会逐字预测下一个符号,就像你打字时手机预测下一个词。不过它只能看到最多1024个token,太长的题目或程序可能让它“忘记开头”。它还可能忘记导入需要的工具,所以论文会自动补充缺失库。

这项研究很酷,因为它说明“更大”不总是唯一办法;更聪明地整理训练材料也很重要。未来如果它能读完整项目、运行代码并根据错误自己修改,就会更像真正的编程队友!

术语表

Causal Language Modeling(因果语言建模)

按从左到右的顺序预测下一个token。其目标是最大化给定历史序列下的条件概率。

阶段一学习原始Python序列,阶段二的CODE-CLM专门预测代码。

Masked Language Modeling(掩码语言建模)

随机遮盖部分词元,再根据可见上下文恢复它们。它强调局部语义理解,而非单纯续写。

Docstr-MLM用于自然语言描述子序列。

Query Layer(查询层)

额外注意力层,用下一位置的嵌入作为查询,读取顶层Transformer表示。它帮助模型确定下一token。

这是PanGu-α架构并由PanGu-Coder继承的组件。

pass@k

对每题生成k个候选时,至少一个候选通过全部隐藏测试的概率估计。论文采用Chen等人的无偏估计器。

报告HumanEval和MBPP上的pass@1、10、100。

AST

抽象语法树,是表示程序结构的树状形式。它能定位函数、docstring、签名和函数体。

用于Python文件过滤、函数抽取与格式清理。

开放问题 这项研究留下的未解疑问

  • 1 函数级训练能否稳定迁移到完整仓库?当前样本缺少跨文件依赖,自动导入也无法解决状态、配置和版本兼容问题。
  • 2 阶段二三种损失的最佳权重尚不清楚。论文比较了组合目标,但对不同语言、任务长度和数据质量的系统消融仍不足。
  • 3 功能测试可能掩盖安全风险。未来需同时评估漏洞、许可证、资源消耗和恶意输入鲁棒性。

应用场景

近期应用

IDE函数补全

开发者提供英文docstring和函数签名,模型生成Python函数体,再由静态检查、沙箱和单元测试筛选。它适合样板逻辑、数据处理和常见算法草稿,但不应直接绕过代码审查。

编程教学与竞赛辅助

教师或学生可让模型生成多种解法、测试样例和解释;竞赛平台可用它产生初稿。HumanEval与MBPP结果表明它能处理入门到中等难度函数,但答案必须经过执行验证。

远期愿景

可验证的软件代理

结合检索、编译、CI测试和错误反馈,模型可从需求生成函数、运行测试并迭代修复。实现这一愿景需要更长上下文、项目级依赖建模和严格安全隔离。

原文摘要

We present PanGu-Coder, a pretrained decoder-only language model adopting the PanGu-Alpha architecture for text-to-code generation, i.e. the synthesis of programming language solutions given a natural language problem description. We train PanGu-Coder using a two-stage strategy: the first stage employs Causal Language Modelling (CLM) to pre-train on raw programming language data, while the second stage uses a combination of Causal Language Modelling and Masked Language Modelling (MLM) training objectives that focus on the downstream task of text-to-code generation and train on loosely curated pairs of natural language program definitions and code functions. Finally, we discuss PanGu-Coder-FT, which is fine-tuned on a combination of competitive programming problems and code with continuous integration tests. We evaluate PanGu-Coder with a focus on whether it generates functionally correct programs and demonstrate that it achieves equivalent or better performance than similarly sized models, such as CodeX, while attending a smaller context window and training on less data.

cs.LG cs.AI cs.CL cs.PL cs.SE