当ChatGPT超越你的编程能力,程序员该如何应对?

发表时间: 2023-03-28 16:17

作者 | 何苗
出品 | CSDN(ID:CSDNnews)

大模型的火热引爆了 AI 编程领域的全面革新,人们开始思考如何借助 AI 提高编程效率的同时,也在思考未来需要怎样的“新程序员”。

3 月 25 日下午,CSDN 与《新程序员》合作举办“新程序员大会(NPCon)的“AIGC 与大模型技术应用峰会”——AI 编程技术论坛在北京环球贸易中心成功举办。本论坛汇聚了来自中科院、微软亚洲研究院、清华大学实验室等学术机构,华为云、aiXcoder 等企业代表们,从ChatGPT、大模型、开源等多个角度,围绕智能代码生成展开激烈的观点碰撞,分享了 AI 编程最新鲜火热的观点。

当AI可以写代码,程序员还能干什么?AI 写的代码,谁或者如何来评定代码的质量?GPT-4 模型将为 AI 编程带来怎样的技术与思维革新?很多问题都在这场论坛中得到了解答,答案或许与你的认知相左,也欢迎留言来辩!

  • 微软亚洲研究院高级研究工程师卢帅:未来的AI编程的发展趋势是一方面探讨如何利用大模型来完成任务,另一方面思考如何进化它,以覆盖更广泛的智能代码场景。

  • aiXcoder 联合创始人郝逸洋:如果 AI 作为操作系统可以直接控制硬件,程序员就能解放双手去编写驱动、操作系统和软件或是研发新的硬件,这就是软件 3.0 的图景。

  • 华为云 PaaS 技术创新 LAB 技术专家申博:当模型越来越大,对硬件性能要求越来越高,有可能会遇到“数据荒”的问题,我们能否让 AI 自我演进,通过自我生成数据的方式学习,以达到与大数据同样的效果?未来自我创造智能是个有前途的方向。

  • 清华大学知识工程实验室研究助理郑勤锴:在将来,程序员需要具备一些更高级的技能和思维,比如 Geek (极客)思维,开发者应该更加注重这方面的培养。

  • 中国科学院软件研究所研究员、博士生导师王俊杰现在的大模型可能有些时候对开发人员来说有点“不太专业”,但对测试人员来说“刚刚好”

一边用大模型来生成代码,一边想办法让它进化

在上午的主论坛,华为云智能化软件研发首席专家王千祥表示 AI 编程肯定会超越 Coding 编程,因为现有的 ChatGPT、GPT-4 大模型工具的能力覆盖到了代码补全、翻译代码、解释代码、DeBug 等多维度。

在AI 编程分论坛会议开场,为了对程序员最关心的编程技术问题做更深入的交流与探讨,他作为论坛出品人,协助 CSDN 精心邀请了几位亲自动手做AI 编程的青年才俊来分享其实践经验与真知灼见,机会难得。

华为云智能化软件研发首席专家 王千祥

以下,是该论坛的内容精华。

首先,微软亚洲研究院高级研究工程师卢帅分享了《基于预训练的代码理解与生成》主题演讲,他表示:预训练模型是目前探索出的代码智能生成最佳解决方案,但其核心挑战在于如何让模型理解和推断代码背后的意图。

微软亚洲研究院高级研究工程师 卢帅

“在编写代码时,并不是所有的代码都是程序员自己原创的。”近年来,代码智能引起了学术界和工业界的广泛研究,基于人工智能技术的自动化程序理解和生成可以极大地提高程序开发者的生产力。微软已经在预训练模型领域做了一些尝试,并在 2020 年初提出了首个将文本和代码结合起来作为模型训练的模型——CodeBERT。它覆盖了 6 种编程语言,支持多项代码理解功能。

会上,卢帅详细地介绍了如何将预训练的模型应用于具体的代码智能任务和场景中。“我们的研究并没有完全关注如何扩大模型规模,而是从程序员或是软件工程的角度,去思考将代码相关信息和软件工程知识融入预训练模型中,增强模型对程序的理解。”

除了对大模型的训练与优化以外,卢帅及其团队还非常关注代码补全和代码审查的具体应用场景,在代码审查场景下,他总结出可通过人工智能或预训练模型来优化和提高开发效率的三种任务:

  • 评估代码更改的质量;

  • 辅助生成代码审查意见;

  • 代码优化。

目前 GPT-4 还有许多没有覆盖到的情况,例如缺少代码语法树等信息;由于长度限制,无法对项目级代码进行分析;代码个性化模型问题,未来都很值得思考。

在大型模型时代,GPT-4 影响广泛,为我们提供了很多便利。相对于 GPT-3,GPT-4 的优化之一在于它引入了人类的反馈,优化方向已经从增大参数量转变为从数据优化和训练方式的角度。但卢帅认为结构方面还没有被充分挖掘。

卢帅及其团队下一步的研究方向是如何让神经网络模型更了解程序,而不是如何使模型变得越来越大。“我认为未来的发展趋势是一面探讨如何利用大模型来完成任务,另一方面则要思考如何进化它,以覆盖更广泛的智能代码场景。”

AI 还需更进一步才能满足程序员的需求

“在 2022 年之前,代码生成模型主要采用语言模型来训练代码模型。而在 GPT-4 时代,一切都改变了。我们可以直接向程序提出需求,就像产品经理向程序员描述需求时一样。”

aiXcoder 联合创始人 郝逸洋

近一年,大型语言模型(LLM)对序列信息建模的能力有目共睹,创建了像 ChatGPT、GPT-4 这样惊人的产品。本次演讲 aiXcoder 联合创始人郝逸洋围绕如何利用 LLM 技术辅助代码开发为我们带来精彩分享,并对交互式多模态LLM(如 ChatGPT、GPT-4 )如何应用于智能化软件开发展开畅想。

首先,郝逸洋分享了自己对于 GPT-4 的认识。“当 ChatGPT 升级至 GPT-4 时,它可支持更长的序列,并在更多领域上进行了微调。相比于 GPT-3,GPT-4 的求解能力有了巨大提升。此外,GPT-4 还有一个未开放使用的能力,即理解图片,但目前还未对外开放使用。”

为了进一步对 GPT-4 的能力边界展开探索,他对代码进行了错误检测和修复,这个功能非常强大,也是编程神器 Copilot 还不具备的功能——它只是一个代码补全模型。

GPT-4 反映出的第一个问题就是它速度较慢,因此无法响应很多实时场景;第二,上下文序列有限(最长 32,768 ),尽管GPT-4 的序列长度已经非常厉害,但是想要将整个项目的信息全部放入其中仍然非常困难;第三,代码项目的上下文和网页爬取的文本差距巨大。

同时,程序生成模型与 GPT-4 此类语言模型的模式仍有区别。

在实际场景中,写代码所依赖的信息量非常多。除了当前文件的上下文信息,它还依赖整个项目中其他文件的信息甚至其他项目的信息。因此,这是个需要独立设计的问题,普通语言模型很难处理如此复杂的需求。

第二大区别则体现交互模式。在创建程序生成模型时,一般有几种模式可供选择,包括填空、补全和排序,而对话语言模型其模式则是“续写”与“问答”。“填空、补全和排序”三种场景都对实时性有要求,如果速度过慢,开发人员是难以接受的。

当一个程序生成模型创建完毕,就需要对补全率和生成率两个指标进行测试,评估它的表现能力,郝逸洋以 HumanEval 为例,为大家展开了细节讲解,同时他强调自动化测试用户实际开发场景非常难,运用一些手动测试来配合验证可能会更精准。

让语言模型学会自己使用工具

“众所周知,GPT-4 可以让编写简单代码的过程更加轻松,但它在处理复杂的代码时仍然很困难。这意味着它不能降低编程的难度,但可以降低入门门槛,这也是生成式 AI 固有的局限。”

华为云 PaaS 技术创新 LAB 技术专家 申博

华为云 PaaS 技术创新 LAB 技术专家申博为我们带来了他《在 GPT-4 时代,重新思考 AI 编程》的精彩分享。

他认为工具的存在旨在提高程序员的开发效率,然而其质量也同样重要。首先,生成的代码中可能存在未知的错误和漏洞。随着生成的内容越多,其质量就越成为一个重要话题。其次,实际项目中往往涉及很多设计模式和框架,需要综合多个文件和不同层次的代码,同时掌握较强的专业和领域知识,才能了解程序的具体含义和功能。再者,自监督的预训练方式是基于自然语言序列的顺序性,但写代码时并非如此,程序员往往会在多份代码中不断跳转和编辑,甚至进行全局的重构。如此一来,仅靠大规模语言模型很难覆盖以上所有情况,即使强大如 GPT-4。

申博认为,交互与协同才是核心。交互与协同不仅指人与AI或工具之间的交互,也包括模型与现有工具之间的交互,以及现有工具之间可能存在的交互。

程序员需要大模型来运用这些工具,就涉及到类似于“ Toolformer ”Tool+Transformer)的组合,即语言模型可以教自己使用工具。该思想的核心是让模型具备人类的能力,让它自主地学会决定应该使用哪些工具以及如何调用这些工具。在经过多轮的训练后,模型可以具备此类能力,并在它生成的文本中插入 API 调用,将 API 返回的结果融合到预测中。

除了让模型调用工具,将模型视为主流工具中的一个环节也是一种可行的思路。与 Toolformer 中让模型调用工具不同,基于语言模型即服务(Language Model as a Service)的方式,使现有工具能够调用模型,这是未来非常有发展潜力的方向。

来自北京大学的研究者们认为,软件代码是程序员对这个世界的理解与表达,在这个过程中,一些个性化东西也被加入到代码中,国外许多开源项目的所有者把代码写成了艺术。随着AI编程的发展,现代化编程中机械化的东西越来越少,所以新程序员们需要更多地关注编程的艺术层面,例如设计架构以及优化算法的优美性。华为云推出了CodeArts 服务来帮助开发者们面向未来转型,CodeArts 提供了一整套软件开发流程,其中包括 CodeArts Snap 智能编程助手,Snap 基于代码生成不局限于代码生成,其最终目的是同时提高开发的效率和质量。

演讲的尾声,他总结道:从前我一直在思考 ChatGPT 这种交互方式什么时候会被应用于 IDE,随着 GitHub Copilot X 的发布,现在 GPT-4 已经来到 IDE 中。因此我们需要重新思考 AI 编程,未来它一定会成为像IDE一样的必备工具。像使用 IDE 一样适应 AI 吧,AI 不会取代人类,但掌握 AI 技术的人将取代另一些人。

为了产业生态发展,开源代码生成模型

“近两年有两个重要的行业动态,一个是 AlphaCode 登上《Science》杂志封面,证实了预训练的代码生成模型可以达到参加编程竞赛的程序员平均水准。另一个是 Copilot 问世,首次证实了在大量源代码语料上进行训练,能取得远超传统方法的代码生成效果。但很遗憾,以上提到的技术全部来自国外,全部都是闭源的,只能被用于产品使用或调用 API 。

清华大学知识工程实验室研究助理 郑勤锴

从代码提出之初起,便一直有人在考虑如何实现自动代码生成。如何实现大规模的代码生成模型?清华大学知识工程实验室研究助理郑勤锴及其团队去年花了整整一年时间做了深度实践,他们将大规模预训练模型应用到代码生成场景,并选择在国产的硬件和平台上实现此模型。

CodeGeeX 是一个具有 130 亿参数的多编程语言代码生成预训练模型,采用华为 MindSpore 框架实现,使用鹏城实验室“鹏城云脑II”平台中 1536 个昇腾 910 AI 处理器,在 20多 种编程语言的代码语料库历时两个月训练而成。开源开放,支持昇腾和英伟达平台,具有高精度代码生成、代码翻译等能力。

在此次大会上,他详细从模型的数据收集、处理;模型架构搭建、模型训练与优化、任务评估、代码生成插件等几大方面分享了实践的细节。

目前来看,CodeGeeX 是在开源领域表现最佳的多语言代码生成模型,用户超过 4 万名,还在不断优化中文等其他语言的表现。

考虑到每种编程语言被发明出来时都有其更适用的特定场景,郑勤锴及其团队分析了 CodeGeeX 的生成结果。绿色表示答案完全正确的结果,红色表示通过编译但答案错误的情况,橙色表示运行时错误,蓝色则表示语法错误。可以看到,目前代码生成模型的难点并不在生成语法正确且可以运行的代码,而是需要更强的逻辑推理能力,保证输出结果的正确性。

由于 Copilot 等类似技术都是闭源的,无论对于研究还是产业都非理想情况。郑勤锴将整个项目开源,目前已获得了 3300 多个 Star,也邀请更多开发者一同参与优化。他表示当前阶段并不着急将某些产品做得太细致,而是应该进一步提高基础模型的能力,之后也会加入对话功能,使其具备更强的交互能力,实现如代码修复之类的功能。

偶尔“不太专业”的大模型,对找 Bug “刚刚好”

现在的大模型可能有些时候对开发人员来说有点“不太专业”,但对测试人员来说“刚刚好”。

中国科学院软件研究所研究员、博士生导师 王俊杰

前面谈到了许多如何利用大模型实现代码生成的问题,在自动化测试领域,大模型是否同样有所助益?中国科学院软件研究所研究员、博士生导师王俊杰为我们带来了《基于LLM的自动化测试》的思考。

对开发人员而言,尽管大模型已非常强大,但其生成的代码仍然不能完全信任。虽然开发人员希望代码生成百分之百正确的,然而对于测试而言,这些问题对结果影响不大。测试本就是为了找出 Bug,即使无法找到,也能节省大量的人工工作量。

王俊杰及其团队的工作是基于大型模型进行自动化测试。

近年来自动化图形用户界面(GUI)测试被广泛用于帮助开发团队确保移动应用程序的质量。然而许多 GUI 需要适当的文本输入才能进入下一页,文本输入的质量成为影响测试覆盖率的主要障碍。由于有效文本输入(例如航班的出发地、电影名称、用户血压信息等)具有多样性和语义要求的特点,实现文本输入生成的自动化是一项具有挑战性的任务,其难度主要体现在两个方面,一是输入时需要生成不同类型的特定值,例如地图应用程序的街道地址;二是在同一 GUI 页面内需要体现文本之间的关联性,例如航班搜索中出发和到达地需要是不同位置。如果文本输入不恰当,自动化测试工具将无法进入下一个 UI 页面,从而导致测试的充分性低下。

针对以上的挑战,团队提出了一种上下文感知的自动文本输入生成方法 QTypist,即使用预先训练的大型语言模型(LLM)来智能地生成语义输入文本,以增强移动 GUI 测试。其设计逻辑是,先给定一个带有文本输入的 GUI 页面及其相应的视图层次结构文件,通过提取文本输入的上下文信息,来设计语言模式以生成提示作为 LLM 的输入。同时,为了提高 LLM 在移动 GUI 中文本输入的性能,团队还开发了一种基于提示的数据构建和调优方法,以自动提取用于模型调优的提示和答案。

团队对来自 Google Play 的 106 个应用程序进行了评估,结果显示,该方法生成文本的通过率为 87 %,比最佳基线高 93 %。团队还将文本生成方法与自动化 GUI 测试工具集成,与原始工具相比,集成后的工具可以多覆盖 42 %的应用程序活动和 52 %的页面,同时多检测 82 %的 Bug,从而提升了自动化测试工具的测试覆盖率和缺陷检测效率。

在演讲的结尾,她提出做大语言模型后续需要解决的四个问题,发人深思:

  1. 大模型如何与被测软件交互?特别是复杂软件,例如自动驾驶仿真测试这种;

  2. Diversity/coverage 问题。对于代码生成任务而言,用户希望得到最正确的一个结果即可,但对于测试任务,更希望达到 diversity and coverage,如何更好实现?

  3. 测试开发同步或者测试驱动开发;

  4. 未来软件开发形态可能是面对用户输入,大模型直接产生可用的软件,那如何保证大模型产出的软件是安全可用的、满足用户需求的?又应该对大规模、以及基于大模型的应用进行测试和质量保障?

以上四个相对开放的问题,也非常欢迎大家在评论区探讨。

圆桌部分:成就大模型时代的应用开发者

在 AI 编程分论坛最后一个环节,由论坛出品人、华为云智能化软件研发首席专家王千祥主持,微软亚洲研究院高级研究工程师卢帅,aiXcoder联合创始人郝逸洋,华为云 PaaS 技术创新 LAB 技术专家申博,清华大学知识工程实验室研究助理郑勤锴,中国科学院软件研究所研究员、博士生导师王俊杰围绕“AI编程现状与未来,成就大模型时代的应用开发者”,共论新时代开发者的新机遇与成长。

从左至右:王千祥 卢帅 郝逸洋 申博 郑勤锴 王俊杰

大型模型出现后,许多新的开发项目将随之诞生,这对开发者而言是好是坏?需要在哪方面提升?华为云 PaaS 技术创新 LAB 技术专家申博认为,此事对程序员的好处大于坏处。他们需要把自己的思维放在一个老板的位置上,编程神器Copilot 会向你推荐出多种实践方案,让你去选择与思考其中最佳。这不仅让程序员享受到了使用者的便捷,同时也在倒逼他们提高编程能力。在这个过程中,程序员需要将其作为一个伙伴、一个老师,而不只是一个下属,在于它平等对话的过程中,也能实现自身能力的提升。当你从“ Copilot ”变成“ Captain ”,你将成为自己的船长。

这是否意味着软件开发人员将会迎来一次巨大的飞跃?微软亚洲研究院高级研究工程师卢帅认为,飞跃进展应该会很大。但在这个领域还有一个待解决的问题,那就是测试。对于人类来说,短时间内可能很难完全相信人工智能生成的东西,因此提高测试的效率对于人工智能来说是有研究价值的。人工智能会对整个软件开发,特别是编写代码这个环节的效率有非常大的提升。

但 aiXcoder 联合创始人郝逸洋有不同观点:根据他的落地实践经验,在短期内实现显著的生产力提升是相当困难的。程序员并非将大部分时间都花在写代码和开发新功能上,而是在调试 Bug,可能 90 %的时间都是如此。但如今却没有讨论这个问题,原因在于目前的AI技术还没有达到相应水平,无法协助程序员完成 deBug。如果它可以助你实现这一目标,才是真正的震撼,意味着突破来了。

那么,对于未来的程序员而言,哪些技能的培养更为重要?清华大学知识工程实验室研究助理郑勤锴认为:在将来,程序员需要具备一些更高级的技能和思维,比如 Geek (极客)思维,你需要了解问题在哪里?哪些方面可能需要优化?如何提出这些问题?一个初级程序员很可能不知道问题在哪里以及何处可以优化,所以你需要理解整个编程系统或架构的设计,这将帮助你获得这种技能。目前 GPT 对代码的认识还不够全面,这就需要开发者从一个更全面的角度出发,具体描述每个模块,确定哪些环节较薄弱,哪些可以进行优化。这种能力非常重要,开发者应该更加注重学习它。

对于 GPT-4 模型将推动哪些领域与技术革新,大家展开了大胆预测。

aiXcoder 联合创始人郝逸洋表示:一般来说程序员写软件需要编写代码,并在编译后按照指令执行程序。现在我们已经可以让 AI 直接生成代码,那么为何不让它直接生成机器指令并且去执行呢?如果 AI 作为操作系统可以直接控制硬件,当程序员下达一个指令后,AI 便会立刻执行,并不需要程序员的参与。那么程序员是否可以将这些新技术和指令传授给 AI,让其掌握并独立操作?如此一来他们就可以解放双手去编写驱动、操作系统和软件或是研发新的硬件,这就是软件 3.0 的图景。

华为云 PaaS 技术创新 LAB 技术专家申博考虑到:数据是否会遇到“数据荒”的问题。当模型越来越大,对硬件性能要求越来越高,而人类社会的语言文字、以及多模态数据都是有限的资源。我们现在拥有如此庞大的数据量,是多年的积累的成果。不能期望这种缓慢自我发展来产生数据,我们能否让 AI 自我演进?这种自我演进的过程,正好符合人类自我创造和自我学习的机制。这个问题值很得研究。如果某些领域的数据相对较少,就可以考虑通过自我生成数据的方式学习,以达到与大数据同样的效果。“自我创造智能”是个有前途的方向。

中国科学院软件研究所研究员、博士生导师王俊杰则希望看到大型智能型应用能够帮助更多使用不便的人,如老年人。大多数人认为非常方便易用的手机,可能对于年长一些的人并不友好,他们不知道要如何预订机票或如何使用应用。有朝一日是否可以省略中间层,让应用变得更加智能、易用,让老年人或不便者可以通过输入指令轻松完成日常任务?此外,若干年后,当大型模型能够达到自我意识,也会带来一些令人担心的问题。

除了上述问题,现场观众也积极提问,绝不放过向专家们取经的机会:对新手来说,如何评价AI大模型推荐的代码的优劣?

对代码自动化测试颇有研究的王俊杰接过了话筒:在理想情况下,如果有测试用例就能够做到,但在现实情况下,很多时候并没有测试用例,也不太知道自己能得到什么样的结果,因此还得在软件完成之后的系统测试阶段对它进行比较完整的测试。

这个场景非常具体,对于新手要如何评测自己是否采纳AI推荐的代码,我们也没有太丰富的经验,在这里仅和大家分享一点新的想法。早前人们使用传统的机器学习算法时,在推荐给出一些结果的同时也会给出其概率,未来大模型是否能参考前者,为生成的结果附上概率,帮助人们确定AI推荐的代码是否为自己所需,如果能有这样的 Guideline,在选择的时候就更有针对性。对于大模型显示不太确定的内容,就增加人工审查力度,反之则减少人工审查工作量。

探索“新程序员”边界,拥抱AI新纪元

至此,AI 编程技术论坛完满落幕,但关于AI与编程的探讨与创新不会停下脚步。

未来,程序员在人工智能产品的协助下会明显提升单兵作战能力,技术团队会有更多时间用于创新,很多程序员也会承担起一部分产品经理甚至是老板的责任。CSDN 也将与你一起持续探索“新程序员”的边界。

不论你是否主动拥抱 AI,属于AI的时代已经来临,打不过那就加入吧!