2026年11月08日 欢迎访问 读到
首页 / 小说书库 / AI辅助编程实战 / 正文
点评
第2章 AI辅助编程技术的工作原理

在本章中,我们将深入探索AI辅助编程工具的内在机制,揭开它们背后的神秘面纱。具体来说,本章将首先带领读者简要回顾这些工具的发展历史;然后探讨Transformer模型和LLM的工作原理,并借助OpenAI Playground进行实践演示;最后提供一系列实用的评估建议,帮助读者了解如何对LLM的性能进行全面评估。

通过本章的学习,读者将能够清晰地了解这项强大技术的优势和局限,从而在实际的软件开发项目中更明智、更有效地利用AI辅助编程工具。

GitHub Copilot、Tabnine、CodiumAI和Amazon CodeWhisperer等AI辅助编程工具在市场上引起了热议。以上每种产品的制造商都试图标榜自己产品的特色。这些工具也有很多共同的常见功能,如表2-1所示。

表2-1 AI辅助编程工具共同的常见功能

AI辅助编程工具日新月异,表2-1中所列的功能并不是一成不变的。显然,AI辅助编程工具通过提供代码提示和上下文感知的代码补全功能,为开发者带来了极大的便利。

智能代码自动补全(也叫自动代码完成或IntelliSense)是许多IDE中的一个神奇功能。它会根据开发者输入的内容,实时地给出代码段的提示、填充和高亮显示以提供帮助。事实上,这项技术最早可以追溯到20世纪50年代末的拼写检查程序。

这项技术的突破发生在20世纪90年代中期。当时,Microsoft Visual Basic 5.0引入了实时建议和自动补全功能,主要侧重于基本语法和函数签名的辅助。这一创新不仅有效减少了代码错误,还极大地提升了开发者的工作效率。

你可能会问:像IntelliSense这样的工具,与AI辅助编程工具有何区别呢?毕竟IntelliSense已经具备一定的人工智能和机器学习技术基础。

两者之间存在一个显著的区别:AI辅助编程工具由生成式AI驱动。它们提供的不仅仅是代码,还有自助式文档、规划文件和帮助指南等。得益于生成式AI,这些工具能够根据给定的上下文,娴熟地生成、调整和理解类人文本(human-like text),从而在翻译、摘要、文本分析、主题建模和查询回答等领域展现出卓越的能力。使用这些工具,我们有时仿佛在与代码进行智能对话。以LLM为核心,它们可以捕捉到用户输入中的上下文和意图变化。

了解编译器的工作内容对熟悉AI辅助编程工具很有帮助。以下是编译器执行的主要步骤。

词法分析(分词)

编译器宛如一位语言教师,它会将用户的代码拆解成一个个token,以便进一步解析和理解其深层含义。

语法分析

在语法分析阶段,编译器会检查token是如何分组的。它不仅验证用户的代码是否由正确的命令构成,还会确保代码具有正确的结构。

语义分析(错误检查)

在语义分析阶段,编译器确保用户的代码在编程语言的上下文中具有意义。它不仅涉及语法的正确性,还关系到代码背后所承载语义的正确性。

中间代码生成

这是代码转换的起始阶段。编译器将高级代码翻译成中间代码。虽然中间代码还不是最终的机器代码,但已经初具雏形。

代码优化

在代码优化阶段,编译器就像代码的私人教练,负责让用户的代码更加精简与高效。它会调整中间代码,使其运行速度更快,占用空间更少。

机器代码生成

这是代码转换的终极阶段。编译器将优化后的中间代码进一步转换为CPU可以直接理解的机器代码或汇编代码。

链接和加载

链接常常被视为编译过程的一部分,负责将各种代码模块和库文件有机地组合成一个完整的可执行程序。加载则是将这个程序加载到内存中准备执行,让代码从静态的文本变为动态的、能够执行的任务。

AI辅助编程工具(如GitHub Copilot)的工作方式与编译器大相径庭。它们并不具备真正“理解”编程语言的能力,而是通过人工智能技术,基于海量的现有代码进行模式识别并提出代码建议。由于AI辅助编程工具是在玩概率游戏,因此它们提出的建议可能会有很大的差异。然后编译器会将这些代码编译成机器可以运行的程序。

LLM基于预测模式,而不是编译引擎。如果有些知识在训练中不常见,它们可能无法被捕捉到。所以,AI辅助编程工具生成的代码可能会漏掉一些简单的元素,比如括号。此外,AI辅助编程工具也会令人迷失方向,它们可能会根据情况给复杂代码的建议。

在发现错误方面,AI辅助编程工具虽然普遍有效,但它们仍无法与编译器忍者般的查错技能相提并论。尽管如此,这些工具仍然很强大。例如,它们可以捕捉恼人的语法错误——分号缺失、函数名中有错别字、括号不匹配,并迅速提出正确的修正建议。

AI辅助编程工具还能帮助你避免常见的编程陷阱。它们可能提醒你在打开文件后正确关闭文件,或者建议你以更有效的方式循环使用数组。说到逻辑错误,AI辅助编程工具的洞察力令人惊讶。它们可能无法解决所有复杂问题,但它们往往能提出你可能未曾考虑过的替代方法或解决方案,引导你朝着正确的方向解决问题。

一言以蔽之,AI辅助编程工具使编程更顺畅,但它们无法取代编译器的全面检查和开发者的敏锐洞察力。

上述缺点真正凸显了将AI辅助编程工具的智能与编译器检查的彻底性,以及人类干预相结合的重要性。毕竟你不仅希望代码优秀,还希望它们准确无误。

2023年10月,Sourcegraph的首席执行官兼联合创始人Quinn Slack分享了一篇颇有见地的文章。在这篇文章中,他深入探讨了像GitHub Copilot这样的AI辅助编程工具,并提出了一种新颖的思考模式,他称之为“AI代码层级”。Slack的分级框架为我们理解AI辅助编程工具的功能提供了一个清晰的视角,同时他还对那些销售AI辅助编程工具的公司所宣称的夸张说法进行了批判性的审视。图2-1显示了编程系统中AI能力的不同层级。

图2-1 编程系统中AI能力的不同层级

在编程的前3个层级中,重点是以人类为主导的编程过程,主要参与者是开发者。首先是第0级,开发者在没有AI的帮助下手工完成所有编程任务。第0级作为基线,为AI的介入奠定了基础。

然后是第1级,即代码补全阶段。在这个层级,AI开始介入并发挥作用,它根据开发环境中的事件来辅助完成单行或多行代码。尽管如此,开发者仍然占据主导地位,负责指导整个程序的开发,AI则作为提高编程效率、完成常规编程任务的一种工具。

在第2级,即代码创建阶段,AI的能力显著增强。此时,AI不仅能够编写更长的代码段,还能够完成更复杂的任务,如设计API,甚至修复现有代码。尽管如此,这些活动仍然需要人类的监督和指导。在这个层级,AI需要对代码库及其运行环境有一个深入的理解,才能生成既正确又适用的代码。

接下来进入第3级,也就是受监督的自动化阶段,我们可以看到AI在编程领域的重大转变。AI可以处理多项任务,实现人类设定的更广泛的目标,而无须在每次完成任务后都进行人工检查。使用这一层级的AI编程,就像将工作委托给一名初级开发者。AI具备足够的智能来排查错误、添加新功能,并将不同的系统集成,同时在这个过程中还会向开发者寻求解释和指导。

第4级标志着完全自动化的实现,AI在此层级真正地增强了自身的能力。它能够独立处理复杂的任务,而不需要人类对代码进行最终审批。想象一下,作为首席执行官或产品经理,你对顶尖工程师的信任程度。第4级所追求的正是这种信任关系。AI不只是被动响应,它还能够主动监控代码,发现并解决问题。

第5级是AI主导的完全自治。与前4个层级相比,在第5级,AI不仅遵循人类的命令,而且能够设定自己的目标。这些目标是基于AI的核心奖赏机制来确定的。可以想象成在一个充满竞争的世界中,AI在玩自己的游戏。虽然这个层级听起来有点像科幻小说,但考虑到技术发展的速度,不难想象,这个层级很可能会成为现实。

到目前为止,像GitHub Copilot这样的工具大致处于第3级。虽然确定其确切层级存在一定难度,但Slack的分级框架为我们提供了一个非常有用的参考,可以帮助我们理解技术及其关键交互。毫无疑问,AI编程技术并没有放慢脚步,而是在以惊人的速度发展。

采用AI辅助编程工具并不要求你成为生成式AI技术专家。但是,对这项技术有一个宏观的了解,将使你能够更敏锐地评估工具的响应速度、能力范围及潜在局限,进而更灵活和有效地利用这些工具。

在这里,“透明性”(transparency)并不仅仅是一个时髦的词汇,要让一项新技术得到广泛接受和应用,清楚地理解其工作原理至关重要。我们是否采纳这项技术,很大程度上取决于我们对它的信任程度。在编程领域,可靠性和责任感不仅仅是附加特性,更是基础,是编程工作的基石。

接下来将简要介绍生成式AI和LLM,以帮助你获得更清晰的认识。

生成式AI的历史可以追溯到几十年前,早期的代表作之一是20世纪60年代中期由麻省理工学院的教授Joseph Weizenbaum开发的聊天机器人ELIZA。ELIZA的设计灵感源于心理治疗师的对话方式,它通过模仿用户的输入来运行,采用的是一种基于规则的算法。ELIZA的技术水平相对初级,至今你仍然可以在网络上找到它的踪迹。

有趣的是,许多人发现与ELIZA对话比与真正的心理治疗师交谈更加令人愉悦,甚至有人误认为自己正在与一个真实的人进行交流。这种现象被称为“ELIZA效应”,它揭示了人们如何轻松地赋予计算机程序人性化的理解能力。

然而,生成式AI的发展历程并非一帆风顺。它的核心技术进展缓慢,如同蜗牛爬行。直到进入21世纪第二个10年,这个领域才迎来一个转折点。得益于强大的计算能力、GPU(Graphics Processing Unit,图形处理器)等先进的硬件系统、丰富的数据资源及深度学习模型的微调,生成式AI再次加速发展。随着技术的进步,生成式AI可以分为两大类——变分自编码器和生成对抗网络。

变分自编码器

Diederik P. Kingma和Max Welling通过他们的开创性论文“Auto-Encoding Variational Bayes”在2013年首次提出了变分自编码器(Variational Auto-Encoder,VAE)的概念。VAE的核心是不需要监督的编码器-解码器架构,它能够从复杂、高维的数据中提取出低维的潜在空间表示。当讨论高维数据时,我们指的是那些具有大量特征的数据集,每个特征都代表一个维度,例如一幅28像素×28像素的图像在784维空间中的表示。低维潜在空间可以看作数据的精简版本,它在保留关键信息的同时,去除了不必要的维度。这种降维技术至关重要,因为它不仅减轻了计算负担,还帮助我们规避了所谓的“维度诅咒”,使得数据更易于可视化和解释。从高维到低维的转换,本质上是对数据的一种简化,它将数据压缩到最基本的形式。与传统的自动编码器不同,在VAE中,编码器不是为每个潜在属性输出一个单一的值,而是输出一个概率分布。随后,解码器从这个概率分布中抽取样本来重建数据。这种在潜在空间中提供一系列可能的数据表示,并不是仅仅提供单一值的策略,而是为生成新的数据或图像提供了无限的可能性。

生成对抗网络

生成对抗网络(Generative Adversarial Network,GAN)是一种用于无监督机器学习的AI算法,由Ian Goodfellow及其团队在2014年首次提出。GAN的核心机制涉及两个相互竞争的神经网络——生成器和判别器,它们在一场类似游戏的对抗中相互较量。

生成器的任务是创造新的数据,这些数据看起来与真实数据无异。而判别器的角色则相当于裁判,其工作是区分生成器产生的假数据和真实世界中的数据。在每一轮的对抗中,生成器不断学习并提升自身,生成越来越逼真的数据样本。判别器也在不断进化,以更好地识别数据的真伪。

这种巧妙的设置不仅推动了生成器和判别器技术的进步,而且为人工智能领域带来了新的可能。如今,GAN已被广泛应用于创造逼真的图像、合成语音以及开发各种创新应用。

上述类型的生成式AI成为Transformer模型的重要构建模块,这是一次真正意义上的突破,使LLM成为现实。

在Transformer模型成为主流之前,自然语言处理(Natural Language Processing,NLP)的首选技术是循环神经网络(Recurrent Neural Network,RNN)。循环神经网络专为处理序列或时间序列数据而设计。它通过更新隐藏状态来记忆序列中先前步骤的输出,这使得它在语言建模、语音识别和情感分析等任务中非常有用。循环神经网络一次处理序列中的一个片段,根据当前输入和之前处理过的内容更新隐藏状态。但循环神经网络在面对长序列时会出现梯度消失或梯度爆炸的问题。因此,循环神经网络很难跟踪数据中的长期关系。

Transformer模型的出现彻底颠覆了这一局面。Transformer模型不采用循环神经网络的逐步处理方法,而是并行地、轻量级地处理数据,并通过注意力机制来追踪输入序列中不同位置之间的关联,而无论这些位置相隔多远。这种架构使得Transformer模型能够轻松处理长短期序列,同时避免出现梯度问题。此外,Transformer模型的并行处理能力与GPU或TPU(Tensor Processing Unit,张量处理器)等现代计算硬件架构完美契合。

由Ashish Vaswani和他带领的Google研究团队开发的Transformer模型的核心架构,在2017年发表的开创性论文“Attention Is All You Need”中公布。图2-2展示了Transformer模型的主要部分。

图2-2 Transformer模型的主要部分

Transformer模型可以视作一位精通语言的大师,擅长揭示语言的复杂性。它的工作主要分为两个阶段——编码和解码。每个阶段都由多层网络构成。在编码阶段,Transformer模型就像理解外语句子的语言学家一样,读取并理解输入文本的含义。在解码阶段,Transformer模型利用编码阶段获得的知识生成新的文本或翻译,类似于语言学家将外语句子译成母语。

Transformer模型的关键在于注意力机制,该机制能够评估句子中每个单词与其他单词的相关性,并为每个单词分配相应的注意力权重。例如,在句子“The cat sat on the mat”中,当模型聚焦于单词“sat”时,“cat”和“mat”可能会获得更高的注意力权重,因为它们与动作“sitting”直接相关。

Transformer模型的一个显著特性是自注意力机制,该机制使得模型能够审视整个句子,理解单词之间的相互关系,并在处理长文本时保持这种理解。这为Transformer模型提供了一种长期记忆的能力,使其能够集中关注所有出现过的单词或标记(即整个单词或单词的一部分),从而更全面地理解上下文。

尽管具备这些能力,但Transformer模型最初并不擅长识别单词在句子中的顺序,而这却是理解句子意义的关键。位置编码(positional encoding)显得至关重要。它相当于为模型提供了一个GPS(Global Positioning System,全球定位系统),指示每个单词在句子中的位置,帮助模型区分类似“The cat chases the mouse”和“The mouse chases the cat”这样的句子。

Transformer模型通过引入更为复杂的多头注意力机制,进一步增强了其处理能力。可以想象,该模型拥有多双“眼睛”,每双“眼睛”都能从独特的视角审视信息,关注不同的方面或词语间的关系。比如,一组注意力可能专注于理解动作,另一组可能聚焦于识别主体,还有一组可能致力于捕捉地点信息。这种多角度的分析方法赋予了Transformer模型对文本更深层次的理解。

Transformer模型常以预训练模型的形式出现。由于这类模型已经在大规模数据集上完成训练,因此可以立即投入使用或进行进一步的微调。预训练完成后,模型可以通过API被轻松调用,快速集成到各种语言处理任务中。企业和个人可以迅速将Transformer模型集成到自己的系统中,比如集成到AI辅助编程应用中。此外,通过在特定领域的数据集上进行微调,这些经过预训练的LLM可以进一步优化,从而在专业领域(如医疗或法律文本分析)里发挥出色的性能。这种方式避免了从头开始开发复杂的语言模型,节省了大量时间、精力和资源。预训练模型所具备的基础语言理解能力,为开发生成式AI应用提供了一个强有力的起点。

构建和运营LLM的成本是相当高的。根据《华尔街日报》在2023年年初的报道,每位用户每月在GitHub Copilot上的花销超过20美元。在一些特定情况下,某些用户每月的花销甚至高达80美元。然而,未来几年随着生成式AI基础设施的规模化发展,预期每位用户的成本将会逐渐降低。

Transformer模型主要分为两大类——GPT(Generative Pretrained Transformer,生成式预训练Transformer)和BERT(Bidirectional Encoder Representations from Transformer,来自Transformer的双向编码器表示)。GPT是由OpenAI开发的一款工具,在文本创作、信息总结和语言转换方面表现出色。GPT基于自回归的LLM架构,这意味着在生成文本时,它会根据已经生成的内容逐字考虑,就像讲故事的人逐字逐句地展开叙述一样。GPT的技能是通过在大量文本数据上进行训练而获得的,它使用解码器来生成内容。

在AI辅助编程应用领域,用到的Transformer模型主要是GPT。实践证明,GPT能够根据开发者提供的上下文信息,有效地预测并自动完成代码,这极大地提升了编程效率。

OpenAI Playground是一个生成式AI沙盒,可用于访问OpenAI开发的各种模型。它配备了一个用户友好的图形界面,使用户能够轻松定制模型。

OpenAI Playground极大地简化了我们理解和评估各种LLM的过程,让我们能够快速把握它们的性能和局限。此外,它还允许用户根据不同的参数输入(如温度)实时测试和调整模型的行为。

不过,OpenAI对GPT的使用收取费用。如表2-2所示,费用以token为单位,根据使用量来计算。需要注意的是,价格会定期调整。好消息是,相关费用一直在下降。

表2-2 GPT收费标准

例如,假设你使用的是 GPT-4/8K 上下文LLM。你输入的提示包含1000个token,而模型生成的响应包含2000个token。那么输入费用为0.03美元,输出费用为0.12美元。

首次注册OpenAI账户时,你将获得5美元的积分,可用于OpenAI Playground,或者用于支付API调用的费用。

1. token

接下来我们详细了解一下token。OpenAI提供了一个名为Tokenizer的工具,如图2-3所示。该工具可以分析我们输入的如下内容。

输入:ChatGPT is unbelievable!  I love it.

图2-3 Tokenizer显示文本的token数量

在分词(tokenization)过程中,“ChatGPT”这个短语被分成3个token。具体来说,“Chat”“G”和“PT”中的每个都单独作为一个token。单词“unbelievable”及其后面的感叹号被分为两个token——一个表示单词本身,另一个表示标点符号。至于表情符号,则被分成3个token。每个标点符号各占一个token。空格的token则被合并到相邻的单词中。

Tokenizer适用于GPT-3、GPT-3.5和GPT-4。需要注意的是,不同的LLM通常采用不同的分词方法。这意味着相同的输入文本在不同的模型中可能会被分解成不同数量或类型的token。

根据经验,1000个token大致等同于750个单词。

2. 使用OpenAI Playground

进入OpenAI Playground后,你将看到图2-4所示的页面。页面中间是我们与LLM交互的主要工作区。

图2-4 包含提示、资源和互动区域的OpenAI Playground首页

SYSTEM(系统提示)

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

USER(用户提示)

这是提示的主要指令。例如,你可以在此处要求LLM执行编程任务。

Add message(添加消息)

在这里,你可以与LLM持续聊天。

假设你正在开发一个Python项目,却不确定如何利用Tkinter(库)来捕获用户输入。在这种情况下,你可以这样询问。

系统:你是擅长Tkinter的Python专家。

用户:我想用Tkinter创建一个简单的图形用户界面来获取用户的姓名和年龄。请问如何做?

LLM将为你生成相应的代码示例。假设你不仅需要获取输入,还想对输入进行验证,此时你可以进一步询问:“我如何确保输入的年龄是一个数字而不是文本?”LLM将提供相应的代码解决方案,其中可能包括使用try-except语句块来尝试将输入的年龄转换为整数,并处理可能出现的异常。

整个过程与使用ChatGPT类似,但提供了更加结构化和专业的体验。真正强大的是其自定义功能,这些功能可以在图2-4所示页面的右侧找到。

Model(模型)

你可以选择不同的模型,甚至可以使用自己微调的LLM,以确保模型专注于你独特的编程需求。有关微调模型的更多信息,请参阅OpenAI的API文档。

Temperature(温度值)

温度值可以调整所生成内容的随机性或创造性。数值范围为0~2,数值越低,回答越确定和集中。表2-3列出了不同类型编程任务的建议温度值。

表2-3 不同类型编程任务的建议温度值

但是,如果使用的温度值过高,结果就会变得毫无意义。下面是使用2作为温度值时的提示示例。

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

如你所见,图2-5展示的输出结果并不具有实际意义。

图2-5 温度值为2时,LLM输出的结果大多毫无意义

Maximum Length(最大长度)

用于设置生成内容时所允许的最大token数量。这个限额包括了提示(prompt)和回复(response)的token数量总和。内容生成与token之间的比例关系,取决于选用的具体模型。

Stop sequence(终止序列)

终止序列是一种信号,用于指示LLM应在何时停止继续生成文本。用户可以设定一个特定的字符串或字符组合,当在生成的文本中遇到这一特定的序列时,模型便会接收到停止生成的命令。

Top P

核采样是一种根据累积概率阈值(用变量p表示,取值范围为0~1)来选择单词的方法。简单来说,LLM在生成文本时,并不是仅仅从概率最高的几个单词中选取,而是根据设定的p值考虑一个更宽泛或更狭窄的单词范围。当p值设定得较小时,模型可以选择的单词范围较小,更集中,这有助于生成更可预测且连贯的文本。相反,当p值设定得较大时,模型考虑的潜在单词范围更广,能够生成更多样化、更具创造性的文本。

Frequency penalty(频率惩罚)

频率惩罚有助于解决LLM的一个常见问题——重复的短语或句子。取值范围为0~2,值越大,重复的短语或句子越少。但是,当值大于1时,文本生成的结果会变得难以预测,甚至变得没有意义。

Presence penalty(存在惩罚)

存在惩罚的取值范围也是0~2,值越大,LLM包含的分词种类越多,也意味着涉及更广泛的词汇或概念。

凭借频率惩罚、存在惩罚和核采样等工具,OpenAI建议基于实验的方法来选择和调整适合特定任务的策略。鉴于LLM的复杂性,寻找最优解通常没有固定的公式或规则。

评估LLM是一项极具挑战性的任务。这些复杂的系统往往缺乏透明度,使得外界难以深入了解其工作原理。人工智能领域公司间的竞争进一步加剧了这种不透明性。关于模型训练所用的数据集、微调行为的参数量,以及支持模型运行的硬件设备的具体信息,正变得日益稀缺。

然而,斯坦福大学的研究人员带来了一线希望。他们开发了一个名为Foundation Model Transparency Index(基础模型透明度指数)的评分系统,旨在衡量LLM的透明度。该系统基于100条标准构建,目的是澄清LLM透明度方面的混乱现状。

排名采用百分比形式。表2-4展示了具体的排名情况。遗憾的是,结果并不令人鼓舞。研究人员认为,目前还没有任何一个主流的LLM达到“足够的透明度”,它们的平均透明度仅为37%。

表2-4 主流LLM的透明度

LLM的一个显著优势在于其处理多领域任务的灵活性(例如软件开发),但这同时也增加了评估它们的复杂性。对这些模型的评估需要依赖特定领域的评估指标和基准测试,以确保模型在每个特定应用场景中都能表现出有效性和安全性。

尽管存在这些挑战,但在评估LLM时,仍须考虑以下几个关键的衡量标准。

BERTScore

BERTScore是一种评估文本生成模型性能的指标,它通过对比生成的文本与参考文本,利用预训练的语言模型BERT来进行计算。这种度量方法主要被用于对自然语言文本进行评估,但通过进行适当的扩展或调整,它同样可以用于代码生成任务,特别适合用在那些涉及自然语言注释或代码评论的场景中。

困惑度

困惑度(Perplexity)是评估概率模型(如LLM)性能的常用指标。它衡量模型预测的概率分布与实际数据分布之间的一致性。在代码生成的背景下,较低的困惑度意味着模型在预测代码序列中下一个token时具有更高的准确性和优势,表明模型对代码的语言模式有更深刻的理解。

BLEU

BLEU(BiLingual Evaluation Understudy)最初是为机器翻译任务设计的,现在也被用在代码生成领域。它通过对生成的代码与参考代码进行比较来评估生成代码的质量。具体来说,BLEU通过计算n-gram的精确度分数来量化生成文本与参考文本之间的相似度,这有助于衡量生成代码的语法准确性。n-gram的精确度分数越高,说明生成的文本在特定长度的词序列上与参考文本的一致性越好,从而反映出生成代码的质量越高。

ROUGE

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是从自然语言处理领域借鉴的一个指标,同样适用于评估代码生成模型的性能。ROUGE主要通过计算生成文本和一组参考文本之间的n-gram重叠度来衡量它们的相似性。

MBXP

MBXP(Most Basic X Programming problems)基准测试是专门为评估多语言环境下代码生成模型的性能而设计的。它采用一个可扩展的转换框架,允许提示和测试用例从原始数据集被转换到目标编程语言。这一过程促使对代码生成模型进行全面的多语言评估,从而更准确地衡量模型在不同编程语言中的代码生成能力。

HumanEval

HumanEval是一个专门用于评估LLM代码生成能力的基准测试,它通过衡量模型根据文档字符串合成程序时的准确性来进行评估。这个基准测试对于持续开发和提升AI模型在代码生成方面的能力起到至关重要的作用。尽管不同模型在HumanEval上的表现各异,展示了它们各自的熟练程度,但名为HUMANEVAL+的扩展版本在识别那些由主流LLM生成,但之前未被探测到的错误代码方面发挥了关键作用。

Multilingual HumanEval

Multilingual HumanEval(HumanEval-X)是对原始HumanEval基准的扩展与升级。这个基准测试旨在全面评估LLM在代码生成和翻译方面的能力,覆盖了超过10种不同的编程语言。HumanEval-X引入了一个转换框架,该框架能够将Python语言中的提示和测试用例适配并转换成目标编程语言的对应格式。这样的设计为评估多语言环境下的代码生成和翻译提供了一个更为全面的基准。

当评估LLM时,一种常见的方法是考查其参数量,这个数字有时可达到数千亿。但参数越多越好呢?答案并非如此简单。评估这些模型应该采用更为细致和全面的方法。

首先,模型参数的扩展在计算能力和能源消耗方面成本极高,这可能导致LLM在实际应用和商业化方面变得不经济。其次,随着参数数量的增加,模型的复杂性也随之增长,这可能导致出现过拟合现象。过拟合往往发生在模型在训练数据上表现优异,但在未见过的数据上表现不佳的情况下,这会削弱模型的泛化能力。

另外,我们需要大量且多样化的训练数据来满足模型对信息的庞大需求。然而,获取和处理如此庞大的数据集不仅需要大量资源,还可能引发数据隐私和偏差方面的担忧。此外,随着参数数量的增加,对模型的评估也变得更加复杂。评估指标需要更全面和多样化,以准确衡量模型在大量不同任务上的性能。

最后,微调是一种在不显著增加基础LLM参数规模的情况下,提升模型性能的有效方法。

LLM有多种类型,其中备受瞩目的一类是开源LLM。这类模型可以自由使用、调整或共享。它们的开放透明让你能够洞察模型的运作方式。此外,开源LLM鼓励开发者协作创新,共同开发插件,以便及时修复那些烦人的错误。

开源LLM最吸引人的一点是什么?毫无疑问,它们是免费的。

然而,开源LLM并非完美无缺。它们可能没有专门的团队来解决问题、提供支持,以及定期推出更新。如果在使用过程中遇到难题,则你可能需要自己动手解决,或者在论坛上寻求社区的帮助。

开源模型的质量和性能可能会有波动,有时就像坐过山车一样起伏不定。此外,它们也可能带来一些安全方面的挑战。由于模型的开放性,黑客可能更容易找到植入恶意代码的途径。因此,使用开源模型时需要格外小心。

开源模型的用户指南和文档有时可能不够完善,甚至难以理解,让人感觉像是在解读象形文字。

表2-5列出了一些主流的开源LLM。

表2-5 主流的开源LLM

注:在LLM中,在提到参数规模时,一般用千参数(K)、百万参数(M)、10亿参数(B)表示。

另一类LLM是闭源或专有LLM,它们的保密性更好,通常将代码、训练数据和模型架构视为高度机密。开发这些复杂系统的公司往往拥有雄厚的财力支持。表2-6展示了这些公司在2023年筹集的风险投资金额。

表2-6 顶级LLM公司在2023年筹集的风险投资金额

有了充足的资金作为后盾,这些公司便能够招募到世界上最杰出的数据科学家,来打造尖端的基础设施。这使得他们开发的LLM在性能上往往处于行业领先地位,代表着业界最前沿的技术。同时,这些模型也是为了满足规模化运营和企业级严格标准而设计的,尤其是在安全性和隐私保护方面。

然而,闭源模型也存在一些缺点,其中最突出的是信任问题。模型是如何生成响应的?它们如何处理幻觉和偏见?目前,这些问题的答案往往不够透明和详尽。

此外,大型AI服务提供商可能会形成垄断,这导致客户有可能会被限制在一个特定的生态系统内,缺乏灵活性和选择权。

与开源LLM相比,闭源LLM可能更容易陷入创新停滞的状态。这是因为它们无法像开源LLM那样从广泛的社区输入和持续的审查中获益。

选择合适的AI辅助编程工具可能是一项令人头疼的任务。在这个过程中,需要考虑多种因素,包括工具的准确性、交互性、安全性、速度和易用性。有时,选择工具可能归结为寻找一个最适合你的工作方式的选项。然而,如果你的雇主或组织坚持使用特定的工具,那么你的选择可能会受到限制。

Stack Overflow的2023年《开发者调查》是一份快速了解当前热门工具的宝贵资源。该调查汇集了近90000名开发者对当前流行的AI辅助编程工具的看法和偏好,如表2-7所示。

表2-7 流行的AI辅助编程工具排名

通过表2-7,你可以对众多可用的AI辅助编程工具有一个全面的了解。在选择特定工具时,一个明智的策略是查看其他开发者是否给予该工具正面的推荐。此外,亲自尝试几款不同的工具也是一个好主意。值得庆幸的是,上述大多数工具提供免费试用版本,这让你有机会先行测试,而不用立即做出全面投入的决定。

另一个需要考虑的重要因素是公司是否拥有稳固的财务支持。你所在的公司是否有进行风险投资的资金支持?资金的充足与否可能直接影响到公司的发展和平台的持续创新能力。如果资金不足,公司可能难以为继,甚至面临停止服务的风险。

一些AI辅助编程工具的供应商可能不得不终止服务,这会给依赖这些工具的开发者带来不便。以Kite为例,它曾是这个领域的先驱之一,自2014年起开始运营。然而到了2022年,Kite公司决定终止该项目。幸运的是,Kite将其大部分代码库开源,为社区提供了持续使用和进一步开发该工具的可能。

在本章中,我们揭开了生成式AI和LLM的神秘面纱。我们回顾了一些引人入胜的历史案例,例如早期的聊天机器人ELIZA。接着,我们深入探讨了人工智能领域的一个重要里程碑——Transformer模型。此外,我们还亲自体验了OpenAI Playground,并学习了如何根据需要定制LLM。

[3]根据基础模型研究中心发布的“Foundation Model Transparency Index Total Scores 2023”(2023年基础模型透明度指数总分)得到。

[4]ROUGE特别关注召回率,即生成文本中包含参考文本的程度。通过这种方式,ROUGE有助于深入了解生成代码与预期输出之间的一致性和准确性。ROUGE分数高表明生成的代码在结构和内容上与参考代码有较高的匹配度,这对于验证代码生成模型的有效性至关重要。——译者注

目录
加书签
详情
加书架
打赏
投票
自动滚动
设置
夜间

评论 0条

加载中...

设置

阅读主题
正文字体
字体大小
18
页面宽度
滚动速度
5
语音朗读
翻页模式
💎

余额不足

您的水晶或能量余额不足,请充值后再试。

立即前往充值

🎫 投月票

1 张月票 = 1.00 水晶。感谢支持!

🎁 打赏作品

打赏将直接扣除水晶余额,鼓励作者创作。