2 AI编码技术的工作原理

在本章中,我们将揭开人工智能辅助编程工具的神秘面纱,了解它们的工作原理。我们将简要回顾一下历史,体验一下变换器模型和LLM,并演示OpenAI Playground。然后,我们将获得一些关于如何评估LLM的建议。

掌握这项强大的技术能做什么、不能做什么,将为在实际软件项目中更明智地使用人工智能辅助编程工具铺平道路。

2.1关键功能

GitHub Copilot、Tabnine、CodiumAI 和 Amazon CodeWhisperer 等人工智能辅助编程工具在市场上引起了热议。每种产品的制造商都试图标榜自己的特色。不过,这些工具也有不少共同的功能。

  • 代码建议:根据注释和文件上下文提供代码建议;推荐单行或整个函数。
  • 上下文感知补全:提供基于全部或部分代码库的上下文感知代码补全,以及帮助编码的建议。
  • 测试生成: 分析代码以生成有意义的测试、映射代码行为并显示边缘情况,从而确保软件在发货前的可靠性。
  • 用户与集成开发环境互动:当用户在集成开发环境中输入代码时,自动激活并提供指导;用户可通过聊天与代码互动。
  • 代码分析:分析代码片段、文档说明和注释,提供可靠的代码预测并标记可疑代码。
  • 错误检测和修复:识别代码中的潜在错误,并提出修复方法。
  • 自动文档:自动添加文档说明并增强代码文档。
  • 常规任务自动化:帮助为常规或耗时任务、不熟悉的 API 或 SDK 以及文件操作和图像处理等其他常见编码场景创建代码。
  • API和 SDK使用优化:帮助正确有效地使用 API 和 SDK。
  • 开放源代码的发现和归属:协助发现和归属开放源代码和库。

这些系统可以为开发人员提供很大的帮助,主要是通过提供代码建议和上下文感知的补全。我们将在下一节详细介绍这些功能。

2.2代码建议和上下文感知补全与智能代码补全

智能代码自动补全(也称为自动完成或微软的 IntelliSense)是许多集成开发环境的神奇之处。当开发人员敲击键盘时,它们会向开发人员提供帮助,提示、填充和突出显示代码段。实际上,这种技术早在上世纪50年代末拼写检查程序出现时就已经存在了。

突破性进展出现在20世纪90年代中期。微软的Microsoft Visual Basic 5.0提供了实时建议和补全,重点放在基本语法和函数签名上。这大大提高了工作效率,减少了错误。

因此,你可能想知道 与人工智能辅助编程工具相比,IntelliSense的优势在哪里?毕竟,IntelliSense在人工智能和机器学习方面有一定的优势。

然而,这两者之间有一个重要的区别。人工智能辅助工具由生成式人工智能驱动。它们提供的不仅仅是代码,还有自助式文档、规划文档和帮助指南等。得益于生成式人工智能,这些工具能够根据给定的上下文,娴熟地生成、调整和理解类似于人类的文本,使它们成为翻译、摘要、文本分析、主题建模和回答查询等方面的佼佼者。使用这些工具有时就像与代码闲聊一样。以LLM为核心,它们可以从你的输入中捕捉到上下文和意图的变化。

2.3编译器与人工智能辅助编程工具

要更好地理解人工智能辅助编程工具,首先要了解编译器的工作。以下是编译器执行的主要步骤:

  • 词法分析(标记化)
    编译器就像一位语言教师,将你的代码分解成标记。

  • 语法分析

在这里,编译器会检查标记是如何分组的。它确保您的代码具有正确的结构,而不仅仅是正确的命令。

  • 语义分析(错误检查)

编译器确保您的代码在编程语言的上下文中是有意义的。这不仅关系到语法的正确性。它还涉及正确的含义。

  • 生成中间代码

这是您的代码开始转换之旅的地方。编译器会将高级代码转换为中间形式。虽然还不是完全的机器语言,但它已经达到了机器语言的水平。

  • 代码优化

在这一步骤中,编译器就像是代码的私人教练,使代码更精简、更高效。它会调整中间代码,使其运行更快,占用空间更少。

  • 代码生成

这是最后的转换。编译器将优化后的中间代码转换成CPU可以理解的机器代码或汇编语言。

  • 链接和加载:

链接有时被认为是编译过程的一部分,它涉及将各种代码和库组合成一个单一的可执行程序。加载是将程序放入内存执行的过程。

至于像Copilot这样的人工智能辅助编程工具,则是另一回事。它们不像编译器那样能真正“理解”编程语言。相反,它们使用人工智能,根据大量已有的代码进行猜测并提出代码建议。由于这些工具在玩概率游戏,因此建议可能会有很大差异。然后,编译器会将这些代码编译成机器可以运行的程序。

有时,人工智能工具可能会漏掉一些简单的地方,比如一个括号,而人类编码员或编译器会立刻发现。这是因为LLM基于预测模式,而不是编译引擎。如果有些东西在训练中并不常见,它们可能就不会发现。此外,这些工具可能会变得花哨,并根据情况建议复杂的代码。是的,人工智能辅助编程工具可能会走火入魔。

说到发现错误,人工智能辅助编程工具一般都很有效,但仍无法与编译器忍者般的查错技能相提并论。不过,这些工具仍然很强大。例如,它们可以帮助捕捉恼人的语法错误--缺少分号、函数名中的错别字、括号不匹配--并迅速提出正确的修正建议。它们还能帮助你避免常见的编码陷阱。无论是提醒你在打开文件后正确关闭文件,还是建议你以更有效的方式循环使用数组,这款工具都能为你提供支持。说到逻辑错误,人工智能辅助编程工具的洞察力令人惊讶。它们可能无法解决所有复杂问题,但往往能提出你可能未曾考虑过的替代方法或解决方案,将你的问题解决之旅引向正确的方向。

这一切都意味着,虽然人工智能工具有助于让编码更顺畅,但它们并不能取代编译器的全面检查或人类编码员的敏锐眼光。

这些缺点真正强调了将人工智能辅助工具的智能与编译器的全面检查和人性化相结合是多么重要。毕竟,你要确保代码不仅是好的,而且是准确无误的。

2.4能力水平

2023年10月,Sourcegraph的首席执行官兼联合创始人Quinn Slack分享了一篇颇有见地的博文。他深入研究了Copilot等人工智能辅助编程工具的世界,并提出了一种有趣的思考方式,他称之为 “代码人工智能水平”。他的分步框架让每个人都能更容易地了解这些人工智能工具的功能,并检查销售这些工具的公司夸夸其谈的说法是否真的站得住脚。

前三个级别侧重于由人类主导的编码,其中开发人员是主要参与者。从0级开始,没有人工智能的辅助,这是老式的编码。开发人员在没有人工智能的情况下手工完成所有工作。这是基线,为人工智能以后的介入奠定了基础。

然后是第一级,即代码完成。这时,人工智能开始介入,并根据周围的情况帮助完成单行或整段代码。在这个阶段,开发人员仍然处于主导地位,指挥整个程序,并使用人工智能作为典型编码任务的捷径。

第二级,代码创建,提升了人工智能。在这里,人工智能的动手能力更强,并能编写更长的代码部分。例如,人工智能可以设计应用程序接口,甚至修复现有代码。当然,这一切都需要人工智能的监控。这一级需要人工智能了解代码库及其周围的环境,这样才能编写出不仅正确,而且非常适合的代码。

从第三级(受监督的自动化)开始,我们看到人工智能在编码方面的主导地位发生了转变。在这一阶段,人工智能会处理多项任务,以实现人类设定的更广泛的目标,而且不需要每次都进行检查。在这个阶段工作,就像把工作委托给初级开发人员。这个级别的人工智能已经足够精明,它可以整理错误、添加新功能、将系统整合在一起,并在过程中向人类同行请教任何问题。

到了第4级,也就是完全自动化,人工智能才真正提高了自己的水平。在这里,它可以独自处理复杂的任务,而不需要人类对代码竖起最后的大拇指。想象一下,如果你是首席执行官或产品经理,你会多么信任一位一流的工程师。这就是这个级别所追求的关系。人工智能不只是做出反应。它在主动关注代码,发现并解决出现的问题。

最后是第五级,即人工智能主导的完全自主。这一级别是完全不同的游戏,人工智能不仅要听从人类的指令,还要设定自己的目标。这是关于人工智能在核心奖励功能基础上的工作。把它想象成在一个与其他代理对决的世界中玩自己的游戏。当然,这个层面听起来有点像科幻小说,但考虑到事物发展的速度,我们不难想象,在我们的有生之年,这个层面可能会成为现实。

目前,像Copilot这样的工具还在第3级左右徘徊。确定确切的级别可能比较困难,但奎因-斯拉克的框架在理解技术及其关键互动方面做得相当出色。有一点是肯定的:这项技术的发展并没有放缓,而是在飞速前进。

参考资料

2.5 生成式人工智能和大型语言模型 (LLM)

使用人工智能辅助编程工具并不需要你是一个精通生成式人工智能技术的奇才。不过,对这项技术有一个鸟瞰式的了解会非常方便。你将能够更敏锐地评估这些工具的反应、能力和局限性。

在这里,透明度不仅仅是一个流行词。要让一项新技术真正流行起来,清楚地了解其原理至关重要。采用的关键在于信任。在编码领域,可靠性和责任感不仅仅是花哨的附加功能,它们更是面包和黄油。

在接下来的章节中,我们将对生成式人工智能和 LLM 蜻蜓点水,让你对它们有一个更清晰的认识。

2.5.1 演进

生成式人工智能的历史可以追溯到几十年前,最早的例子之一是ELIZA,它是麻省理工学院教授约瑟夫-韦曾鲍姆(Joseph Weizenbaum在60年代中期创造的聊天机器人。ELIZA的设计目的是模仿与心理治疗师的聊天(你现在还能在网上找到它)。当然,ELIZA是最基本的,它依靠基于规则的算法运行,主要是模仿用户的输入。

然而,许多人发现,与ELIZ 聊天比与真正的心理医生聊天更愉快,有些人甚至被骗了,以为自己是在与人交流。这种奇特的现象被称为“ELIZA效应”,它展示了人们是多么容易想象出计算机程序对人类的理解能力。

然而,生成式人工智能的发展历程并非一帆风顺。其核心的技术装备相当基础,进展更像是缓慢的爬行。但到了 2010年代,这一领域迎来了转折点。现在的技术世界拥有强大的计算能力、GPU(图形处理器)等华丽的硬件系统、数据宝库以及深度学习等复杂模型的微调。就这样,生成式人工智能又回到了快车道上。随着它的发展,出现了不同的方法:

  • 变异自动编码器(VAEs Variational autoencoders)

这项技术于2013年首次亮相,这要归功于 Diederik P. Kingma 和 Max Welling 及其论文《变异贝叶斯自动编码》。他们的 VAE 模型由来自更复杂、更高维度数据的低维度潜空间组成,所有这些都无需监督。它还包括一个编码器-解码器结构。当我们说高维数据时,我们指的是具有许多特征的数据,每个特征是一个维度--想想在784维空间中的28×28像素图像。低维潜在空间就像是这些数据的精简版,在保留关键信息的同时,又舍弃了额外的维度。这一点非常重要,因为它减轻了计算负荷,抵御了维度诅咒,使数据更易于可视化和解释。这种从高维空间到低维空间的飞跃被称为降维,它将数据简化到了最基本的程度。传统的自动编码器会为每个潜在属性输出一个单一的值,而VAE 编码器则不同,它会为你提供一个概率分布。然后,解码器从该分布中选取样本重建数据。这种在潜空间中提供一系列数据而非单一值的巧妙技巧,为创建新数据或图像打开了大门。

  • 生成对抗网络(GANs)

生成对抗网络由伊恩-古德费洛(Ian Goodfellow)及其同事于2014年提出,是一类用于无监督机器学习的人工智能算法。生成式对抗网络的核心是两个神经网络,分别被称为生成器和判别器,它们在类似游戏的对决中正面交锋。生成器产生新的数据块,而鉴别器则扮演裁判的角色,分辨真假数据。每一轮,生成器都会提高自己的水平,制作出与真实实例极为相似的数据。这种巧妙的设置打开了通往新可能性的大门,使人工智能可以创造出逼真的图像、语音录音以及其他更多的东西。

这些类型的生成式人工智能将成为变压器模型的重要基石,而变压器模型则是使LLM的强大功能成为现实的真正突破。

2.5.2 Transformer模型—(转换器)

在变换器大放异彩之前,自然语言处理(NLP)的常用方法是递归神经网络(RNN)。RNN专为处理序列或时间序列数据而设计。它们会对隐藏状态进行监控,以记住序列中先前步骤的比特--这对于语言建模、语音识别和情感分析等工作来说,是一项非常方便的功能。RNN一次处理序列中的一个片段,根据当前输入和之前处理的内容更新隐藏状态--这就是所谓的递归。但在处理长序列时,它们遇到了一个障碍,即梯度消失或爆炸问题。这使得他们很难跟踪数据中的长期关系。

转换器的出现,完全颠覆了这一剧本。变换器并不采用RN 的循序渐进方式,而是以并行方式轻松处理数据,并利用注意力机制来跟踪输入序列中不同比特之间的关系,无论它们被放置在何处。架构蓝图中的这一变化让变换器可以轻松处理长短序列。它还避免了梯度问题。此外,它们的并行处理能力还能很好地与图形处理器(GPU graphics processing units)或张量处理单元(TPU tensor processing units)等复杂的芯片架构相匹配。

Ashish Vaswani和他在谷歌的研究人员创建了Transformer,并在2017年发表的开创性论文《Attention Is All You Need》中公布了核心架构。

转换器模型就像一位出色的语言学家,善于揭开语言错综复杂的面纱。它的神奇之处主要体现在两个阶段:编码和解码。每个阶段都由各自的层级组成。在编码阶段,模型阅读并理解输入文本,就像语言学家理解外语句子一样。然后在解码阶段,模型根据编码阶段获得的理解生成新的文本或译文,就像语言学家将句子翻译成你的母语一样。

转换器的核心是一种名为 “注意力”的机制,它可以评估句子中每个单词与其他单词的相关性。它会给每个词分配一个注意力分数。例如,以句子 “猫坐在垫子上 ”为例。当模型关注sat这个词时,cat和mat这两个词可能会因为与 sitting 这个动作的直接关系而获得更高的关注分。

该模型的一个显著特点是自我注意机制。这使它能够查看整个句子,理解单词之间的关系,并在长时间的文本阅读中保留这些关系。这就赋予了转换器一种长期记忆形式,使其能够专注于迄今为止出现过的所有单词或标记(整个单词或单词的一部分),从而理解更广泛的上下文。

然而,尽管有这些能力,转换器最初还是缺乏识别句子中单词顺序的能力,而这对于理解句子的意思至关重要。在这里,位置编码介入了。它就像GPS一样,为模型提供每个单词在句子中的位置信息,帮助理解 “猫追老鼠 ”和 “老鼠追猫 ”这样的分句。

转换器采用了多头注意机制,使其更加复杂。设想该模型有多对眼睛,每对眼睛从一个独特的角度审视句子,并关注不同的方面或词语之间的关系。例如,一双眼睛可能专注于理解动作,另一双眼睛可能专注于识别字符,还有一双眼睛可能专注于识别位置。这种多视角方法使转换器能够掌握对文本更丰富的理解。

此外,转换器的每个阶段都包含多层前馈神经网络,这种直接的网络可帮助处理单词之间的关系。这进一步增强了对文本的理解和生成。

转换器采用预训练模型的形式。它已经在大量数据上经过训练,可以随时使用或进一步微调。预训练完成后,该模型可作为API访问,从而可立即用于各种语言处理任务。公司或个人可以快速将该模型集成到自己的系统中,如人工智能辅助编程应用。此外,通过在特定领域的数据上进行微调,预训练的LLM还可以进一步磨练,使其在医学或法律文本分析等专业领域表现出色。这样就无需从头开始开发复杂的语言模型,从而节省了大量的时间、精力和资源。预训练模型具有基础语言理解能力,是开发生成式人工智能应用的跳板。

构建和运行LLM成本高昂。据《华尔街日报》报道,2023年初,GitHub Copilot平均每个用户每月亏损超过20美元。在某些情况下,一些用户每月给公司带来80美元的亏损。不过,随着未来几年生成式人工智能基础设施的扩展,每个用户的成本应该会降低。

转换器系统的两种主要类型是生成式预训练转换器(GPT generative pretrained transformer)和来自变压器的双向编码器表示(BERT encoder representations from transformers)。GPT是OpenAI推出的一款工具,非常适合创建文本、总结信息和翻译语言。它基于自回归LLM架构。这意味着,它在制作文本时,会根据已经输出的内容仔细考虑每个单词,就像讲故事的人一次一个单词地叙述故事一样。它的技能来自于对大量文本数据的训练。GPT使用解码器生成内容。

而BERT则使用自动编码方法。这种设计使其能够深入理解句子中单词的上下文,从而善于破译语言的细微差别和含义。谷歌于2018年开发了BERT,并将其作为一个开源项目。从那时起,核心模型出现了许多变化和增强。

至于人工智能辅助编程应用,主要的变换器模型类型是GPT。事实证明,它可以根据程序员提供的上下文,高效地预测和自动完成代码。

2.5.3 OpenAI Playground

OpenAI Playground是一个生成式人工智能沙盒,可访问 OpenAI 开发的各种模型。它允许通过直观的图形界面定制模型。

OpenAI Playground使人们更容易了解各种LLM的优缺点。此外,它还能根据不同的输入(如温度)对模型进行实时测试和调整。

不过,OpenAI对平台的使用收取费用。费用根据使用的代币数量而定。请记住,价格会定期变化。好消息是,截至本文撰写时,所有变化都是降价。

首次注册OpenAI帐户时,您将获得5美元的积分,可用于OpenAI Playground。这可用于调用 API。

  • Tokens

OpenAI 有一个名为Tokenizer 的工具:

在标记化过程中,ChatGPT 这个词由三个标记组成,并用颜色突出显示。细分为 Chat、G 和 PT。单词 unbelievable 及其后面的感叹号有两个标记,一个表示单词,一个表示标点符号。至于表情符号,它由三个标记符组成。每个标点符号都是一个标记符。空格包含在相邻的单词中。

标记化器适用于 GPT-3、GPT-3.5 和 GPT-4。请记住,不同 LLM 的标记化通常是不同的。

根据经验,1,000个Token大致相当于750个单词。

  • 使用平台

进入OpenAI Playground后,您可以访问一个仪表板:

屏幕中间是与 LLM 交互的主要工作流程:

系统:您可以在这里为 LLM 提供一些背景信息,例如 “您是 Python 编程专家”。系统提示是会话中的第一条信息,为交互奠定了基础。自定义系统提示可以更好地控制模型在对话中的行为,这对于确保模型保持在所需的参数或上下文范围内特别有用。

用户:这是提示的主要指令。例如,您可以要求 LLM 执行编码任务。

添加信息:这允许您与 LLM 进行持续聊天。

让我们举个例子。假设你正在开发一个Python项目,但对如何使用Tkinter库来获取用户输入有困难。您可以输入以下内容:

系统消息: 您是专门研究Tkinter的Python 专家。

用户信息: 我想使用Tkinter创建一个简单的图形用户界面来获取用户的姓名和年龄。我该怎么做?

LLM将生成代码列表。但假设您想为输入添加验证。您可以按下添加按钮并输入 "如何确保输入的年龄是数字而不是文本?

LLM 会给出相应的代码,使用 try-except 块将年龄输入转换为整数。

当然,这就像使用ChatGPT,但结构更加严谨。此外,真正强大的是自定义功能。你可以在屏幕右侧找到这些功能:

模式:您可以从多种模型中进行选择,甚至可以使用自己的微调 LLM,以确保模型专注于您编码的独特需求。有关微调模型的更多信息,请参阅 OpenAI API 文档。

温度:这可以调整生成内容的随机性或创造性。

代码生成 0.2-0.3 确保代码更加确定、准确,并遵守通用惯例,以获得可靠、可理解的结果。
代码审查 0.2 或更少 专注于既定的最佳实践和标准,以获得准确的反馈。
错误修复 0.2 或更少 对发现的问题提出更准确、更直接的解决方案。
创造性地解决问题 0.7-1.0 探索更广泛的可能解决方案,有助于头脑风暴或创新性地解决问题。
学习与实验 0.7-1.0 提供更广泛的实例和解决方案,以了解解决问题的不同方法。
数据分析和可视化 0.2 或更少 生成准确而有意义的可视化或分析。
优化任务 多种多样 允许在探索(较高温度)和利用(较低温度)之间取得平衡,以获得高效解决方案。

不过,如果使用的温度值过高,结果可能会不合理。下面是使用2值时的提示示例:

提示:在Python中,将数据从CSV文件迁移到MySQL数据库的步骤是什么?

当使用温度为2时,LLM 的结果大多毫无意义

现在,让我们看看可以调整的其他功能:

最大长度:这是用于生成内容的最大令牌数。该数量包括提示和回复的使用量。标记与内容的比例取决于您使用的模型。

停止序列:这表示 LLM 停止进一步创建文本的时间点。您可以指定一个特定的字符串或字符序列,当在生成的文本中检测到该字符串或字符序列时,就会向模型发出停止进程的信号。

Top p:这种技术也称为核采样,根据累积概率阈值(用 p 表示,范围在 0 到 1 之间)来选择单词。简单地说,模型并不总是从最有可能的前几个下一个单词中进行选择,而是根据指定的 p 值来考虑范围更广或更窄的可能的下一个单词。p 值越低,可供选择的词语范围越小,重点越突出,从而使文本的可预测性和连贯性更强。另一方面,p 值越高,可能的下一个词的范围就越大,从而生成的文本就越多样化、越有创意。

频率惩罚:这有助于解决 LLM 的一个常见问题,即重复的短语或句子。该值范围在 0 到 2 之间,值越大,重复越少。但是,当值大于 1 时,文本生成可能会变得不可预测,甚至毫无意义。

存在惩罚:该值也有 0 到 2 之分。较高的值将允许 LLM 包含更多种类的标记,这意味着要使用更多样化的词汇或更广泛的概念。

有了频率惩罚、存在惩罚和顶部 p,OpenAI 建议您选择一种方法来调整您的任务。但不要回避实验。由于所涉及的复杂问题错综复杂,优化 LLMs 的道路并不是由严格的规则铺就的。

2.6 评估LLM

评估LLM是一项艰巨的任务。这些庞然大物通常非常不透明,似乎无法理解。人工智能公司之间的竞争只会加剧这种情况。关于这些模型所训练的数据集、用于微调其行为的参数数量以及为其提供动力的硬件等方面的详细信息少之又少,这已经成了家常便饭。

不过,斯坦福大学的一些研究人员还是带来了一些好消息。他们创建了一个名为 “基础模型透明度指数”(Foundation Model Transparency Index)的评分系统,用于衡量 LLM 的开放程度。这个由一百条标准组成的尺度,旨在让法律硕士透明度的浑水变得更加清澈。

排名以百分比为基础。遗憾的是,结果远非令人鼓舞。研究人员认为,没有一个接近于达到 “足够的透明度”,平均得分仅为37%。
AI辅助编程2  AI编码技术的工作原理-小白菜博客
基础模型透明度指数总分 2023,https://crfm.stanford.edu/fmti

LLM 在处理各种领域和任务(如软件开发)方面的灵活性是一个显著优势。然而,这也使评估过程变得复杂,因为它需要特定领域的评估指标和基准,以确保模型在每个特定应用中的有效性和安全性。

尽管如此,在评估 LLM 时仍有一些指标值得考虑:

  • BERTScore

该指标旨在通过比较使用 BERT 嵌入生成的文本和参考文本来评估文本生成模型。虽然它主要用于自然语言文本,但也可扩展或调整用于代码生成任务,尤其是当代码以自然语言进行注释或评论时。

  • 复杂度

这是评估 LLM 等概率模型的常用指标。它量化了模型预测的概率分布与数据实际分布的吻合程度。在代码生成中,较低的复杂度值表明模型在预测代码序列中的下一个标记时更有优势。

  • BLEU(双语评估底稿)

BLEU 最初用于机器翻译,现在也用于代码生成,将生成的代码与参考代码进行比较。它通过计算 n-gram 精确度分数来量化生成文本和参考文本之间的相似性,这有助于评估生成代码的语法正确性。n-gram 精确度分数越高,表明生成的代码与参考文本在特定的 n 个词序列上的一致性越好。

  • ROUGE(面向召回的 Gisting 评估研究)

这是从 NLP 中借用的另一个指标,可用于评估代码生成模型。它计算生成文本和参考文本之间 n-grams 的重叠度,从而深入了解生成代码与预期输出的吻合程度。

  • MBXP(最基本的 X 编程问题)

该基准专门用于评估多种编程语言的代码生成模型。它使用一个可扩展的转换框架,将提示和测试用例从原始数据集转换为目标语言,从而促进对代码生成模型进行全面的多语言评估。

  • 人类评估

这是一个评估 LLM 代码生成能力的基准,通过测量 LLM 从文档脚本合成程序的功能正确性来评估 LLM 的代码生成能力。该基准对于持续开发和增强代码生成方面的人工智能模型至关重要。虽然不同的模型在 HumanEval 上表现出不同的熟练程度,但名为 HUMANEVAL+ 的扩展版本在识别流行 LLM 生成的以前未被发现的错误代码方面发挥了关键作用。

  • 多语言 HumanEval(HumanEval-X)

这是对原始 HumanEval 基准的扩展。Multilingual HumanEval 评估 LLMs 的代码生成和翻译能力,涵盖 10 多种编程语言。它采用了一个转换框架,将 Python 中的提示和测试用例转换成目标语言中的相应数据,为多语言代码生成和翻译创建了一个更全面的基准。

评估 LLM 的另一种方法是看参数的数量--可能高达数千亿。所以参数越多越好,对吗?不一定。评估应采取更细致的方法。首先,在计算能力和能源使用方面,扩展参数的成本可能非常高。这可能会使 LLM 在货币化应用方面不划算。其次,随着参数数量的增加,模型的复杂性也在增加,这有可能导致过度拟合。当模型在训练数据中学得非常好,但在接触未见数据时却出现问题时,就会出现过拟合。这会削弱模型的泛化能力。

另一个问题是需要大量不同的训练数据集来满足这些模型对数据的贪得无厌的需求。然而,获取和整理如此广泛的数据集不仅需要大量资源,而且会带来数据隐私和偏差方面的挑战。此外,随着参数的激增,对这些庞然大物的评估也变得越来越复杂。评估指标需要更加全面和多样化,以准确衡量模型在各种任务中的表现。

最后,微调是一种更好的方法,无需大幅增加底层 LLM 的参数大小,就能从模型中获得更多信息。

2.7 LLM的类型

LLM 有多种类型,其中一个突出的类别是开源 LLM。任何人都可以使用、调整或共享它们。它们的透明度意味着你可以看到这些模型是如何运行的。此外,开源 LLM 允许开发人员合作创新,开发附加组件,当然也可以修复讨厌的错误。

最棒的是什么?它们没有价格标签。

但开源LLM并不都是彩虹和独角兽。通常没有专门的团队来解决这些问题或推出定期更新。因此,如果遇到困难,你可能不得不卷起袖子钻进论坛寻求帮助。

开源模型的质量和性能有时就像过山车。还有令人头疼的安全问题。由于一切都是可用的,黑客更有可能找到插入邪恶代码的方法。建议谨慎行事。

最后,说到用户指南和文档,开源LLM可能会让你希望得到更多。这些指南有时让人感觉像是用象形文字写成的。

  • GPT-NeoX-20B EleutherAI 20B 在 “The Pile ”数据集上进行过训练;能够完成各种 NLP 任务,如故事生成、聊天机器人和摘要等。
  • LLaMA 2 Meta 7B 至 70B 在 2 万亿个词块上进行过训练;上下文长度是 LLaMA 1 的两倍 OPT-175B Meta 175B 模型套件的一部分;训练时的碳足迹低于 GPT-3
  • BLOOM BigScience 176B 在 ROOTSa 语料库上训练;设计透明,公开训练数据细节和评估方法
  • Falcon-40B 技术创新研究所 (TII) 40B 在 1,000B tokens上进行训练
  • Dolly 2.0 Databricks 12B 基于 EleutherAI 的 Pythia 模型系列;提供类似于 ChatGPT 的指令跟随互动性
  • Mistral 7B Mistral AI 7.3B 使用分组查询和滑动窗口关注;在大量数据集上进行了训练,在较长序列处理方面表现出色
  • Mixtral 8X7B Mistral AI 46.7B 稀疏专家混合模型;像 12.9B 模型一样执行推理,支持多种语言,在代码生成和推理等各种任务中表现出色

另一方面,封闭源代码或专有的 LLM 则更加神秘。它们大多对代码、训练数据和模型结构保密。不过,开发这些复杂系统的公司通常拥有巨额资金。

有了这些资源,这些公司就可以聘请世界上最优秀的数据科学家,并建立复杂的基础设施。因此,LLM 在性能方面往往是最先进的。它们还针对规模和企业的严格需求(如安全和隐私)而构建。

至于缺点,那就是信任问题。这些模型是如何做出反应的?幻觉和偏见又是怎么回事?这些问题的答案可能缺乏细节。

此外,这些大型人工智能运营商还有可能成为垄断者。这可能意味着客户会被锁定在一个生态系统中。最后,闭源LLM可能比开源项目更容易停滞不前,因为它们可能无法像开源项目那样受益于多样化的投入和审查。

2.8 评估人工智能辅助编程工具

选择哪种人工智能辅助编程工具可能会让人头疼。你必须权衡许多因素,如精确度、聊天功能、安全性、速度和用户友好性。有时,归根结底还是要看使用起来感觉如何。不过话又说回来,如果你的雇主坚持使用特定的系统,你可能会束手无策。

要想了解目前的热门话题,Stack Overflow 的 2023 年开发者调查是一个很方便的资源。Stack Overflow 收集了近 9 万名程序员对最流行工具的看法,如表 2-7 所示。

通过这张图表,您可以一窥现有的众多工具。当你想选择一款工具时,明智的做法是从其他开发者那里获得推荐。此外,最好还能亲自试驾几款工具。幸运的是,大多数工具都提供免费试用版,因此你可以试一试,而不必马上下定决心。

另一个需要考虑的关键因素是公司的财务支持。它有风险投资资金吗?如果没有,公司可能不仅难以发展,也难以保持平台的创新性。目前,已经有几家人工智能辅助编程公司不得不停止服务,这对开发者来说确实是个不小的打击。以 Kite 为例。它是这一领域的早期参与者之一,成立于2014年。然而,到 2022 年,该公司决定终止该项目。一线希望是什么?它开源了该工具的大部分代码库。

2.9 结论

在本章中,我们揭开了生成式人工智能和LLM的神秘面纱。我们了解了一些引人入胜的历史,例如 ELIZA,然后重点介绍了人工智能领域最大的突破之一:变换器模型。我们还试用了 OpenAI Playground,并展示了如何定制 LLM。

本章的一些重要内容包括:token、利用预训练模型的优势、LLM 大小的注意事项、perplexity 和 BLEU 分数等指标,以及开源模型与专有模型。