AI先锋

LLMs和AI代码生成器的使用不断增长

LLMs和AI代码生成器的使用不断增长

像GPT-4这样的大型语言模型和GitHub Copilot这样的工具可以让优秀的程序员更有效率,但也会让糟糕的程序员变得更加危险。你准备好了吗?

截至2023年5月,仅在Visual Studio Code中就有数百个“AI”或“代码生成”扩展可用。其中几个可能会在编码时节省您一些时间。

该领域中一个值得期待的发展是,有几个工具可以自动生成单元测试。相比生成通用代码,生成单元测试要容易得多——实际上,可以使用简单模式来完成——但您仍需要查看和运行生成的测试,以确定它们是否有意义。

在本文中,我将提供一个简要的语言模型历史概述,然后调查当前最先进的大型语言模型(LLM),例如OpenAI的GPT家族,Google的LaMDA和PaLM,用于文本生成和代码生成。最后,我们将快速介绍10种代码生成工具,包括Amazon CodeWhisperer、Google Bard和GitHub Copilot X。

文本生成的AI模型简史


语言模型可以追溯到1913年的Andrey Markov。现在这个研究领域称为马尔可夫链,是马尔可夫模型的一种特殊情况。Markov在俄语中,特别是在普希金的《叶甫根尼·奥涅金》中展示了字母出现的概率取决于前一个字母,并且通常辅音和元音倾向于交替出现。自那时以来,Markov的方法已经推广到单词、其他语言和其他语言应用。

1948年,Claude Shannon在通信理论中扩展了Markov的工作,1985年,IBM的Fred Jelinek和Robert Mercer再次扩展了该工作,基于交叉验证(他们称之为删除估计)产生了一种语言模型,并应用于实时的大词汇语音识别。基本上,统计语言模型为单词序列分配概率。

为了快速了解语言模型的操作,可以在谷歌搜索引擎或智能手机上的文本消息应用中输入几个单词,并允许其提供自动完成选项。

现在已经开始接受提名,角逐2024年度IT最佳工作场所。2000年,Yoshua Bengio等人发表了一篇关于神经概率语言模型的论文。其中神经网络代替了统计语言模型中的概率,避免了维度灾难,并将基于前面单词的单词预测结果比平滑的三元模型(那时是最先进的)提高了20%至35%。如今,基于前馈、自回归的神经网络模型仍然在使用,但这些模型现在具有数十亿的参数,并且经过大量的语料库训练,因此被称为“大型语言模型”。

正如我们将看到的那样,随着时间的推移,语言模型不断变得更大以使其运行更加出色。然而,这也有成本。Emily Bender、Timnit Gebru等人在2021年发表的论文《关于随机鹦鹉的危险:语言模型是否太大?》质疑我们是否在走向极端。作者指出,我们应该首先权衡环境和财务成本,并投入资源来策划和精心记录数据集,而不是将互联网上的所有内容都摄入进来。

Gebru和Bender都因为实质上指出了“裸体的皇帝”,而随后在谷歌失去了工作。Bender现在在华盛顿大学任教。Gebru则创立了分布式AI研究所。

文本生成的大型语言模型

近年来,大型语言模型的爆炸式增长始于Google Brain和Google Research的Ashish Vaswani等人于2017年发表的论文《Attention is All You Need》。该论文介绍了一个“新的简单网络架构Transformer,仅基于注意机制,完全放弃循环和卷积”。 Transformer模型比递归和卷积模型更简单,同时也更优秀。它们的训练时间也明显缩短。

ELMo


ELMo是AllenNLP(请参阅ELMo论文)于2018年推出的一种深度上下文化的词表示,它模拟了单词使用的复杂特征(例如,语法和语义)以及这些用法在语言环境中的变化(即,为了建模多义性)。原始模型有9360万个参数,并在十亿字基准上进行了训练。

BERT

BERT(Bidirectional Encoder Representations from Transformers)是谷歌AI语言于2018年发布的语言模型,基于公司的Transformer(2017)神经网络架构(参见BERT论文)。BERT旨在通过联合所有层中的左右上下文来预训练无标签文本的深度双向表示。原始论文中使用的两个模型大小为1亿和3.4亿个参数。BERT使用掩码语言建模(MLM),其中约15%的令牌被“破坏”以便进行训练。它在英文维基百科及多伦多书籍语料库上进行了训练。

T5

2020年,谷歌推出了基于GPT、ULMFiT、ELMo和BERT及其后继模型最佳迁移学习技术的新模型——Text-To-Text Transfer Transformer(简称T5)。该模型使用一个名为Colossal Clean Crawled Corpus(C4)的开源预训练数据集,标准英语C4数据集大小为800GB,基于Common Crawl数据集。T5将所有自然语言处理任务重新构建成一个统一的文本到文本格式,其中输入和输出始终是文本字符串,而不像BERT风格的模型只输出类标签或输入的一段内容。基础T5模型总共有约2.2亿个参数。

GPT家族

OpenAI是一家人工智能研究和部署公司,其使命是“确保人工通用智能(AGI)惠及全人类”。当然,OpenAI尚未实现AGI。一些人工智能研究者,如Meta-FAIR的机器学习先驱Yann LeCun,认为OpenAI目前对AGI的方法是一条死胡同。

OpenAI负责GPT语言模型系列,可通过OpenAI API和Microsoft的Azure OpenAI服务获得。请注意,整个GPT家族都基于谷歌2017年的Transformer神经网络架构,这是合法的,因为谷歌已开源了Transformer。

GPT(生成预训练变压器)是OpenAI于2018年推出的模型,使用了约1.17亿个参数(请参阅GPT论文)。GPT是一个单向变压器,它在Toronto Book Corpus上进行了预训练,并使用因果语言建模(CLM)目标进行了训练,这意味着它被训练来预测序列中的下一个标记。

GPT-2是2019年推出的直接升级版,拥有15亿个参数,并在800万个网页或约40GB的文本数据集上进行了训练。OpenAI最初限制了对GPT-2的访问,因为它“太好了”,会导致“虚假新闻”。尽管随着GPT-3的发布,潜在的社会问题变得更加严重,但公司最终松口允许访问。

GPT-3是2020年推出的自回归语言模型,具有1750亿个参数,并在Common Crawl、WebText2、Books1、Books2和英文维基百科的过滤版本组合上进行了训练(详见GPT-3论文)。GPT-3使用的神经网络与GPT-2类似,只是增加了一些额外的模块。

GPT-3最大的缺点是容易“幻觉”,也就是编造没有明显依据的事实。GPT-3.5和GPT-4也存在这个问题,但程度较轻。

CODEX是2021年推出的GPT-3后代,专门为代码生成而进行微调,使用了5400万个开源GitHub存储库中提供的数据。这是GitHub Copilot使用的模型,在下一节中进行讨论。

GPT-3.5是针对GPT-3和CODEX的2022年更新版本。gpt-3.5-turbo模型专为聊天优化,但对于传统完成任务也表现良好。

GPT-4是2023年推出的大型多模态模型(接受图像和文本输入,输出文本),OpenAI声称在各种专业和学术基准测试中具有人类水平的表现。在多个模拟考试中,包括统一律师考试、LSAT、GRE和数个AP科目考试,GPT-4的表现都超过了GPT-3.5。

OpenAI未公开GPT-4的训练方式,这是一个严重的问题。该公司表示出于竞争原因不便公开,考虑到微软(一直资助OpenAI)和谷歌之间的竞争,这种解释似乎有些道理。然而,由于不知道训练语料库中的偏见,我们也无法得知模型中的偏见。Emily Bender在Mastodon上发表了对GPT-4的看法(于2023年3月16日发布),认为“在#OpenAI公开其训练数据、模型架构等信息之前,应该假定GPT-4是有害垃圾。”

ChatGPT和BingGPT是基于gpt-3.5-turbo开发的聊天机器人,在2023年3月升级为GPT-4。要使用基于GPT-4的ChatGPT版本,需订阅ChatGPT Plus。标准版ChatGPT是基于2021年9月截止的数据进行训练的。在Microsoft Edge浏览器中可用的BingGPT也是基于2021年截止的数据进行训练的,但当询问时,它会回答:“我正在不断学习和更新来自网络的新信息。”

2023年3月初,香港科技大学人工智能研究中心的Pascale Fung就ChatGPT的评估问题作了一次演讲。推荐花费1小时时间观看,收获不少。

LaMDA

LaMDA(Language Model for Dialogue Applications)是谷歌2021年的“突破”对话技术,它是一款2017年训练有素的Transformer模型,专门用于对话,并进行了微调以显著提高其响应的合理性和特异性。 LaMDA 的一个优点是它可以处理人类对话中常见的主题漂移。

一种 LaMDA 版本驱动着 Bard,谷歌的会话式 AI 服务。Bard 于2023年3月21日发布,并于2023年5月10日正式推出。我将在下面讨论它的代码生成能力。

PaLM(Pathways Language Model)是谷歌研究的一种2022密集解码器-仅Transformer模型,具有5400亿个参数,使用 Pathways 系统进行训练(请参阅 PaLM 论文)。PaLM 使用英语和多语言数据集的组合进行训练,包括高质量的网络文档、书籍、维基百科、对话和 GitHub 代码。

谷歌还为 PaLM 创建了一个“无损”词汇表,以保留所有空格(对于代码尤其重要),将超出词汇表的 Unicode 字符分割成字节,并将数字分割为单独的标记,每个标记代表一个数字。PaLM-Coder 是 PaLM 540B 在仅使用 Python 代码数据集进行微调的版本。

PaLM-E

PaLM-E是谷歌于2023年推出的一款“具身化”(面向机器人)多模态语言模型。研究人员首先使用强大的大型语言模型PaLM,然后将它进行具身化(即“E”在PaLM-E中的意思),通过补充机器人代理的传感器数据使其具有行动能力。除了PaLM之外,PaLM-E还是一个通用的视觉语言模型。除了PaLM之外,它还包含ViT-22B视觉模型。

LLaMA

LLaMA(Large Language Model Meta AI)是Meta AI(又名Meta-FAIR)于2023年2月发布的一个650亿参数的“原始”大型语言模型。据Meta称,“在大型语言模型领域中,训练像LLaMA这样较小的基础模型是可取的,因为它需要更少的计算资源来验证新方法、验证他人的工作并探索新的用例。基础模型训练于大量未标记的数据集上,这使它们非常适合调整各种任务。”

LLaMA以几个不同的规模发布,并附有一个说明模型构建方式的模型卡片。最初,你必须请求检查点和分词器,但是根据Meta-FAIR的Yann LeCun所说,现在它们都已经可供下载,因为有人通过请求正确获得了这些模型并在4chan上发布了一个可下载的种子文件。

专业的代码生成产品

虽然包括ChatGPT和Bard在内的几个大型语言模型可以用于释放的代码生成,但是如果它们经过调整以适应一些代码(通常来自免费开源软件),则会有所帮助,以避免明显的版权侵犯。这仍然引起了“开源软件盗版”的问题,这是2022年联邦集体诉讼对GitHub,Microsoft(GitHub的所有者)和OpenAI关于GitHub Copilot产品和OpenAI GPT Codex模型的指控。

请注意,除了使用主要基于公开可用代码进行训练的人工智能模型之外,一些代码生成工具还依赖于搜索代码共享网站,例如Stack Overflow。

亚马逊CodeWhisperer

Amazon CodeWhisperer与Visual Studio Code和JetBrains IDE集成,在现有代码的基础上生成代码建议以响应注释和代码完成,并可以扫描代码以查找安全问题。您还可以激活CodeWhisperer以在AWS Cloud9和AWS Lambda中使用。

CodeWhisperer良好地支持Python、Java、JavaScript、TypeScript和C#编程语言,另外10种编程语言的支持程度较低。它可以免费提供给个人开发人员使用,对于专业团队每位用户每月收费19美元。

CodeWhisperer帮助我编写了下面显示的Python代码。我进行了审查、测试和调试,它很好。

Bard

2023年4月21日,Bard编程平台宣布支持超过20种编程语言,包括C ++、Go、Java、JavaScript、TypeScript和Python等。为了迅速测试其功能,我让Bard写了一个Go函数来获取当前日期和时间,并且它很快就完成了任务。

CodeT5

CodeT5是Salesforce AI Research于2021年发布的一款针对编程的统一预训练Encoder-Decoder Transformer模型。它基于2020年谷歌T5模型架构,并在CodeSearchNet数据集以及BigQuery中的一些C/C#代码上进行了微调。CodeT5的官方PyTorch实现位于GitHub上,同时在Hugging Face上提供了两个检查点,链接可以在GitHub的README中找到。

GitHub Copilot

GitHub Copilot是一个基于OpenAI Codex开发的工具,其源自GPT-3,并针对5400万个开源GitHub仓库进行了代码生成的微调。当我在2021年11月审查了GitHub Copilot的预发布版本后,我发现尽管它并不总是能生成良好、正确或可运行的代码,但它仍然有一定的用处。目前GitHub Copilot的价格是每月10美元或每年100美元,除非你符合免费版本的条件。

我喜欢Copilot在Visual Studio Code中的工作方式。你只需要编写函数的第一行或描述函数的注释,Copilot将生成最多10个版本的函数,你可以直接使用,编辑或不使用。正如我上面所指出的,你应该带着怀疑的态度来看待Copilot生成的任何代码,因为它倾向于产生幻觉,例如下面示例中第8和9行的代码注释。

GitHub Copilot X

GitHub Copilot X是基于GPT-4的技术预览版产品。相较于原版Copilot,它提供了聊天和终端界面、生成单元测试的能力、生成拉取请求说明以及从文档中提取解释的功能,可以说是对原版进行了大幅度升级。

实际使用中,GitHub Copilot X已经在很大程度上减少了依赖人类帮助的情况下生成正确的函数和测试用例的次数,尽管仍会出现错误和幻想,但其出错率要远低于原版本。如果您需要参考原版Copilot,请看这里。

IntelliSense与IntelliCode

Microsoft IntelliSense是Visual Studio和Visual Studio Code内置的功能,使用语言语义为短代码完成提供菜单选择。它通常在帮助您查找所需API或方法调用方面表现良好,但倾向于提供许多选择。

IntelliCode是IntelliSense的附加增强功能,它使用在本地计算机上运行的人工智能来检测您的代码上下文-包括变量名、函数和您编写的代码类型-以给出最佳建议,并在某些情况下提供整行完成。IntelliCode还可以帮助您清理重复的代码,并为常见的编程任务推荐快速操作。

IntelliCode与Visual Studio 2022中的C#,C ++,Java,SQL和XAML以及Visual Studio Code中的TypeScript,JavaScript和Python一起使用。

Kite

Kite是一项早期尝试使用人工智能帮助开发者编写代码的项目,它从2014年运营到2021年。虽然吸引了超过50万名开发者,但从未产生任何收入。Kiteco的代码库包含了大部分源代码,但其中私有部分已被替换为“XXXXX”,因此部分代码无法运行。

PolyCoder

PolyCoder是卡内基梅隆大学于2022年推出的一个开源大型语言模型,具有27亿个参数,用于生成代码(详见论文)。它基于GPT-2模型架构,并在12种编程语言的249GB代码上进行了训练。在C编程语言中,PolyCoder的表现优于包括Codex在内的所有模型。

Replit Ghostwriter

Replit Ghostwriter是一款于2022年万圣节发布的软件,提供了五项功能:代码完成、代码解释、代码转换、代码生成和带有调试的错误检测,每月收费10美元(根据使用“周期”数量而定)。该软件只与Replit在线编辑器兼容,并支持Python、Ruby、JavaScript、TypeScript、HTML、CSS、Go、Lisp、Haskell、Bash、C、C++、Rust、Java和JSON。

Replit表示,Ghostwriter“返回从公开可用代码训练的大型语言模型生成的结果,并由Replit进行了调整”。Replit没有指明它在Ghostwriter中使用的LLMs或训练语料库,这使得它面临着与Emily Bender关于GPT-4所提出的相同指控:除非Replit公开其训练数据、模型架构等信息,否则应该认为Ghostwriter是有毒垃圾。这也使得Replit面临着与GitHub Copilot有关的“开源软件盗版”的指控,这些指控正在通过法院传来。

Tabnine

Tabnine是一家位于特拉维夫的公司推出的软件,类似于增强版的IntelliSense,并且可以选择在开源代码以及自己的代码语料库上进行训练。它可以在编辑器或IDE中进行整行和整个函数的代码完成,支持20种工具,从Visual Studio Code和IntelliJ到Emacs和Vim。

根据你所选择的计划,Tabnine可以使用通用的AI模型,在开源代码上进行训练,也可以使用一组针对所有编程语言进行优化的生成式AI模型,“专为与你的技术堆栈匹配”或者由你自己的代码库训练的私有代码模型。

Tabnine的免费Starter计划仅提供基本的代码完成功能。Pro计划每个用户每月12美元,提供整行和整个函数的代码补全。Tabnine没有透露其模型架构或训练语料库。因此,根据Emily Bender原则,我们应该假设它生成的任何代码都是最糟糕的情况。

尽管大语言模型有时可以用于生成或完成代码,但无论它们是否已经在代码语料库上进行了训练,训练过的代码模型往往更了解空格的重要性。而像OpenAI Codex和Tabnine这样的代码生成产品通常比更通用的语言模型具有更好的编程编辑器集成。

我们应该期望AI代码生成器随着时间和使用而改进。GitHub Copilot X比原始的Copilot更好,我相信下一个Copilot将会更好。然而,你永远不能假设由任何类型的AI生成的代码是正确或高效的,甚至不一定能编译和运行。你应该像处理未知程序员的合并请求一样对待AI生成的代码,这意味着在将其纳入你的应用程序之前要进行审核、测试和调试。

分享此文章