我是如何学会喜欢自主生成AI与自动完成的

我是如何喜欢生成AI与自动完成的

新的生成式AI代码工具通过合成代码帮助开发人员更快地完成工作,付出更少的努力。ChatGPT和其他LLM方法使这种生成式AI对广大普通用户来说更加可访问。开发人员们纷纷涌入。

但是往往被忽视的是生成式AI代码工具与其他方法之间的基本区别,而这些区别决定了哪种方法更适合您的开发任务。在底层,生成式AI代码工具分为两个基本类别:基于Transformer的大型语言模型(例如Copilot,ChatGPT)和基于强化学习的系统(RL)。

RL与Copilot等LLM之间最大的区别在于,Copilot是一个交互式代码建议工具,适用于一般的代码编写(微软将其称为“AI伙伴程序员”),而基于强化学习的系统可以在没有人类帮助的情况下生成代码。一个RL的例子是Diffblue Cover,它可以自主编写完整的、功能齐全的单元测试套件。

Copilot的设计初衷是与人类开发人员一起处理乏味和重复的编码任务,如编写样板代码和调用“外国领域”(第三方API)。虽然您可以让Copilot为您的代码提供单元测试建议,但您不能将其指向一百万行代码,然后在几个小时后得到成千上万个编译和运行正确的单元测试。

这是因为它们本质上是不同的东西,或者说是工具,在选择方法之前,开发人员需要首先考虑她想要实现什么。

强化学习可以成为解决复杂问题的强大工具。由于它们使用预先收集的数据进行学习,因此RL系统在笔记本电脑上运行速度很快,特别对大型数据集非常有效。

从历史上看,进行在线训练(使AI模型与真实世界进行交互学习)的成本是禁止的。OpenAI、Google和Meta的新LLM大大降低了这种成本,吸收了其中的大部分费用。但开发人员仍然需要审查生成的代码!

以创建单元测试为例。Copilot会写一个测试,并要求进行一些“提示工程”来引导它编写不同的测试,还需要时间来编辑生成的建议并使其编译和运行正确。另一方面,RL可以理解每个动作的影响,可能会获得奖励并重塑其参数,以最大化这些奖励。通过这种方式,模型学会了哪些动作会产生奖励,并定义了策略——它将遵循的策略——以最大化这些奖励。然后,它会生成可以自主编译和运行的单元测试。

基于Transformer模型的代码补全工具通过分析给定的文本来预测序列中的下一个单词或令牌。这些Transformer模型在演变中发生了巨大的变化,并使生成式AI登上了全球新闻头条。它们的输出看起来像是魔术。GPT-2是最早于2019年2月发布的开源模型之一。从那时起,这些模型中的参数数量已经大幅增加,从GPT-2的15亿个参数到2022年11月发布的GPT-3.5的1750亿个参数。

OpenAI Codex是一个拥有约50亿个参数的模型,用于GitHub CoPilot,它专门针对开源代码进行了训练,使其在从简单注释生成样板代码和基于过去看到的示例调用API等任务上表现出色。这些模型的一次性预测准确率已经达到了明确训练的语言模型可比拟的水平。不幸的是,GPT-4是一个黑匣子——我们不知道使用了多少训练数据或参数数量来开发该模型。

尽管LLM AI驱动的代码生成工具看起来很棒,但有时它们是不可预测的,并且严重依赖于提示的质量(这引发了在LinkedIn上发布新的“提示工程”工作的热潮)。由于它们本质上是文本模式的统计模型,它们可能会生成看起来合理但实质上存在缺陷的代码,或者出现着名的幻觉。

例如,GPT-3.5在循环中结合了人类强化学习,通过人类进行排序以产生改进的结果,并进行了人类编写的响应的训练。然而,识别这些模型产生的细微错误仍然是一个挑战,这些错误可能会导致意外后果,比如涉及德国编码公司OpenCage的ChatGPT事件。无论在训练这些模型时使用了多少训练数据和参数,这些问题都不会消失。

另外,大型语言模型(LLMs)通过处理文本来进行学习。但是,很多学习与文本或语言完全无关。这就像通过阅读教科书来学习篮球与通过打球学习篮球之间的区别。

强化学习与LLM的不同之处在于它专注于通过实践学习,而不是依赖文本。在单元测试的上下文中,这个过程允许系统迭代改进,生成具有更高覆盖率和更好可读性的测试,最终为开发人员提供更有效和高效的测试过程。