ChatGPT-和其它-LLM-的编程指南-全-

ChatGPT 和其它 LLM 的编程指南(全)

原文:annas-archive.org/md5/f65b85cd0754fa675e3a3a79f0300a04

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

在人工智能革命的时代,你不能仅凭人类的力量实现目标。

自动化的速度比人类快了数千倍,并且在迅速加速!软件改变了世界,创造了人工智能。现在,人工智能正在改变世界,并使其变得更好。最好的创造方式是人类与机器力量的融合。

《与 ChatGPT 及其他 LLMs 一起编程》 一书中,你将学到如今编程的最佳方式。你将学会如何找到并有效使用最先进的代码生成、架构设计、描述和测试工具,同时避免法律纠纷,快速推进你的职业发展,并帮助周围的人一起进步。读完本书、学习其中的提示和代码后,你应该能了解这种技术的未来发展趋势。你还将能够生成自己关于如何改善世界的想法,并拥有实现这些想法的能力。

本书适合谁阅读

本书适合新手程序员和有经验的程序员、软件工程师、软件开发者以及从事科学计算的科学家。如果你想从事编程或软件开发的职业,这本书适合你。如果你关心伦理问题、偏见、安全性或人工智能的未来影响,这本书也适合你。

如果你是一个律师,关注人工智能和代码的法律问题,那么这本书对你来说会非常有帮助。

本书内容

第一章 ,什么是 ChatGPT,什么是大型语言模型(LLMs)? 介绍了像 ChatGPT 和 Claude 这样的大型语言模型(LLMs)。本章解释了这些模型是如何工作的,并通过现实世界的例子探索了它们的应用。

第二章 ,释放 LLMs 在编程中的力量:一种范式转变 探讨了 LLMs 如何通过生成代码来彻底改变软件开发。本章介绍了有效的提示策略,强调了要避免的常见陷阱,并且强调了反复迭代优化的重要性,以获得最佳结果。

第三章 ,代码重构、调试和优化:实践指南 详细讨论了精炼代码的基本任务。本章包括调试以确保功能性,重构以改善结构或调整功能,优化以提高速度、内存使用和代码质量。本章展示了 LLMs 如何帮助这些过程,提供了有效的 AI 驱动编程的实用策略。

第四章 ,揭示生成代码的可读性 强调了编写清晰、易懂的代码的重要性。本章指出,对作者来说有意义的代码可能不容易为其他人理解——甚至是作者自己在未来的某个时刻也可能无法理解。这一章展示了 LLMs 如何通过增强文档、澄清函数和库,帮助提高代码可读性,并促进一些实践,使代码库更易于团队成员和未来的自己访问。

第五章 , 解决 LLM 生成代码中的偏见和伦理问题,探讨了偏见如何从用于训练 LLM 的数据、提示中的隐性假设或开发者期望中产生。它提供了识别隐藏偏见并加以纠正的策略,以确保公平和负责任的代码生成。

第六章 , 导航 LLM 生成代码的法律环境,讨论了与偏见、代码重用、版权问题以及跨司法区不同的法规相关的潜在法律挑战。本章为你提供了应对法律风险并确保合规使用 LLM 生成代码所需的知识。

第七章 , 安全性考虑与措施,聚焦于保护你的软件免受漏洞的侵害。它突出了 LLM 生成代码可能出现的安全风险,并提供了识别、缓解和预防潜在威胁的最佳实践。

第八章 , 使用 LLMs 编码的局限性,讨论了 LLMs 能够实现的边界。它探讨了 LLMs 在理解人类语言的细微差别方面的挑战,以及在处理复杂编码任务时的局限性。本章还讨论了 LLM 生成的输出中固有的不一致性和不可预测性,帮助读者设定现实的期望。

第九章 , 在 LLM 增强编码中培养协作,倡导在软件开发中培养开放与合作的文化。它提供了 LLM 生成的代码及其伴随知识的共享最佳实践,促进透明度与团队合作。读者将发现确保 LLM 生成的解决方案中编码的专业知识能有效地在开发团队之间共享和利用的策略。

第十章 , 扩展 LLM 工具包以供编码人员使用:超越 LLMs,探讨了非 LLM AI 工具如何补充 LLM 驱动的编码。它重点介绍了用于代码编写、分析和测试的工具,详细说明了这些工具的功能和局限性。本章提供了将这些工具集成到全面编码工具包中的策略,以提高生产力并最大化效率。

第十一章 , 使用 LLMs 帮助他人并最大化你的职业生涯,重点讨论了通过教学、辅导和知识共享为 LLM 编码社区做出贡献。它提供了关于如何通过分享专业知识推动该领域发展的指导,并探索了如何利用 LLM 生成的编码技能推动职业成长和新机会。

第十二章 LLM 在软件开发中的未来,展望了 LLM 技术中涌现的趋势和发展。它反思了这些进展将如何塑造软件开发的未来,并考察了自动化编码对社会的更广泛影响,包括对未来社区可能带来的影响。

获取本书的最大收益

假定知识:一些基本的编程技能,对软件和/或人工智能感兴趣。

尝试应用你在这里学到的知识,分享你的代码、最新的学习成果和经验,并向他人学习。

本书中涉及的软件/硬件 操作系统要求
Python Windows、macOS 或 Linux
Java
HTML
JavaScript

下载示例代码文件

你可以从 GitHub 下载本书的示例代码文件,地址是 github.com/PacktPublishing/Coding-with-ChatGPT-and-Other-LLMs。如果代码有更新,它将会在 GitHub 仓库中进行更新。

我们还提供了其他代码捆绑包,来自我们丰富的图书和视频目录,网址为 github.com/PacktPublishing/。快去看看吧!

本书使用的约定

本书中使用了多种文本约定。

文本中的代码: 表示文本中的代码词汇、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟网址、用户输入和 X 处理。这里有一个例子:“接下来,我们有 Prompt 5 作为一个 Flask 应用(app.py)并包含 Python 代码。”

代码块如下所示:

<!DOCTYPE html> 
<html> 
<head> 
<title>Button Click</title> 
<script> 
function sayHello() { 
  alert("Hello!"); 
}
</script> 
</head> 
<body> 
<button onclick="sayHello()">Click me</button> 
</body> 
</html> 

当我们希望你特别注意代码块中的某部分时,相关的行或项目会加粗显示:

import pandas as pd 
import matplotlib.pyplot as plt 
# Sample data (replace with your data) 
data = pd.Series([1, 2, 3, 4, 5]) 
# Assuming the data is in a column named "values" 
fig, ax = plt.subplots() 
ax.plot(data) 
ax.set_xlabel("Index") 
ax.set_ylabel("Value") 
ax.set_title("Line Plot of Data") 
plt.show()

粗体: 表示新术语、重要词汇或屏幕上显示的词汇。例如,菜单或对话框中的词汇会以粗体显示。举个例子:“你必须点击第一个按钮,点击我,才能再次弹出窗口。”

提示或重要说明

如下所示。

联系我们

我们始终欢迎读者的反馈。

一般反馈: 如果你对本书的任何内容有疑问,请通过电子邮件联系我们,邮箱地址是 customercare@packtpub.com,并在邮件主题中注明书名。

勘误表: 虽然我们已尽力确保内容的准确性,但错误难免。如果你发现本书中的错误,我们将非常感激你能报告给我们。请访问 www.packtpub.com/support/errata 并填写表格。

盗版: 如果你在互联网上发现我们作品的非法复制版,无论形式如何,我们将非常感激你能提供该作品的所在地址或网站名称。请通过电子邮件联系我们,地址是 copyright@packt.com,并附上相关链接。

如果您有兴趣成为作者: 如果您在某个主题上有专长,并且有兴趣撰写或参与书籍编写,请访问 authors.packtpub.com。

分享您的想法

阅读完《与 ChatGPT 及其他 LLMs 编程》后,我们希望听到您的想法!请点击这里直接前往亚马逊评价页面,分享您的反馈。

您的评价对我们以及技术社区都很重要,将帮助我们确保提供高质量的内容。

下载本书的免费 PDF 副本

感谢您购买本书!

你喜欢随时随地阅读,但又无法携带纸质书籍吗?

您购买的电子书与您选择的设备不兼容吗?

不用担心,现在每本 Packt 书籍你都可以免费获得该书的无 DRM PDF 版本。

随时随地、在任何设备上阅读。直接从您最喜欢的技术书籍中搜索、复制和粘贴代码到您的应用程序中。

福利不仅仅到此为止,您还可以独家获取折扣、新闻通讯和每天发送到您邮箱的精彩免费内容。

按照以下简单步骤,获取您的福利:

  1. 扫描二维码或访问下面的链接

img

packt.link/free-ebook/978-1-80512-505-1

  1. 提交您的购买证明

  2. 就是这样!我们将直接通过电子邮件发送您的免费 PDF 以及其他福利。

第一部分:LLMs 及其应用简介

本节为理解大语言模型(LLMs)及其在各个领域的变革潜力奠定了基础。它介绍了像 ChatGPT 这样的 LLMs,并解释了它们是如何工作的。我们还将探讨 LLMs 在各行业中的不同应用,从客户服务到内容生成。我们还将了解 LLMs 在软件开发中的独特能力。

本节包括以下章节:

  • 第一章 , 什么是 ChatGPT,什么是 LLMs?

  • 第二章 , 释放 LLMs 在编码中的力量:范式转变

  • 第三章 , 代码重构、调试与优化:实用指南

第一章:什么是 ChatGPT,LLM 是什么?

最近 AI 领域的进展,尤其是 大型语言模型LLM),如 ChatGPT 和 Gemini(前身为 Bard),对世界产生了强烈影响。我们见证了 OpenAI 在五天内达成一百万用户、巨型科技公司裁员、历史修正图像丑闻、更多科技公司获得数万亿美元估值(微软和 NVIDIA)、为下一阶段技术筹集 5-7 万亿美元资金的呼声,以及关于如何一切都将发生革命性变化的讨论!

是的,这一切都归功于新的 AI 技术,尤其是 LLM 技术。

LLM 在多个方面都很庞大:不仅是大规模的训练集和高昂的训练成本,还有它们对世界的巨大影响!

本书是关于如何有效地利用这些技术为你带来好处,特别是如果你是程序员的话。

编程方式发生了变化,我们必须紧跟其后,否则我们的技能将变得过时或无用。本书提供了程序员需要的工具,以便快速生成代码并做到精良,同时进行注释、调试、文档编写,并保持道德和合法性。

如果你是程序员或开发人员,这部分内容适合你。软件,尤其是 AI/机器学习,正在以前所未有的速度改变一切,所以你必须快速学习这些知识,并利用它们来创造和理解未来的技术。

我不想再耽误你时间了,咱们进入第一章吧。

本章将介绍 ChatGPT、Gemini 和其他 LLM 的一些基础知识,讲解它们的来源、开发者以及架构的组成。我们还将介绍一些使用 LLM 的组织及其服务。我们也会简要提到 LLM 所涉及的一些数学原理。最后,我们将了解 LLM 在该领域的竞争态势和应用。

本章将涵盖以下内容:

  • LLM 入门

  • LLM 的起源

  • 早期的 LLM

  • 探索现代 LLM

  • 变换器如何工作

  • LLM 的应用

LLM 入门

ChatGPT 是一个大型语言模型(LLM)。LLM 可以用来回答问题、生成电子邮件、营销材料、博客、视频脚本、代码,甚至看起来像是由人类编写的书籍。然而,你可能更想了解这项技术。

让我们从 LLM 是什么开始讲起。

LLM 是深度学习模型,具体来说,是变换器网络(或简称“变换器”)。变换器无疑改变了我们的文化!

LLM 在巨大的文本数据上进行训练,数据量达到千兆字节(即数千个千兆字节),并预测下一个单词或词组。由于 LLM 的工作方式,它们在输出文本时并不完美;它们可能给出替代事实,或是“虚构”的事实。

截至本文撰写时,ChatGPT 是最受欢迎和最著名的 LLM,由 OpenAI 创建并管理。OpenAI 是一家总部位于旧金山的慈善机构和有限利润组织 [ OpenAI_LP , OpenAIStructure ]。

ChatGPT 现在被世界各地的许多人广泛用于多种目的。当然,还有 GPT-4 以及现在的 GPT-4 Turbo,它们是付费的,功能更强大,能够做更多事情,并且可以处理更多的提示文本。

它被称为 ChatGPT:“Chat”是因为这就是你与它的互动方式,它是一个聊天机器人,而GPT是技术的名称,代表生成预训练的 Transformer。我们将在GPT 传承小节中进一步探讨这一点。

Transformer 是一种神经网络架构,也是当今最成功的 LLMs 的基础(2024 年)。GPT 是一个生成预训练的 Transformer。Gemini 是一个 Transformer [ChatGPTGeminiMenonHuggingFace]。OpenAI 的 GPT-4 是人工智能领域的一个显著进步。这个模型是 GPT 系列的第四代,它引入了一个新功能:能够生成文本和图像。这是一个重大的飞跃,相比于其主要基于文本的前身。

OpenAI 还拥有一款图像生成 AI——DALL-E,以及一款可以将图像与文本结合并进行图像识别的 AI,叫做 CLIP(OpenAI_CLIP)。DALL-E 的图像生成能力是通过对图像数据训练 Transformer 模型实现的。这意味着,在训练过程中,模型接触到了大量的图像数据,从而使它能够理解并生成视觉内容 [OpenAI_DALL.E]。

此外,由于图像可以按顺序排列形成视频,DALL-E 也可以被视为一个视频生成器。这为内容创作开辟了无数可能性,从静态图像到动态视频。这证明了 Transformer 模型的多功能性和强大能力,展现了人工智能未来的潜力。

本质上,OpenAI 的工具不仅仅是文本生成器,而是一个综合的内容生成套件,能够生成各种输出。这被称为多模态。这使得这些工具在许多应用中都极具价值,从内容创作、图形设计到研究和开发。GPT-3 到 GPT-4 的演变标志着人工智能发展的一个重要里程碑,推动了 AI 模型能够实现的边界。

LLMs 的起源

早期的神经网络凭借其读取句子并预测下一个词的能力,每次只能读取一个词,这些网络被称为递归神经网络RNNs)。RNNs 尝试模拟类似人类的按顺序处理单词和句子的方式,但由于内存容量有限,它们在处理单词和句子之间的长期依赖关系时面临着挑战。

1925 年,Wilhelm Lenz 和 Ernst Ising 奠定了基础,提出了他们的非学习型 Ising 模型,被认为是早期的 RNN 架构 [Brush双子]。

1972 年,天谷俊一(Shun’ichi Amari)使这一架构具备适应性,为学习 RNNs 铺平了道路。这项工作在 1982 年由 John Hopfield 进一步推广 [天谷双子]。

因此,已经有相当多的研究试图找到方法,扩大这种记忆以包括更多文本,以获得更多上下文。RNN 是变压器。还有其他变压器,包括LSTM,即基于 RNN 的更高级版本的长短期记忆神经网络,但我们在此不再深入讨论 [Brownlee_LLMsGemini]。LSTM 由 Hochreiter 和 Schmidhuber 于 1997 年发明 [Wiki_LSTMHochreiter1997]。

还有一个网络叫做卷积神经网络CNN)。不多讲,CNN 在图像处理方面非常出色,并引领着全球的图像识别等相关工作。CNN(或 ConvNets)由 Fukushima Kunihiko 于 1980 年发明,并由 Yann LeCun 发展,但直到 2000 年代,随着 GPU 的出现,CNN 才真正流行开来。Chellapilla 等人测试了在 CPU 和 GPU 上训练 CNN 的速度,发现 GPU 训练速度比 CPU 快 4.1 倍 [Fukushima1980LeCun1989Chellapilla2006]。有时,发明需要时间才能取得成果,但继续发明吧!CNN 使用多个层或阶段对输入做许多不同的数学运算,并尝试从不同的角度来看待它们:不同的视角、去除细节(丢弃层)、对图像的邻近区域进行池化、将负数归零等技巧。

需要的是一个具备某种记忆功能的模型,能够记住并生成句子和更长的写作内容。

2017 年,Ashish Vaswani 等人发表了一篇名为Attention Is All You Need的论文,[Vaswani2017]。在这篇重要的论文中,提出了基于注意力机制的 Transformer 架构。换句话说,这个模型没有使用递归和卷积,如 RNN 和 CNN。这些方法本身已经是非常成功和流行的 AI 架构。

与 RNN 和 CNN 相比,Vaswani 的 Transformer 在训练速度上表现更快,并且支持更高的并行化。

Transformer 成为了英德翻译的基准,并在 WMT 2014 英法翻译任务中建立了新的单一模型技术。它还在训练时间远低于下一个最佳现有模型的情况下,完成了这一壮举。事实上,Transformer 在自然语言处理领域是一次突破性的进展 [Vaswani2017]。

现在我们已经了解了 LLM 的起源,接下来我们将看看一些最早创建的 LLM。

早期 LLM

今天有许多 LLM,它们可以被归类到一个家族树中;见图 1.1。该图展示了从 word2vec 到 2023 年最先进的 LLM:GPT-4 和 Gemini [Bard]的演变过程。

图 1.1:从 word2vec 到 GPT-4 和 Bard 的 LLM 家族树,来自 Yang2023,已获许可

图 1.1:从 word2vec 到 GPT-4 和 Bard 的 LLM 家族树,来自 Yang2023,已获许可

这些就是所有版本,但现在我们将关注那些早期的 LLM,它们为今天最先进的技术奠定了基础。我们从 GPT 开始。

GPT 谱系

GPT 的发展是一个不断变化的迭代过程,每一个新模型都在前代的优势和不足上进行构建。由 OpenAI 发起的 GPT 系列经历了许多演变,推动了自然语言处理NLP)和理解的进展。

第三次迭代的 GPT-3 带来了在规模和复杂性方面的重大飞跃,拥有令人印象深刻的 1750 亿个参数。这使得它能够在广泛的主题和学科上生成相当类人化的文本 [Wiki_GPT3 , ProjectPro ]。

随着 GPT 系列的发展,OpenAI 不断完善和增强架构。在后续的迭代中,GPT-4 和 GPT-4 Turbo 进一步推动了这些 LLM 所能实现的边界。迭代开发过程着重于增加模型大小和提高微调能力,从而使输出更具细致性和语境相关性。

此外,还有更多的模式,比如具有视觉和文本到语音功能的 GPT-4。

GPT 模型的迭代不仅仅是通过增加参数数量来扩展;它还涉及解决早期版本中发现的局限性。用户互动、研究成果和技术进步的反馈有助于 GPT 系列的迭代特性。OpenAI 始终致力于减少其聊天机器人生成的不准确信息和不连贯的输出(幻觉)。此外,每一次迭代都会吸取现实应用和用户反馈的经验教训。

GPT 模型通过在非常大且多样化的数据集上进行训练和微调,以确保聊天机器人能够适应许多不同的语境、行业和用户需求。迭代开发方法确保了后续的 GPT 模型更能理解和生成类人文本,使其成为各种应用场景中极具价值的工具,包括内容创作(如博客、视频剧本、广告文案写作)以及对话型代理(聊天机器人和 AI 助手)。

GPT 模型的迭代开发方式展示了 OpenAI 在 LLM 领域持续改进和创新的承诺,这为未来基于这些模型构建更复杂、更强大的模型奠定了基础。

以下是不同版本的 GPT 发布的日期:

  • GPT 首次发布是在 2018 年 6 月

  • GPT-2 于 2019 年 2 月发布

  • 2020 年的 GPT-3

  • 2022 年的 GPT-3.5/2022 年 11 月的 ChatGPT

关于 GPT 家族的内容将在稍后的GPT-4 /GPT-4 Turbo部分详细讨论。

在这里,我们将详细介绍 LLM 的架构以及它们的工作原理。

BERT

要理解双向编码器表示法(来自变压器)BERT)的根源和发展,我们必须深入了解神经网络这一复杂且快速发展的领域。毫不夸张地说,BERT 在 NLP 领域是一个非常重要的创新,代表了 AI 不断进化的一部分。BERT 在 2018 年 10 月发布时,成为了广泛 NLP 任务的最前沿技术[Gemini]。这些任务包括问答、情感分析和文本摘要。

BERT 也为后来的 LLM 研发铺平了道路;它在 LLM 的发展中发挥了重要作用。由于 BERT 是开源的,它帮助加速了 LLM 的进展。

BERT 从 RNN(在LLM 的起源部分提到的神经网络)中汲取了一些 DNA,RNN 通过自我循环创建某种记忆,尽管这种记忆相对有限。

第一个变压器架构的发明是 BERT 起源的关键。作为双向编码器的 BERT(这些编码器在句子中前后移动)受变压器注意力机制的启发,能够捕捉句子中单词之间的双向上下文关系。

因此,BERT 的注意力是双向的(从左到右和从右到左的上下文)。在其创立之时,这种特性是独特的,它使得 BERT 能够更全面地理解语言的微妙语义。

虽然 BERT 的基础是变压器架构,但随着进一步的研究与发展,其特性也不断演变,尽管目前并未处于开发阶段。BERT 的每次迭代都在精炼和扩展其能力。

BERT LLM 是 AI 持续创新的一部分。BERT 理解语言的双向能力,从前后单词中汲取洞察,是为实现具有深刻自然语言理解的 AI 所做努力的一部分。

图 1.2:BERT 架构,双向编码器(转载自 GeekCultureBERT)

图 1.2:BERT 架构,双向编码器(转载自 GeekCultureBERT)

LaMDA

理解对话应用语言模型LaMDA)的起源涉及追溯其架构设计的根源以及它在自然语言处理(NLP)领域的发展路径。LaMDA 与其他模型一样,来自于一系列共同革新人类语言理解与生成方式的模型。

本章第一节提到的 RNN 在 LaMDA 的家族谱系中发挥着关键作用。

突破性进展来自于变压器架构的发明,而 LaMDA 要感谢具有革命性的Attention Is All You Need论文[Vaswani 20172023]。这篇论文为一种新方法奠定了基础,推动了从顺序处理转向更加并行化和基于注意力的机制。

LaMDA LLM 从变压器家族继承了其核心架构,并由 Google 开发。这些模型非常擅长学习句子中词语之间的关系。这使得变压器能更丰富地理解语言。这一从传统的顺序处理转变为 NLP 中的范式转变,使得 LaMDA 能更有效地把握文本中微妙的交互和依赖关系。

虽然起源于变压器架构,但 LaMDA 的独特特性可能通过后续的研究和开发工作进行了精细调整和演进。LaMDA 的血统不仅仅是线性的进展,而是一个家族树,是许多可能性的分支探索,每一次迭代都在完善和扩展其能力。在 Figure 1 .1 中,LaMDA 位于主要垂直蓝色分支右侧的 ERNIE 3.0、Gopher 和 PaLM 附近。

简单来说,LaMDA 是人工智能领域持续创新和精炼的产物,站在早期模型和研究突破的肩膀上。其理解和生成语言的能力深深扎根于从大量文本数据中学习的进化过程,模仿人类在大规模数字化环境中处理和理解语言的方式。

LaMDA 于 2021 年 5 月推出。

LLaMA 家族树

LLaMA 是 Meta AI 的人工智能孩子。也许它不是你最常听说的,但其血统中充满了创新和进化的故事,穿越了 AI 沟通历史的一段迷人旅程。

像其他聊天机器人 LLM 一样,LLaMA 的根源也在变压器架构中。这些模型依赖复杂的注意机制,使它们能够分析单词之间的关系,而不仅仅是它们的顺序。

在大量文本和代码数据集上训练后,LLaMA 学会了生成基本的响应、翻译语言,甚至写不同类型的创意文本格式。

然而,就像一个新生的小马驹一样,它们的能力是有限的。它们在复杂语境中踉跄,缺乏常识推理,有时会发出不连贯的字符串。

然而,它们的潜力是不可否认的。从数据中学习和适应的能力使它们成为研究人员的宝贵工具。Meta AI 精心培养这些新生模型,仔细调整它们的架构并提供更丰富的数据集。它们深入理解人类语言,掌握了事实基础、推理能力和参与多轮对话的能力(Wiki_llama)。

Llama 家族树不是线性的进展,而是多个探索分支的家族。不同版本探索了特定的途径:Code Llama 专注于代码生成,而 Megatron-Turing NLG 530 B 则训练了填补缺失单词、阅读理解和常识推理等能力( CodeLlama 2023 , Megatron-Turing 2022 )。

关于 LLaMA 在进化树中的位置,可以参见左上角垂直蓝色分支上的图 1 1.1,靠近 Bard(Gemini)。

每一次实验,每一次成功的进步,都为未来的世代贡献了宝贵的基因。

为什么叫Megatron-Turing NLG 530 BMegatron代表着强大的硬件和软件框架;Turing是为了向艾伦·图灵致敬,图灵是第一个 AI 研究者,也是人工智能和机器学习的奠基人。NLG代表自然语言生成,它拥有 5300 亿个参数。

Meta AI 继续管理 Llama 家族,未来充满了更多激动人心的进展。

Llama LLM 于 2023 年 2 月发布,而 Megatron-Turing NLG 530 B 则在 2022 年 1 月发布。

既然我们已经讨论了 LLMs 的起源并探索了其早期阶段,让我们快进到下一部分,谈一谈现代 LLMs。

探索现代 LLMs

在 2022 年底 ChatGPT 爆炸性起飞之后,仅用了 5 天就达到了 100 万活跃用户,2023 年 1 月(大约两个月)活跃用户突破 1 亿,2023 年对大语言模型(LLMs)、人工智能研究以及人工智能的广泛应用来说是一个非常火热的年份。

大多数科技公司都在开发自己的 LLM 或变压器模型,并将其公开使用。许多公司、组织和个人(包括学生)都已将 LLM 应用于各种任务。OpenAI 不断更新其 GPT 家族,而 Google 则持续更新其 Bard 版本。Bard 在 2024 年 2 月变更为 Gemini,因此所有对 Bard 的引用都已更改为 Gemini。许多公司将 ChatGPT 或 GPT-4 作为其产品的核心,仅仅创建一个外壳并进行销售。

随着 OpenAI 不断为 GPTs 添加新的模态(语音、图像等)以及一个新的市场平台,用户可以在 OpenAI 的服务器上创建并销售自己的 GPT 代理,未来可能会发生变化。该平台在 2024 年 1 月初推出,面向付费用户(每月$20,未含增值税)。我们将在接下来的章节中介绍一些公司正在开发的最新 LLMs。

GPT-4

GPT-4 Turbo,OpenAI 最新的热聊机器人,是另一次重大升级。它是你所熟悉的 GPT-4,但拥有了 10 倍的内存,并且对图像有了全新的理解。

如果说 GPT-4 是一个天才作家,那么 GPT-4 Turbo 就是一个多媒体博学者。它不仅能编织引人入胜的故事和诗歌,还能解读图像、绘制生动的数字画面,甚至用机智的评论为照片配上字幕。忘掉过时的信息吧——Turbo 的知识库不断更新,确保其在时事上保持如针锋般的敏锐。

但它不仅仅是一些炫酷的技巧。Turbo 是一个对事实极为挑剔的家伙。它能够访问外部知识库,并采用复杂的推理,确保其回答既准确又可靠。过去偏见或误导的输出已经成为历史——Turbo 力求真理与清晰,是学习和探索过程中的可靠伙伴。

最棒的部分?OpenAI 并没有将这个强大的技术封锁起来。他们制作了 API 和开发者工具,邀请程序员和创新者定制 Turbo 以应对特定的任务和领域。这种高级语言处理的民主化为未来开辟了大门,未来每个人,无论是艺术家还是科学家,都可以利用语言模型的力量创造、分析和理解周围的世界。

GPT-4 Turbo 可能被广泛认为是目前科技的巅峰,向我们展示了 LLM 的惊人潜力。它不仅仅是一个语言模型;它是我们走向一个未来的前瞻,未来机器将以前所未有的方式理解并与我们互动。所以,系好安全带!语言的未来已经到来,而它的动力来自 GPT-4 Turbo。

GPT-4 于 2023 年 3 月发布,GPT-4 Turbo 于 2023 年 11 月发布(Wiki_GPT4OpenAI_GPT4TurboGemini)。

GPT-4o 或 GPT-4 omni 于 2024 年 5 月发布,它可以理解多种格式的数据。Omni 比之前的模型更快,平均响应时间为 0.32 秒,类似于人类的反应时间,而 Turbo 在语音模式下大约需要 5.4 秒响应。

这部分是因为,尽管 Turbo 通过一个简单模型将音频转录为文本,再通过第三个模型将文本转回音频响应,而 omni 是一个理解音频、视频和文本的单一模型。Turbo 的三个模型比 omni 更慢,而且由于转录,GPT-4 Turbo 会丢失很多信息。

GPT-4o 在非英语人类语言处理方面远远优于 GPT-4 Turbo。

Omni API 的成本也仅为 Turbo 的一半(OpenAI-GPT-4o)!

GPT-4o 在代码生成方面表现非常出色,相较于 Claude 3 Opus 和 Gemini 1.5 Pro。Claude 表现中等,Gemini 被评为非常好,而 GPT-4o 的表现则是优秀的 [encord]。

GPT-4 架构

OpenAI 尚未公开 GPT-4 的架构和完整细节,作为专有信息暂时保密,但我们可以从类似的工作中拼凑出一些元素。

GPT-4 拥有 1.75 万亿个参数(1.75 万百万)(MotiveX_Gemini)。

视觉 Transformer 很可能会采用某种编码器-解码器架构:图像和视频输入给编码器,然后解码器将生成输出,如文本描述或标题以及图像(Gemini)。

它将拥有一种注意力机制,因为“注意力就是你所需要的一切。”

视觉组件可能会采用多头机制来同时处理输入的各个方面。它应该还会有位置编码、图像预处理层和模态融合。

模态融合是指视觉能力与处理文本的能力相结合。从这个过程中,它需要生成对输入或场景的统一理解。

因此,GPT-4 能够理解图像,并且它被认为结合了 Vision TransformerViT)和 Flamingo 视觉语言模型。

图 1 .3 显示了 ViT 的架构(转载自 Wagh)。

图 1.3:这是 ViT 内部工作的图示(摘自 Wagh)

图 1.3:这是 ViT 内部工作的图示(摘自 Wagh)

因此,处理视觉处理的 GPT-4 内部工作很可能涉及到视觉转换器,正如前面的图示所示,以及在LLM 如何处理句子子部分中的文本处理器。

您可以在这里了解更多关于 ViT 的信息:github.com/lucidrains/vit-pytorch

LLaMA-2

最新的官方 LLaMA,LLaMA-2,能够进行复杂对话,生成各种创意文本格式,甚至根据特定用户的个性调整其响应。

OpenLLaMA 是由 Open LM Research 发布的 LLaMA 的开源版本(Watson 2023OpenLMRGemini)。 OpenLLaMA 有几个版本,每个版本都是基于不同数据集进行训练,但训练过程与原始 LLaMA 非常相似。模型权重可以在 HuggingFace Hub 上找到,并且无需任何额外权限即可访问。有关 OpenLLaMA 的 HuggingFace 页面在这里:huggingface.co/docs/transformers/en/model_doc/open-llama

  • OpenLLaMA 模型作为 LLM 研究的基准。它们的开源性质使得可以与其他模型进行比较。这得益于提供的 PyTorch 和 TensorFlow 格式。

  • LLaMA-2 于 2023 年 4 月发布。

  • OpenLLaMA 于 2023 年 6 月发布。

  • 2024 年初,有传言称 LLaMA-3 将在今年发布。

Gemini(前身为 Bard)

谷歌的 Gemini 是一个具有互联网访问权限的聊天机器人 LLM,只需一个谷歌登录即可。从技术上讲,Gemini 是面孔,而大脑则是谷歌插槽中的任何内容。

以前,Gemini 由 PaLM 2 驱动。

在撰写本文时(2024 年初),Bard 先前由 Gemini 供电。Gemini 有三个版本:Nano、Pro 和 Ultra。Nano 适用于移动设备。由于 Bard 由 Gemini Pro 供电,因此名称更改为 Gemini。可能很快会有付费版本。

Gemini 是在 2023 年 3 月发布的(Wiki_Gemini)。

Gemini 有 1.424 亿用户,其中 62.6%位于美国(AnswerIQ)。

Gemini 的架构

Gemini 是 Google/Alphabet 开发和使用的 LLM 和 AI 之一。让我们来看看其内部运作,了解 Gemini 的工作原理!

Gemini 是基于世界书籍、文章和互联网交流的庞大文库进行训练的。Google Gemini 的 Infiniset 数据集中有 1.56 万亿字,即 750 GB 的数据。Gemini 有 1370 亿参数,这些是神经网络的权重(ChatGPT 有 1750 亿参数/权重)(ProjectPro)。

2023 年 11 月,Bard 升级,并开始由新的 AI 系统 Gemini(SkillLeapAI)提供支持。此前,Gemini 由 LaMDA 从 2023 年 3 月起供电,然后是 PaLM 2 从 2023 年 5 月起。

有三个型号,分别是 Gemini Nano、Gemini Pro 和 Gemini Ultra。截至 2024 年 1 月 19 日,Gemini 由 2023 年 12 月发布的 Gemini Ultra 驱动。

图 1 .4 显示了 Gemini 的架构( GeminiTeam )。

图 1.4:Bard/Gemini 架构,来自 DeepMind GeminiTeam (GeminiTeam)

图 1.4:Bard/Gemini 架构,来自 DeepMind GeminiTeam (GeminiTeam)

Gemini 可以处理文本、图像、音频和视频输入的组合,在这里它们用不同的颜色表示。输出可以是文本和图像的结合。

向 Gemini Ultra 的过渡标志着 Gemini 能力的重大飞跃,提供了更高的性能、更大的效率和更广泛的潜在应用(Gemini)。Bard/Gemini Ultra 有着复杂的架构,就像一个精密的语言处理工厂,每个组件在理解你的问题和制定完美回答方面都起着至关重要的作用。

关键组件是变压器解码器,它是整个操作的大脑。它分析输入的文本,剖析每个单词的含义及其与其他单词的关系。就像一位熟练的翻译员,解读你发送的信息,并准备流利地回应。

Gemini Ultra 多模态编码器不仅能处理文本。图像、音频及其他数据类型也能被处理,从而为解码器提供更丰富的上下文。这使得 Gemini 能够理解复杂的情境,例如描述你发送的图像或根据你的情绪创作音乐。

为了优化解码器的输出,预激活和后激活变压器起到了作用。这些额外的层次对响应进行了精炼和平滑处理,确保其清晰、语法正确,并且像自然语言一样流畅。通过减少幻觉现象,事实基础模块将其响应固定在现实世界中。就像一位可靠的老师,它确保 Gemini 提供的信息准确无误且不带偏见,并将其创造力建立在坚实的真实基础之上。除了基本的理解能力,Gemini Ultra 还具备推理能力。它能回答复杂的问题,得出逻辑结论,甚至解决问题。

实现 Gemini 的过程中还与 Google 有一些联系,帮助用户核实其回答。在输出的底部,输入框上方,Google 允许你双重检查其响应。

图 1.5:Gemini 的 Google 搜索按钮,用于核实其给出的输出

图 1.5:Gemini 的 Google 搜索按钮,用于核实其给出的输出。

点击此按钮后,它会显示Google 搜索,并输出一些搜索结果以及你所看到内容的指南。

图 1.6:基于其输出的 Google 搜索

图 1.6:基于其输出的 Google 搜索

图 1 .7 显示了高亮部分的含义。

图 1.7:理解 Google 搜索结果以帮助核实事实

图 1.7:理解 Google 搜索的结果以帮助事实核查

在你的 Gemini 屏幕上,你会看到不同的段落被高亮显示为棕色或绿色。绿色高亮的文本与结果一致,棕色高亮的文本与源数据不一致,未高亮的文本表示信息不足以确认。

这只是 Gemini Ultra 架构和功能的简化介绍。凭借其庞大的参数量、自注意力机制和微调能力,它是一个不断进化的语言大师,推动着 LLM 所能实现的极限。

亚马逊奥林匹斯

亚马逊开发了一个庞大的新 LLM。它是一个巨大的存在,甚至在规模上也压倒了 OpenAI 的 GPT-4。但这不仅仅是实力的较量。奥林匹斯的目标是更远的目标:在连贯性、推理和事实准确性方面取得重大突破。他们的聊天机器人 Metis 由奥林匹斯提供支持:happyfutureai.com/amazons-metis-a-new-ai-chatbot-powered-by-olympus-llm/

没有半吊子的想法,奥林匹斯深入思考、逻辑推理,并在说出任何话之前反复核实事实。亚马逊据说正在努力减少偏见和错误信息。这款 LLM 力求达到高水平的智慧和可靠性。

这不仅仅是亚马逊炫耀实力。奥林匹斯代表着语言模型的一个潜在转折点。

目标是能够以极高的准确性处理复杂的任务,抓住细微的意义差异,并与其他 AI 进行智能、基于事实的对话。

希望奥林匹斯将成为一个更具思考性的伙伴,能够进行更深层次的理解和富有洞察力的交流。

奥林匹斯可能还未准备好加入你的书籍俱乐部,但它的故事值得关注。希望奥林匹斯能成为 LLM 的必要进步,不会产生幻觉,只会产生真相,并改变 LLM 的功能。

亚马逊奥林匹斯应该拥有大约两万亿个参数(权重和偏差)(Life_Achritecture)。

亚马逊奥林匹斯预计将在 2024 年下半年发布,但自 2023 年 11 月以来,尚未公开太多信息。

现在我们已经介绍了许多现代的 LLM,让我们看看它们是如何工作的,包括通过一个示例文本。

变换器是如何工作的

接下来是一般的变换器,图 1.8展示了一个变换器的结构:

图 1.8:变换器架构:输入的编码器和输出的解码器(来自 Zahere 的复原)

图 1.8:变换器架构:输入的编码器和输出的解码器(来自 Zahere 的复原)

你可以看到它有一个编码器和一个解码器。编码器学习数据中的模式,解码器则试图重建这些模式。

编码器有多个神经网络层。在变换器中,每一层都使用自注意力机制,使得编码器能够理解句子的不同部分是如何组合的,从而理解上下文。

以下是变压器过程的简要版:

  1. 编码器网络:

    使用多层神经网络。

    每一层都使用自注意力来理解句子部分之间的关系和上下文。

    创建输入的压缩表示。

  2. 解码器网络:

    利用编码器的表示来生成新的输出。

    采用多层结构,并通过交叉注意力与编码器进行信息交换。

    生成有意义的输出,如翻译、总结或基于输入的答案。

  3. 编码器-解码器合作:

    它们结合在一起,为变压器提供高准确性和灵活性的各种任务处理能力。

    例如,微软必应利用 GPT-4 这一变压器模型,理解用户的意图和上下文,不仅仅依靠关键词,从而提供相关的搜索结果。

  4. 超越关键词:

    必应通过使用 GPT-4 从搜索引擎转变为 AI 驱动的副驾驶。

    它通过分析上下文和意图来解释问题和请求,而不仅仅是依赖关键词。

    例如,不仅提供食材列表,还根据饮食需求和技能水平推荐个性化的食谱。

  5. 从链接到理解:

    必应不仅仅是寻找链接,而是能够理解用户需求并提供相关且有用的信息。

接下来是变压器过程的详细版。

LLM 如何处理一段文本

编码器生成输入的压缩表示。这使得解码器不仅可以考虑自身的输出,还可以回顾编码器的表示,其中包含整个输入序列的表示,用于指导解码器的每一步输出生成。

解码器使用来自编码器的输出生成新的输出序列。得益于 Transformers,现代大语言模型(LLM)可以在其注意力中处理整个句子或段落,而不仅仅是像 RNN 那样一次处理一个词。

再次强调,这一部分包含很多层,但这一次有交叉注意力。

解码器与编码器压缩后的知识之间的反复对话,使得解码器能够生成有意义且相关的输出,例如将一句话翻译成另一种语言、总结一段文字或根据输入回答问题。

编码器和解码器共同构成了变压器的强大动力,使其能够以卓越的准确性和灵活性执行各种任务。

微软的必应搜索引擎使用 GPT-4 来提供更相关的搜索结果,理解你的意图和上下文,而不仅仅是关键词。

必应从一个搜索引擎转变为一个由 GPT-4 驱动的 AI 副驾驶。这种强大的语言模型作为必应的大脑,不仅仅通过关键词理解你的问题和请求,而是通过分析上下文和意图。

例如,你可以请求一个食谱,而不仅仅是食材;GPT-4 会在网上搜寻,考虑你的饮食需求和技能水平,然后呈现个性化的选择。这就像有一个知识丰富的朋友帮助你在浩瀚的信息海洋中导航。所以,Bing 不仅仅是找链接了;它是在理解你真正需要什么,并以相关且有帮助的方式提供它(www.bing.com/)。

将一段话输入到大型语言模型(LLM)中的整个过程如下:

  1. 清洗

  2. 分词

  3. 词到数字转换(将词汇赋予索引:1、2、3、4……)

  4. 数字被转化为向量

  5. 上下文嵌入

  6. 上下文向量被形成

  7. 注意力向量被形成并输入到最后的块中

  8. 随后的词语会被预测

ChatGPTGeminiPanugantyAakanksha)。

在你潜意识中有了这个框架之后,我们可以详细讨论各个阶段。当你为 ChatGPT 提问并得到答案时(对于开发者来说更多),你是按成千上万个标记(tokens)来付费的。标记是将句子拆分成单词、标点符号或其他词汇的过程。标记被转换为数字(索引),然后放入向量中,因为使用向量或上下文向量进行数学运算更容易。注意力层会指示模型在每个句子中应聚焦的部分,从而预测下一个词。

这个过程是将词汇和句子输入到转换器模型中,以便训练和查询以获得响应。

在分词之前,数据(句子、段落等)需要清洗和规范化:去除特殊字符,将所有内容转为小写,以及其他一些基本的清理操作。

这是一个需要分词处理的段落示例:

游戏《辐射》在与《堡垒之夜》相比时,作为一种独特且沉浸式的游戏体验脱颖而出。《辐射》的优势在于其丰富的叙事,提供了一个充满复杂故事情节、角色发展和重要选择的后末日世界。与《堡垒之夜》的快节奏大逃杀模式不同,《辐射》提供了广阔的开放世界探索,鼓励玩家深入细致且富有氛围的环境。游戏中的角色扮演和决策制定的重视增添了多层次的复杂性,带来了更深刻的 游戏沉浸感。”

现在,这是经过分词处理的同一段文字(ChatGPT):

["The", "game", "Fallout", "stands", "out", "as", "a", "distinctive", "and", "immersive", "gaming", "experience", "when", "compared", "to", "Fortnite", ".", "Fallout's", "strength", "lies", "in", "its", "rich", "narrative", ",", "offering", "players", "a", "post-apocalyptic", "world", "filled", "with", "intricate", "storytelling", ",", "character", "development", ",", "and", "meaningful", "choices", ".", "Unlike", "Fortnite's", "fast-paced", "battle", "royale", "format", ",", "Fallout", "provides", "a", "vast", "open-world", "exploration", ",", "encouraging", "players", "to", "delve", "into", "a", "detailed", "and", "atmospheric", "environment", ".", "The", "emphasis", "on", "role-playing", "and", "decision-making", "in", "Fallout", "adds", "layers", "of", "complexity", ",", "contributing", "to", "a", "more", "profound", "gaming", "engagement", "."]

句子可以通过 BertTokenizerMetzger)进行分词:

from transformers import BertTokenizer

然后,通过词到数字的转换,一个词变成一个索引:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88

索引转化为向量,这是通过预训练的词表示来定义的,这些表示来自于在前面提到的巨大数据集上的训练。这些表示来自于 Word2Vec、GloVe 或 FastText、ELMo,或者著名的 BERT:

  • "The": [0.2, 0.8, - 0.5, 0.3]

  • "game": [0.5, -0.7, 0.1, 0.6]

  • "Fallout": [0.9, 0.4, - 0.2, -0.1]

  • "stands": [-0.3, 0.6, 0.7, -0.5]

  • "out": [-0.7, 0.2, - 0.4, 0.9]

  • "as": [0.3, 0.1, - 0.6, 0.4]

向量的大小取决于模型的维度数量。前面的模型暗示了一个四维模型,这个模型非常小,仅仅用于这个简单的解释。

只有两个维度的模型,可能会将“女人”放在“男人”的语境中,或者“快”放在“慢”的语境中。

接下来,我们有上下文嵌入:这个词的环境是什么?

这里有一些例子,展示了可能发生的情况:

  • 句子 1,游戏 Fallout 脱颖而出... :嵌入可能会强调独特性和游戏体验的方面

  • 句子 2,Fallout 的优势在于其丰富的叙事... :嵌入可能会集中在讲故事和叙事元素上

  • 句子 3,与《堡垒之夜》快速节奏的玩法不同,Fallout 提供了... :嵌入可能会突出与其他游戏的对比以及世界探索的方面

作为向量,它会像这样表示:

  • The: [0.12, 0.34, 0.56, 0.21, -0.05, ..., 0.90] (300 个值)

  • 游戏: [0.78, 0.21, -0.45, 0.10, 0.83, ..., 0.68] (300 个值)

  • Fallout: [0.90, -0.10, 0.05, 0.75, 0.43, ..., -0.22] (300 个值)

有 300 个维度,因为这能让模型捕捉到较为微妙的语义关系,但也需要更多的训练数据和计算资源。

如果数据集很小,而且你不想花费大量的时间和金钱来计算所有内容,可以只用 50 个维度来完成。

ChatGPT 使用来自人类反馈的强化学习

ChatGPT 在其他大语言模型(LLM)中脱颖而出,原因是它通过一种叫做人类反馈强化学习RLHF)的过程不断改进。这意味着它不仅仅从大量的文本和代码数据集中学习,还融入了来自人类用户的直接反馈。

当一个新的 GPT 模型被训练(无论叫什么 GPT-X),在发布给公众之前,用户会与 GPT-X 互动,提问或发出指令。在收到回复后,他们可以通过各种方式表示赞同或反对,例如点赞/点踩评分或明确的反馈提示。这些宝贵的输入直接影响 GPT-X 模型如何精炼其内部模型,优先回应符合人类需求的回答,减少那些偏离的回答。

把它当作训练一只小狗。就像奖励鼓励期望的行为一样,强化学习中的正反馈会加强 GPT-X 中的有帮助且准确的响应。随着时间的推移,通过无数的互动和反馈循环,GPT-X 不断微调其响应,使其更加有信息量、吸引人并符合人类的偏好。这种“人类在环”方法使得 GPT 模型与其他模型不同,它们能够动态适应和学习,基于现实世界的互动不断发展其能力。

这就是研究人员和开发人员试图使人工智能具备伦理和道德的方法,依据他们对人类道德的理解,这种理解不会得到每个人的认同,但它符合普遍的文化,包括法律。

其他人则喜欢确保存在未经审查的 LLMs,这些 LLMs 不会鼓励开发者所在地区(如加利福尼亚科技公司)所持的政治观点。

这个过程应该能阻止人工智能协助任何人做任何暴力/非法的事情,比如制造武器或非法入侵组织的网站或服务器。

虽然 RLHF(强化学习与人类反馈)实现的具体细节仍然是专有的,但其影响在于 ChatGPT 能够处理多样的对话风格、生成不同的创意文本格式并提供有用的答案。随着 RLHF 技术的发展,我们可以预期像 ChatGPT 这样的 LLMs 会在理解和回应人类需求方面变得更加得心应手,模糊机器与人类沟通之间的界限。

大型语言模型(LLMs)非常昂贵

许多科技公司玩家一直在努力创建和训练自己的 LLMs 或聊天机器人,以借助这波创新浪潮赚取金钱并获取控制权。如今的 LLMs(2024 年)需要大量的训练,这需要巨额的资金。OpenAI 在微软购买 OpenAI 股份时获得了大约 130 亿美元的资金,其中很大一部分可能用于在微软自己的 Azure 云服务器上训练 GPT 系列 LLMs(Sanman)。

训练和运行 LLMs 需要现金和冷却(能源),因此,深度学习模型能够节省能源并减少污染是一件好事。DeepMind 曾经帮助谷歌数据中心节省了 40%的冷却费用!他们通过开发一个深度学习模型,提出了如何修改冷却系统运行方式的建议。后来,DeepMind 模型直接控制冷却系统的运行[Hooper 2021 和 DeepMind]。这些谷歌数据中心有自己的专用电站,因此节省了大量能源,同时也节省了金钱和减少了污染!

说到数字和计算,让我们简要了解一下 LLMs 涉及哪些数学领域。

关于 LLMs 数学的一点说明

进入 LLMs 的数学核心可能有些复杂,但理解它们的核心原理能揭示许多当前最强大且广泛使用的人工智能是如何运作的。因此,如果你想构建这些 AI 模型并进行研究,数学非常有趣:

  • 线性代数基础:LLMs 的基石在于线性代数,其中矩阵和向量占主导地位。单词被映射到高维向量,捕捉它们在广阔语义空间中的意义和关系。每个单词都是多维空间中的一个点,相关的单词会聚集在一起。

  • 反向传播与优化:训练 LLMs 需要庞大的数据集和复杂的优化算法。一个强大的工具是反向传播,这是一种数学技术,用于计算误差梯度——每个参数对模型输出偏差的贡献程度。通过根据误差梯度反复调整这些参数,LLMs 能够学习并改进其预测。

  • 损失函数和评估指标:为了评估大语言模型(LLM)的性能,我们需要定量指标。损失函数定义了模型输出与期望结果之间的偏差,而像准确度、困惑度和 BLEU 分数等指标则评估模型生成流畅且上下文适当的文本的能力。

    • BLEU 分数代表 Bilingual Evaluation Understudy score,源自翻译领域,但也可以作为一种方法来比较 AI 生成的翻译与参考翻译。可以使用 Python 中的 NLTK 代码库,通过 sentence_bleu() 函数(Brownlee_BLEU)计算 BLEU 分数。
  • 超越基础数学:LLM 的数学远远超出了这些核心原理。技术如正则化、丢弃法和梯度裁剪有助于防止过拟合并提高泛化能力。RNN 增加了记忆能力,使模型能够从更长的序列中学习。数学的世界不断发展,推动 LLM 能力的边界。

  • Transformers 和注意力:这种数学架构构成了现代 LLM 的引擎。在 Transformers 中,计算注意力分数的机制涉及查询向量和键向量之间的点积。而在 LSTM 中,每个时间步既充当 查询 又充当 ,Transformers 则将这两个角色分开:查询来自当前词元的表示,而键来自序列中所有词元的值表示。这一区分有助于计算出注意力分数,指示每个词元在其上下文中的重要性或相关性。Transformers 还使用值,它们也来自所有词元的词嵌入,携带每个词元的实际信息。

    • 让我们来看一个例句,The cat played with a ball

    • 在 Transformer 的注意力机制中,适用以下规则:

      • 词语及其意义通常使用嵌入表示为数值形式,如 Word2Vec 或 GloVe 向量。

      • 查询将来源于当前词元的表示;假设它是词 played

      • 键是从序列中所有词元的值表示计算出来的,因此我们会为 Thecatplayedwithaball 计算键。

      • 然后,每个查询将与每个键向量做点积。

      • 这些点积将用于计算注意力分数。

      • 最终,这个过程有助于突出序列中哪些词在上下文中最相关或最重要,从而增强 Transformer 理解文本的能力。

虽然数学可能看起来令人畏惧,但必须记住,它只是一个工具。真正的力量在于这些算法如何结合在一起,创造出能够实现语言处理奇迹的模型。随着数学模型的不断发展和数据集的增大,LLM 有望突破语言的边界,以越来越迷人的方式模糊人类与机器交流之间的界限 [Llama3, Gemini]。

LLM 的应用

LLM 革命正在将它的虚拟触角伸向生活的方方面面,从写大学论文到生成个性化的可口可乐广告和客户服务。以下是 16 个多样化应用的快速一瞥:

  • DIYVA : 设计惊艳的视觉效果和标志,即使是艺术天赋较差的人也能看起来像毕加索(diyva.life/)。

  • LimeWire : 创造独特的 AI 生成艺术作品,将你最疯狂的创意愿景变为现实。从这里开始:limewire.com/studio?referrer=ml736b1k7k

  • Coca-Cola : 创建有针对性的广告活动,为每个可口可乐消费者量身定制个性化的营销信息(www.coca-cola.com/gb/en)。

  • Slack : 转录会议并自动总结关键要点,节省宝贵的时间和精力(slack.com/intl/en-gb)。

  • Octopus Energy : 预测你的能源使用并建议个性化的方案,通过 LLM 智能优化你家中的电力(octopus.energy/)。

  • Cheggmate : 提供 AI 驱动的辅导,针对每个学生的具体需求进行定制,使学习更加高效和有趣(www.cheggmate.ai/)。

  • Freshworks : 自动化客户服务,分析聊天记录并在客服人员反应过来之前提供解决方案(www.cheggmate.ai/)。

  • Udacity : 设计个性化学习路径,带领你穿越技术丛林,借助 LLM 驱动的推荐(www.udacity.com/)。

  • Zalando : 这家欧洲时尚零售商使用 LLM 根据用户的偏好和行为生成个性化的产品推荐(www.zalando.co.uk/)。

  • Headspace : Headspace 利用 LLM 个性化指导冥想,根据你的情绪、睡眠模式和个人目标调整冥想练习(www.headspace.com/)。

  • Spotify : Spotify 的 Discover Weekly 播放列表和其他个性化推荐是由 LLM 生成的,通过分析你的听歌习惯和音乐偏好,为你的生活策划一条不断演变的背景音乐(open.spotify.com/)。

  • Peloton : Peloton 的 AI 教练利用 LLM 在锻炼过程中提供动态实时反馈,根据你的个人表现和健身目标调整提示和挑战(www.onepeloton.co.uk/)。

  • 百度的文澜 : 帮助中国企业分析客户评论并个性化营销活动;本地的 LLM 巨头(ir.baidu.com/company-overview)。

  • NVIDIA Megatron-Turing NLG:生成不同的创意文本格式,如诗歌、代码、剧本等,推动 LLM 表现力的边界(gpt3demo.com/apps/mt-nlg-by-microsoft-and-nvidia-ai)。

  • Grammarly:这个写作助手使用 LLM 分析你的写作,为你提供实时的语法和风格建议,使你的沟通更加清晰、有影响力。

  • app.grammarly.com/)。

  • DeepBrain AI:利用他们自己的 LLM,结合先进的动画和语音合成技术(www.deepbrain.io/aistudios?via=abtnews)。(ForbesMarrf6sGemini)。

摘要

本章我们涵盖了 ChatGPT 是什么以及 LLM 一般是什么,一些广泛使用的 LLM 的起源,如 BERT、GPT 系列、LlaMDA、LlaMA,以及现代 LLM 如 GPT-4 和 Gemini。我们查看了 LLM 和变换器的一些架构。我们尝试了以 LLM 模型的方式全面处理一个句子:分词、Word2Vec 上下文嵌入等。我们还涉及了相关的数学类型及这项由公司部署的惊人技术的应用。

希望你现在已经理解了像 ChatGPT/Gemini 这样的 LLM 的性质;理解了 LLM 的架构;理解了一些 LLM 的数学原理;并且对这一领域的竞争以及如何将 LLM 教授给他人有了启发。

第二章中,我们将探讨使用 LLM 编码的优势、规划基于 LLM 的编码、与 LLM 一起进行编码以及如何使其为你所用。

参考文献

第二章:2

利用 LLMs 的力量进行编程:一种范式转变

在本章中,我们将揭示使用 LLMs 进行编程的优势,并探讨使用像 ChatGPT 和 Bard(现在称为 Gemini)等 LLMs 进行代码生成的可能性。在这里,你将了解如何开始获得良好的结果,认识到从 LLMs 获得的代码的局限性,并发现 LLM 在编程任务中的实际应用示例。

这将帮助你进入一些编程和提示工程的领域。你将获得一些结果,之后逐步提升结果,最终开始编写更稳定的代码。

我们将查看一些 LLMs 的示例提示及其生成的代码,逐步提高提示,以获得更好的代码。然而,这将需要多次提示。然后,在第三章中,我们将更详细地讨论修正和调试代码的整个过程。

本章内容包括以下主题:

  • 揭示使用 LLMs 进行编程的优势

  • 规划你的 LLM 驱动编程

  • 进入 LLM 驱动的编程

  • 使其为你工作

技术要求

在本章中,你需要以下内容:

现在,我们将进入本章,首先讨论使用 LLMs 进行编程的优势,以及你为何要这么做。

揭示使用 LLMs 进行编程的优势

为什么你会想使用像 Gemini 或 GPT-4 这样的 LLMs 来为你提供代码?

简短版本

使用 LLMs 进行编程既快捷又能轻松获得所需的代码,进行代码语言之间的转换,记录和解释代码,并与不同能力的程序员分享。

更长的版本

LLMs 在多个方面提升你的能力,包括提高生产力、加速创新、降低进入门槛和更好的协作。接下来我们将介绍最有用的优势:

  • 大幅 提高生产力

    • 你可以节省大量时间,几乎可以立即获得与目标相关的代码示例。LLM 还很可能会给你提供有用的注释。

    • LLMs 还可以将代码从一种编程语言转换到另一种语言(例如,从 Python 到 C++)。

    • LLMs 甚至可以自动生成代码文档,改善沟通与理解,方便其他开发者理解你的代码,或者如果你忘记了你当时在创建什么及其原因,帮助你回忆。

    • 减少样板代码 : LLMs 可以自动生成重复的代码片段,节省开发者在常规任务上投入的时间和精力。

    这意味着更高的生产力。那么它如何提高创新速度呢?

  • 创新加速 :

    • 新想法的实验 : LLMs 可以生成替代的代码方法和解决方案,鼓励探索和创新。

    • 探索小众和复杂算法 : LLMs 可以高效地浏览庞大的代码库,并为特定需求推荐相关算法。

    • 快速原型设计 : LLMs 可以快速生成功能性原型,加快开发周期并测试新想法。

    • 个性化优化 : LLMs 可以根据特定的使用案例和性能要求,建议代码优化方案。

  • 降低进入壁垒 :

    • 学习辅助 : LLMs 可以实时解释复杂的代码概念并回答问题,使初学者更容易进行编码。

    • 代码补全建议 : LLMs 可以自动补全代码,提供有用的提示并减少语法错误。

    • 个性化学习材料 : LLMs 可以根据个人需求和技能水平生成量身定制的学习材料。

    • 数据的民主化 : LLMs 可以帮助分析和处理大数据集,使数据驱动的开发对所有人更加可及。

  • 增强协作 :

    • 改进的沟通 : LLMs 可以简化技术解释并生成代码注释,促进开发者之间更清晰的沟通。

    • 面向多样技能的可达性 : LLMs 可以弥合不同技能水平的开发者之间的差距,促进知识共享与合作。

    • 团队增强 : LLMs 可以作为虚拟助手,协助开发者完成任务,使他们能专注于复杂问题。

    • 版本控制协助 : LLMs 可以帮助跟踪更改并建议代码改进。

警告

你仍然需要了解如何编写代码以及执行与编程相关的其他任务。你还需要调试从 LLMs 获得的代码。

LLMs 可以建议已识别错误的可能修复方案,加速调试过程。

所以,这些是优势;然而,这可能并不直截了当,并且存在危险。我们将在后续章节中详细讨论这些内容:代码重构、调试和优化( 第三章 )、解决偏见和道德问题( 第五章 )、LLM 生成代码的法律环境( 第六章 )、安全考虑和措施( 第七章 )、以及使用 LLM 进行编码的限制( 第八章 )。

要生成良好且可操作的代码,与大多数事物一样,计划很重要。

这些是使用 LLM 来辅助编码的强大理由。在下一节中,你可以了解如何实际在编码中实现 LLM 工具,从规划阶段开始。

规划你的 LLM 驱动编码

要确保你有好的代码,你需要很好地计划你将需要什么。

你可能需要回答以下问题:

  • 代码/软件的目的是什么?

  • 谁将使用你的软件?

  • 软件将在哪里使用?

  • 用户如何进行交互?

  • 是否需要任何数据源?

  • 你将使用什么数据格式?

  • 如何处理数据输入?

  • 你的软件将是什么样子?GUI 还是命令行界面?

在跃入充满激情的 LLM 驱动编码世界之前,花一点时间精心规划你的项目对确保创造稳健有效的代码至关重要。这就像在建造房子之前绘制蓝图 - 你优先考虑稳定性和功能性,然后再添加最后的修饰。以下是一些需要深思熟虑的关键问题。

1. 理解你的目的 - 揭示为什么

每个伟大的创造都始于一个目的。你的 LLM 驱动代码也不例外。在深入技术细节之前,暂停一下,真正定义它的存在理由。你要解决什么问题?它将自动化哪些具体任务?是优化现有流程,创建全新解决方案,还是探索创新可能性?

清晰地表达你的目标就像给 LLM 一张路线图。你的愿景越清晰,它越能有效地将生成能力集中在与你愿望一致的相关代码上。把它看作是一场对话:“ 这是我想要实现的;LLM,指引我生成能让这个目标实现的代码

2. 确定你的受众 - 量身定制体验

想象一下你的软件正在使用。谁在使用它?是熟悉复杂界面的技术达人,还是寻求熟悉和直观体验的普通用户?确定你的目标受众至关重要,因为它在很大程度上塑造了 LLM 的输出。

对于技术熟练的受众,LLM 可能会侧重于生成高效且强大的代码,即使它涉及更多技术元素。但在面向普通用户时,重点则转向创建一个用户友好的界面,优先考虑清晰性和易用性。可以把它想象成设计一座建筑——你要根据受众的需求和偏好来创建一个既友好又易于访问的空间。

3. 定义环境 – 你的代码的“家”

想象一下你的代码有一个物理地址。它会在哪里驻留?是作为一个网络应用程序在线访问、作为一个移动应用程序在设备上随时可用,还是作为本地软件藏匿在特定硬件中?理解部署环境对 LLM 至关重要。

不同的环境有不同的需求。Web 应用需要优化在线访问性,移动应用要求便捷的可移植性和资源效率,而本地软件则可能优先考虑离线功能。每种情境都会影响 LLM 的代码生成,确保它满足特定部署环境的需求。

4. 用户交互映射 – 绘制导航流程图

想想用户如何与软件互动。他们是通过按钮和菜单等图形元素进行导航,还是依赖于终端类界面中的文本命令?甚至可能会有语音命令!定义交互方式会显著影响 LLM 的输出。

对于图形用户界面GUI),LLM 优先生成元素位置、响应性和直观交互处理的代码。可以把它看作是绘制一张地图——你引导 LLM 创建清晰且高效的用户导航流程。相比之下,对于命令行界面CLI),重点则转向文本输入、输出格式化和命令解析,帮助用户通过清晰简洁的文本命令与软件进行互动。

5. 确定数据源 – 喂养机器学习的“猛兽”

你的软件是否依赖外部数据来运行?也许它使用用户输入、从数据库检索信息或处理传感器读取值。如果是这样,确定数据源、它们的格式(CSV、JSON 等)以及它们将如何集成到代码中就变得至关重要。

把数据当作是驱动你的 LLM 的燃料。通过提供有关数据源的具体细节,你为 LLM 提供了它需要的知识,使其能够有效地访问和处理这些燃料。这确保了生成的代码可以正确地处理数据交互,从而实现准确且强大的功能。

6. 什么数据格式?

选择正确的数据格式对于与 LLM 驱动的代码无缝集成至关重要。考虑以下因素:

  • 兼容性:你的 LLM 是否能够原生理解该格式,还是需要额外的转换步骤?像 CSV、JSON 和 XML 这样的常用格式广泛支持,而不太常见的格式可能需要额外的处理。

  • 效率:对于大规模数据集,考虑使用空间高效的格式,如 Parquet 或 Apache DataFrames。对于频繁读写的结构化数据,关系型数据库如 MySQL 可能更为合适。分析你的数据大小、访问模式以及 LLM 兼容性,以找到最优的平衡点。

  • 可读性:如果你需要手动理解数据,选择易于人类阅读的格式,如 CSV 或 JSON。但对于纯机器处理,更紧凑的格式可能更合适。

  • 未来需求:考虑超越当前需求。数据格式能否随着项目的增长而良好扩展?你能否轻松地在以后添加新的数据类型?选择一种灵活且广泛采用的格式,可以避免日后遇到麻烦。

通过仔细考虑这些因素,你将选择一种数据格式,确保 LLM 和数据之间的顺畅沟通,从而有效地推动代码生成过程。

7. 你将如何管道化数据?

管道(Plumbing)指的是你的代码如何获取、处理和集成数据。在 LLM 的应用中,这变得尤为重要:

  • 数据访问机制:你的 LLM 是否直接访问数据源(例如,数据库 API)?或者你的代码将作为中介,先获取并预处理数据,然后再传递给 LLM?根据复杂性、安全需求以及你对数据处理的控制要求来选择。

  • 数据转换:LLM 是否要求特定的数据结构或格式?你可能需要在将数据传递给 LLM 之前对其进行转换或预处理(例如,清理和归一化)。考虑使用专门用于 AI 模型数据准备的库或工具。

  • 错误处理:预见潜在的数据问题,如缺失值、不一致性或错误。设计代码时应优雅地处理这些问题,可能提供备用数据源或回退机制,防止 LLM 因为不良数据而生成错误的代码。

  • 灵活性和可扩展性:随着项目的发展,数据访问和转换可能需要调整。确保你的代码模块化且具有适应性,便于更新和扩展,以适应数据源、格式或处理需求的变化。

通过有效地“管道化”数据,你为 LLM 提供了干净且有序的信息,使其能够生成稳健且准确的代码,从而增强你的 LLM 驱动的开发过程。

8. 可视化界面

你的软件是会有一个带有按钮、菜单和视觉元素的用户友好图形界面(GUI),还是将采用文本命令驱动的命令行界面(CLI)?选择界面就像是在决定你建筑的外观设计——它决定了用户如何与之互动并体验你的创作。以下是这种选择如何影响 LLM 的代码生成:

  • GUI:如果选择 GUI,LLM 将生成符合 UI 设计原则的代码。包括元素定位、响应式布局和交互处理的代码。考虑向 LLM 提供类似 GUI 或设计模型的示例,以指导其输出。

  • CLI:对于 CLI,LLM 将专注于文本输入、输出格式化和命令解析的代码。提供现有 CLI 工具或命令结构的示例,可以帮助 LLM 理解你所期望的用户体验。

记住,界面也会塑造用户的期望和感知。明智选择,并确保 LLM 生成的代码符合你对用户交互的愿景。

通过仔细处理这些基础元素,你为基于 LLM 的编程之旅奠定了坚实的基础。请注意:明确的目的、清晰的受众、合适的环境、直观的交互和可访问的数据源是成功的 LLM 驱动代码构建的支柱。

现在,你已经准备好深入探索技术方面,确信你的 LLM 拥有正确的路线图和工具,能够引导你实现编程目标。

现在,让我们实际获取那些代码!

开始进入 LLM 驱动的编程

在这里,你可以使用 LLM 为你生成代码!它可以根据一些英文内容直接为你生成一堆代码。如果你运气好,或者代码很简单且常用,代码可能会立刻就能正常工作!这将为你节省大量时间和精力!

以下是由 Gemini 提供的一系列提示及其生成的代码响应。通过这些,我们可以开始了解聊天机器人能够轻松完成的任务,以及哪些任务更加困难且容易出错。

然后,我们可以分析并学习如何改进我们的提示,并在出现错误时如何进行调试。

这是 Prompt 1请给我一个 Python 代码示例,制作一个网页按钮,当你点击按钮时,它会显示 "hello"。

这是 HTML,因此应该将其放入网页编辑器中的网页,或者可以在 HTML 解释器中进行测试和操作,例如 htmledit.squarefree.com/onecompiler.com/htmlwww.w3schools.com/tryit/

<!DOCTYPE html>
<html>
<head>
<title>Button Click</title>
<script>
function sayHello() {
  alert("Hello!");
}
</script>
</head>
<body>
<button onclick="sayHello()">Click me</button>
</body>
</html>

在在线 HTML 解释器中,代码看起来是这样的:

图 2.1:这是粘贴到 HTML 解释器中的代码

图 2.1:这是粘贴到 HTML 解释器中的代码

我们将得到一个与下图相似的按钮。它非常简单!

图 2.2:生成的按钮

图 2.2:生成的按钮

图 2 .3 中,我们可以看到点击按钮后的输出。

图 2.3:点击从 Gemini 获得的 HTML 代码按钮后的输出

图 2.3:点击从 Gemini 获得的 HTML 代码按钮后的输出

那么,第一段代码很好地运行了,似乎不需要调试。用户点击 OK 按钮,窗口消失了。你需要再次点击第一个按钮 Click me 才能再次弹出窗口。这部分也运行正常。

希望我们已经学到了(是的,我也是),LLM 聊天机器人可以提供一些不错的代码来做简单的事情,如果你把它放在正确的位置来执行该代码,它可以运行。

我通常不会将所有代码放在页面上,因为这样会变得笨重而且太啰嗦,对于一本书来说。

您可以从本书的 Packt GitHub 存储库获取代码:github.com/PacktPublishing/Coding-with-ChatGPT-and-Other-LLMs/

这段代码结合了 HTML 和 JavaScript:

  • HTML 创建一个带有文本 Click me 的按钮

  • sayHello() JavaScript 函数在点击按钮时显示带有消息 Hello! 的警报框

接下来,我们有巴德(现已被双子座替代)的第二个提示,你将看到一点数学是必要的。

这里是 Prompt 2请给我一个 Python 代码示例,制作一个简单的脚本,如果输入华氏度,它给出摄氏度,如果输入摄氏温度,它给出华氏度。

这将需要 Python 解释器或 IDE。

复制以下块中的代码,运行它,看看它的运行效果:

def convert_temperature(temperature, unit):
    if unit.lower() == "f":
        celsius = (temperature - 32) * 5 / 9
        return celsius, "Celsius"
    elif unit.lower() == "c":
        fahrenheit = temperature * 9 / 5 + 32
        return fahrenheit, "Fahrenheit"
    else:
        return None, "Invalid unit"
# Example usage
temperature = float(input("Enter temperature: "))
unit = input("Enter unit (F/C): ")
result, new_unit = convert_temperature(temperature, unit)
if result is not None:
    print(f"{temperature} {unit} is equal to {result} {new_unit}")
else:
    print("Invalid input")

Figure 2 .4 中,我们可以看到在线解释器中的代码。

图 2.4:华氏度和摄氏度转换器代码

图 2.4:华氏度和摄氏度转换器代码

接下来,在 Figure 2 .5 中,我们可以看到代码执行一次:

图 2.5:F 到 C 和 C 到 F 温度转换脚本;这是网页上图 2.4 右边的位置

图 2.5:F 到 C 和 C 到 F 温度转换脚本;这是网页上图 2.4 右边的位置

下图展示了在命令行中进行的摄氏度到华氏度转换:

图 2.6:命令行中的摄氏度转华氏度转换代码

图 2.6:命令行中的摄氏度转华氏度转换代码

我们可以从这里学到什么?再次证明,LLM 聊天机器人的简单代码片段第一次运行就可以很好地工作!这次,代码是 Python。

我们以后会改进这段代码;它非常简单,但我们可能可以使其更用户友好:易于使用和更漂亮。

这是 Prompt 3一个 Jupyter 笔记本的代码块,如果给定一列数据,将显示绘图。

这是针对 Jupyter Notebook 的,之前叫做 IPython Notebook,因此这些文件的格式是 .ipynb。你可以在 Anaconda Python 发行版中获得 Jupyter Notebook。如果你想更快速地测试这段代码,你可以使用 Google Colab(colab.research.google.com)或 Jupyter Notebook 本身:jupyter.org/try-jupyter/notebooks/?path=notebooks/Intro.ipynb

这些笔记本通过将 Python 代码放入单元格中来工作;见 图 2 .7

这是 Python 代码;如果你不知道如何使用这些笔记本,可以搜索 Jupyter Notebook 或 Google Colaboratory,当然也可以使用像 GPT-4 或 Gemini 这样的 LLM。

import pandas as pd
import matplotlib.pyplot as plt
# Sample data (replace with your data)
data = pd.Series([1, 2, 3, 4, 5])
# Assuming the data is in a column named "values"
fig, ax = plt.subplots()
ax.plot(data)
ax.set_xlabel("Index")
ax.set_ylabel("Value")
ax.set_title("Line Plot of Data")
plt.show()

图 2 .7 中,你会看到笔记本中的代码,以及标题和额外的文字。介绍你的代码块或单元格总是个好主意。

图 2.7:在 Jupyter Notebook 中的 Python 代码,给定一列数据后,应绘制数据

图 2.7:在 Jupyter Notebook 中的 Python 代码,给定一列数据后,应绘制数据

图 2 .8 显示了输出图表:

图 2.8:来自 Prompt 3 的代码生成的图表

图 2.8:来自 Prompt 3 的代码生成的图表

好吧,这个图表挺无聊的,但现在你知道如何在 Python 或 Jupyter Notebook 中制作图表了。如果你之前不知道,现在的章节和 LLM 已经给出了一些提示。

这是 Prompt 4一个脚本,会要求你加载 bench,然后帮助你浏览最终显示的图像。

加载 bench?那是什么意思?

我弄错了提示!我说得不好,或者 AI 没有听懂,但它还是弄明白了我想要什么,并给了我代码!哈哈!

这是 Python 代码,旨在放入可以运行 Python 并加载如 tkinter 这类代码库的 IDE 中。因此,必须在你使用的代码环境中安装这个代码库。

让我们看看它在某个在线 Python 解释器中是否能工作……这部分内容在 第三章 中继续,在 Prompt 4 中。需要进行相当多的调试,这一章就是关于调试和其他内容的,所以过程在那儿。

以下是最终的代码,它来自 Gemini 和 Stack Overflow,以及我确保安装了相关代码库的结果。谷歌在 2024 年 2 月用 Gemini 替代了 Bard LLM。这段代码从 Bard 开始,最终由 Gemini 完成:

from tkinter import Tk, Label, Button, filedialog
from PIL import Image, ImageTk
# Initialize Tkinter window
root = Tk()
# Create a label to display the image
label = Label(root)
label.pack()
# Define a function to load an image
def load_image():
    filename = filedialog.askopenfilename(title="Select an image", 
        filetypes=[("Image Files", "*.jpg;*.png")])
    if filename:
        try:
            # Open the image using PIL
            img = Image.open(filename)
            # Convert the image to Tkinter format
            tk_img = ImageTk.PhotoImage(img, master=root)
            # Update the label with the new image
            label.config(image=tk_img)
            label.image = tk_img  # Keep a reference to the image to prevent garbage collection
        except Exception as e:
            print("Error loading image:", e)
# Create a button to trigger the image loading
button = Button(root, text="Load Image", command=load_image)
button.pack()
# Run the window's main loop
root.mainloop()

这应该能很好地工作。我希望你从这里以及 第三章Prompt 4 调试)的相关部分中学到的是,这些 LLM 可以生成相当不错的代码,但一旦代码变得稍微复杂一些,比如涉及到代码库和加载文件,代码通常需要调整:调试、检查在线论坛如 Stack Overflow、思考代码、测试它并反复迭代。

所以,你仍然需要编程技能。到 2024 年初,LLM 还不能处理复杂的代码。

这是 Prompt 5显示图形用户界面的网页的 HTML 代码。但是,这个计算器是一个真正有效的计算器,点击按钮后可以实际运算 这些按钮

再次提醒,我稍微弄错了提示,但 LLM 仍然明白了意思。

了解 LLM 在一定程度上能够管理和理解用户输入中的错误,令人感到放心。

Bard 有时会给出多个版本供你选择。在这里,它提供了 HTML 和 Flask(Python)版本。HTML 和 JavaScript 脚本工作得很好,所以我们不需要 Flask 版本。

将其放入网站构建器或 HTML 解释器中:

<!DOCTYPE html>
<html>
<head>
<title>Calculator</title>
</head>
<body>
<input type="number" id="num1" required>
<select id="operator">
  <option value="+">+</option>
  <option value="-">-</option>
  <option value="*">*</option>
  <option value="/">/</option>
</select>
<input type="number" id="num2" required>
<button type="button" onclick="calculate()">Calculate</button>
<p id="result"></p>
<script>
function calculate() {
  const num1 = parseFloat(document.getElementById("num1").value);
  const num2 = parseFloat(document.getElementById("num2").value);
  const operator = document.getElementById("operator").value;
  let result;
  switch (operator) {
    case "+":
      result = num1 + num2;
      break;
    case "-":
      result = num1 - num2;
      break;
    case "*":
      result = num1 * num2;
      break;
    case "/":
      if (num2 !== 0) {
        result = num1 / num2;
      } else {
        result = "Division by zero";
      }
      break;
    default:
      result = "Invalid operator";
  }
  document.getElementById("result").textContent = result;
}
</script>
</body>
</html>

图 2.9 显示了计算器的 GUI:

图 2.9:界面看起来是这样的

图 2.9:界面看起来是这样的

计算器非常简单,你可以输入数字或点击出现的小上下箭头。你还可以从下拉菜单中选择运算符 (+- 、***** 和 /)。这不是科学计算器,只是一个非常简单的算术计算器。

这段代码是 HTML,并调用了嵌入在

posted @ 2025-07-10 11:38  绝不原创的飞龙  阅读(14)  评论(0)    收藏  举报