代替程序员?微软让 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 和编程语言当中。

目录
打赏
0
0
0
0
368
分享
相关文章
基于DeepSeek R1改进的AI安全模型!MAI-DS-R1:微软开源AI安全卫士,敏感话题响应率高达99.3%
微软开源的MAI-DS-R1是基于DeepSeek R1改进的AI模型,通过后训练优化将敏感话题响应率提升至99.3%,同时将有害内容风险降低50%,保持原版推理能力并增强多语言支持。
76 3
基于DeepSeek R1改进的AI安全模型!MAI-DS-R1:微软开源AI安全卫士,敏感话题响应率高达99.3%
Motia:程序员福音!AI智能体三语言混编,零基础秒级部署
Motia 是一款专为软件工程师设计的 AI Agent 开发框架,支持多种编程语言,提供零基础设施部署、模块化设计和内置可观测性功能,帮助开发者快速构建和部署智能体。
129 15
Motia:程序员福音!AI智能体三语言混编,零基础秒级部署
AI浪潮下程序员的职业重构与生存指南
当代码生成器能写出比人类更规范的代码时,程序员的价值在哪里?这个问题曾让我陷入长时间的思考
后端程序员逆袭之路:巧用 AI 工具,拿下高薪 offer
在技术职场中,后端程序员面临诸多挑战,如复杂业务逻辑、繁琐代码编写与调试及持续学习压力。然而,AI 工具的兴起为后端开发带来了全新机遇。智能代码生成工具如飞算 JavaAI 可高效完成需求分析、设计与代码生成;智能调试工具如 CodeGuru 能快速定位问题;知识学习工具如 ChatGPT 助力技术提升。借助这些工具,后端程序员不仅能显著提高项目质量和效率,还能展示技术前瞻性与学习能力,拓展技能边界,从而在求职市场中脱颖而出,顺利拿下高薪 offer。
Java程序员在AI时代必会的技术:Spring AI
在AI时代,Java程序员需掌握Spring AI技术以提升竞争力。Spring AI是Spring框架在AI领域的延伸,支持自然语言处理、机器学习集成与自动化决策等场景。它简化开发流程,无缝集成Spring生态,并提供对多种AI服务(如OpenAI、阿里云通义千问)的支持。本文介绍Spring AI核心概念、应用场景及开发步骤,含代码示例,助你快速入门并构建智能化应用,把握AI时代的机遇。
2025年解析 AI 编程:当前水平与对程序员的影响-优雅草卓伊凡
2025年解析 AI 编程:当前水平与对程序员的影响-优雅草卓伊凡
35 8
2025年解析 AI 编程:当前水平与对程序员的影响-优雅草卓伊凡
Qlib:华尔街颤抖!微软开源金融AI量化投资神器,助力智能投研
Qlib是微软亚洲研究院推出的开源AI量化投资平台,提供从数据处理、模型训练到组合管理的全流程支持,内置高性能数据基础设施和多种机器学习模型。
220 19
Qlib:华尔街颤抖!微软开源金融AI量化投资神器,助力智能投研
AI的出现,让月入几万的程序员,要被AI取代了?
人工智能(AI)的快速发展对程序员的工作带来了挑战与机遇。AI在自动化代码生成、问题解决及效率提升方面表现出色,但程序员在复杂系统架构设计、创新思维和业务沟通上仍具不可替代的优势。AI可作为辅助工具提升效率,同时催生新职业机会如AI工程师和数据科学家。获取生成式人工智能认证(GAI认证)能增强竞争力,拓展职业领域并提高稳定性。应对AI挑战的关键在于持续学习、培养软技能和关注行业动态,实现与AI的合作共生。
AI的出现,如何判定程序员的水平高不高?
本文探讨了AI时代评判程序员水平的标准,涵盖基础知识与编程能力、AI技术理解与应用能力、问题解决与创新能力及团队协作与沟通能力等多方面。同时,强调生成式人工智能认证(GAI认证)对程序员职业发展的助力,包括增强专业认可度、拓展职业空间和提升学习能力。程序员需不断学习,适应AI浪潮,以保持竞争力。
手把手体验通义灵码2.0:AI程序员如何让我从“调参侠”进阶“架构师”?
通义灵码2.0是一款强大的AI编程工具,帮助开发者从“调参侠”进阶为“架构师”。它通过跨语言开发支持、智能单元测试生成和图生代码等功能,大幅提升开发效率。例如,将Python数据处理函数一键转为React+ECharts组件,自动生成单元测试用例,甚至通过草图生成前端布局代码。此外,新增的QwQ模型具备“代码脑补”能力,可推荐性能优化策略。尽管功能强大,但仍需注意环境隔离与代码审查,避免过度依赖。通义灵码2.0不仅是工具,更是开发者的“外接大脑”。
86 8