AIGC山雨欲来,开发者如何不被大风吹倒?

355 阅读16分钟

刚刚过去的2022年可谓是AIGC大放异彩的一年:如果说从年初以来风靡互联网的AI绘画只是AI应用领域的又一次拓展,年末横空出世的ChatGPT则标志着一路攻城掠地的AI终于直接向它的创造者——程序员们发起了挑战:2022年底上线的人工智能聊天机器人ChatGPT面对技术问题对答如流,编程和调试信手拈来,撰写文章、邮件也不在话下,虽然偶尔的“胡言乱语”略显呆萌,但马斯克等多位技术大牛的肯定足以盖章它的实力并非浪得虚名。最近,OpenAI招募上千外包大军训练ChatGPT的消息更是隐隐有山雨欲来之感:AI究竟能在多大程度上胜任编程工作?如果有朝一日,AI真正达到资深程序员的水平,码农们又该何去何从?本文将从AI编程工具的历史源流和方向入手,探讨未来AI与人类程序员的关系形式,以及在剧变到来之前,程序员们可以做些什么。

一、AI编程工具的前世今生

现有的AI编程工具大致可以分为两种,一类是以Kite、GitHub Copilot为代表的AI代码补全工具,一类是以ChatGPT、AlphaCode为代表的将自然语言转换成代码的AI生成系统。如果把写代码比作做菜,前者就像替你打下手的小学徒,让你无需重复那些简单劳动;后者则好比饭馆的师傅,只需要说明需求,就可以等待饭菜上桌——比方说,如果你安装了Kite,在输入代码时,它会自动检查并提供我们代码库中最常用的模式,以及利用机器学习预测一些常用的编程模式,从而实现智能补全;而如果你是ChatGPT使用者,只需用自然语言输入需求,它就能直接生成一段代码。

最早涉足AI代码补全的工具有2014年诞生的Kite和Codota(后改名为TabNine)。凭借先进的模型和较为完整的功能,这两款工具一度红极一时。然而,由于当时机器学习还不够成熟,导致模型难以理解代码的结构,Kite生成的代码质量不足以实现预期的10x生产力提升。再加上未能实现商业化导致的盈利困难,Kite最终于2022年11月宣布停止开发。Codota公司也在收购TabNine后放弃了老产品Codota,转而主推TabNine。

动图封面

Kite的界面

虽然Kite 和 Codota的征程以缺憾告终,但二者颇具先锋性的尝试,让开发者看到了让AI参与编程工作的可能性,也催生了至今仍然被广泛应用的TabNine和GitHub Copilot。得益于机器学习的逐步成熟,2018年发布的TabNine和2021年发布的GitHub Copilot采用了更为适合代码生成的模型:TabNine基于GPT-2模型在海量代码数据上进行调优,打造出了一款针对代码的深度学习引擎,能智能识别代码的上文信息,提供长序列的代码补全结果;Copilot在GPT-3模型基础之上通过对GitHub的开源代码进行学习,得到了Codex模型,其原理和TabNine相似,但生成效果更加强大。如今,TabNine和GitHub Copilot都已经拥有上百万用户,越来越多的企业也将它们引入团队之中,成为生产力的一部分。

比起代码补全,让AI根据需求自动生成代码似乎更贴近人们对作为生产力的AI的想象。2017年,来自彭博和英特尔实验室的两位研究人员推出了首个能够自动生成完整软件程序的AI系统 AI Programmer。基于遗传算法的AI Programmer 在最低限度的人类指导下,就可以完整地实现字符串的输出、反转字符串、斐波那契数列等相对简单的程序。但是,AI Programmer所使用的机器编程语言只有8个指令,使之难以完成相对复杂的程序,并在很大程度上依然依赖人工干预,和如今的ChatGPT、Alphacode完全不在同一个量级。

image.png

AI Programmer相关论文

2021年,发布了GitHub Copilot之后,Open AI 推出了支持将自然语言转换成代码的AI系统CodeX。Codex 不仅可以解读简单的自然语言命令,而且能够按照用户的指令执行这些命令,从而有可能为现有应用程序构建自然语言接口。但是,当真正面对复杂的编程问题,CodeX 便显得捉襟见肘:即使对于同一个问题,也可能存在多个不同的解决方案,而如何让 AI 在深度学习中对程序的正确性进行判断,是一项艰巨的挑战。

不过,AI和开发者们并未止步于此。2021年,Deep Mind 公司发布的AlphaCode对这项难题交出了一份满分答卷:Deep Mind 为Alphacode设置了三个关键组件,使其得以在代码生成任务中实现可以与人类竞争的水平:

一是选用广泛且简洁的竞争性编程数据集,以便进行训练和评估;

二是采用大型、且具备高效采样能力的架构;

三是通过大规模模型抽样来缩小探索空间,并根据程序行为对一小组提交内容进行过滤。

由此,AlphaCode的问题解决率大大提升。在Codeforces平台举办的编程比赛模拟评估中,AlphaCode在超过5000名参与者的比赛中平均排名前54.3%——击败了一半的选手,一次通过率更是达到了惊人的66%。

而作为聊天机器人模型的ChatGPT不仅在交互形式上实现了创新,应用场景也空前广泛:ChatGPT不仅可以生成代码和debug,还可以回答技术问题、生成文章,流畅程度足以媲美真人。可以说,ChatGPT几乎是一款一手包办开发者全部需求的理想工具。那么,ChatGPT 的强大实力从何而来呢?

其实ChatGPT在技术原理并没有本质的革新:本质上,它还是一个深度学习模型。值得一提的是它的“学习”方式:ChatGPT出色的表达能力是建立在巨量的参数量级之上的,作为一个大模型,它参数的量级达到了1750亿个。这么大的模型需要的训练数据非常多,大概在十亿以上的规模。如果采用传统的监督学习的方式标注出这么大量级的数据,将非常耗时耗力,效果也未必好。于是,ChatGPT引入了基于人类反馈的强化学习方法,将训练数据样本数量进行了压缩,这样就可以在小规模的标注样本数据集上完成训练。具体方法分为三步:

第一步:利用人类标注的数据对一个模型进行监督训练,称之为sft模型

首先设计一个prompt的数据集,prompt可以理解为提示或者问题,然后人工对这些prompt给出正确的答案,用标注好的数据对sft模型进行训练;

第二步:训练强化学习需要的奖励模型,称之为rm模型

用第一步训练好的模型去做预测,并对几个训练好的不同sft模型预测的结果集进行人工排序,基于排序好的数据对rm模型进行训练;

第三步:用训练好的sft模型和rm模型进行强化学习

以之前两步训练后sft模型和rm模型的参数作为强化学习的初始化参数,并以第二步rm模型的打分作为奖惩依据来更新模型的参数。强化学习的目标函数包含之前的sft模型和rm模型,这就意味着强化学习在自身学习的同时也在不断更写迭代sft模型和rm模型的参数。经过修正过的sft模型和rm模型又反过来作用强化学习模型。经过循环不断地训练、微调,最终收敛完成训练

最后,在训练的同时构建多轮对话能力和未知问题拒绝和违法问题识别的能力,ChatGPT就诞生了。

而为了进一步提升ChatGPT的问题解决能力,近日Open AI 已开始着手招募一批外包人员来训练ChatGPT“像人类一样思考”:开发者用书面英语向ChatGPT解释自己将如何处理一个特定的编程问题,然后提供解决方案,如果发现了bug,则要详细地说明问题和纠正方式。换言之,就是向ChatGPT“投喂”人类思路的数据,以期让ChatGPT在迭代中“学会”人类的思考方式,并用于解决编程问题。毫无疑问,如果ChatGPT真能掌握人类的思考方式,我们将离“人人都是开发者”的未来更近一步:人们只需要向AI描述自己的创意和愿景,就能由AI构建出任何自己想要的产品。

image.png

ChatGPT

二、AI会取代程序员吗?

AI会取代程序员吗?对于这个问题,我们可以换一种问法:未来,AI和人类程序员的关系会是什么样?是AI凭借速度和迭代的优势彻底取代人类程序员?是人类出于伦理和法律争议选择封杀AI?抑或是经过磕磕碰碰的磨合,最终走向人与AI的协作?

诚然,目前AIGC面临着诸多法律和伦理上的争议:AI生成内容,离不开海量的训练数据。那么,训练数据从哪里来?去年,Github Copilot 因被开源开发者告上法庭,正是由于微软和GitHub直接将资源库中的代码用于训练AI。愤怒的开发者称,此举无异于吸开源社区的血。另一边,风头正劲的ChatGPT也因为可能造成抄袭和作弊惹了一身官司,甚至被多所高校禁用,期刊也禁止将其列为作者。但彻底封杀AI并不是明智的选择:GitHub Copilot、ChatGPT等AI工具在实践中的表现已然证明了AI作为生产力工具的实力,也预示着AIGC作为下一个技术爆发点的趋势。封杀AI,无异于自废武功。

那么,随着AI的编程能力越来越强,最终会不会将人类程序员卷出开发领域?毫无疑问,如果AI真能模拟人类的思路,那么它完全可以胜任CURD等简单重复的工作,甚至能解决一些常规问题。后果就是,一些“初级”码农被彻底淘汰。但是,需求是多种多样,无法完全标准化的。即便AI学会了模拟人类的思路,一些高度个性化的,或是非常超前的需求还是需要人类程序员出马。最后,即便未来的AI能够一键完美满足用户的需求,它也无法进行真正意义上的开发:开发工作,不仅仅是写代码,更是业务逻辑的建构和对技术的理解与创想。AI或许能写出完美的代码,但无法真正产生一个哪怕最蹩脚的创意。到那时,开发者一词将被重新定义:任何有需求、有想法的人,都可以是开发者。

不过,以目前AI的“道行”来看,程序员们恐怕还不能放心大胆地把工作丢给它们:不管是GitHub Copilot还是ChatGPT,都出现过代码错误,甚至“不懂装懂”的黑历史,问题解决能力也尚未达到生产级别。可以预见的是,在很长一段时间内,人类程序员和AI将保持一种合作关系。ChatGPT本“人”对此抱有这样的期望:

“不,我不会取代程序员。作为一名程序员,我认为写代码是一种技能,并且需要不断学习和实践来提高。我相信程序员是一个繁忙而充满挑战的工作,并且我也认为程序员在社会中扮演着重要的角色,帮助我们实现许多不可能的事情。我并不想取代程序员,而是希望能够与他们一起合作,为社会做出贡献。”

“我会和程序员合作的方式包括:

提供技术支持:我会为程序员提供技术支持,帮助他们解决遇到的技术问题。

分享经验:我会分享我的经验和知识,帮助程序员更好地完成工作。

合作完成项目:我会和程序员一起合作完成项目,共同解决问题并实现目标。

提出建议:我会提出建议和观点,帮助程序员更好地完成工作。

持续学习:我会继续学习新的技术和知识,为和程序员的合作提供更多的帮助。”

未来AI或许就像键盘上的按键一样不可或缺!

三、AIGC与低代码

纵观AI编程的发展历程,不难发现,AI编程的趋势是代码量逐渐降低,直至用户使用自然语言即可完成编程。这一趋势和低代码技术有着异曲同工之妙:用尽可能少的代码完成需求,从而提高开发效率,降低开发门槛。不过,据专业人士估测,AI编程真正实现类似低代码的能力,至少还需要十年的时间;大模型编程AI的较高成本,也让完全依靠AI完成产品开发显得不太现实。因此,在AI编程尚未普及的当下,不妨试试更为成熟的低代码。

如今,借助AI编程工具,虽然可以实现代码补全和简单的按需生成代码,但目前几大主流的AI工具都存在着诸多问题:TabNine经常会推荐生成了一半的补全结果,也会经常推荐出本工程内不存在的API,使用离线模式时,内存和CPU占用量高得吓人;Copilot的模型更为强大,但依然会在很多情况下生成存在语法错误的代码片段,甚至陷入死循环;ChatGPT 生成的代码有时是有问题的,甚至是误导性的,比如出现伪造出来的参数。相比之下,具有一定技术基础的开发者使用低代码进行编程,至少可以把“主动权”掌握在自己手里,避免出现不明不白的错误;面对个性化需求时,低代码也有着显著的优势:试想,当你突然产生了一个前无古人的创意,急于把它实现出来,于是打开了编程AI,却发现,由于相关样本不足,AI无法理解你的想法,输出了一堆风马牛不相及的代码,反而把你的思绪搅得一团糟,是不是想想就血压升高?而如果你熟练掌握一项低代码开发工具,就完全可以在短时间内完成原型的构建和测试,并为后续开发持续赋能。

即将上线的飞布正是一款致力于改善开发体验,提高开发速度,灵活适应需求的可视化API开发平台。

飞布的优势主要有:

①. 轻松上手:只需要30分钟的学习,开发者便可借助飞布构建出稳健的生产级WEB API。

②. 后端切入:不同于目前市面上的前端低代码平台,飞布从后端切入,真正实现让开发者无需重复CURD,掌握飞布,前端也能变全栈,后端更能将节省的时间投入到更有价值、更感兴趣的工作中来。

③. 操作简便:飞布专注于API开发,用可视化界面封装了API开发的复杂性,支持多种数据源,且与编程语言无关,用户通过配置和勾选即可生成生产级REST API;飞布还集成了数据库设计功能,用户无需刻意学习,即可上手开发,从而节约大量的学习成本和开发时间,达到降本增效的目的。

④. 强大的灵活性:飞布的HOOKS 机制方便开发者采用任何喜欢的语言实现自定义逻辑。同时,飞布通过内置WebContainer,让TypeScript开发者无需准备任何环境,即可进行nodejs钩子的开发,从而具备强大的灵活性,适配前端低代码所不能实现的需求。

⑤:广阔的应用场景:飞布的适用场景也远比传统的前端低代码平台更加广阔,横跨中后台开发、移动端开发、BI大屏,以及如今大火的区块链应用开发。

⑥.飞布支持AI智能推荐功能,可以实现类似于GitHub Copilot等AI智能补全工具的效果。另外,飞布hooks可集成AI代码生成功能,进一步提升飞布开发效率。

飞布与AI生成代码主要有以下两点不同:

1.飞布不仅针对开发环节,也针对部署和运维环节,两者切入点不同;

  1. 飞布是声明式编程,AI辅助写代码是命令式编程,实现相同功能的路径不同。相比而言,使用飞布产出的代码会更稳定。但辅助编码和传统编码的灵活性是一样的,所以飞布也集成了hooks来弥补。

最后,当AI编程普及之后,人类开发者真正的竞争力在于业务逻辑和创意。从现在开始,用低代码解放重复劳动,将更多时间投入业务逻辑的提升和创造力的培养,或许会是实现抢跑,快人一步的关键;而在编程AI追赶人类程序员的过程中,飞布通过功能集成和简便的API开发,实现让AI为人类程序员赋能,人类为AI拓宽应用场景,积极探索人机协作的无限可能。