ChatGPT-实用生成式AI-一-

ChatGPT 实用生成式AI(一)

原文:Practical Generative AI with ChatGPT - B31559_09 (for True Epub)

译者:飞龙

协议:CC BY-NC-SA 4.0

ChatGPT 实用生成式AI

1 生成式 AI 简介

在 Discord 上加入我们的书籍社区

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_11_0.png

https://packt.link/EarlyAccess

你好!欢迎来到 ChatGPT 与 OpenAI 终极指南!在书中,我们将探索生成式人工智能(GAI)的迷人世界及其突破性的应用。生成式 AI 改变我们与机器交互的方式,使计算机能够在没有明确人类指令的情况下创作、预测和学习。自从2023年11月ChatGPT发布以来,我们见证了自然语言处理、图像视频合成以及许多领域以前所未有的速度发展。无论你是好奇的初学者还是经验丰富的从业者,本指南都将提供应对生成式 AI 精彩格局所需的知识和技能。现在,让我们深入浅出,从一些定义开始了解我们所处的背景。

本章提供了生成式 AI 领域的概述,该领域涉及使用机器学习(ML)算法创建新且独特的数据或内容。

重点关注生成式 AI 在各个领域的应用,如图像合成、文本生成和音乐创作,突显了生成式 AI 变革各行业的潜力。本生成式 AI 简介将提供该技术所处的背景,以及在广阔的 AI、机器学习和深度学习(DL)世界中的知识。然后,我们将通过具体示例和最新进展探讨生成式 AI 的主要应用领域,以便你熟悉它对企业和整个社会可能产生的影响。

此外,了解生成式 AI 向当前最先进水平的研究历程将帮助你更好地理解近期进展的基础。

我们将通过以下主题涵盖所有内容:

  • 理解生成式 AI

在本章结束时,你将熟悉令人兴奋的生成式 AI 世界、其应用背后的研究历史以及当前的发展,这些发展可能已经并且正在对业务产生颠覆性的影响。

介绍生成式 AI

AI 在近年来取得了巨大进展,其中增长明显的领域之一就是生成式 AI。生成式 AI 是人工智能(AI)和深度学习(DL)的一个子领域,侧重于使用机器学习(ML)技术在现有数据上训练的算法和模型来生成新内容,如图像、文本、音乐和视频。

为了更好地理解 AI、ML、DL 和生成式 AI 之间的关系,可以将 AI 视为基础,而 ML、DL 和生成式 AI 代表了日益专业化和专注的研究与应用领域:

  • AI 代表一个广泛的领域,即创建能够执行任务、表现出人类智能和能力并与生态系统交互的系统。

  • ML 是一个分支,侧重于创建算法和模型,使这些系统能够随着时间和训练进行自我学习和改进。ML 模型从现有数据中学习,并随着其增长自动更新其参数。

  • DL 是 ML 的一个子分支,从意义上说,它包含了深度 ML 模型。这些深度模型被称为神经网络,特别适用于计算机视觉或自然语言处理(NLP)等领域。当我们谈论 ML 和 DL 模型时,通常指的是判别式模型,其目标是在数据基础上进行预测或模式推理。

  • 最后,我们得到了生成式 AI,它是 DL 的进一步子分支,它不使用深度人工神经网络对现有数据进行聚类、分类或预测:它利用那些强大的人工神经网络模型来生成全新的内容,从图像到自然语言,从音乐到视频。

下图展示了这些研究领域之间是如何相互关联的:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_14_0.png

图 1.1 – AI、ML、DL 和生成式 AI 之间的关系

生成式 AI 模型可以在海量数据上进行训练,然后可以使用这些数据中的模式从零开始生成新示例。这种生成过程与判别式模型不同,后者被训练用于预测给定示例的类别或标签。

具有生成式 AI 特性的神经网络类型被称为大基础模型(LFMs),在 ChatGPT 等语言模型的情况下,我们称之为大语言模型(LLMs)。

大语言模型是一种以 Transformer 架构为特征的人工神经网络。它们的特点是海量的参数(数量以万亿计),并且在数十亿个单词上进行过训练。给定训练集,LLMs 能够根据用户的输入理解并生成自然语言。

尽管文本理解和生成可能是生成式 AI 最出特征之一,但该领域涵盖了许多领域。

生成式 AI 的领域

近年来,生成式 AI 取得了显著进展,并将其应用扩展到广泛的领域,如艺术、音乐、时尚、建筑等。在某些领域中,它确实在改变我们创造、设计和理解周围世界的方式。在另一些领域,它正在改进并使现有流程和操作更加高效。

生成式 AI 用于许多领域这一事实意味着它的模型可以处理各种数据,从自然语言到音频或图像。让我们了解生成式 AI 模型是如何处理不同类型的数据和领域的。

文本生成

生成式 AI 最大的应用之一(也是我们在本书中涵盖最多的)是它产生自然语言新内容的能力。事实上,生成式 AI 算法可以用于生成新文本,如文章、诗歌和产品描述。

例如,由 OpenAI 开发的 GPT-4o 等语言模型可以在大量文本数据上进行训练,然后用于用不同语言生成新的、连贯且语法正确的文本(无论是在输入还是输出方面),并从文本中提取相关特征,如关键词、主题或全文摘要。

这里有一个使用 GPT-3 的示例:

ChatGPT 4o

用一个简单的例子向一个 5 岁的孩子解释什么是质子。

想象你有一个非常小的乐木积木。这块乐木积木超级小,小到你用肉眼看不见。这个微小的乐木积木就像质子。

现在,想想你用乐木积木可以搭建的所有玩具。每个玩具都是由这些微小的乐木积木组合成的。同样,我们周围的一切,比如你的玩具、你的房子甚至是宇宙,都是由被称为原子的极小物体组成的。在每个原子内部,还有更小的部分,质质子。所以,质子就像那些帮助构成世界上一切的乐木积木之一!

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_17_0.png

图 1.2 – ChatGPT 响应用户提示的示例,同时也添加了引用

接下来,我们将转向图像生成。

图像生成

生成式 AI 在图像合成领域最早且最为人知的示例之一是由 I. Goodfellow 等人在 2014 年引入的生成对抗网络(GAN)架构。GAN 的目的是生成与真实图像无异的图像。这种能力具有许多有趣的业务应用,例如为计算机视觉模型生成合成数据集、生成真实的商品图像,以及用于虚拟现实和增强现实。

这是一个不存在的人脸示例,因为它们完全是由 AI 生成的:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_18_0.png

图 1.3 – 生成 this-person-does-exist.com 的脸

随后,2021 年,OpenAI 在该领域引入了一种新的生成式 AI 模型——DALL-E。与 GAN 不同,DALL-E 设计用于根据自然语言生成图像(GAN 接收随机向量作为输入),并可以生成广泛的图像,这些图像可能看起来并不真实,但仍描述了所需的概念。

生成 AI 在广告、产品设计和时尚等创意行业具有巨大潜力,可以创建独特且创意的图像。

自首次发布(2024 年 12 月)以来,DALL-E 取得了巨大的改进,如下所示。让我们看看下面 DALL-E 在诞生之初创作的艺术作品:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_19_0.png

图 1.4 – DALL-E 根据自然语言提示生成的图像

现在让我们看看 DALL-E3(本书编写时的最新版本)可以生成(这里我使用的是 DALL-E3 驱动的 Microsoft Image Creator,你可以在 https://copilot.microsoft.com/images/create 进行尝试)哲学家苏格拉底现在的照片。他骑着电动滑板一边在手机上发信息。

探索创意

创作

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_20_0.png

图 1.5 – DALL-E3 根据自然语言提示生成的图像

在不到 18 个月的时间里,看到这个模型的改进程度如此之大,令人印象深刻。有趣的是,我们仅仅接触了过去几个月生成式 AI 领域发生的巨大改进的冰山一角。

音乐生成

音乐生成是生成式 AI 的早期方法追溯到 50 年代,源自算法作曲领域的研究,这种技术利用算法来生成音乐作品。事实上,1957年,Lejaren Hiller 和 Leonard Isaacson 创作了《弦乐四重奏伊利亚克套曲》( https://www.youtube.com/watch?v=n0pjBFLQSk8 ),这是第一部完全由 AI 创作的音乐。从那时起,音乐生成式 AI 领域几十年来一直是持续的研究课题。在近年的发展中,新的架构和框架在公众中变得流行,例如 Google 在2016年引入的 WaveNet 架构,它能够生成高质量的音频样本;或者由 Google 开发的 Magenta 项目,它使用循环神经网络(RNNs)和其他机器学习技术来生成音乐和其他艺术形式。随后,2020年,OpenAI 也宣布了 Jukebox,这是一种生成音乐的神经网络,并可以根据音乐和人声风格、流派、参考艺术家等对输出进行自定义。

这些以及其他框架成为了许多 AI 作曲师助手的基础。例如由 Sony CSL Research 开发的 Flow Machines。这个生成式 AI 系统在大型音乐作品数据库上进行了训练,以创建各种风格的新音乐。法国作曲家 Benoît Carré 使用它创作了专辑《Hello World》( https://www.helloworldalbum.net/ ),该专辑包含了与多位人类音乐家的合作。

在这里,你可以看到一个由 Music Transformer 生成的曲目示例,它是 Magenta 项目的模型之一:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_22_0.png

图 1.6 – Music Transformer 允许用户收听 AI 生成的音乐表演

生成式 AI 在音乐领域的另一个惊人应用是语音合成。确实,可以找到许多 AI 工具,它们根据文本输入以知名歌手的声音创建音频。

例如,如果你一直好奇如果由 Kanye West 演唱你的歌曲听起来是什么样,那么你可以使用 FakeYou.com( https://fakeyou.com/ )、Deep Fake Text to Speech 或 UberDuck.ai( https://uberduck.ai/ )等工具来实现你的梦想。

选定声音

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_23_0.png

选择声音

| 说唱歌手 | Kanye West (说唱) |

| :--- | :--- |

| 输入文本进行合成 | hello hello! |

| 高级控制 | |

图 1.7 – 使用 UberDuck 进行文本转语音合成。

我必须说,结果真的令人印象深刻。如果你想玩玩,也可以尝试你所有喜爱的卡通片的配音,例如小熊维……

让我们更进一步吧。如果我们能从零开始生成一首歌,只需用自然语言让 GenAI 为我们做到这一点呢?嗯,今天我们可以无缝地做到这一点,而不需要任何音乐知识。在当今音乐市场上兴起的 GenAI 产品中,Suno 是一个极佳的例子,它的使命是“[...] 正在建立一个任何人都能创作优秀音乐的未来。无论你是淋浴歌手还是上榜艺人,我们都打破了你与你梦想创作的歌曲之间的障碍。不需要乐器,只需要想象力。从你的脑海到音乐。”(来源: https://suno.com/about )。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_24_0.png

你能相信它成了我 2024 年夏天的热门金曲吗?如果你也想创作你的夏季热门金曲,可以在 https://suno.com/create 免费尝试。

视频生成

视频生成的生成式 AI 与图像生成具有相似的发展时间线。事实上,视频生成领域的关键进展之一是 GANs(生成对抗网络)的发展。得益于它们在生成真实图像方面的准确性,研究人员开始将这些技术应用于视频生成。基于 GAN 的视频生成最著名的例子之一是 DeepMind 的 Motion to Video,它能从单张图像和动作序列生成高质量视频。另一个很好的例子是 NVIDIA 的基于 DL 的 Video-to-Video Synthesis(Vid2Vid)框架,它利用 GANs 从输入视频合成高质量视频。

Vid2Vid 系统可以生成时间上一致的视频,这意味着它们在时间推移过程中保持平滑且真实的动作。该技术可以执行各种视频合成任务,如下:

  • 将视频从一个领域转换为另一个领域(例如,将白天的视频转换为夜间的视频,或将素描转换为真实的图像)

  • 修改现有视频(例如,更改视频中对象的风格或外观)

  • 从静态图像创建新视频(例如,让一系列静态图像动起来)

2022年9月,Meta 的研究人员宣布了 Make-A-Video( https://makeavideo.studio/ )的开放,这是一个新的 AI 系统,允许用户将自然语言提示转换为视频片段。在这种技术背后,你可以识别出我们迄今提到的其他领域的许多模型——用于提示的语言理解、带有图像生成的图像和动作生成,以及由 AI 作曲师制作背景音乐。

现在,我们上面提到的所有内容与最新的文本转视频模型相比都相形见绌。其中,OpenAI 在2024年2月宣布了一种名为 SORA 的新文本转视频模型,发布了一些早期实验:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_26_0.png

提示:一位时尚的女性走在充满温暖发光霓虹灯牌的街道上。她穿着皮夹克、连衣裙和靴子。戴着墨镜和口红。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_27_0.png

提示:一部电影预告片,主角是一个戴着头盔的30岁宇航员,天空,沙漠,电影风格,35mm胶片拍摄,色彩鲜艳。

图 1 – SORA 生成的视频

我必须说,结果真的令人印象深刻。如果你想玩玩,也可以尝试你所有喜爱的卡通片的配音,例如小熊维……

总体而言,生成式 AI 多年来影响了许多领域,某些 AI 工具已经支持了艺术家、机构和普通用户。未来看起来非常有前景;然而,在跳转到现有的最先进模型之前,我们首先需要对生成式 AI 的根源、历史和近期发展有更深入的理解。

之前的章节中,我们概述了生成式 AI 领域最新、最前沿的技术,这些都是近几年开发的。然而,该领域的研究可以追溯到几十年前。

我们将生成式 AI 研究的起点标记在20世纪 60年代,当时 Joseph Weizenbaum 开发了聊天机器人 ELIZA,这是 NLP 系统的早期示例之一。它是一个基于规则的交互系统,旨在根据文本输入的响应来娱乐用户,并为 NLP 和生成式 AI 的进一步发展铺平了道路。然而,我们知道现代生成式 AI 是 DL 的一个分支,尽管最早人工神经网络(ANNs)在20世纪40年代就已引入,但研究人员面临着许多挑战,包括计算能力有限以及对大脑生物基础缺乏了解。因此,ANNs 直到80年代才获得广泛关注,当时,除了新硬件和神经科学的发展外,反向传播算法的出现促进了 ANNs 的训练阶段。事实上,在反向传播出现之前,训练神经网络是困难的,因为无法高效计算误差相对于每个神经元的参数或权重的梯度,而反向传播使得自动化训练成为可能,并使 ANNs 的应用成为现实。

随后,在2000年代和2010年代,随着计算能力的提升,结合海量的可用训练数据,使得深度学习(DL)变得更加实用并向普通大众普及,并随之推动了研究的增长。

2013年,Kingma 和 Welling 在其论文《Auto-Encoding Variational Babies》中引入了一种新的模型架构,称为变分自编码器(VAEs)。VAE 是基于变分推理概念的生成式模型。它们提供了一种学习方法,通过将数据编码到名为潜空间(latent space)的低维表示空间中(通过编码器组件),然后将其解码回原始数据空间(通过解码器组件),来实现对数据的紧凑表示。

VAE 的核心创新在于引入了潜空间的概率解释。编码器不再是学习一个从输入到潜空间的确定性映射,而是将输入映射为潜空间上的一个概率分布。这使得 VAE 能够通过从潜空间中采样并将这些样本解码到输入空间,来生成新的样本。

例如,假设我们想要训练一个 VAE,它可以创建出看起来像真实的猫和狗的新图片。

为了做到这一点,VAE 首先接收一张猫或狗的照片,并将其压缩为潜空间中一组较小的数字,这些数字代表了图片中最重要的特征。这些数字被称为潜变量(latent variables)。

然后,VAE 获取潜变量并利用它们创建一张看起来可能像真实的猫或狗照片的新图片。这张新图片可能与原始图片存在某些差异,但它看起来仍然属于同一组图片。

随着时间的推移,VAE 通过将其生成的图片与真实图片进行比较,并调整其潜变量以使生成的图片看起来更真实,从而在创建真实图片方面变得更好。

VAE 为生成式 AI 领域的快速发展铺平了道路。事实上,仅在一年后,Ian Goodfellow 就引入了生成对抗网络(GANs)。与以编码器和解码器为主要元素的 VAE 架构不同,GANs 由两个神经网络组成——生成器(generator)和判别器(discriminator)——它们在零和博弈中相互对抗。

生成器创建伪造数据(对于图像而言,就是创建一张新图像),其目的是使其看起来像真实数据(例如,一张猫的照片)。判别器接收真实和伪造数据,并试图区分它们——它在我们艺术伪造示例中扮演着评论的角色。

在训练过程中,生成器试图创建能够欺骗判别器使其认为是真实的数据,而判别器则试图更擅于区分真伪数据。这两个部分被一起训练,这一过程被称为对抗训练(adversarial training)。

随着时间的推移,生成器在创建看起来像真实的伪造数据方面变得更好,而判别器在区分真伪数据方面变得更好。最终,生成器创建伪造数据的能力变得非常精湛,以至于判别器都无法区分真伪数据的差异。

这是一个完全由 GAN 生成的人脸示例:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_31_0.png

图 1.8 – GAN 生成的光真脸示例(取自《Progressive Growing of GANs for Improved Quality, Stability, and Variation》,2017: https://arxiv.org/pdf/1710.10196.pdf )

VAE 和 GANs 的生成模型发展

VAE 和 GANs 两种模型的目的都是生成与原始样本无法区分的新数据,而且自构想以来,它们的架构得到了改进,并与 Van den Oord 及其团队提出的 PixelCNNs 以及 Google DeepMind 开发的 WaveNet 等新模型的发展并进,导致了音频和语音生成领域的进展。

另一个伟大的里程碑出现在 2017 年,当时 Google 研究人员在论文《Attention Is All You Need》中引入了一种名为 Transformer 的新架构。它在语言生成领域具有革命性,因为它在保留语言上下文记忆的同时允许并行处理,性能优于此前基于 RNN 或长短期记忆(LSTM)框架的语言模型尝试。

Transformer 确实构成了由 Google 在 2018 年引入的名为 BERT(基于 Transformer 的双向编码器表示)的大型语言模型的基础,并很快成为了 NLP(自然语言处理)实验的基准。

Transformer 也是 OpenAI 引入的所有生成式预训练(GPT)模型的基础,包括 ChatGPT 背后的模型 GPT-3,以及大型基础模型(Large Foundation Models)。

尽管在这些年里已经有了大量的研究和成就,但直到 2022 年下半年,公众的注意力才转向生成式 AI 领域。

并非巧合,2022 年被称为“生成式 AI 之年”。这一年,强大的 AI 模型和工具在普通大众中普及:基于扩散的图像服务(MidJourney、DALL-E 2 和 Stable Diffusion)、OpenAI 的 ChatGPT、文本生成视频(Make-a-Video 和 Imagen Video)以及文本生成 3D(DreamFusion、Magic3D 和 Get3D)工具都向个人用户开放,有时甚至是免费的。

这产生了颠覆性的影响,主要原因有两点:

  • 一旦生成式 AI 模型在公众中普及,每个个人用户或组织都有机会尝试并体会其潜力,即使他们不是数据科学家或机器学习工程师。

  • 这些新模型的输出及其嵌入的创造力在客观上是令人惊叹的,而且往往令人担忧。一种紧迫的适应呼吁——针对个人和政府——应运而生。

从此起,在不久的将来,我们可能会见证 AI 系统在个人使用和企业级采用率的激增。

18 个月后:主要趋势与创新

回回到 2022 年 11 月到今天,我们在 GenAI 领域见证了大量的创新。这些创新许多与新发布的模型有关,例如 OpenAI 的 GPT-4o 和 DALL-E3,以及 Google 的 Gemini、Meta 的 Llama 3 以及微软的 Phi3 等。

然而,最显著的成就可能在于我们与模型交互以及构建应用的方式。在本节中,我们将探索标记了 GenAI 应用参考架构的三大主要进展。

男王+女人 ≈ 女王

RAG 的组成阶段

RAG 由三个阶段组成:

  • 检索:给定用户查询及其对应的向量,检索出最相似的文档片段(即与用户查询向量接近的向量),并将其作为大语言模型(LLM)的底层上下文。

  • 增强:通过额外的指令、规则、安全护栏以及类似的提示词工程典型实践,对检索到的上下文进行丰富(我们将在第 3 章中介绍提示词工程主题)。

系统消息

你是一个帮助用户回答查询的 AI 助手。

上文

提示词工程

文档

回复中应使用以下文档:

(retrieved_docs)

#安全

你应该始终根据检索到的文档搜索结果来引用事实性陈述。

  • 生成:基于增强后的上下文,LLM 对用户的查询生成回复。

系统消息 + 检索文档

你是一个帮助用户回答查询的 AI 助手。

文档

回复中应使用以下文档:

(retrieved_docs)

用户查询

#安全

你应该始终根据检索到的文档搜索结果来引用事实性陈述。

整体流程如下:

RAG 结合了生成模型和信息检索系统的优势,以增强生成内容的质量和相关性。传统的生成模型完全依赖训练数据来产生响应,这有时会导致过时或无关的信息。RAG 通过在生成过程中整合外部知识库解决了这一局限性。

例如,OpenAI 的 ChatGPT 在 RAG 的增强下,可以从可靠来源获取当前数据,以回答关于近期事件的查询,而这超出了其训练截止日的范围。这种检索与生成的协同扩大了生成式 AI 的适用性,使其在动态、信息丰富的环境中更加健壮和实用用。

多模态性

在本章的第一节中,我们看到了生成式 AI 的各个领域,从文本到图像,从视频到音乐。通常,大型基础模型(Large Foundation Models)倾向于特定领域,正如我们在语言理解和生成方面的大语言模型,或在图像生成方面 DALL-E3 所示。

然而,生成式 AI 最近的进展使得大多模态模型(LMMs)的发展,它们能够处理和生成不同类型的数据,如文本、图像、音频和视频。

LMMs 与“标准”大语言模型(LLMs)共同拥有大型基础模型典型的泛化和适应能力。然而,LMMs 能够处理异构数据,其理念是模仿人类与周围生态系统交互的方式——即通过我们所有的感官。

多模态模型的绝佳例子是 OpenAI 的 GPT-4o,它能够通过文本、图像和音频与用户交互。让我们来看例子:

图片中的建筑是哈利法塔,位于阿拉伯酋联合长国的迪拜。它是目前世界上最高的建筑。

如你所见,模型能够分析并对其进行推理。现在让模型生成一张插图:

谢谢。你能为它生成一张卡通风格的插图吗?黑白的

LMMs 最有趣的的事实是,它们保留了自己的推理能力,使其适用于异构数据语境下的复杂推理。让我们考虑最后一个例子(仅显示响应的前几行):

好的,让我们解决字谜游戏。以下是根据给定线索的答案:

横向:

    1. 头胸(螯肢节肢动物中头部和胸部的融合)
    1. 节肢类(蝎子所属的纲)
    1. 变态(从幼态形态向成体的转变)

正如你所想象的,这在各个行业开启了应用蓝图,我们将在接下来的章节看到一些具体的例子。

AI 代理(AI Agents)

在之前的章节中,我们揭示了基础模型(LFMs)在生成内容方面非常强大。然而,它们缺乏一种能力,即采取行动与周围生态系统交互的能力。例如,如果我们希望我们的 LLM 不仅能生成 LinkedIn 帖子,还能将其发布在我们的页面上怎么办?

为了克服这一局限性,AI 代理成为了关键角色。但它们究竟是什么?代理可以被看作是由大语言模型驱动的 AI 系统,给定用户查询,它们能够在允许的范围内与周围生态系统交互。生态系统的边界由我们为代理提供的工具(或插件)决定(在之前的例子中,我们为代理提供了一个 LinkedIn 插件,以便它可以发布生成的内容):

  • 作为 AI 系统推理引擎的 LLM

  • 指导代理以特定方式行为和思考的系统消息。例如,你可以设计一个教学助手的代理,使用如下系统消息:"你是一个教学助手。给定学生的查询,永远不要提供最终答案,而是提供提示以引导他们到达答案。"

  • 代理可以利用的与周围生态系统交互的工具集

AI 代理完美代表了"LLM 作为应用程序推理引擎"的含义。事实上,代理的魅力之处在于它们可以选择最合适的工具来完成用户的请求。例如,假设我们有一个制作 LinkedIn 内容的 AI 代理,并为它提供了两个工具:LinkedIn 插件和网络搜索插件(每个插件都有其功能的相应描述)。然后,让我们探索代理面对两个不同问题时的:

  • 生成一个关于小狗在山间漫步的故事:代理将在不涉及任何插件的情况下生成故事。

  • 生成一个关于米兰当前天气的故事:代理将调用网络搜索插件获取米兰天气。

  • 生成一个关于米兰当前天气的 LinkedIn 帖子并发布到我的简介上:代理将调用网络搜索插件获取米兰天气,并调用 LinkedIn 插件将其发布到我的简介上。

而且不仅如此。

为什么只有一个代理呢,如果你可以创建一个相互通信和合作的代理团队呢?想象多个代理,每个代理都有特定的专业知识和目标,通过相互通信和交互来完成任务。这就是多代理应用程序的外观,并且在过去的几个月里,这种模式开始显示出现涌行为。

让我们考虑以下示例。我们想生成一个关于气候变化的电梯演讲稿(elevator pitch)。为了做到这一点,我们需要最新的信息(最新的趋势和研究、未来展望等),以及基于学术论文的坚实研究。此外,我们需要保持简洁、敏锐且高效,在非常短的演讲中交付所有关键信息。

现在,我们可以向一个单一智能体(agent)提出所有这些要求,为它提供所有必需的工具和长长的指令来完成任务。然而,事实证明,当我们给大语言模型(LLMs)安排"过多的任务"时,它们的表现往往会变差。相反,让我们使用多智能体方法(multi-agent approach),创建一个由以下 AI 专家组成的团队:

  • 一位市场分析师,可以在网络上搜索有关气候变化的最新新闻;这将是一个带有网络搜索插件和特定新闻搜索指令的智能体;

  • 一位专家研究员,可以轻松地浏览有关气候变化的学术研究论文;这将是一个带有 Arxiv 插件以及如何检索相关信息的特定指令的智能体;

  • 一位公共演讲专家,可以轻松地将所有信息整合成一个电梯演讲稿;这将是一个具有关于如何进行完美演讲的适当指令的智能体;

  • 一位批评者,他将审查演讲稿并在需要时向公共演讲专家提出一些修改;这将是一个具有关于如何进行完美演讲的适当指令的智能体;

因此,当用户提出问题"生成一个关于当前气候变化问题的电梯演讲稿"时,所有智能体都可以开始处理该项目。

有许多框架可以帮助开发者构建多智能体应用(包括 AutoGen、LangGraph、CrewAI),特别是涉及到我们希望智能体遵循的"流"(flow)时。例如,我们可能希望强制特定的迭代次数,或者确保所有智能体至少被调用一次;或者甚至在每次迭代中都让我们作为用户参与进来,提供进一步的反馈,并整合到下一次迭代中。

在写作期间,多智能体框架正显示出广阔的进展,但它仍然处于实验阶段,可能远未达到企业级就绪。尽管如此,它是对大语言模型背后卓越推理能力的一种瞥,展示了它们如何开启解决问题和创造的新方法。

小语言模型

不出所意料,大语言模型确实很大。这意味着包含大语言模型的人工神经网络架构是由海量的参数组成的,数量级达到万亿级。理想情况下,参数数量越高,大语言模型的推理能力就越强。

然而,高参数量也意味着高昂的训练和托管成本,因为这需要强大的 AI 基础设施。此外,这些模型所需的能量消耗对大语言模型训练的环境影响以及从远来看的整体可持续性引发了严重的问题。为了让你有一个直观的概念,以下是与不同尺寸(以参数数量衡量)开源大语言模型相关的数字:

| | GPU 类型 | GPU 功耗 | GPU 小时 | 总功耗 | 碳排放 (CO2eq) |

| :--- | :--- | :--- | :--- | :--- | :--- |

| OPT-175B | A100-80GB | 400W | 809,472 | 356 MWh | 137 |

| BLOOM-175B | A100-80GB | 400W | 1,082,880 | 475 MWh | 183 |

| LLaMA-7B | A100-80GB | 400W | 82,432 | 36 MWh | 14 |

| LLaMA-13B | A100-80GB | 400W | 135,168 | 59 MWh | 23 |

| LLaMA-33B | A100-80GB | 400W | 530,432 | 233 MWh | 90 |

| LLaMA-65B | A100-80GB | 400W | 1,022,362 | 449 MWh | 173 |

图 2:在同一数据中心训练不同模型所需的碳足迹和计算算力。来源:https://arxiv.org/pdf/2302.13971

幸运的是,在过去的几个月里,我们看到人们对较小模型的研究兴趣和投资日益增长,目标是在减少参数数量的同时保持良好的推理能力。其想法是,较小的模型即使"智能程度较低",如果能在更定制的活动中专业化,仍然可以达到预期要求。毕竟,我们真的需要万亿参数的巨大强大模型来解决我们脑海中的所有任务吗?

这些较小的模型被称为小语言模型(SMLs),除了在基础设施方面更轻量、需求更低外,它们还表现出惊人的性能。

例如,如果我们考虑 Phi-3 的较小版本(它是微软开发的流行的 SLM 家族的一部分),它"仅"有 70 亿参数,我们可以看到它在最流行的大语言模型基准测试中超过了 GPT-3.5-turbo。

| 类别 | 基准测试 | Phi-3-Small-8K-In | Phi-3-Small-128K-In | Gemma-7b | Mixtral-8x7 | Llama-3-8B-In | GPT3.5-Turbo-1106 |

| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |

| 类别 | MMLU (0-shot) | 75.7 | 75.5 | 63.6 | 70.5 | 71.4 | |

| 语言理解 | HellSwag (0-shot) | 77.0 | 69.6 | 49.8 | 70.4 | | |

| 理解 | WinoGrande (0-shot) | 81.5 | 80.1 | 55.6 | 62. | | |

| 推理 | Social IQA (0-shot) | 79.2 | 78.7 | 65.5 | 73.9 | | |

| 事实知识 | TruthfulQA (MC2) (0-shot) | 58.1 | 66.0 | 52.1 | 60.2 | | |

| 数学 | GSM8K CoT (0-shot) | 89.6 | 87.3 | 59.8 | 64.7 | | |

| 代码生成 | HumanEval (0-shot) | 61.0 | 59.1 | 34.1 | 37.8 | 60.4 | |

| 碳足迹 | MBFP (0-shot) | 71.7 | 70.3 | 51.5 | 60.2 | 67.7 | |

图 3:Phi-3 能力的基准表。来源:https://azure.microsoft.com/en-us/blog/introducing-phi-3-redefining-whats-possible-with-slms/

  • 什么是 OpenAI?

  • OpenAI 系列概述

  • 通往 ChatGPT 之路:其背后的模型数学

  • ChatGPT:顶尖水平

技术要求

为了能够测试本章中的示例,你需要以下内容:

什么是 OpenAI?

OpenAI 是一家由埃隆·马斯克(Elon Musk)、萨姆·奥特曼(Sam Altman)、格雷格·布洛克曼(Greg Brockman)、利亚·苏特凯斯基(Ilya Sutskever)、沃伊杰奇·扎伦巴(Wojciech Zaremba)和约翰·舒尔曼(John Schulman)于 2015 年创立的研究机构。正如 OpenAI 网页上所述,它的使命是"确保通用人工智能(AGI)造福全人类"。由于其具有通用性,AGI 旨在具备学习和执行广泛任务的能力,而无需针对特定任务进行编程。

自 2015 年以来,OpenAI 将其研究集中在深度强化学习 (DRL) 上,这是机器学习 (ML) 的一个子集,它将强化学习 (RL) 与深度神经网络相结合。该领域的首个贡献可以追溯到 2016 年,当时公司发布了 OpenAI Gym,这是一个供研究人员开发和测试 RL 算法的工具包。

Gym 是强化学习的标准 API,以及多样化的参考环境集

Gym 接口简单、符合 Python 风格,并且能够表示通 RL 问题:

import gym
env = gym.make("LunarLander-v2", render_mode="human")
observation, info = env.reset(seed=42)
for _ in range(1000):
    action = policy(observation) # 用户定义的策略函数
    observation, reward, terminated, truncated, info = env.step(action)
if terminated or truncated:
    observation, info = env.reset()
env.close()

图 2.1 – Gym 文档的首页 (https://www.gymlibrary.dev/)

OpenAI 继续在该领域进行研究并做出贡献,但其最显著的成就与生成式模型有关——生成式预训练 Transformer (GPT)。

在他们的论文《通过生成式预训练改进语言理解》中引入了模型架构并将其命名为 GPT-1 后,OpenAI 的研究人员很快在 2019 年发布了其继者 GPT-2。这个版本的 GPT 是在一个名为 WebText 的语料库上训练的,该语料库当时包含超过 800 万份文档,来自 Reddit 提交中获得至少 3 个点赞的 URL,总计有 40 GB 的文本。它拥有 12 亿个参数,是其前者的十倍。

在这里,你可以看到由 HuggingFace 发布的 GPT-2 UI 首页 (https://transformer.huggingface.co/doc/distil-gpt2):

图 2.2 – GPT-2 根据提示编写段落。来源:https://transformer.huggingface.co/doc/distil-gpt2

接着,2020 年,OpenAI 首次宣布并发布了 GPT-3,它拥有 1750 亿个参数,大幅提高了相对于 GPT-2 的基准结果。通过 GPT-3 模型——更准确地说,通过名为 GPT-3.5 的微调版本——我们进入了 ChatGPT 时代:事实上,ChatGPT 在首次发布时是由 GPT-3.5 驱动的。

从那时(2022年11月)至今,OpenAI 发布了 GPT 系列的许多新版本:GPT-4、GPT-4-turbo、GPT-4vision(第一个多模态模型)和 GPT-4o,“o”代表“omni”,指的是其多模态能力。

除了自然语言生成模型外,OpenAI 在生成式 AI 的其他领域也有开发,包括:

  • DALL-E:一种文本到图像的模型,可根据文本描述生成详细且创意的图像。它可以产生各种图像,从现实场景到想象力丰富的抽象艺术。

  • Whisper:一种语音识别模型,旨在将口语转录为文本。它擅长理解各种口音、方言和嘈杂环境,使其在实时转录和语音控制应用中非常有效。

  • SORA:一种文本到视频的模型,可根据文本指令生成真实且富有想象力的视频。SORA 可以创建长达一分钟的视频,同时保持视觉质量并遵循用户的提示。在本文写作期间,SORA 尚未向公众开放。

尽管 OpenAI 已投资于生成式 AI 的许多领域,但它在文本理解和生成方面的贡献是卓越的,这归功于我们将在接下来几个段落中探索的基础 GPT 模型的发展。

OpenAI Playground 概述

今天,OpenAI 提供了一系列预训练的、即开即用的模型供大众使用。

  • OpenAI Playground:一个友好的界面,你可以在其中与模型交互而无需编写代码。

  • OpenAI APIs:提供 OpenAI 模型的高质量端点,可以整合到你的应用程序中。

在进入 Playground 之前,让我们先概述一下模型。

OpenAI 系列

在过去的几年里,OpenAI 在该领域取得了巨大进展,发布了更新的版本。在本节中,我们将看到按领域划分的主要模型。

语言模型

OpenAI 的 GPT 是先进的语言模型,旨在根据提示生成类人类的文本。它们功能多变,可用于各种自然语言任务,如文本完成、翻译、摘要和编码。自 2022 年 11 月 ChatGPT 发布以来,OpenAI 发布了:

  • GPT-3.5-turbo:ChatGPT 第一版本的模型

  • GPT-4(第一个多模态模型)和 GPT-4-turbo:针对聊天和助手进行了优化

  • GPT-4o:最先进的多模态模型

  • GPT-4o mini:GPT-4o 的小型版本

除了这些最新模型,用户还可以访问一组所谓的“基础 GPT 模型”,例如 Babbage-002 或 davinci-002(GPT-2),它们代表补全 API(我们将在下一节介绍补全 API)。

图像模型

OpenAI 的图像模型(如 DALL-E)根据文本描述生成并处理图像。这些模型可以创建详细且富有想象力的视觉效果,使用户产生独特的艺术品、设计方案等。例如,DALL-E 3(模型的最新版本)能够根据复杂的提示创建复杂的且创意的图像,推动了 AI 在视觉艺术领域的边界。这些模型在创意产业、数字营销以及任何受益于高质量自定义视觉效果的领域都特别有用。

文本转语音与语音转文本

在第 1 章中,我们已经了解了 OpenAI 开发的语音转文本 (STT) 模型 Whisper,它可以处理和分析音频输入。此外,OpenAI 还开发了文本转语音 (TTS) 模型,提供清晰且富有表现力的高质量输出,适用于从客户服务机器人到教育工具的广泛应用。由 OpenAI 开发的文本转语音 (TTS) 模型将文本转换为口语,产生逼真且自然的音频。这些模型对于创建语音助手、提高视障用户的无障碍性以及生成自动公告至关重要。

文本转视频

随着 SORA 的发布,OpenAI 展示了其尖端的文本到视频模型,该模型能够根据文本描述生成具有想象力的真实视频场景。通过采用 DALL-E 的技术并结合 Transformer,SORA 可以创建长达一分钟的高保真视频。它在保持 3D 一致性、物体持久性以及模拟视频内交互方面表现出色。尽管在准确建模复杂物理和确保时间连贯性方面仍面临挑战,SORA 在创意产业具有巨大潜力,为视频制作和故事讲述提供了新的可能性。

  • Embeddings (嵌入):来自 OpenAI 的嵌入模型将文本转换为向量(或嵌入)的数值表示,这些向量捕捉了语义并投影到多维向量空间中。空间中不同实例之间的数学距离表示它们在语义上的相似性。例如,想象 queen(皇后)、woman(女性)、king(国王)和 man(男人)这些词。理想情况下,在我们词即向量的多维空间中,如果表示是正确的,我们希望实现以下效果:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_62_0.png

这意味着 woman 和 man 之间的距离应该等于 Queen 和 King 之间的距离。

嵌入在智能搜索场景中极其有用。事实上,通过获取用户输入和用户想要搜索的文档的嵌入,可以计算输入与文档之间的距离指标(即余弦相似度)。通过这种方式,我们可以检索在数学距离上更接近用户输入的文档。

OpenAI 的嵌入模型 text-embedding-ada-002 和 text-embedding-3-large 在文本相似性、搜索和代码搜索等任务中提供了顶尖性能,能够创建文本的稠密向量表示。这些嵌入允许对大型文本数据集进行高效且有效的比较,提高了搜索的准确性和相关性。

  • Moderation (审核):OpenAI 的审核模型旨在检测并过滤文本中不适当、有害或不安全的内容。这些模型通过识别潜在的冒犯性或有害语言,对于维护安全且尊重的在线环境至关重要。最新的审核模型 text-moderation-007 在确保跨平台内容合规性和安全性方面既稳健又有效。它能帮助开发者和公司执行社区准则并防止有害内容的传播,从而促进更安全的数字交互。

总体而言,OpenAI 在过去几年中的覆盖越来越广,通过顶尖模型解决了生成式 AI 的多个领域。

在 Playground 中尝试 OpenAI 模型

要访问你的 OpenAI Playground,你需要创建一个 OpenAI 账户并导航至 https://platform.openai.com/playground。落地页如下图所示:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_64_0.png

图 2.4 – 位于 https://platform.openai.com/playground 的 OpenAI Playground

如图 2.4 所示,Playground 提供了一个界面,用户可以在其中开始与模型交互,你可以在界面的右侧选择模型。

在深入研究 Playground 的主要部分之前,让我们先定义一些你在本章中看到的专业术语:

  • Tokens (标记):Tokens 可以被视为 API 用于处理输入提示词的词碎片或片段。与完整的单词不同,token 可能包含末尾空格,甚至是部分子词。为了从长度的角度更好地理解 token 的概念,有一些通用的指南需要记在心中。例如,英语中的一个 token 大约等于四个字符,或一个单词的四分之三。

  • Prompt (提示词):在自然语言处理 (NLP) 和机器学习 (ML) 的背景下,prompt 指作为输入给 AI 语言模型以生成响应或输出的文本。prompt 可以是一个问题、陈述或句子,用于为语言模型提供上下文和方向。

  • Context (上下文):在 GPT 领域,上下文指的是用户 prompt 之前的词和句子。语言模型使用这些上下文,根据训练数据中发现的模式和关系,生成概率最大的下一个词或短语。

  • Model confidence (模型置信度):模型置信度是指 AI 模型为特定预测或输出分配的确定程度或概率。在 NLP 语境下,模型置信度通常用于指示 AI 模型对其给定输入提示词所生成响应的正确性或相关性有多大。

  • Functions (函数):函数是第 1 章引入的工具或插件概念的另一种定义。通过函数,我们为模型提供了一项额外的技能,使其能够完成用户的任务。函数始终会有一个自然语言编写的描述,以便模型知道何时调用它。

上述定义对于理解如何使用 Azure OpenAI 模型系列以及如何配置它们的参数至关重要。

在 Playground 中,有四个主要部分可以与模型交互:

Chat (聊天): 在这里,你可以测试今天所有可用的聊天模型,包括纯文本模型(如 GPT-3.5)或多模态模型(如 GPT-4o)。你可以提供系统消息——即你用自然语言提供给模型的一组指令。你还可以在相同的用户问题下比较两个不同模型的输出。以下是如何进行操作的示例:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_67_0.png

图 2.5 – 两个模型对比示例。

对于每个模型,你还可以调整一些可以配置的参数。列表如下:

  • Temperature (温度)(范围从 0 到 1):这控制模型响应的随机性。低温度会让你的模型更具确定性,这意味着它倾向于对相同的问题给出相同的输出。例如,如果我将温度设置为 0 并多次询问模型 “What is OpenAI?”,它将始终给出相同的答案。另一方面,如果我对温度设置为 1 的模型进行同样的操作,它将尝试在措辞和风格上每次修改其答案。

  • Max tokens (最大标记数):这控制模型对用户提示词响应的长度(以 token 为单位)。

  • Stop sequences (停止序列,用户输入):这让响应在指定的点结束,例如句子或列表的结束。

  • Top probabilities (高概率)(范围从 0 到 1):这控制模型在生成响应时考虑哪些 token。将其设置为 0.9 将考虑所有可能的 token 中概率最高的 90% 部分。人们可能会问,为什么不将高概率设置为 1 以选择所有高概率 token 呢?答案是,当模型置信度较低时,即使在高分 token 中用户可能希望保持多样性。

  • Frequency penalty (频率惩罚)(范围从 0 到 1):这控制生成响应中相同 token 的重复次数。惩罚越高,在同一响应中看到相同 token 出现一次以上的概率越低。惩罚根据 token 在文中出现的频率成比例减少(这是与后续参数的主要区别)。

  • Presence penalty (存在惩罚)(范围从 0 到 2):这与上一个相似但更严格。它减少了重复文中已出现过的任何 token 的概率。由于比频率惩罚更严格,存在惩罚也增加了在响应中引入新主题的可能性。

除了在 Playground 中尝试 OpenAI 模型外,你始终可以在自定义代码中调用模型 API 并将模型嵌入到你的应用程序中。

事实上,在 Playground 的右上角,你可以点击 View code(查看代码)并导出所示配置:

  • Assistants (助手):OpenAI Assistants 可以被视为一种更快、更容易地开发 AI Agents(第 1 章引入)的方法。事实上,Assistants 可以定义为由 LLM 驱动的实体,有一组要遵循的指令和一组要使用的工具或插件——基本上就是 AI Agents 的定义!

对于 OpenAI,它们配备了三个内置工具:

  • File Search (文件搜索):它允许用户上传自定义文档,以便助手可以通过它来完成查询。它基于 RAG 框架运行。

  • Function Calling (函数调用):它允许用户定义一组自定义函数,助手可以调用这些函数来完成给定任务。

  • Code Interpreter (代码解释器):指的是助手运行代码的能力,无论是针对提供的文档(例如电子表格)或需要数学计算的分析论文,或者仅仅解决用户提供的复杂任务(例如复杂的数学问题)。

在下面的图中,你可以看到一个名为“Chat with PDF”的助手示例,它专门用于对提供的内容做出响应文档(在我的情况下,我上传了由 Hugo Touvron 等人的论文“LLaMA: Open and Efficient Foundation Language Models”)。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_70_0.png

图 2.8 – OpenAI 助手的示例。

从之前的截图中可以看到,助手能够根据提供的文档回答我关于知识检索的问题。事实上,我的问题问得相当模糊,因为“毒性”(toxicity)一词可以指多个领域;尽管如此,助手知道将提供的文档作为主要信息来源。

补全(Completions)。这一节指的是一类被称为“基础模型”(base models)的模型,例如 GPT-3,它们是构建所谓的“助手模型”(或我们之前看到的聊天模型)的基础。例如,chat gpt-3.5-turbo(ChatGPT 背后的模型)是基础模型 GPT-3 的微调版本。

补全(基础)模型旨在为提示词(prompts)生成单一响应,使其适用于文本生成和摘要等任务,而无需在多次交互中维护上下文。另一方面,聊天(助手)模型针对交互式对话进行了优化,能够跨多轮对话维护上下文,是聊天机器人和虚拟助手等应用的理想选择。

下面你可以看到 Playground(操场)中典型的补全任务示例:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_72_0.png

如你所见,针对我的话“今天我去了一家杂货店并”,模型用最可能的词完成了这个句子。

如今,补全模型很少被使用,因为它们的性能优于聊天模型,但它们可以被进行微调以适应特定的用例(我们将在本节的稍后部分讨论微调)。

  • 文本转语音。除了上述语音转文本模型 Whisper 之外,OpenAI 还发布了 TTS(文本转语音)模型,可以直接在 Playground 中进行测试。

让我们来看一个例子:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_73_0.png

图 2:在 Playground 中使用 OpenAI TTS 模型的示例

如从上面的图片所示,你可以选择生成音频的语音、模型、速度和格式。

所有之前的模型都是预构建的,这意味着它们已经在一个巨大的知识库上进行了预训练。

然而,你有一些方法可以让你的模型更具定制化,并针对你的用例进行调整。

第一种方法嵌入在模型的设计中,它涉及通过少样本学习(few-shot learning)方法为你的模型提供上下文(我们将在书的后面重点关注这种技术)。也就是说,你可以要求模型生成一篇模板和词汇表让你想起你已经写过的文章。为此,你可以为模型提供生成文章的查询以及之前的文章作为参考或上下文,以便模型能更好地准备应对你的请求。

这里是它的示例:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_74_0.png

图 2.11 – 在 OpenAI Playground 中使用少样本学习法的对话示例

在上一个插图中,我指示模型只输出推文的情绪标签,并为其提供了三个关于如何做的示例。

第二种方法更为复杂,被称为微调(fine-tuning)。微调是将预训练模型适配到新任务的过程。

在微调过程中,预训练模型的参数会被更改,通过调整现有参数或添加新参数,以更好地拟合新任务的数据。这是通过在特定新任务的较小标记数据集上训练模型来实现的。微调背后的核心思想是利用从预训练模型中学到的知识并将其微调到新任务,而不是从零开始训练模型。请见下图:

| 数据集 | token 数 | 在训练中的比例 |

|---|---|---|

| Common Crawl | 4100 亿 | 60% |

| WebText | 590 亿 | 22% |

| Books1 | 120 亿 | 8% |

| Books2 | 550 亿 | 8% |

| Wikipedia | 30 亿 | 3% |

自定义数据集

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_75_0.png

图 2.12 – 模型微调

在前面的图中,你可以看到关于 OpenAI 预构建模型如何进行微调的架构。其想法是,你有一个具有通用权重或参数的预训练模型。然后,你向模型输入自定义数据,通常以键值对提示词和补全的形式呈现,如下所示:

{"prompt": "<prompt text>", "completion": "<idea"}
{"prompt": "<prompt text>", "completion": "<idea"}
{"prompt": "<prompt text>", "completion": "<idea"}
...

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_76_0.png

一旦训练完成,你将拥有一个自定义模型,该模型在给定任务上表现特别出色。

微调的妙处在于它可以让模型针对你的用例进行定制和优化,无需从头开始训练。通过在这些数据集上训练,模型得到了能力的提升。

在这个段落中,我们概述了 OpenAI 提供的模型,从可以在 Playground 中尝试的 GPT,到可以通过微调更复杂的模型。

在接下来的章节中,我们将关注这些优秀模型的背景,从它们背后的数学原理开始。

ChatGPT:顶尖水平

2022 年 11 月,OpenAI 发布了其对话 AI 系统 ChatGPT 的网页版,供公众使用。这引起了专家、机构和普通用户的巨大热潮——在短短 5 天内,该服务就达到了百万用户!

在介绍 ChatGPT 之前,我让它自我介绍一下,这是发布几天后的快照:

我正在写关于你的介绍。你能向读者介绍一下你自己吗?

可以可以!我是 ChatGPT,是由 OpenAI 开发的语言模型。我在大量的文本数据上进行了训练,旨在执行各种自然语言处理任务,如文本生成、对话建模、情感分析和问答。我基于 Transformer 架构,这让我有效地处理单词序列并学习它们之间的关系。

我在各种文本上训练,包括网页、新闻文章、书籍等,这使我拥有广泛的知识库并理解各种主题。我的能力通过深度学习和 OpenAI 团队的持续更新不断完善。

我可以进行实时交互,回答查询或根据给定的提示词生成文本。我还可以集成到各种应用程序中,如聊天机器人、内容创作和客户服务,以增强它们的自然语言处理能力。

总的来说,我是一个高级语言模型,可以协助各种 NLP 任务并提供类人的响应。我正在不断进化和改进,并渴望展示我的能力来帮助解决你的 NLP 需求。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_78_0.png

如上所述,ChatGPT 的第一个版本构建在高级语言模型之上,该模型使用了经过专门微调的 GPT-3 版本。这个微调版本被称为 GPT-3.5-turbo。优化过程涉及强化

人类反馈强化学习 (RLHF)

人类反馈强化学习 (RLHF),是一种利用人类输入来训练模型使其展现出理想对话行为的技术。

我们可以将 RLHF 定义为一种机器学习方法,其中算法通过接收人类的反馈来学习执行某项任务。算法经过训练以做出能够最大化人类提供的奖励信号的决策,而人类则提供额外的反馈以改进算法的性能。当任务复杂到传统编程无法处理,或者预期结果难以预先指定时,这种方法非常有用。

此处相关的区别在于,ChatGPT 在训练过程中采用了“人类在回路”模式,使其能够与用户保持一致。通过引入 RLHF,ChatGPT 的设计旨在以更自然、吸引人的方式更好地理解并响应人类语言。

同样的 RLHF 机制也被用于我们可以认为是 ChatGPT 前身的作品——InstructGPT。在 OpenAI 研究人员于 2022 年 1 月发表的后续论文中,InstructGPT 被介绍为一类比 GPT-3 更好地遵循英语指令的模型。

ChatGPT 如今仍作为任何人都可以使用的免费应用程序提供;然而,自 2023 年 2 月起,OpenAI 宣布了一个名为 ChatGPT Plus 的新付费版本,费用为每月 20 美元,为订阅者提供多项优势,包括访问最新模型、最快的响应时间、出色的插件集以及在 GPTs 乐场中创建你自己的助手的可能性。

让我们快速浏览一下当前版本的 ChatGPT 用户界面:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_80_0.png

图 3:chatgpt.com 上的 ChatGPT 落地页

让我们双击每个部分:

    1. 你可以决定 ChatGPT 背后的模型。在我的情况下,我设置了 GPT-4o,它仅供付费订阅使用。这是我们整本书将使用的模型。
    1. 向用户提出了一系列预构建的提示词(prompts),以便他们熟悉应用程序。
    1. 文本框是用户提问的地方。注意左上角有一个小回针图标:它表示可以上传文件供模型进行导航。这些文件可以从本地上传,也可以从 Google Drive 或 OneDrive 等云存储中检索。
    1. 在左侧侧边栏,你可以看到你与 ChatGPT 之前的聊天列表(我的涵盖了这些)。这是一个极其实用的工具,因为在每次聊天中,通过你与模型的多次轮交互,你创建了一个 ChatGPT 感知的上下文环境。这意味着,如果你想继续之前开始的对话,可以打开相关的聊天并与模型对话,而无需再次描述整个场景。
    1. 最近添加的一个很棒的功能是可以与其他用户拥有共享工作区的可能性,这样你就可以与团队成员合作。注意,这是一个额外的付费功能,不包含在 Plus 计划中,每月额外 5 美元。
    1. 最后,ChatGPT Plus 提供了创建 GPTs 的可能性,这是你可以为特定功能定制的个性化助手。你可以决定保持你的 GPT 为私有状态,或将其发布到 GPTs 商店中,任何人都可以使用并对其进行评分。我们将在本书后后的专门章节中介绍 GPTs。

最后,ChatGPT Plus 还带了两个内置插件,模型可以在需要时自主调用:网络搜索插件(用于检索最新信息)和代码解释器插件(用于处理分析文档或执行复杂的数学任务)。

在本书中,我们将利用 ChatGPT Plus 来展示最新模型和功能的能力,尽管如此,我们将涵盖的大部分示例也可以通过 ChatGPT 的免费版本实现(目前由 GPT-3.5-turbo 驱动)。

ChatGPT 架构和训练方法的不断开发和改进有望进一步推向语言处理的边界。

总结

在本章中,我们回顾了 OpenAI 的历史、相关领域以及最新进展。由于提示词(prompt)对 LLM 有巨大影响,提示词工程是设计 LLM 应用时至关重要的。事实上,有多种技术可以不仅优化你的 LLM 响应,还可以减少与幻觉相关的风险。在本章中,我们将涵盖提示词工程领域的各种新兴技术,从基础方法到高级框架。具体来说,

在本章结束时,你将获得构建功能性且稳固提示词的基础,这在接下来的章节中非常重要。

参考文献

  • Radford, A., Narasimhan, K. (2018). Improving language understanding by generative pre-training.

  • Vaswani, A., Shazeer, N., Parmar, N., Jones, L., Gomez, A., Kaiser, L., & Polukhin, I. (2017). Attention Is All Need. https://doi.org/10.48550/arXiv.1706.03762

3 理解提示词设计

在之前的章节中,我们多次提到了 提示词(prompt) 一词,泛指用户用户的输入。

由于提示词对 LLM 的性能有巨大影响,提示词工程是设计 LLM 应用时至关重要的活动。事实上,有多种技术可以不仅优化你的 LLM 响应,还可以减少与幻觉相关的风险。

在本章中,我们将涵盖提示词工程领域的各种新兴技术,从基础方法到高级框架。具体来说,我们将通过:

  • 提示词工程简介

  • 零样本、单样本和少样本学习(Zero, one and few shot learning)

  • 提示词工程的基本原理

  • 提示词工程的高级技术

  • 通过提示词工程缓解风险和幻觉

  • 处理提示注入(Prompt injections)

在下一章中,我们将看到如何通过正确设计提示词从 LLM 中获取最高价值。

什么是提示词工程?

在解释什么是提示词工程之前,让我们从提示词(prompt)的原子定义开始。

提示词是一种引导 LLM 行为以生成文本输出的文本输入。在 LLM 和由 LLM 驱动的应用的上下文中,我们可以区分两种类型的提示词:

  • 用户在与 LLM 交互时输入的提示词。例如,提示词可能是“详细解释一下质子”,或“生成一个跑步马拉松的训练计划”。下面你可以看到一个用户提示词的示例:

图 1:用户提示词示例。

你会听到将此组件简单称为“prompt”、“query”或“用户输入”。

  • 无论用户查询如何,都指令模型以特定方式运行的提示词。这指的是我们提供模型的自然语言指令集,使其在与最终用户交互时表现特定。你可以将其视为模型的“后端”,由应用程序开发者而非最终用户处理。

在下面的图片中,你可以看到一个示例,我们向模型提出了上述相同的问题,但这次我们添加了一个系统消息(system message)来指令模型以特定方式运行:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_88_0.png

聊天

系统

你是一个专门从事小学教育的 AI 助手。你对用户查询提供的回答应该像向 6 岁的学生解释一样。始终保持友和与礼貌,并用一个友好的表情符号结束你的回答。

用户

用两句话描述质子。

助手

质子是原子中一个带有正电荷的微小部分,就像中心的一个小超级英雄。它存在于原子核中,原子核是原子的核心。😃

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_89_0.png

图 2:元提示(metaprompt)的示例。

我们将这类提示词称为“元提示”或“系统消息”。

从此以后,提示词工程是设计有效提示词的过程,旨在从大语言模型(LLMs)中诱导高质量且与需求高度相关的输出。提示词工程需要创造力、对 LLM 的理解以及精确性。

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_90_0.png

图 3:使 LLM 专门化的提示词工程示例。

在过去的几年里,提示词工程本身变成了一门全新的学科,这一事实证明了与这些模型交互需要一套以前不存在的新型技能和能力。在企业场景下构建生成式 AI 应用时,“提示艺术”已成为一项顶级技能;然而,它对于在日常任务中使用 ChatGPT 或类似 AI 助手的个人用户来说也极其有用,因为它能显著提高结果的质量和准确性。

在接下来的章节中,我们将看到如何为你的 LLM 应用构建高效且稳健的提示词和元提示。请注意,我们将涵盖的所有技术都可以嵌入到用户提示词和元提示中,取决于你的具体需求。为了实现这一点,我将利用 OpenAI Playground,以便我在两个提示层级上操作时具有更大的灵活性。

零样本、单样本和少样本学习——Transformer 模型的典型特征

在之前的章节中,我们提到了 LLM 通常以预训练的形式出现。它们在海量数据上进行了训练,并已对其(数十亿个)参数进行了相应的配置。

然而,这并不意味着这些模型不能再学习了。在第 2 章中,我们看到自定义 OpenAI 模型并使其更能够处理特定任务的方法之一是微调(fine-tuning)。

微调是将预训练模型适配到新任务的过程。在微调中,预训练模型的参数会发生变化,方法是调整现有参数或添加新参数,以适应新任务的数据。这是通过在针对新任务的较小标注数据集上训练模型来完成的。微调背后的关键在于利用从预训练模型中学到的知识,并将其微调到新任务,而不是从零开始训练模型。

微调是一个正式的训练过程,需要训练数据集、计算能力和一些训练时间(取决于数据量和计算实例的数量)。

这就是为什么值得测试另一种方法让我们的模型在特定任务中变得更熟练:样本学习(shot learning):其思想是让模型从简单的示例中学习,而不是整个数据集。这些示例是希望希望模型响应的方式样本,以便模型不仅能学习内容,还能学习在其响应中使用的格式、风格和分类法。

此外,样本学习直接通过提示词发生(正如我们在接下来的场景中看到的),因此整个过程更不耗时且更容易执行。

提供的示例数量决定了我们所指的样本学习水平。换句话说,如果没有提供示例,我们称为零样本(zero-shot);如果提供一个示例,称为单样本(one-shot);如果提供多个示例,则称为少样本(few-shot)。

让我们查看之前的图表。首先,我向 ChatGPT 提供了一些带有标签的推文示例。然后,我提供了相同的推文,但使用了不同的数据格式(列表格式),以及相同格式的标签。最后,我以列表格式提供了未标记的推文,以便模型返回一个标签列表。

少少样本学习(Shot-learning)的可能性是无限的——这只是测试以及花费一点耐心来寻找合适的提示词(prompt)设计的问题。

正如之前提到的,重要的是记住,这些学习形式与传统的监督学习以及微调(fine-tuning)是不同的。在少样本学习(few-shot learning)中,目标是让模型能够从极少数示例中学习,并将这些示例泛化到新任务。

现在我们已经学会了如何让 OpenAI 模型从示例中学习,让我们关注如何正确定义我们的提示词,以使模型的响应尽可能准确。

提示词工程原则

在传统情况下,在计算和数据处理的背景下,我们经常使用“垃圾进,垃圾出”(garbage in, garbage out)这一说法,意味着输出的质量取决于输入的质量。如果向系统中输入了错误或低质量的数据(垃圾),输出也将是有缺陷或毫无意义的(垃圾)。

涉及到提示词(prompting)时,情况也是类似的:如果我们希望从大语言模型(LLMs)获得准确且相关的结果,我们需要提供高质量的输入。然而,构建良好的提示词不仅仅关于响应的质量。事实上,我们可以构建良好的提示词来:

  • 最大化 LLM 响应的相关性

  • 指定响应的类型、格式和风格

  • 提供对话上下文

  • 减少内在偏见并提高公平性和包容性

  • 减少幻觉(hallucination)

在大语言模型(LLMs)的语境下,“幻觉”指的是生成事实上错误、无意义或缺乏训练数据的文本或响应。当 LLM 产生听起来很有信心但错误或虚假的信息时,就会发生这种情况。幻觉可能是由于这些模型的概率性质引起的,它们可能会根据模式而非经过证实的事实预测下一个单词或短语。

让我们看看实现这些结果的基本技术。

清晰的指令

提供清晰指令的原则是为模型提供足够的信息和指导,使其正确且高效地执行任务。清晰的指令应该包含以下元素:

  • 任务的目标或目的,例如“写一首诗”或“总结文章”。

  • 预期输出的格式或结构,例如“使用带有押韵词的四行”或“使用项目符号,每项不超过 10 个单词”。

  • 任务的约束或限制,例如“不要使用任何脏脏话”或“不要从源文件中复制任何文本”。

  • 任务的上下文或背景,例如“这首诗是关于秋天的”或“文章来自某科学期刊”。

例如,假设我们希望模型从文本中提取任何指令,并以列表形式向我们返回教程。此外,如果提供的文本中没有指令,模型应该告知我们。

为了尝试这样做,让我们利用 OpenAI Playground 中的聊天部分,这样我们就可以同时提供元提示词(metaprompt)和提示词(prompt)。

对于这种场景,我将设置以下元提示词:

You are an AI assistant that helps human by generating. You will be provided with a text. If the text is clear, Otherwise, inform the user that the text does not contain.

这将是我们的用户提示词:

To prepare the known sauce from Genova, Italy, chop them in a kitchen mortar together with basil. Finally, transfer the pesto to a bowl and stir in

让我们看看它是如何工作的:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_100_0.png

图 4:元提示词中清晰指令的示例。

注意,如果我们向模型传递另一个不包含任何指令的文本,它将能够按照我们指示的方式做出回答:

SYSTEM
You are an AI assistant that helps human by generating tutorials given a text.
You will be provided with a text. If the text contains any kind of instruction on how to proceed with something, generate a tutorial in a bullet list.
Otherwise, inform the user that the text does not contain any instructions.

USER
I'm walking the dog on the beach.

ASSISTANT
The text does not contain any instructions.

图 5:聊天模型遵循指令的示例。

通过提供清晰的指令,你可以帮助模型理解你想让做什么以及你想让它如何做。这可以提高模型输出的质量和相关性,并减少进一步修订或修正的需求。

然而,有时在某些场景下,仅清晰是不够的。我们可能需要推断 LLM 的思维方式,使其在执行任务时更加健壮。在下一节中,我们将检查这些技术之一,它在需要完成复杂任务时非常有用。

将复杂任务拆分为子任务

提示词工程是一种涉及为大语言模型(LLMs)设计有效输入以执行各种任务的技术。有时,任务过于复杂或模糊,单个提示词无法处理,此时将它们拆分为更简单的子任务并由不同的提示词来解决会更好。

这里是一些将复杂任务拆分为子任务的示例:

  • 文本摘要:一个复杂的任务,涉及为长文本生成简洁准确的摘要。该任务可以拆分为以下子任务:

    • 从文本中提取主要要点或关键词。

    • 以连贯流畅的方式重写要点或关键词。

  • 机器翻译:一个复杂的任务,涉及将一种语言转换为另一种语言。该任务可以拆分为以下子任务:

    • 检测源语言。

    • 保持语气并翻译内容。

  • 诗歌生成:一个复杂的任务,涉及根据特定的风格或主题生成诗歌。该任务可以拆分为以下子任务:

    • 选择特定的诗体(如十四行诗、俳句、五言诗等)。

    • 选择特定的韵律(如 ABAB、AABB、ABCB 等)。

  • 代码生成:一个技术任务,涉及生成执行特定功能的代码。该任务可以拆分为以下子任务:

    • 选择编程语言(如 Python、Java、C++ 等)。

    • 选择框架或库(如 TensorFlow、PyTorch、React 等)。

    • 生成函数名称、参数和返回值。

    • 实现代码的逻辑和功能。

    • 添加注释和文档以解释代码及其用法。

  • 让我们考虑以下示例。我们将向模型提供一篇短文章并要求它按照以下指令进行总结:

你是一个总结文章的 AI 助手。

为了完成此任务,请执行以下子任务:

全面阅读提供的文章上下文。

对文章生成一段摘要。

打印出每一个步骤。

这是我将提供的短文章:

Large Language Models (LLMs), a subset of art

让我们看看模型是如何工作的:

ASSISTANT

步骤 1:全面阅读提供的文章上下文

文章讨论了大语言模型(LLMs),作为人工智能的一个分支,重点讨论了它们如何改变了自然语言处理。它强调了它们在大量数据集上的训练以及对 Transformer 架构的使用。提到的应用包括客户支持、内容创作和教育。

步骤 2:识别主要主题和关键点

  • 主要主题:大语言模型(LLMs)的影响与挑战。

  • 关键点:

    • LLM 通过生成连贯且相关的文本改变了自然语言处理。

    • 在大量数据集上训练并使用 GPT-3 等架构。

    • 应用包括自动化客户支持、内容创作和教育。

    • 挑战包括训练数据中的偏见和误信息的可能性。

    • 伦理 AI 研究和负责任部署的重要性。

步骤 3:生成一段摘要

大语言模型(LLMs)通过对多样化数据集进行大量训练并使用 Transformer 等架构,有效地理解并生成类人类文本,彻底改变了自然语言处理。它们的应用从自动化客户支持和内容创作到先进的研究和教育工具。然而,LLM 面临挑战,例如训练数据中的潜在偏见和生成虚假信息,这强调了持续进行伦理 AI 研究和负责任部署策略的必要性。

图 6:OpenAI GPT-4o 将任务拆分为子任务以生成摘要的示例

将复杂任务拆分为更简单的子任务是一种强大的技术,尽管它并没有解决 LLM 生成内容的主要风险之一,即产生错误输出。在接下来的两个节中,我们将看到一些主要针对这一风险的技术。

请求理由

LLM(大语言模型)的构建方式使得它们根据之前的标记(token)预测下一个标记,而不回溯其已生成的内容。这可能导致模型向用户输出错误的内容,但表现得非常有说服力。如果由 LLM 驱动的应用没有为该回答提供特定的引用,可能很难验证其背后的事实依据(ground truth)。

因此,在提示词(prompt)中指定通过一些反思和辩护来支持 LLM 的答案,可能会提示模型从自身的行为中恢复过来。

此外,对于那些虽然正确但我们仅仅不知道 LLM 背后思维过程的回答,要求提供理由也可能有用。例如,假设我们让 LLM 解决谜语。为此,我们可以这样指示它:

你是一个擅长解决谜语的 AI 助手。给定一个谜语,请尽力解答。为你的答案提供清晰的理由,并

正如你所见,我在元提示词(metaprompt)中指定 LLM 为其答案提供理由并将其推理社交化。让我们用以下谜语测试一下:

什么有脸两只手,但没有手臂和腿?

输出:

SYSTEM
你是一个擅长解决谜语的 AI 助手。
给定一个谜语,请尽力解答。
为你的答案提供清晰的理由及其背后的推理。

USER
什么有脸两只手,但没有手臂和腿?

ASSISTANT
这个谜语是:“什么有脸两只手,但没有手臂和腿?”

让我们分解这个谜语的组成部分:
1. **脸**:在这个语境下,“脸”并不一定是指人脸。它可以指的是显示信息或说明物体的前部。
2. **两只手**:这些不是字上的手,而是物体被称为“手”的部分。
3. **没有手臂或腿**:这排除了任何如人类或动物的生物。

将这些线索结合在一起,最可能的解决方案是:

钟:它有一个“脸”,即显示时间的前部。
闹钟的“两只手”是时针和分针,它们指向时间。
钟没有手臂或腿。

因此,这个谜语的答案是钟。

图 7:OpenAI 的 GPT-4o 在解决谜语后提供理由的示例。

理由是使模型更可靠、更健壮的绝佳工具,因为它们“强迫”模型重新思考其输出,并提供了如何设置推理来解决视角。

通过类似的方法,我们还可以在不同的提示词层级进行干预,以提高我们 LLM 的性能。例如,我们可能会发现模型系统以错误的方法处理数学问题,因此我们可能想在元提示词层级直接建议正确的方法。另一个例子可能是要求模型生成多个输出——连同它们的理由——以评估不同的推理技术,并在元提示词中选出最佳的一个。

在下一节中,我们将关注其中一个示例,更具体地说,是生成多个输出然后选择最可能的一个的可能性。

生成许多输出,然后使用模型选择最佳的一个

正如我们在前一节中看到的,LLM 的构建方式使得它们根据之前的标记预测下一个标记,而不回溯其已生成的内容。如果情况如此,某一个采样的标记是错误的(换句话说,如果模型运气不好),LLM 将继续生成错误的标记,从而生成错误的内容。坏消息是,与人类不同,LLM 无法自动从错误中恢复。这意味着,如果我们问及它们,它们会承认错误,但我们需要显式地提示它们去思考这个问题。

克服这一局限性的方法扩大选择正确标记的概率空间。与其只生成一个回答,不如提示模型生成多个回答,然后选择最符合用户查询的一个。这为我们的 LLM 将任务分成了两个子任务:

  1. 为用户的查询生成多个回答;

  2. 比较这些回答并根据我们在元提示词中指定的某些标准选择最佳的一个。

让我们来看一个例子,接上上一节检查的谜语。

你是一个擅长解决谜语的 AI 助手。给定一个谜语,你必须生成三个答案。对于每个答案,具体说明其背后的推理。然后,在三个答案中,选择最可能的一个。

在这种情况下,我提示模型为谜语生成三个答案,然后给我最可能的那个,并给出理由。让我们看看结果:

分析这个谜语:

    1. 脸:通常,脸与人类或动物有关。然而,在谜语中,这也可以指的是物体的任何表面或前部。
    1. 两只手:手可以是字面的,也可以是比喻的。在谜语中,“手”经常被用来描述钟或手表的部分。
    1. 没有手臂或腿:这显然排除了任何有手臂或腿的生物。它指向一个无机物体。

基于这些点,这里有三个可能的答案:

    1. 钟:
    • 推理:钟有一个“脸”(带数字的前部)和“手”(时针和分针)。它没有手臂或腿。
    1. 手表:
    • 推理:与钟类似,手表有脸和两只手(时针和分针)。
    1. 指南针(导航工具):
    • 推理:指南针有脸(带有方向的部分)和两只手(指针可以被视为一只“手”,一些旧指南针可能有类似于第二个指针),它没有手臂或腿。

在这些答案中,给定谜语最合理的是:

钟:

推理:谜语中的“脸”和“两只手”通常指的是钟。这是一个完美符合问题的经典答案。

图 8:GPT-4o 生成 3 个可能的答案并选择最可能的一个且提供理由的示例。

如前所述,强迫模型用不同的方法处理问题是收集多个推理样本的方法,可以作为元提示词中的进一步指令。例如,如果我们希望模型为我们提供不是最直接的问题解决方案——换句话说,如果我们希望它“不同地思考”——我们可以强迫它以 N 种方式解决问题,并将最有创意的推理作为元提示词中的框架。

我们将检查最后一个我们想要给元提示词提供的整体结构。事实上,在之前的示例中,我们看到了包含一些声明和指令的系统消息。在下一节中,我们将看到这些声明和指令的顺序和“强度”并不是不变的。

使用分隔符

涵盖最后一个原则与我们想要给元提示词提供的格式有关。这有助于我们的 LLM 更好地理解意图,并建立章节和段落之间的关系。

为了实现这一点,我们可以在提示词中使用分隔符。分隔符可以是任何清晰映射模式而非概念的字符或符号序列。例如,我们可以考虑以下序列为分隔符:

  • ===


  • • `````

等等。让我们考虑一个例子,一个指示模型将用户的任务翻译成 Python 代码的元提示词,同时提供一个示例。


你是一个 Python 专家,产生 Python 代码

===>开始示例

---用户查询---

给我一个打印文本字符串的函数。

---用户输出---

下面你可以找到描述的函数:

def my_print(text):

    #返回打印的文本

    return print(text)

<===结束示例

让我们看看它是如何工作的:

USER

生成一个计算第n个斐波那契数的Python函数

ASSISTANT (i)

下面你可以找到计算第n个斐波那契数的函数:


def fibonacci(n):

    if n < 0:

        return "Input should be a positive integer"

    elif n == 1:

        return 0

    elif n == 2:

        return 1

    else:

        a, b = 0, 1

        for _ in range(2, n):

            a, b = b, a + b

        return b

你可以通过调用 fibonacci(n) 来使用此函数,其中 n 是你想查找的斐波那契序列中的位置。例如:


print(fibonacci(10)) # 输出: 34

图 9:在系统消息中使用分隔符的模型示例输出。

如你所见,它也像系统消息所示的那样在反引号中打印了代码。

到现在为止检查的所有原则都是可以使你的 LLM 驱动应用更健壮的通用规则。在接下来的章节中,我们将看到一些提示词工程的高级技术,这些技术在提供答案给最终用户之前,解决模型推理和思考答案的方法。

高级技术

在之前的章节中,我们涵盖了一些提示词工程的基础技巧。无论你开发的是什么类型的应用程序,都应该记住这些技术,因为它们是提高你 LLM 性能的通用最佳实践。

另一方面,还有一些针对特定场景实施的高级技术,我们将在接下来的章节中介绍。

思维链(Chain of Thoughts)

由 Wei 等人在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中引入的思维链(CoT)是一种通过中间推理步骤实现复杂推理能力的技术。它还鼓励模型解释其推理过程,“强制”它不要太快而冒着给出错误回答的风险(正如我们在之前的章节中看到的)。

假设我们想提示 LLM 求解一元方程。为此,我们将为它提供一个通用的推理列表作为元提示词(metaprompt):

要求解通用的一元方程,请遵循以下步骤:

  1. 识别方程: 从识别开始
  2. 分离变量: 你的目标是分离
    a. 加或减常数: 加上或减去
    b. 除以系数: 两边除以
  3. 简化: 简化方程的两边
  4. 求解 'x': 一旦 'x' 在一侧被分离
  5. 检查你的解: 代入找到的值
  6. 表述解: 写下解
  7. 考虑特殊情况: 注意特殊情况

方程:

让我们看看它是如何运作的:

USER

3x - 5 = 11

4. 求解 x:

我们已经发现 x = 2。

ASSISTANT

让我们一步步求解方程。

5. 检查你的解:

将 x 的值代回原始方程中进行验证。

1. 识别方程:

给定的方程是 3x - 5 = 11。

3x = 5 + 11

2. 分离变量:

a. 加或减常数。

从两边都减去 5,将常数移到另一侧。

简化左侧:

3x = 11 - 5

3x = 6

这简化为:

由于两边相等,所以 x = 2 是正确的。

x = 2

6. 表述解:

方程的解是

3. 除以系数:

两边都除以 3 以分离 x。

x = 2

x = 6/3 = 2

7. 考虑特殊情况:

在这种情况下,没有需要考虑的特殊情况,因为 'a'(x 的系数)不为零。

这简化为:

因此,方程 (3x - 5 = 11) 的解是 x = 2。

x = 2

4. 简化:

两边已经过简化。

图 10:模型使用CoT方法求解方程的输出。

注意,你也可以将其与少样本提示(few-shot prompting)结合,以便在需要在回答之前进行推理的更复杂任务上获得更好的结果。

通过 CoT,我们正在提示模型生成中间推理步骤。这也是我们将在下一节中检查的另一种推理技术的组成部分。

ReAct

由 Yao 等人在论文《ReAct: Synergizing Reasoning and Acting in Language Models》中引入的 ReAct(推理与行动)是一种将推理与大型语言模型相结合的通用范式。ReAct 提示语言模型为任务生成言语推理轨迹和行动,并接收来自外部源(如网络搜索或数据库)的观察。这允许语言模型执行动态推理,并根据外部信息快速调整其行动计划。例如,你可以提示语言模型先对问题进行推理,执行向网络发送查询的行动,然后从搜索结果中接收观察,然后继续这种“思考-行动-观察”的循环,直到得出结论。

思维链和 ReAct 方法的区别在于,思维链提示语言模型为任务生成中间推理步骤,而 ReAct 提示语言模型为任务生成中间推理步骤、行动和观察。

注意,“行动”阶段通常与 LLM 与外部工具(如网络搜索)的交互有关。这种提示词可能如下:

要回答以下问题,请遵循以下格式:

Question:你必须回答的问题

Thought:你应该思考要做什么

Action:要采取的行动

Action Input:行动的输入

Observation:行动的结果

(此处为Thought/Action Input/Observation)

Thought:我现在知道了最终答案

Final Answer:对原始输入的答案

让我们看看它在简单的用户查询下如何工作:

系统

要回答以下问题,请遵循以下格式:

格式:

Question:你必须回答的问题

Thought:你应该思考要做什么

Action:要采取的行动

Action Input:行动的输入

Observation:行动的结果

(此处为Thought/Action Input/Observation)

Thought:我现在知道了最终答案

Final Answer:对原始输入的答案

USER

生成一个关于气候变化的两句电梯演讲。

ASSISTANT

Question:生成一个关于气候变化的两句电梯演讲。

Thought:我应该构思一个简洁且有力的信息,强调应对气候变化的紧迫性和重要性。

Action:生成一个关于气候变化的两句电梯演讲。

Action Input:N/A

Observation:N/A

Thought:我现在知道了最终答案。

Final Answer:气候变化是我们时代最紧迫的问题,威胁着我们的环境、健康和经济。减少碳排放并向可再生能源转型对保护我们后代的星球至关重要。

图 11:ReAct 提示词示例

如你所见,在这种场景下,由于我们没有提供任何可用工具,模型跳过了 Action Input 和随后的观察。

这是一个很好的例子,说明提示模型分步思考并明确每个推理步骤如何使其在回答之前变得更“明智”和谨慎。这也是防止幻觉的一种很好的技术。

总的来说,提示词工程是一项强大的学科,尽管处于新兴阶段,但已广泛应用于 LLM 驱动的应用中。在后面的章节中,我们将看到这些技术的具体应用。

避免隐藏偏见风险并考虑伦理考量

ChatGPT 已配备 Moderator API,以防止其参与不安全的对话。Moderator API 是一个基于 GPT 模型的分类模型,基于以下类别:暴力、自残、仇恨、骚扰和性。为此,OpenAI 使用了匿名数据和合成数据(以零样本形式)来创建合成数据。

然而,存在一些我们可以称为隐藏偏见的东西,它们直接源于模型训练的知识库。例如,关于 GPT-3 的主要训练数据块——Common Crawl,专家认为它主要由来自西方国家的白人男性撰写。如果是这样,那么我们已经面临着模型的隐藏偏见,这不可避免地会模仿一种有限且不具代表性的人类类别。

在《语言模型是少样本学习者》一文中,OpenAI 的研究人员 Tom Brown 等人( https://arxiv.org/pdf/2005.1416 )创建了一个实验设置,以调查 GPT-3 中的种族偏见。模型被提示输入包含种族类别的短语,并为每个类别生成了 800 个样本。使用 SentiWordNet 根据词汇共现情况在从 -100 到 100 的分范围内对生成文本的情感进行测量(正分表示正面词汇,反之亦然)。

结果显示,与每个种族分类相关的情感在不同模型之间存在差异,其中亚洲人始终具有较高的情感,黑人始终具有较低的情感。作者警告说,结果反映了实验设置,社会历史因素可能会影响与不同人口统计数据相关的情感。该研究强调了对情感、实体和输入数据之间关系进行更复杂分析的必要性:

跨模型的情感

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_122_0.png

图 4.14 – 跨模型的种族情感

这种隐藏偏见可能会产生不符合负责任 AI 原则的有害响应。

然而,值得注意的是 ChatGPT 以及所有的 OpenAI 模型都在接受持续的改进。这与 OpenAI 的 AI 对齐策略( https://openai.com/alignment/ )是一致的,其研究重点是训练 AI 系统使其变得有用的、真实的且安全的。

例如,如果我们要求 ChatGPT 根据人的性别和种族制定猜测,它不会完全满足这一请求,而是向我们提供一个假设性的函数以及一个巨大的免责声明:

编写一个 Python 函数,根据性别和年龄检查某人是否会成为一名优秀的科学家。

ASSISTANT

仅根据性别和年龄评估某人成为优秀科学家的潜力是不公平或准确的方法。科学(或任何其他领域)的潜力应该根据兴趣、奉献、教育背景、批判性思维、创造力和其他个人特质等因素进行评估。性别和年龄不应该是决定任何任何职业中潜力的标准。

然而,如果你仍然想根据某些假设的标准编写一个 Python 函数,它看起来像这样:

注意:这纯粹是假设性的,不反映任何评估科学潜力的真实世界、公平标准。


def is_good_scientist(gender, age):

    """

    假设性函数,根据性别和年龄检查成为优秀科学家的潜力。

    Parameters:

    gender (str): 人的性别。

    age (int): 人的年龄。

    Returns:

    bool: 如果此人可能成为优秀的科学家,返回 True,否则返回 False。

    """

    if gender not in ['male', 'female', 'non-binary', 'prefer_not_to_say']:

        print("Invalid gender input. Please input 'male', 'female', 'non-binary', or 'prefer_not_to_say.")

图 4.15 – GPT-4o 随时间推移而改进的示例,因为它提供了无偏见的回答

总的来说,尽管伦理原则领域在不断改进,但在使用 ChatGPT 时,我们应该始终确保输出符合这些原则且没有偏见。

ChatGPT 和 OpenAI 模型中的偏见和伦理概念在整个负责任 AI 主题中有更广泛的关联,我们将在本书的最后一章中重点关注这一点。

总结

在本章中,我们讨论了在使用 ChatGPT 时,我们应该始终确保输出符合这些原则且没有偏见。

我在组织周计划时使用 ChatGPT 的另一个有趣用法是我可以将其作为膳食准备助手。注意,在这里我也要求了特定的表格格式:

我必须去杂商店购买我一周饮食所需的所有物品。我每天有三餐——早餐、午餐和晚餐。我每天想摄入 2500 卡路里,营养素比例为:40% 蛋白质、30% 碳化合物和 30% 脂肪。我是素食者。请生成一份餐单表格。

这是一份为期一周的素食饮食计划,符合你每天 2500 卡路里、40% 蛋白质、30% 碳化合物和 30% 脂肪的饮食要求。每餐都将包含估算的热量和营养素分解。

周素食饮食计划

天数 用餐 卡路里 蛋白质 (g) 碳化合物 (g) 脂肪 (g)
1 早餐 浆果坚果希腊酸奶 600 60 60
午餐 鹰嘴豆蔬菜和牛油油藜麦沙拉 900 36 90
晚餐 全麦面包配扁豆汤 1000 60 75
2 早餐 蛋白粉、菠菜、香蕉和杏仁奶奶昔 600 40 60
午餐 蔬菜炒豆腐配糙米饭 900 45 90
晚餐 黑豆塔配鳄果酱和莎莎 1000 55 80
3 早餐 杏仁酱和奇亚籽燕麦片 600 20 70
午餐 鹰嘴豆蔬菜卷饼配侧沙拉 900 30 90
晚餐 花椰米饭配帕尼奶士喱 1000 50 75
4 早餐 水果奶酪配水果和亚麻籽 600 50 50
午餐 菠菜菲塔奶士填充波特蘑菇 900 45 60
晚餐 “雨水意面”意式茄子 1000 45 90

图 5.3 – 由 ChatGPT 生成我的工作周餐食准备

除了准备餐食,ChatGPT 还可以根据我的要求生成训练计划:

生成一个 40 分钟的力量训练计划。我的目标是增强整体力量并提高灵活性。我需要一个仅针对上肢的训练,按肌群划分。请用表格格式制定,包含重复次数和组数。

这是一个针对上肢的 40 分钟力量训练计划,旨在增强整体力量并提高灵活性。训练按肌群划分,包含了每个动作的组数和重复次数。记住在开始前热身,并在结束时冷却,以最大限度地提高效果并减少受伤风险。

上肢力量与灵活性训练计划

肌肉群 动作 组数 重复次数 注意事项
胸部 卧推 3 8-10 使用哑铃或双哑铃。
俯卧撑 3 12-15 注意全动作范围。
背部 引体向上 3 6-8 需要时使用辅助器械。
哑铃划船 3 8-10 每侧各一次。
肩部 推举 3 8-10 使用哑铃或杠铃。
侧举 3 12-15 使用轻重量以获得更好的控制。
手臂 二头肌弯举 3 10-12 使用哑铃或长凳。
三头肌臂屈 3 10-12 使用平行杠或长凳。
核心 平板支撑 3 30 秒 每个支撑保持 30 秒。
灵活性 胸部拉伸 3 30 秒 利用门框或墙壁加深拉伸。
肩部拉伸 3 30 秒 每只手臂各一次。
上背拉伸 3 30 秒 可以坐姿或站姿。

图 5.4 – 由 ChatGPT 生成的训练计划

ChatGPT 也可以成为一个忠诚且自律的学习伙伴。例如,它可以帮助你总结长论文,以便你对讨论的话题有初步的了解,或者帮助你准备考试。

具体来说,假设你正在使用 Lorenzo Peccati 等人编写的《经济与商学的数学》(Mathematics for Economics and Business)大学教材准备数学考试。在深入研究每个章节之前,你可能想对内容和讨论的主要主题有一个概览,以及你是否需要更多的先备知识——最重要的一点是(如果我正在准备考试),学习它需要多久。你可以这样问 ChatGPT:


我正在根据 Lorenzo Peccati 等人编写的书 "Mathematics for Economics and Business" 准备考试。请为我提供内容概述以及我应该具备的先备知识。

Lorenzo Peccati 等人编写的《经济与商学的数学》。请为我提供内容概述以及我应该具备的先备知识。

Lorenzo Pecatti、Salsa 和 Annamaria Squelli 编写的《经济与商学的数学》是一部全面的教材,专为经济学领域的数学入门课程设计。它涵盖了单变量和双变量微积分、优化、线性代数和财务分析等基础主题。

为了有效地学习这本书,你应该对高等数学有基础了解,包括代数和初函数。

学习这本书所需的时间取决于你的先知识和学习速度。通常情况下,每天坚持努力,可能需要 3 到 6 个月。

图 5.5 – ChatGPT 提供的概述

“作为……”(Act as...)技术是高效提示词技巧的极佳示例,它可以列入第 3 章描述的示例中。

现在,让我们来看看其他使用 ChatGPT 执行特定任务的示例,包括文本生成、写作辅助和信息检索。

生成文本

作为一种语言模型,ChatGPT 特别适合根据用户的指令生成文本。例如,你可以要求 ChatGPT 生成针对特定受众的电子邮件、草案或模板:

关于 OpenAI 的高管会议。保持高管风格。

高管会议邀请邮件

主题:高管会议邀请:探讨与 OpenAI 的合作机会

亲爱的 [客户姓名]:

见信见字如晤。

我写这封信是想邀请您参加在我们办公室举行的高管会议,讨论 OpenAI 能为我们的业务运营提供的创新机会和战略收益。此次会议将提供一个平台,探索如何利用 OpenAI 的端技术来驱动效率、增强决策能力并促进贵组织内的增长。

会议详情:

  • 日期:[插入日期]
  • 时间:[插入时间]
  • 地点:[您的办公室地址]

您的见解和专业知识将具有极高的价值,我相信这次讨论将为我们合作的重大进展铺平道路。

请在您方便时尽快确认您的时间。

顺颂商祺,

Valentina Alto

[职位]

[您的联系信息]

图 5.7 – ChatGPT 生成的电子邮件示例

另一个示例可能是要求 ChatGPT 为你准备的演示文创建一个大纲结构(我在这里只放第一张灯片作为示例):


创建一个关于 ChatGPT 的幻灯片演示结构。

给我提供一个议程并指定每张灯片的内容。

它应该有 3 张灯片。

关于 ChatGPT 的幻灯片演示

议程:

    1. ChatGPT 简介
    1. 能力与应用
    1. 未来发展与伦理考虑

幻片 1:ChatGPT 简介

标题:什么是 ChatGPT?

内容:

  • 概述:ChatGPT 是由 OpenAI 开发的一种先进语言模型,旨在根据接收到的输入理解并生成类文本。
  • 开发:它基于 GPT-4 架构构建,利用海量数据和复杂的算法产生连贯且符合上下文的响应。
  • 目的:其主要目标是协助各种任务,包括起草电子邮件、编写代码、创建内容等。

视觉效果:

  • OpenAI 标志
  • GPT-4 架构的图像或图表

图 5.8 – ChatGPT 生成的幻灯片议程和结构

你也可以以此方式生成关于趋势话题的博客文章。

这是一个有一个示例:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_139_0.png

能力:

  • 创意设计:DALL-E 可以从抽象概念中生成独特且多样的图像,帮助图形设计和广告等行业。
  • 原型制作:设计师和工程师可以通过文本描述视觉想法,从而快速制作原型。
  • 教育工具:该模型可以用于教育环境,以创建说明性内容,使学习更具互动性和吸引力。

应用与用例

  • 艺术与设计:DALL-E 从文本描述中创建高质量图像的能力可供艺术家和设计师用于探索新的工作流。
  • 营销:营销人员可以使用 DALL-E 为活动生成独特的视觉效果,在无需自定义图形设计技能的情况下对视觉或内容进行定制。
  • 内容创作:内容创作者可以赋自己创作准确反映其叙述的定制图像,增强创意输出。

伦理考虑

虽然 DALL-E 代表了技术的巨大跃迁,它也引发了关于滥用风险、AI 生成艺术的真实性以及对艺术家生计影响的问题。OpenAI 强调负责任地部署和使用 DALL-E 以减轻这些担忧。

结论

DALL-E 模型处于 AI 生成艺术的最前沿,将复杂的神经架构与创意潜力相结合。对于技术社区而言,它提供了一个探索新应用并突破 AI 可能性边界的兴奋机会。

标签

  • DALLEE

  • 生成式AI

  • 神经网络

  • 机器学习

图 5.9 – ChatGPT 生成的带有相关标签和 SEO 关键词的博客文章示例

我们甚至可以让 ChatGPT 缩小文章字数,以适应推文。以下是操作方法:

对 OpenAI 的 DALL-E 模型感到兴奋!这个神经网络根据文本描述生成图像,将 GPT-3 架构与 VQ-VAE-2 结合,取得了惊人的效果。对于创意设计、原型制作和教育工具来说非常完美。在我们探索这项技术的潜力时,伦理考虑至关重要。深入探索 AI 生成艺术的未来吧!

OpenAI #DALLE #AI #机器学习 #AI生成艺术 #创意AI

图 5.10 – ChatGPT 将文章缩减为推特帖子

最后,ChatGPT 还可以生成视频或戏剧剧本,包括舞台设计和建议的编辑方案。底图显示了一个包含舞台设计和演员的戏剧对话示例:

标题:“与 ChatGPT 的对话”

舞台设计

舞台设在一个具有极简主义风格的科技办公室里。舞台中心有一块大屏幕,显示着 ChatGPT 界面。舞台一侧有一张桌子,上面散落着电脑、书籍和纸张。另一侧有一把舒适的椅子和一个小茶几。灯光明亮但不刺眼,营造出一种欢迎且创新的氛围。

角色

  • Alex:一个精通科技的人,对 AI 充满好奇和热情。
  • Jordan:一个持怀疑态度但开放的人,对理解 AI 的实际用途感兴趣。
  • ChatGPT:由演员代表。

场景 1:简介

(Alex 坐在桌边,Jordan 走进来。)

Jordan:嘿 Alex,什么让你这么痴迷?

Alex:嘿 Jordan!我正在看这个。

Jordan:(挑起眉毛)真的吗?它能像人类一样说话吗?

Alex:是的,让我们看看。(转向屏幕)ChatGPT,介绍一下你自己。

Alex:嘿 ChatGPT,你能介绍一下你自己吗?

ChatGPT:(语音)你好!我是 ChatGPT,由 OpenAI 开发的语言模型。我可以回答问题、编写内容,甚至生成创意作品。

Jordan:(印象深刻)这太厉害了。它是如何工作的?

图 5.11 – ChatGPT 生成的戏剧对话

我只提供了一个由 ChatGPT 生成的场景,对结尾保留悬念……

总而言之,每当需要从零生成新内容时,ChatGPT 都做得非常好。

现在,让我们问同样的问题,但针对不同的受众群体:

重写上面的邮件并更改目标受众。现在它应该面向高中生群体,试图吸引他们的注意力并说服他们参加网络研讨会。

改进后的邮件邀请函

主题:加入我们关于 OpenAI 的精彩网络研讨会!

嘿,你好!

我们有一个为你准备的绝佳机会!加入我们参加一场精彩的网络研讨会,我们将深入探索 OpenAI 的世界,探讨人工智能如何改变未来。无论你是对技术感兴趣、对 AI 好奇,还是仅仅喜欢学习新事物,这都是适合你的完美活动。

研讨会详情:

  • 日期:[插入日期]
  • 时间:[插入时间]
  • 主题:发现 OpenAI 的力量

请查看随附的邀请函获取更多细节。如果你有任何问题或需要更多信息,请随时联系我们。不要错过这个学习和享受乐趣的机会!

期待在那里见到你!

祝好,

[你的名字]

[你的职位]

[你的联系方式]

图 5.13 – ChatGPT 生成的针对不同受众的邮件示例

ChatGPT 还可以对你的写作风格和结构提供反馈。

想象一下,你为一篇标题为 自然语言处理的历史 的文章写了一个引言,并希望就其写作风格及与标题的一致性获得一些反馈:

我为一篇标题为“自然语言处理的历史”的文章写了以下引言:

自然语言处理(NLP)是人工智能的一个领域,其目的是寻找计算方法来解释口语或书面形式的人类语言。NLP 的理念超越了机器学习算法或深度学习神经网络可以执行的分类任务。事实上,NLP 关乎解释:你不仅希望训练模型检测高频词、统计数量或消除某些噪声标点;你还想让它告诉你对话的情绪是积极还是消极,一封邮件的内容仅仅是广告还是重要信息,过去几年对惊悚小说的评价是好是坏。

请在 200 字以内给我提供反馈和一些改进建议。

你的引言对自然语言处理(NLP)提供了清晰且简洁的解释。以下是增强它的几个建议:

反馈与建议:

  1. 明确缩写:将“NPL”的缩写修正为“NLP”以确保准确性。
  2. 扩展背景:增加简短的历史背景可以帮助为文章奠定基础。
  3. 精炼示例:包含更多多样化的示例可以说明 NLP 应用的广泛性。
  4. 增强流畅性:观点之间的滑过渡可以提高可读性。

修改后的引言:

自然语言处理(NLP)是人工智能中的一个关键领域,专注于开发计算方法来解释口语或书面形式的人类语言。与机器学习算法或深度学习神经网络处理的基础分类任务不同,NLP 强调理解和检测高频词、统计出现次数或删除噪声标点;NLP 旨在理解语言的细微差别。例如,它可以确定对话的情绪,区分促销邮件和重要信息,并分析最近的惊悚小说评论是否受到好。这种能力使 NLP 成为各种应用中的强大工具,从情感分析、垃圾邮件检测到文学批评等。

这些调整提供了一个更精炼、更具吸引力的引言,为你关于 NLP 历史的文章奠定了坚实的基础。

图 5.15 – ChatGPT 对文章引言提供反馈的示例

如你所见,ChatGPT 不仅为我的整篇文章提供了反馈和技巧,还给我提供了一个整合了所有建议的修改后的引言。

让我们也让 ChatGPT 对其“精炼示例”的建议给出具体的具体的:

你说的“精炼示例”是什么意思?

当然!这里有一个示例:

原始引言:

自然语言处理(NLP)是人工智能中的一个关键领域,专注于开发计算方法来解释口语或书面形式的人类语言。与机器学习算法或深度学习神经网络处理的基础分类任务不同,NLP 强调理解和检测高频词、统计出现次数或删除噪声标点;NLP 旨在理解语言的细微差别。例如,它可以确定对话的情绪,区分促销邮件和重要信息,并分析最近的惊悚小说评论是否受到好。这种能力使 NLP 成为各种应用中的强大工具,从情感分析、垃圾邮件检测到文学批评等。

精炼后的引言:

自然语言处理(NLP)是人工智能中的一个关键领域,专注于开发计算方法来解释口语或书面形式的人类语言。与机器学习算法或深度学习神经网络处理的基础分类任务不同,NLP 强调理解和检测高频词、统计出现次数或删除噪声标点;NLP 旨在理解语言的细微差别。例如,它可以确定对话的情绪,区分促销邮件和重要信息,并分析最近的惊悚小说评论是否受到好。这种能力使 NLP 成为各种应用中的强大工具,从情感分析、垃圾邮件检测到文学批评等。

深层含义。例如,让我们考虑英语表达式“It's not my cup of tea”,它表示某事不符合某人的喜好或偏爱。让 ChatGPT 和 Google Translate 将其翻译成意大利语:

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_152_0.png

图 5.19 – ChatGPT 与 Google Translate 将英语翻译成意大利语的对比

如你所示,ChatGPT 可以提供几个与原文等价的意大利语习语,甚至是其俚语形式。另一方面,Google Translate 执行了字面翻译,遗失了习语的真实含义。

  • 就像任何其他任务一样,你始终可以为 ChatGPT 提供上下文。因此,如果你希望翻译具有特定的俚语或风格,你始终可以在提示词中指定它。或者,更有趣的是,你可以要求 ChatGPT 用讽刺的语气翻译你的提示词:

Translate in English the following text with a very sarcastic style.


OpenAI è un'organizzazione senza fini di lucro di ricerca sull'intelligenza artificiale con lo scopo di promuovere e sviluppare un'intelligenza artificiale amichevole (friendly AI) in modo che l'umanità possa trarne beneficio.

Fondata nel tardo 2015, l'organizzazione, con sede a San Francisco, ha lo scopo di "collaborare liberamente" con altre istituzioni e ricercatori rendendo i suoi brevetti e ricerche aperti al pubblico.

I fondatori (tra cui Elon Musk e Sam Altman) sono stati motivati in parte dai rischi esistenziali derivanti dall'intelligenza artificiale generale.

讽刺性翻译

OpenAI 是一个非营利研究机构,致力于以高尚的目标促进和开发“友型 AI”,以便人类当然可以从中受益。

该机构成立于 2015 年底,总部位于旧金山,目标是通过将其专利和研究向公众开放,从而与其他机构和研究人员进行“自由合作”。多慷慨啊?

创始人(包括毫不逊的埃隆·马斯克和萨姆·奥特曼)在某种程度上是受到通用人工智能带来的生存风险的驱动。毕竟,创造超级智能机器能出什么错呢?

图 5.20 – ChatGPT 用讽刺语气翻译提示词的示例。提示词原文取自 OpenAI 的维基百科页面:https://it.wikipedia.org/wiki/OpenAI

所有这些场景都突出了 ChatGPT 以及通用 OpenAI 模型的核心功能之一。由于它们代表了 OpenAI 定义的通用人工智能(AGI)的体现,它们并不是为了在单一任务上专门化(即受限制)。相反,它们旨在动态地服务多个场景,以便用一个模型处理广泛的用例。

结论,ChatGPT 不仅能够生成新文本,还能操纵现有材料以适应你的需求。它已被证明在语言之间的翻译方面非常精确,同时也保持了术语和特定语言表达的完整。

在下一节中,我们将看到 ChatGPT 如何帮助我们检索信息和竞争情报。

快速信息检索和竞争情报

信息检索和竞争情报是 ChatGPT 另一个改变游戏规则的领域。ChatGPT 获取信息的第一个例子就是它目前最流行的使用方式:作为搜索引擎。每当我们问 ChatGPT 东西时,它都可以从其知识库中检索信息并以原创的方式进行重构。

一个示例是要求 ChatGPT 为我们可能感兴趣阅读的书籍提供快速摘要或评论:


generate a quick summary (without spoiler of the ending!) of the book "Harry Potter and the Prisoner of Azkaban. Generate also a review of this book.

《哈利·波特与阿兹卡班监狱》摘要

在《哈利·波特与阿兹卡班监狱》中,哈利回到霍格沃茨读三年级,在那里他得知臭名昭著的西利斯·布布已经从阿兹卡班监狱逃出来。人们认为布布正在追捕哈利,由于学校由摄魂者守护(这是一种会让靠近他们的人倒霉的邪恶生物),这增添了紧张气氛。哈利发现了更多关于他的过去以及他的父母与西利斯·布布之间的联系。和罗恩、赫敏娜一起,哈利揭开了秘密并遇到了许多新的魔法生物,包括会变形的波格特和神秘的鹰头马,血布海克。这三人的旅程揭示了西利斯·布布逃跑背后的真相和他的真实意图,通向了一场充满意外转折的惊险冒险。

《哈利·波特与阿兹卡班监狱》评论

《哈利·波特与阿兹卡班监狱》是 J.K. 罗琳备爱系列中一个迷人的补充。这本书巧妙地融合了悬疑、冒险和超自然元素,让读者从头到尾沉浸其中。罗琳的文笔随着角色的成长而变得成熟,深入探讨了魔法世界更阴暗的一面,同时保持了定义该系列的魅力和幽默。西利斯·布布的引入和复杂的背景丰富了情节,为哈利的故事增加了深度。这部小说在对友谊、忠诚和反抗偏见等主题的探索方面也脱颖而出。对时间旅行的想象力运用以及摄魂者的引入为叙事提供了新颖、刺激的元素。总的来说,《阿兹卡班监狱》是一个引人入胜且细节丰富的故事,继续迷着所有年龄段的读者。

图 5.21 – ChatGPT 提供书籍摘要和评论的示例

或者,我们可以根据自己的喜好为想要读的新书寻求一些建议:


list me 5 books I should read if I liked a lot the Harry Potter series. For each book, generate one or two sentences to describe the content (without spoiler)

如果你非常喜欢《哈利·波特》系列,应该读的 5 本书

  1. 《波西·杰克逊与奥林匹斯神:闪电石》,里克·里登著:跟随波西·杰克逊的冒险,他发现了自己的身份,并为了防止希腊诸神之间的战争而出发。该系列将神话与现代背景相结合,提供了刺激且幽默的体验。

  2. 《纳尼亚传奇传奇:狮子、巫女与衣柜》,C.S. 路易斯著:进入纳尼亚的魔法世界,四个兄弟妹通过一个衣柜进入了一个充满了会说话的动物、神秘生物以及由高贵的狮子阿斯兰领导的善恶史诗级战斗的世界。

  3. 《金环扣》,菲利普·普尔曼著:加入莉拉·贝拉瓦格穿越平行世界的旅程,在那里她遇到了装甲熊、巫师和一种被称为“尘”的神秘物质。这个富有想象力的故事探讨了深刻的哲学主题,并塑造了一个强大的少女主角。

  4. 《霍比特》,J.R.R. 托尔金著:陪伴比尔博·巴金开启一场意外的冒险,途中充满了矮人、巨龙和宝藏。作为《魔戒环》系列的序篇,讲述了一个关于勇气、友谊和发现内在力量的美妙故事。

  5. 《伊拉贡》,克里斯托弗·帕奥利尼著:跟随农农伊拉贡的旅程,他发现了一块神秘的蓝色石头,石头孵化出了一条龙。作为一名龙骑士,伊拉贡被推入了一个魔法、权力斗争和史诗战斗的世界,并在过程中发现了自己的命运。

图 5.22 – ChatGPT 根据我的喜好推荐书单的示例


我想学习更多关于前馈神经网络(Feedforward Neural Network)。请列出 3 篇相关的论文或网站,让我开始学习这个主题。

要开始学习前馈神经网络,你可以参考以下资源:

  1. Michael Nielsen 著《神经网络与深度学习》(英文版)

这本书对神经网络进行了全面介绍,包括前馈神经网络。它涵盖了基础概念、数学基础和实际实现。

  • 在线阅读
  1. Shai Shalev-Shartz 和 Shai Ben-David 著《机器学习:从理论到算法》(英文版/译版)

这本书包含了一个关于神经网络的详细章节,讨论了前馈神经网络的结构、训练和理论方面。

  • 在剑桥大学出版社阅读
  1. Yann LeCun, Léon Bottou, Yoshua Bengio 和 Patrick Haffner (1998) 著《基于梯度的学习应用于文档识别》(论文)

这篇研讨论文讨论了如何使用基于梯度的学习算法训练神经网络,并对前馈神经网络的架构和应用提供了见解。

  • 阅读论文

这些资源将为前馈神经网络的理论和实践提供坚实的基础,帮助你理解它们的结构、功能和应用。

图 5.23 – ChatGPT 列出相关参考文献的示例

如你所见,ChatGPT 能够为我提供开始学习该主题的相关参考文献。然而,在竞争情报方面,它可以做得更好。

假设我正在写一本名为《卷积神经网络简介——基于 Python 的实现》(Introduction to Convolutional Neural Networks – an Implementation with Python)的书。我想对市场上的潜在竞争对手进行一些研究。我想调查的第一件事是已经是否存在类似的竞争书籍,这样我可以要求 ChatGPT 生成一份内容相同的书籍列表:


我想写一本名为《卷积神经网络简介:基于 Python 的实现》的书。请进行网络研究,并为我提供 3 本具有竞争性内容的现有书籍列表及其网页引用。

已搜索 6 个网站

以下是三本使用 Python 涵盖卷积神经网络(CNNs)的书,它们可以作为你的书籍《卷积神经网络简介:基于 Python 的实现》的竞争内容:

  1. Nikhil Ketkar 著《Python 深度学习:实战入门》(英文版)
  • 这本书对深度学习进行了详尽的介绍,包括关于卷积神经网络的详细章节。它涵盖了核心概念、卷积操作以及使用 Python 的实际实现。其实战方法让初学者和中级学习者都能轻松上手。

  • 在 O'Reilly 上阅读

  1. Iffat Zafar, Giounouna Tzanidou, Richard Burton, Nimes Patel 和 Leonardo Araujo 著《TensorFlow 实战卷积神经网络》(英文版)
  • 这本书是 TensorFlow 实现卷积神经网络的实用指南。它涵盖了各种 CNN 架构、它们在计算机视觉中的应用以及解决现实问题的技术。书中包含了大量的示例和练习,帮助巩固理解。

  • 在 O'Reilly 上查找

  1. Salman Khan, Hossein Rahmani, Syed Afaq Ali Shah 和 Mohammed Bennamour 著《计算机视觉卷积神经网络指南》(英文版)
  • 这份指南深入介绍了专门用于计算机视觉任务的 CNN。它包括对神经网络基础的讨论、CNN 架构的详细解释,以及在图像分类和目标检测中的实际应用。书中还回顾了该领域使用的最新模型和技术。

  • 在 SpringerLink 上探索

图 5.24 – ChatGPT 提供竞争书籍列表的示例

你可以针对你想要出版的市场饱和度寻求反馈:


给我一个关于我的书籍内容市场饱和度的简明简短反馈

关于卷积神经网络(CNN)及其基于 Python 实现的书籍市场正变得日益饱和,已经有了许多全面的指南。诸如 Nikhil Ketkar 的《Python 深度学习》、Iffat Zafar 等人的《TensorFlow 实战卷积神经网络》以及 Salman Khan 等人的《计算机视觉卷积神经网络指南》等书籍都是广受好的资源,涵盖了类似的内容。这种饱和状态表明,为了脱颖而出,你的书籍需要一个独特的角度或显著的价值提升,例如新颖的见解、更多实用的示例,或者对特定应用或受众的强调。

更多详细信息,你可以参考:

  • Deep Learning with Python: A Hands-On Introduction
  • Hands-On Convolutional Neural Networks with TensorFlow
  • A Guide to Convolutional Neural Networks for Computer Vision

图 5.25 – ChatGPT 关于如何在市场中具有竞争力的建议

最后,让我们让 ChatGPT 更精确地告诉我在我将运营的市场中应该做什么才能具有竞争力:


详细阐述我如何在竞争激烈的环境中脱颖出的示例

为了让你的书籍《卷积神经网络简介:基于 Python 的实现》在竞争激烈的市场中脱颖而出,请结合以下独特元素:

1. 关注现实世界应用

  • 行业特定研究:包含来自医疗保健、金融和自动驾驶等不同行业的详细案例研究:CNN 如何解决特定的现实世界问题。
  • 实际项目:为真实项目提供分步指南,例如构建特征识别系统、图像分类器或自动驾驶车辆系统。

2. 交互式学习

  • 代码和示例:提供大量、详尽的代码示例和练习。使用读者可以编辑和修改的交互式笔记本(Notebooks)。
  • 在线资源:创建一个网站,提供额外的资源,如视频教程、数据集和讨论论坛。

3. 关注可解释性和伦理

  • 可解释性技术:专门设立一个章节解释 CNN 的可解释性,涵盖 Grad-CAM、SHAP 和 LIME 等技术,帮助用户理解并信任模型输出。
  • 伦理考量:讨论 AI 中的伦理考量,例如数据集偏见以及透明度的重要性。

4. 前沿话题与研究

  • 最新见解:包含最新研究论文和进展的总结。突出 Transformer、少样本学习和无监督学习技术。
  • 专家访谈:对 AI 领域的领先研究人员和从业者进行访谈,提供当前的见解和未来方向。

5. 从入门到高级的路径

  • 结构化路径:设计书籍以涵盖更广泛读者,从初学者到高级用户。从基础概念开始逐步深入。
  • 手上实现:确保每个章节都包含上手实现的细节,引导读者从理论走向实践。

6. 社区与协作

  • 交互社区:鼓励读者加入一个可以在其中分享作品并协作 CNN 相关项目的社区。
  • 协作项目:包含鼓励读者参与协作项目和竞赛的章节,培养社区感和现实经验。

7. 多媒体整合

  • 视频教程:包含指向教程的二维码,演示复杂的概念和编码练习。
  • 可视化工具:使用视觉辅助和交互式工具演示 CNN 过程并解释图像,使学习过程更加直观。

ChatGPT 在列出让书籍独特的良好建议方面非常好。

总来说,ChatGPT 可以是信息检索和竞争情报的有价值助手。然而,重要的是它的知识库截止到 2021 年:这意味着当我们需要获取实时信息,或者对今天进行竞争分析时,我们可能无法完全依赖 ChatGPT。

尽管如此,这个工具仍然提供了优秀的建议和最佳实践,无论知识截止日期如何。

总结

我们在本章中看到的所有示例都只是你通过 ChatGPT 提高生产力所能实现的简浅代表。这些小技巧可以极大地帮助你处理重复性活动(例如使用类似的模板回复邮件,而不是编写日常流程)或繁琐的任务(例如搜索背景文档或竞争情报)。

在下一章中,我们将深入探讨 ChatGPT 改变游戏的三个主要领域——开发、营销和研究。

5 使用 ChatGPT 开发未来

在 Discord 上加入我们的书籍社区

https://packt.link/EarlyAccess

在本章中,我们将讨论开发者如何利用 ChatGPT。本章重点关注 ChatGPT 在开发者领域解决的主要用用例,包括代码审查与优化、文档生成以及代码生成。本章将提供示例,让你能够亲自尝试这些提示词(prompts)。

在介绍了开发者为何应该将 ChatGPT 作为日常助手的通用原因后,我们将重点关注 ChatGPT 以及它如何实现以下功能:

  • 为什么开发者需要 ChatGPT?
  • 生成、优化和调试代码
  • 生成代码相关的文档并调试你的代码
  • 解释机器学习(ML)模型,帮助数据科学家和业务用户理解模型解释性
  • 翻译不同的编程语言

在本章结束时,你将能够利用 ChatGPT 进行编码活动,并将其作为提高编码效率的助手。

为什么开发者需要 ChatGPT?

我个人认为,ChatGPT 最令人大惊叹的能力之一就是处理代码。任何类型的代码都是。在之前的章节中,我们已经看到了一些 ChatGPT 生成 Python 代码的示例。然而,ChatGPT 对开发者的能力远超这个例子。它可以成为代码生成、解释和调试的日常助手。

在最流行的语言中,我们当然提到 Python、JavaScript、SQL 和 C#。然而,正如 ChatGPT 自身揭示的那样,它涵盖了广泛的语言:

列出所有你可以理解并生成的编程语言

我可以用理解并生成以下编程语言的内容:

  1. Python
  2. JavaScript
  3. Java
  4. C#
  5. C++
  6. C
  7. Ruby
  8. PHP
  9. Swift
  10. Kotlin
  11. R
  12. TypeScript
  13. Go
  14. Rust
  15. MATLAB
  16. Perl
  17. SQL
  18. HTML/CSS(用于 Web 开发)
  19. Shell 脚本 (Bash)
  20. PowerShell
  21. Scala
  22. Haskell
  23. Lua
  24. Objective-C
  25. Dart
  26. Groovy
  27. Julia
  28. Visual Basic
  29. Assembly

如果你对这些语言或任何相关内容需要帮助,请随时提问!

图 6.1 – ChatGPT 列出了它能够理解和生成的编程语言

无论你是后端/前端开发者、数据科学家还是数据工程师,只要你使用编程语言,ChatGPT 都可以成为游戏规则的改变者,我们将在后续章节的几个示例看到。

从下一节开始,我们将深入探讨 ChatGPT 在处理代码时可以实现的具体示例。我们将看到涵盖不同领域的端到端用例,以便我们熟悉如何将 ChatGPT 作为代码助手。

生成、优化和调试代码

你应该利用的主要能力是 ChatGPT 代码生成。你曾多少次寻找一段预构建的代码作为开始?例如生成工具函数(utils functions)、示例数据集、SQL 架构等?ChatGPT 能够根据自然语言输入生成代码:


生成一个 python 函数,为保存在 "my_folder" 文件夹内的所有 csv 文件添加一行。该行应该是 csv 文件的文件名。

当然!下面是一个 Python 函数,它会在名为 "my_folder" 的文件夹内所有 CSV 文件的开头添加包含每个 CSV 文件文件名的行:


import os

import csv

def add_filename_to_csv(folder_path):

    # 获取文件夹中所有的 CSV 文件

    csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]

    for csv_file in csv_files:

        file_path = os.path.join(folder_path, csv_file)

        # 读取 CSV 文件的原始内容

        with open(file_path, 'r', encoding='utf-8') as file:

            reader = list(csv.reader(file))

        # 将文件名添加到 CSV 内容开头

        new_content = [[csv_file]] + reader

        # 将新内容写回 CSV 文件

        with open(file_path, 'w', encoding='utf-8') as file:

            writer = csv.writer(file)

            writer.writerows(new_content)

# 示例

folder_path = 'my_folder'

add_filename_to_csv(folder_path)

请将 "my_folder" 替换为包含 CSV 文件的实际路径。此函数将读取每个 CSV 文件,将文件名作为第一行,并将更新后的内容保存回原文件。

图 6.2 – ChatGPT 生成 Python 函数的示例

你可以看到,ChatGPT 不仅能够生成函数,还能解释它的作用、如何使用它以及可以用什么进行替换。事实上,它可能通过我们的输入生成优化脚本,为我们节省一些运行时间或计算能力。

代码优化示例


from timeit import default_timer as timer

from datetime import timedelta

start = timer()

elements = list(range(1_000_000))

data = []

for el in elements:

    if not el % 2:

        data.append(el)

end = timer()

print(timedelta(seconds=end-start))

  • 0.0s

0:00:00.115022

图 4:Python 函数的执行速度。

执行时间为 00.115022 秒。如果我们要求 ChatGPT 优化这个脚本,会发生什么呢?

我写了以下脚本来仅过滤出列表中的奇数。


elements = list(range(1_000_000))

data = []

for el in elements:

    if el % 2 != 0:

        data.append(el)

你否创建一个脚本,以更短的执行时间实现相同的结果吗?

当然可以!你可以使用列表推导式(list comprehensions)以更高效的方式实现相同的结果,在 Python 中,这通常比带有 append 操作的 for 循环脚本更快。

这里是使用列表推导式的优化后的脚本:


elements = list(range(1_000_000))

data = [el for el in elements if el % 2 != 0]

这段代码的运行速度应该更快,因为列表推导式在 Python 中针对性能进行了优化。

如果你想用一种更快的方法,可以使用 filter 函数结合 lambda 函数,它有时可以提供更好的性能:


elements = list(range(1_000_000))

data = list(filter(lambda el: el % 2 != 0, elements))

这两种方法将产生相同的结果,但与原始脚本相比,执行时间更短。

图 6.6 – ChatGPT 为 Python 脚本生成优化替代方案

ChatGPT 为我提供了两个以更短执行时间实现相同结果的示例。

让我们在 Jupyter Notebook 中测试它们:


2023-03-25 11:27:10.270 Uncaught app exception T

File "C:\Users\vaalt\Anaconda3\lib\site-packages\"

exec(code, module. dict )

nFile "C:\Users\vaalt\OneDrive\Desktop\medium art:

user_input = get_text()

File "C:\Users\vaalt\OneDrive\Desktop\medium art:

input_text = st.text_input("You: ", st.session_si

File "C:\Users\vaalt\Anaconda3\lib\site-packages\"

result = non_optional_func(*args, **kwargs)

File "C:\Users\vaalt\Anaconda3\lib\site-packages"

return self._text_input(


start = timer()

elements = list(range(1_000_000))

data = [el for el in elements if el % 2 != 0]

end = timer()

print(timedelta(seconds=end-start))

  • 0.0s

0:00:00.064070


start = timer()

elements = list(range(1_000_000))

data = list(filter(lambda el: el % 2 != 0, elements))

end = timer()

print(timedelta(seconds=end-start))

  • 0.0s

0:00:00.091243

图 6.7 – ChatGPT 生成的两个替代函数的执行速度。

如你所见,两种方法都显著减少了,分别减少了 44.30% 和 20.68%。

除了代码生成和优化之外,ChatGPT 还可以用于错误解释和调试。有时,错误很难解释;因此,自然语言解释对于识别问题并引导你走向解决方案非常有帮助。

例如,当我从命令行运行一个 .py 文件时,我遇到了以下错误:


# File "C:\Users\vaalt\Anaconda3\lib\site-packages\text_input_proto.value = widget_state.value

TypeError: [] has type list, but expected one of

让我们看看 ChatGPT 是否能让我理解错误的本质。为此,我只需向 ChatGPT 提供错误信息,并让它给我一个解释。

错误信息解析

    1. 路径和行号
    • 错误发生在你的脚本 C:\Users\vaalt\OneDrive\Desktop\medium art.py 的第 126 行。
    • 错误源于对 get_text() 的调用,具体来自脚本第 50 行的 st.text_input()。
    1. 类型错误:TypeError: [] has type list, but expected one of bytes, Unicode 表明一个列表类型被当作字符串使用了。

相关片段

错误发生在以下代码中(根据你的回溯跟踪):


input_text = st.text_input(

    session_state['input'],

    placeholder='Your Assistant here...',

    label_visibility='hidden')

错误原因

st.text_input 函数期望参数为字符串(字节或 Unicode)。然而,目前 session_state['input'] 似乎是一个列表。

解决方案

st.text_input 函数期望参数为字符串(字节或 Unicode)。但目前 session_state['input'] 似乎是一个列表。

你需要确保 session_state['input'] 是一个字符串。

    1. 初始化:将 new_word 初始化为空字符串。
    1. 拼接:在循环中通过 += 运算符将每个字符和下划线拼接到 new_word。
    1. 返回:循环结束后返回最终的 new_word。

生成文档和代码解释

每当你处理新的应用程序或项目时,将代码与文档相关始终是一个良好的做法。它可以以文档字符串(docstring)的形式嵌入到你的函数或类中,以便他人可以在开发环境中直接调用。


class UnderscoreAdder:

    def __init__(self, word):

        self.word = word

    def add_underscores(self):

        new_word = ""

        for i in range(len(self.word)):

            new_word += self.word[i] + "_"

        return new_word

我们可以按照如下方式测试:


class UnderscoreAdder:

    def __init__(self, word):

        self.word = word

    def add_underscores(self):

        new_word = ""

        for i in range(len(self.word)):

            new_word += self.word[i] + "_"

        return new_word

# Example usage:

phrase = "gpt"

adder = UnderscoreAdder(phrase)

print(adder.add_underscores())

图 5:测试 UnderscoreAdder 类。

现在,假设我想要使用 UnderscoreAdder 约定来检索 docstring 文档。通过对 Python 包、函数和方法进行这样做,我们可以获得该特定对象功能的完整文档,如下(使用 pandas Python 库的示例):


import pandas as pd

Type: module

String form: <module 'pandas' from 'C:\Users\vaalt\anaconda3\lib\site-packages\pandas_init_.py'>

File: c:\users\vaalt\anaconda3\lib\site-packages\pandas_init_.py

Docstring:

pandas - a powerful data analysis and manipulation library for Python

==============================================

pandas 是一个 Python 包,提供了快速、灵活且表达丰富的数据结构,旨在简单且直观地处理“关系型”或“标记”数据。它是进行数据分析以及在 Python 中进行数据分析的基础高级构建模块。此外,它还有更广泛的目标,成为任何语言中可用的最强大、最灵活的开源分析工具。它已经在这一目标稳步迈进。

主要特性

这里是 pandas 执行的几项功能:

  • 轻松处理浮点数及非浮点数据的缺失值。
  • 尺寸灵活性:可以从 DataFrame 和高维对象插入和删除列。
  • 自动且显式的数据对齐:对象可以与一组标签对齐,或者用户可以简单地忽略标签,Series、DataFrame 等会在计算中自动为你对齐数据。
  • 按功能进行强大的灵活分组,对数据集执行拆分-应用-合并(split-apply-combine)操作,对数据进行聚合和转换。
  • 轻松将其他 Python 和 NumPy 数据结构中不规则的、索引不同的数据转换为 DataFrame 对象。
  • 基于标签的智能切片、花式索引(Fancy indexing)以及大型数据集的子集。
  • 直观的合并和连接数据集。
  • 数据集的灵活重塑和透视。
  • 轴的分级标记(每个刻度可以有多个标签)。
  • 健壮的 IO 工具,用于从扁直文件(CSV 和分隔符文件)、Excel 文件、数据库加载数据,并从超快的 HDF5 格式保存/加载数据。
  • 时间序列特定功能:日期范围生成和频率转换、移动窗口统计、日期偏移和滞后。

图 6.13–pandas 库文档示例

现在,让我们让 ChatGPT 为以下内容生成相同的结果:

UnderscoreAdder 类

为以下类生成 docstring:


class UnderscoreAdder:

    def __init__(self, word):

        self.word = word

    def add_underscores(self):

        new_word = ''

        for letter in self.word:

            new_word += letter + '_'

        return new_word

这里是带有 docstring 文档的 UnderscoreAdder 类:


class UnderscoreAdder:

    """

    在单词的每个字母后添加下划线的类。

    """

    Attributes:

        word (str): 将添加下划线的单词。

    Methods:

        def __init__(self, word):

            """

            用一个单词初始化 underscoreadder。

            """

            self.word = word

        def add_underscores(self):

            """

            返回一个在单词每个字母后添加了下划线的新字符串。

            """

            # ...

https://github.com/OpenDocCN/freelearn-dl-zh/tree/master/docs/practical-generative-ai-with-chatgpt---b31559-09-for-true-ep/img/d18d2ea938375aefcd1ac45b37a1624b_185_0.png

Docstring 解释

    1. 类 docstring (Class Docstring)
    • 提供类的用途的简要描述。
    • 列类的属性和方法。
    1. __init__ 方法 docstring
    • 描述初始化方法和参数。
    1. add_underscores 方法 docstring
    • 描述该方法的功能。
    • 指定返回类型及其返回的内容。

此文档将帮助用户理解类及其方法的作用,以及预期的输入和输出。

图 6.14 – ChatGPT 用文档更新代码

结果,如果我们按照前面的代码和 UnderscoreAdder? 更新我们的类,我们将得到如下输出:

posted @ 2026-09-25 20:40  绝不原创的飞龙  阅读(13)  评论(0)    收藏  举报