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:004740

评论

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

软件测试|一文带你入门Python图片处理神器Pillow

霍格沃兹测试开发学社

item_get_app-获得淘宝app商品详情原数据api接口的步骤

技术冰糖葫芦

API 文档

软件测试/测试开发丨接口自动化测试学习笔记,加密与解密

测试人

软件测试

item_review-获得淘宝商品评论api接口步骤

技术冰糖葫芦

API 文档

情感语音识别技术的现状与未来

数据堂

软件测试|教你拿捏Python运算符(一)

霍格沃兹测试开发学社

软件测试| 教你拿捏Python运算符(三)

霍格沃兹测试开发学社

软件测试|Python神器pillow,从此拍照不再需要滤镜

霍格沃兹测试开发学社

软件测试|Python帮手残党写出漂亮签名

霍格沃兹测试开发学社

区域巡查二维码系统:扫码记录巡查结果,异常情况及时上报

草料二维码

二维码 知识分享 二维码生成 草料二维码 区域巡查

OpenAI 上线新功能力捧 RAG,开发者真的不需要向量数据库了?

Zilliz

openai 向量数据库 ChatGPT zillizcloud rag

Last Week in Milvus

Zilliz

Milvus Zilliz 向量数据库

大模型架构创新已死?

Openlab_cosmoplat

腾讯云大数据流计算 Oceanus 在 MySQL CDC Connector 的核心优化

腾讯云大数据

流计算 Oceanus

情感语音识别在人机交互中的应用与挑战

数据堂

软件测试|数据可视化神器——pyecharts教程(五)

霍格沃兹测试开发学社

中国唯一!华为入选Gartner®企业低代码应用平台魔力象限

云计算 低代码 华为云

北大&腾讯打造多模态15边形战士!语言作“纽带”,拳打脚踢各模态,超越Imagebind

Openlab_cosmoplat

docker上安装的jenkins容器内访问不了外网

伤感汤姆布利柏

百度搜索智能化算力调控分配方法

百度Geek说

人工智能 深度学习 算法 企业号11月PK榜

特权账号管理之风险检测

尚思卓越

网络安全 特权账号 风险检测

代码安全之代码混淆及加固(Android)🔒

用Java使用API接口获取Lazada商品详情

Noah

软件测试/测试开发丨接口自动化测试,接口鉴权的多种方式

测试人

软件测试

DeFi和NFT融合:去中心化金融的新领域

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

情感语音识别的技术挑战与解决方案

数据堂

软件测试|教你拿捏Python运算符(二)

霍格沃兹测试开发学社

JNPF低代码,发挥软件定制的威力

互联网工科生

软件开发 低代码 开发平台 JNPF

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