2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

代替程序员?微软推出会编程的 AI 后,又让 AI 学会了代码审查

  • 2022-04-14
  • 本文字数:3256 字

    阅读完需:约 11 分钟

代替程序员?微软推出会编程的AI后,又让AI学会了代码审查

去年 7 月,微软联合 GitHub、OpenAI 打造了一个全新的代码生成 AI——GitHub Copilot,其背后的功臣正是 OpenAI 深度学习驱动平台 Codex。不过,数据显示,Codex 的准确率大概有 30%。日前,微软推出 AI 代码审查工具 Jigsaw,进一步提升 AI 编码的准确率。


目前,各类可调大型预训练语言模型(包括 GPT-3、Codex 等)已经能够根据程序员用自然语言表达的意图,成功编写出代码。这类自动化模型当然有望提升每一位软件开发从业者的生产效率,但也由于模型自身难以理解程序语义,因此尚无法保证生成代码的最终质量。


在我们的研究论文《Jigsaw:当大型语言模型牵手程序综合》(Jigsaw: Large Language Models meet Program Synthesis,文章已被国际软件工程会议 ICSE 2022 接收)中,我们介绍了一种可以提高这类大型语言模型性能的新工具。Jigsaw中包含可以理解程序语法及语义的后处理技术,可利用用户反馈不断提升修正能力。配合多模输入,Jigsaw 即可为 Python Pandas API 合成代码。


我们的经验表明,随着这些大型语言模型逐步演变为“按意图合成代码”的利器,Jigsaw 也将在提高系统准确性方面发挥重要作用。

机器编写软件的前景与风险


以 OpenAI 的 Codex 项目为代表的各类大型语言模型,正在重塑编程领域的整体面貌。软件开发者如今在处理编程任务时,可以直接对所需代码片段的功能做出英文描述,Codex 则通过 Python 或 JavaScript 等语言合成出预期代码。


然而,机器编写的代码可能并不正确、甚至无法编译或运行。因此,Codex 用户必须在代码使用前进行审查。


在 Jigsaw 项目中,我们的目标就是让审查实现部分自动化,帮助 Codex 等大型语言模型按开发者指示合成代码、提高生产效率。


假定 Codex 为软件开发者提供了一条代码片段,之后开发者可以检查代码能否编译、借此做出初步审查。如果未能编译,则开发者可以参考编译器提供的报错信息进行修复。而一旦代码最终编译完成,开发者则通过输入/输出(I/O)开展测试,检查代码所产生的输出是否符合预期。


这一阶段中,代码同样有可能暴露出问题(例如引发异常或产生错误输出),这就要求开发者进一步进行修复。我们证明,这一过程完全可以自动化执行。Jigsaw 将预期代码的英文描述以及 I/O 示例作为输入,再将输入与相关输出进行配对,最终保证 Python 输出代码能够正确编译、且可以根据输入产生符合预期的高质量输出结果。


在之前提到的论文《Jigsaw:当大型语言模型牵手程序综合》中,我们在 Python Pandas 上评估了这种方法。Pandas 是目前在数据科学领域中广泛使用的 API,具有数百个用于操作数据框或行列表的函数。


要让开发者记住这么多函数用法显然太不“人道”,更好的办法当然是使用 Jigsaw。在它的帮助下,用户可以通过英语描述预期转换效果、提供输入数据框与对应的输出数据框,之后由 Jigsaw 合成预期代码。例如,假定开发者希望从下表的“country”列中删除前缀“Name:”,可以在 Pandas 通过执行以下操作来实现:


df['c'] = df['c'].str.replace('Name: ', '')


图一:输入数据框与输出数据框。Jigsaw从名为“country”的列中删除了多余部分“Name:”。


在传统流程中,刚刚接触 Pandas 的开发者往往需要先熟悉函数及其参数,才能整理出相应的代码片段;或者是将查询与示例结果发布到 Stack Overflow 等论坛上,之后坐等热心网友的回复。另外,开发者还时常需要结合上下文背景大幅调整响应。相比之下,直接使用英语来描述自己想要的输入-输出表(或数据框)无疑要方便得多。

Jigsaw 工作原理解析


Jigsaw 首先获取英语查询信息、再配合适当的上下文对查询进行预处理,由此构建起可被馈送至大型语言模型的输入。Jigsaw 模型属于黑箱形式,而且已经使用 GPT-3 及 Codex 完成了评估。


这种设计的最大优势,在于能够以即插即用的形式支持各类最新、最好的可用模型。在模型生成输出代码之后,Jigsaw 就会检查其是否满足 I/O 示例。如果满足,则模型输出正确、代码直接可用。在我们的实验中,约有 30%的输出代码无需修复、直接可用。但如果代码有误,则在后处理阶段启用修复流程。


图二:所有供大型语言模型(包括GPT-3、Codex等)的输入都将经过预处理。如有必要,后处理输出还将被返回至最终用户进行验证和编辑。学习结果则被反馈至预处理和后处理机制当中,用以进一步改进Jigsaw的修正能力。


在后处理过程中,Jigsaw 使用三种转换来实现代码修复。其中每一种转换均由我们在 GPT-3 及 Codex 中观察到的故障模式所驱动。令人意外的是,GPT-3 与 Codex 的代码错误案例间有着极高的相似性,因此 Jigsaw 在后处理中使用的故障模式对二者都有很大帮助。

通过三种转换实现代码修复

变量转换


我们观察到,Codex 的输出中经常会出现不正确的变量名称。例如,大部分公开代码会将数据框命名为 df1、df2 等,所以 Codex 也就直接照搬了过来。然而,如果开发人员实际使用的是 g1、g2 等数据框名称,那么 Codex 对 df1、df2 的坚持就会引发问题。


另外,Codex 还时常把收到的变量名称搞混。例如,正确的输出应该是 df1.merge(df2),但却被它写成了 df2.merge(df1)。为了修复这些错误,Jigsaw 需要把 Codex 生成代码中的名称替换为可用范围内的一切名称,直到其满足 I/O 示例。我们发现,这种简单的转换已经足以解决机器代码中的大多数问题。

参数转换


有时候,Codex 生成的代码还会调用预期 API 函数,但其中某些参数却存在错误。例如:


a.) 查询-删除‘inputB’列中的所有重复行


dfout = dfin.drop_duplicates(subset=['inputB']) # Model

dfout = dfin.drop_duplicates(subset=['inputB'],keep=False) # Correct


b.) 将 df 当中 country 列内的所有 CAN 查询-替换为 Canada


df = df.replace({'Canada':'CAN'}) # Model

df = df.replace({'country':{'Canada':'CAN'}) # Correct


为了修复此类错误,Jigsaw 会成系统地枚举一切可能的参数,并以 Codex 生成的函数及参数序列作为起点,直到找出满足 I/O 示例的组合。

AST 到 AST 转换


AST(抽象语法树)就是以树的形式表示代码。因为 Codex 这类模型会在句法层级上设计代码结构,所以可能会生成句法与预期相近、但某些字符存在问题的输出结果。例如:


a.) 查询-选择 dfin 中符合条件的各行,要求其 bar 值 <38 或者 >60


dfout = dfin[dfin['bar']<38|dfin['bar']>60] # Model

dfout = dfin[(dfin['bar']<38)|(dfin['bar']>60)] # Correct

错误——缺少括号会改变优先级次序并引发异常


b.) 查询-计数 df 中重复行的数量


out = df.duplicated() # Model

out = df.duplicated().sum() # Correct

错误——需要求和以获取重复行的总量


为了修复这类问题,Jigsaw 还提供随时间学习的 AST 到 AST 转换功能。用户首先自行修复代码,再由 Jigsaw UI 捕捉编辑结果、把结果推广到其他适用的转换场景当中,同时学习转换知识。随使用次数与转换次数的增加,Jigsaw 也将逐步掌握开发者的修复思路。

评估


我们还在多种数据集上评估了 Codex 直出代码与 Jigsaw 修复后代码,并测量二者的准确度(即系统能够产生预期结果的情况,在总体数据集任务中所占的百分比)差异。Codex 直出代码的准确度大约在 30%左右,这也与 OpenAI 论文中的观点相符。Jigsaw 能够将准确度提高到 60%以上,如果配合用户反馈、则准确度可以进一步拉升至超过 80%。

展望未来


我们已经发布了可供公开使用的 Jigsaw 评估数据集。每个数据集中包含多项任务,各项任务分别对应一条英语查询与一个 I/O 示例。要解决任务,模型需要生成一段 Pandas 代码,并将提供的输入数据框映射至相应的输出数据框。我们希望大家能以这套数据集为基础,评估并比较更多其他系统。尽管目前部分数据集只包含英语查询加 I/O 示例等简单任务,但 Jigsaw 数据集仍然开创了行业先河。


随着语言模型的不断发展壮大,我们相信 Jigsaw 将一路为其保驾护航、帮助这些大型模型在更多实际场景内发挥作用。当然,这只是相关研究领域内的冰山一角,我们还有以下关键问题需要解决:


  1. 这些语言模型能否通过训练掌握代码语义?

  2. Jigsaw 能否集成进更好的预处理与后处理步骤?例如,我们正在研究用表述分析技术改进后处理效果。

  3. I/O 示例对于 Python Pandas 之外的其他 API 是否有效?如果没有相应的 I/O 示例,我们该如何解决?怎样才能使 Jigsaw 适应 JavaScript 等语言以及 Python 中的通用代码?

  4. Jigsaw 目前的输出结果仍有改进空间,就是说除了用自然语言执行查询之外,开发者仍需要对输出进行评估和调查。


这就是我们正在努力探索的几个有趣方向。随着 Jigsaw 的不断改进和完善,相信它的自动化能力将在提高程序员生产力方面发挥重要作用。我们也将尝试把 Python Pandas API 方面的经验推广到其他 API 和编程语言当中。

2022-04-14 14:004833

评论

发布
暂无评论
发现更多内容

企业内PAAS建设的经验与教训

Crazy

中间件 PaaS 经验 云原生应用

做毕设用不起GPU?亚马逊云SageMaker免费给你用

亚马逊云科技 (Amazon Web Services)

学习

一文读懂 MongoDB驱动程序 API

MongoDB中文社区

mongodb

如何从头到脚彻底解决一个MySQL Bug

华为云开发者联盟

MySQL 数据库 华为云 bug GaussDB(for MySQL)

你的密钥被我看见了 !逆向获取密钥

H

网络安全 逆向

经验分享 | 搭建帮助中心的最强攻略

小炮

fastposter v2.6.0 发布 电商海报生成器

物有本末

fastposter 海报生成器 电商海报

被冰封的 Bug:Fishhook Crash 修复纪实

RTE开发者社区

Dev for Dev fishhook

租房小程序

源字节1号

前端开发 后端开发 租房小程序

租房小程序

源字节1号

前端开发 后端开发 租房小程序

基于WEB快速开发平台的轻量ERP

雯雯写代码

ERP 快速开发平台

安全app之PHP代码审计

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 代码审计

好云推荐官丨飞天加速之星怎样选择云服务器ECS?

阿里云弹性计算

阿里云 采购季 好云推荐官

杜绝不良信息侵害未成年,皮皮APP发起语音社交行业自律书

联营汇聚

敏捷小游戏的思考-上篇

LigaAI

团队管理 敏捷实践

龙蜥开发者说:做开源,兴趣是最好的源动力 | 第1期

OpenAnolis小助手

开源 创作 开发者故事 兴趣是动力

Hoo虎符研究院| 稳定币的主要分类及发展趋势

区块链前沿News

虎符研究院 稳定币

【Python训练营】Python每日一练----第31天: k倍区间

是Dream呀

3月月更

盲盒风潮过后,中国收藏玩具市场该何去何从?

易观分析

盲盒 潮玩

openGauss社区成立ReleaseManagement SIG

VuePress 博客之 SEO 优化(一) sitemap 与搜索引擎收录

冴羽

Vue vuepress SEO 博客搭建 sitemap

什么是以特性为核心的持续交付|阿里巴巴DevOps实践指南

阿里云云效

云计算 阿里云 研发效能 研发 DevOps实践指南

手把手教程|构建无服务器通用文本识别功能

亚马逊云科技 (Amazon Web Services)

架构

聊聊编程中的 “魔数”

程序员鱼皮

我给公司用了这款工具,领导直接给我涨了两千工资

刘祥

后端技术 编程工具

基于深度学习的时间序列预测

云智慧AIOps社区

关于知识库:你需要知道的一切

小炮

基于微信小程序的大学社团平台的可研方案

CC同学

聊聊 kerberos 的 kinit 命令和 ccache 机制

明哥的IT随笔

数据安全 kerberos

2 月月更获奖名单公布!获奖的小伙伴速速领取奖励啦!

InfoQ写作社区官方

2月月更 热门活动

MongoDB案例分享:如何使用oplog恢复数据

MongoDB中文社区

mongodb

代替程序员?微软推出会编程的AI后,又让AI学会了代码审查_文化 & 方法_微软研究院_InfoQ精选文章