写点什么

Anthony Alford 访谈:AI 架构入门

  • 2024-11-12
    北京
  • 本文字数:14392 字

    阅读完需:约 47 分钟

大小:6.94M时长:40:24
Anthony Alford访谈:AI架构入门

本文要点

  • “人工智能”一词通常是指生成式人工智能(GenAI),因为这是人们所熟悉的最常见的实现方式。

  • LLM,像任何 ML 模型一样,获取输入,提供输出,就像一个你可以通过 API 调用的函数。

  • 在应用程序中使用 LLM 之前,务必定义一个成功的标准。

  • 要提升 LLM 的效果,如果提示工程还不够的话,那么检索增强生成(RAG)是你早期应该采用的步骤。

  • 向量数据库提供最近邻搜索,这有助于查找要用于 LLM 上下文的相关内容。

简介

Thomas Betts:大家好。在 InfoQ,我们一直致力于向读者提供最新的软件创新和趋势信息。我知道,有时候新消息满天飞,我们主要关注那些与我们目前正在从事的工作密切相关的主题,或是我们感兴趣的主题。有时,你可能会意识到,一些你以前可以置之不理的东西,现在已经不容忽视了。我承认,对于过去十年间的很多新闻,关于大数据、机器学习、人工智能,我都是这么看的。我发现这很有趣,但因为那不是我的工作,所以我对大多数主题的理解都很浅。这没什么问题。通常来说,软件架构师就是这么处理问题的。

 

我们所掌握的知识往往呈 T 形。我们需要了解的学科范围很广,但通常,我们只深入了解其中的几个,除非我们不得不再去深入地了解其他学科。我认为,这就是 ML 和 AI 的发展现状。那不再是一件无关紧要的事。架构师每天都要面对它们。因为产品负责人、首席技术官、首席执行官,甚至我们的客户都在问,“能加入一些人工智能功能吗?”

 

就是这样,我想到了今天的节目。我邀请了 Anthony Alford 来帮助解释一些与 ML 和 AI 相关的概念。我认为,这些概念现在是成为一名高效的软件架构师所必备的知识。Anthony 的声音可能听起来很熟悉,因为他也是 InfoQ 的编辑。他和 Roland Meertens 共同主持了 Generally AI 播客,那个节目刚刚开始第二季。Anthony,感谢你参加我的 InfoQ 播客节目。

Anthony Alford:谢谢你们的邀请。

Thomas Betts:对于我们今天的讨论,我做了一个很大的人工智能词汇表。里面有很多术语,我认为,架构师需要理解这些术语是什么,然后弄清楚自己需要了解多少,才能与同事进行明智的对话。我想,今天我们可以提供足够的信息,使架构师们有能力进行那样的对话,并且能够认识到,当出现什么情况时,他们就必须开始将其用于项目或思考设计。使他们了解更多的背景信息,这将帮助他们在做进一步研究时取得更大的成功。这样行吗?

Anthony Alford:听起来不错。

 

AI 通常指深度学习或神经网络

Thomas Betts:首先,请说出你的定义,什么是 AI?

Anthony Alford:AI 就是人工智能。

Thomas Betts:好吧,今天的节目就到这里。

Anthony Alford:言归正传。事实上,当我与人们谈论这个问题时,我会说,“对于你试图解决的问题,AI 确实会告诉你更多你不知道的困难”。它不是一个实际的解决方案。好消息是,大多数人在谈论 AI 时,他们实际上是在谈论某种类型的机器学习。毫无疑问,机器学习是一项技术,而且是一个经过充分研究、明确定义的科学分支。事实上,现在大多数人所说的机器学习是深度学习,也称为神经网络。它早在 20 世纪 50 年代就出现了,因此人们对它进行了广泛的研究。

ML 模型不过是接受输入并提供输出的函数

Thomas Betts:是的,我认为人工智能不是一种你可以买到的产品。你可以买一个机器学习模型。你可以构建一个机器学习模型。你可以将其添加到你的系统中,但你不能只是说,“我想要一个 AI”。但人们就是这么谈论它的。接下来,让我们开始讨论些已经存在的东西,有形的部分。请举几个例子说明一下,当人们说“我想在我的系统中包含 AI”时,他们是怎么想的。他们谈论的机器学习元素是什么?

Anthony Alford:当然,大多数人谈论的是大语言模型或生成式人工智能。作为软件开发人员,我想告诉人们的是,你可以把这些东西看作是一个函数。我们经常编写调用外部库函数的代码。在某种程度上,你可以这样想。它只是一个可以调用的函数。输入和输出都很复杂,对吧?输入可能是一张完整的图片或是一个播客音频,而输出也可能是一些比较大的东西,比如播客的文稿或摘要。

Thomas Betts:大多数人想到生成式 AI 时都是说,给我一些文字、图片、声音。这是输入。对于机器学习模型,所有这些都会归结为 1 和 0,对吧?它会把它们分解成某种它能理解的数据并对其进行数学运算,对吧?

Anthony Alford:是的,没错。同样,当我与软件开发人员交谈时,我说,“当你考虑这些函数的输入和输出时,它们都只是一个浮点数数组”。实际上,它可能是一个多维数组。对此,有一个抽象术语叫向量。如果你看一些常见的机器学习库,就会发现它们用到了向量这个词。它是指一个多维数组,但是你必须能够用向量来表示所有的输入和输出。

构建 ML 模型就像编写大量的单元测试并优化函数

Thomas Betts:是的,这些是我多年前在大学里学到的数学知识,但因为我不是数据科学家,所以我不会每天都用到这些词,我会忘记它们,“哦,是的,多维数组,我知道那是什么”。但实际上,我不需要把这话说出来。我有了作为输入的向量。接下来我该怎么做?如何构建这些模型?

Anthony Alford:如果你真想构建自己的模型,我们可以稍后再讲,但你可能会考虑不那样做。但总的来说,这些模型的构建是一个叫做训练和监督学习的过程。从软件开发人员的角度来看,你真正需要的是一套单元测试。一个非常大的单元测试套件,也就是我们期望的函数的一些输入和预期输出。本质上讲,训练的过程是随机编写一个函数。它从一个随机函数开始,然后不断地修复该函数中的错误,直到单元测试通过。也并不是说一定要通过。你还可以告诉它,“这里有一种方法可以计算测试失败的程度,务必每次都要缩小这个数值”。

Thomas Betts:这就用到概率了,一切都归结为数学。同样,我习惯于编写单元测试,我说,“我的输入是 A 和 B,我期望输出 C”。而你说,“这是 A 和 B,我想要 C”。但这里的问题是,你怎么知道离 C 有多远呢?

Anthony Alford:没错,是这样。这取决于数据类型。我说过,输入和输出都变成了向量,但我们不妨假设一个最简单的情况,比如你正在构建一个输出实际数值的模型。输入是房子的平方英尺和房间的数量等,而输出是预期房价。如果你对它做单元测试,则可以用你期望的数值减去你得到的数值来衡量单元测试的偏离程度。你可以做误差平方和。这样一来,机器学习就会不断地改变函数,缩小误差平方和。对于像文本或图像这样的东西,要衡量单元测试的偏离程度可能会有点麻烦。

语言模型是用句子训练的,用来预测句子中下一个单词出现的概率

Thomas Betts:我们正在深入探讨生成式 AI 的所有概念。到目前为止,我们只谈了文本的例子,暂时还没有涉及音频、图像及其他的东西,因为原理都是一样的。大多数人都熟悉如何与 ChatGPT 交互。我给它输入一些东西,它给我输出一堆文本。这些文本是如何产生的?我们是如何创建这些 LLM 的,让人们可以对它们说,“当我输入这个句子,我期望这个句子得到回应”?

Anthony Alford:好吧,你想听多长的故事?我们可以从 2017 年开始说,或者更早。

Thomas Betts:我们看一些高层次的细节吧。我觉得,那些里程碑式的东西有助于我们了解故事的来龙去脉。

Anthony Alford:你说的对。简单来说,像 ChatGPT 这样的东西或所谓的语言模型,函数的输入是一个单词序列或更抽象的 Token。输出是所有可能的 Token 以及它们成为下一个 Token 的概率。让我们通过一个例子来看一下。如果我输入序列“once upon a...”,下一个单词是什么?

Thomas Betts:我猜是“time”。

Anthony Alford:是的。LLM 会给出每一个可能的单词和它的概率,而 time 是下一个单词的概率非常高。那么像 pancake 这样的词概率就会比较低。这是一个概率分布。我们其实知道答案。在训练中我们知道,对于这个单元测试,time 这个词的概率是 100%,其他单词的概率为 0。这是一个概率分布。LLM 给出的概率分布是另一个。有一种方法可以衡量两者之间的差异,即交叉熵损失。

 

借助这个方法,你就可以训练并改进它。LLM 会使 time 一词在其输出中的概率接近 100%,而其他单词的概率都为零。这是一种语言模型,它们就是利用我上面提到的方法进行训练的。你获取一大堆文本,从中生成一些序列,去掉一个或多个单词,然后再由 LLM 来填充这些单词。它的填充方式就是给出每个可能的单词的概率分布。在理想情况下,你去掉的那个单词概率最高。

Thomas Betts:了解,就像我们多年来看到的图像识别一样。

Anthony Alford:正是如此。

Thomas Betts:我们已经有图像识别模型。比如,我们提一个问题, "我怎么知道这是一只狗,还是一只猫?"然后对它进行训练,说:"这是一只猫。这是一只狗"。然后它就开始以某种方式把这些内容输入到它的模型中。就好像是当我看到这个像素数组时,我给出的答案是一个概率,即它是那张图片中的一只狗的可能性。

Anthony Alford:是的。一般来说,如果我们要讨论数据类型的话,这是一个枚举。对于枚举数据类型,我们可以称之为分类器。你谈论的是,是狗还是猫。它会针对每个可能的输出提供一个答案。每个可能的枚举值都有一个与之相关联的概率。你想要真正的答案接近 100%,而剩下的接近零。对于文本也是一样。LLM 会将整个词汇表以概率分布的形式给出。

神经网络是在做矩阵乘法,而且用的矩阵非常大

Thomas Betts:当你听说这些模型有多大时,就会知道它们受过多少训练。基本上,ChatGPT 和 GPT-4 是用你可能从互联网上能得到的所有信息进行训练的。我不知道这是不是真的,但人们就是这么说的。

Anthony Alford:基本上是这样。那说的是数据集。还有就是组成模型的参数的数量。当我们谈论这些深度学习模型时,我们谈的是神经网络。神经网络本质上就是矩阵乘法。我前面提到过的输入向量,你可以把它们想象成矩阵。你可以用它乘以模型的矩阵。我们说的这些矩阵项有时会被称为权重,因为最终你要做的就是计算输入值的加权和。当我们讨论模型多大时,我们讨论的是其中有多少个矩阵参数。我们不知道 GPT-4 有多少参数。他们没说。GPT-2 的话,它的矩阵中有大约 15 亿个参数。

Thomas Betts:是的,我想现有应该有……

Anthony Alford:数千亿。

Thomas Betts:数千亿,是的。怎么才算大语言模型?数以 10 亿计吗?

Anthony Alford:是的。这不是一个很难达到的数值。但我们现在看到的是,如果模型有数百亿或数千亿参数,那它多半很大。现在也有小一点的,你可以看下 Llama 之类的东西……谷歌的 Gemma,还有微软的 Phi。它们仍然是有数十亿参数的模型…现在,从 10 亿到 100 亿都被认为是一个小模型。那样的模型已经足够小,它们可以在你的笔记本电脑上运行。

Thomas Betts:好吧,你刚才提到了其他几个名字,我觉得那是架构师们喜欢的东西,“哦,我想我听说过 Llama。Gemma 听起来也很耳熟。”还有一个是 Psi 吗?

Anthony Alford:Phi,P-H-I。这是个希腊字母。在美国,我们写成 Phi,但在其他地方是 Phee。

Hugging Face 是语言模型的 GitHub

Thomas Betts:有一个叫“Hugging Face”的网站,我不是很了解。你可以在上面找模型,也可以测试模型。那是个什么样的网站?

Anthony Alford:你可以把它想象成语言模型的 GitHub。事实上,我提到过一个库。他们有 SDK。他们有一个库,一个 Python 库,你可以安装在你的笔记本电脑上,它会在后台下载并运行这些比较小的语言模型,在你的机器上运行。他们所做的就是提供包含我提到的那些矩阵项的文件。

Thomas Betts:那是组合模型,对吧?我一直以为,训练的过程就是我运行程序,然后它输出模型。而这个过程可能需要几个小时或几天,但一旦完成,模型就出炉了。现在模型有了,不管是大语言模型,还是小语言模型,你说我都可以放在笔记本电脑上运行。其中一些,如果是比较小的机器学习模型,我们一会儿就可以运转起来了,对吧?

机器学习生命周期的两个阶段

Anthony Alford:哦,是的。我们可以把机器学习模型的生命周期分为两个阶段,第一个即你提到的训练阶段。我们可以把这个阶段看作是开发一个函数,一旦编写完成,我们就可以构建它,并将其部署为一个 jar,或者某种你可以使用的库。模型训练好以后,你可以加载它并提供输入,然后得到输出,这就是所谓的推理阶段,即模型从输入推断生成一些输出。这就是模型生命周期的两大阶段。

自回归模型会将输出结果作为下一个输入,并将其添加到上下文中。

Thomas Betts:回到大语言模型,你说预测下一个单词,然后再预测下下个单词。在这个过程中,它会向模型反馈。我的理解是,它就像打了兴奋剂一样不断地自动补全,一个字母,一个单词。它就像在说 “我全都会”。它会不断地将正在构建的句子反馈到上下文中。

Anthony Alford:是这样。你会听到人们把这些模型称为自回归模型,而这正是它们在做的事情。你提供初始输入,有时我们称之为 “提示”。我们也把模型的输入称为上下文。提示是初始上下文,然后它会输出一个 Token 并将其放在末尾,作为新的上下文反馈给模型,就这样反复这个过程。它们还能输出一个表示 “停止”的 Token。这样,模型就知道该停止了。我曾在手机上试过自动补全,就是一遍又一遍地重复自动补全过程。虽然最终产生一堆胡话,但思路是完全一样的。

Token 是模型用来做出响应的单词或单词的组成部分

Thomas Betts:你已经说了好几次 “Token”,而我一直在说 “单词(word)”。我知道,外行人通常认为这两个词可以互换,但其实它们并不完全是一回事。Token 并不总是单词。那么在这些语言模型中,Token 是指什么?

Anthony Alford:最开始的时候,人们用的就是单词。我们可能都很熟悉搜索引擎所做的词干提取之类的事情,在这类事情里,单词本身实际上并不能称为 Token。我们之所以想做一些不完全限于单词的事情,是因为我提到过,模型的输出只能是它所知道的 Token。你可能见过这样的情况:“那我们就用字节作为 Token 吧”。现在,Token 就是字节对了。从根本上讲,它不再是单词层面的东西。Token 比单词小。你可能会看到,一个 Token 是几个字母、字符或字节。

Thomas Betts:它不再像以前一样预测下一个单词,而是预测 T,然后是 I,然后是 M,然后是 E。这样做的好处是什么?

Anthony Alford:或者类似的东西,或者 TI。这样做的目的是为了输出那些实际上不是单词的内容,它们不属于常规词汇。

Thomas Betts:现在,它是否已经足够聪明,说 time 是一种可能的 Token,而 TI 是另一种可能?它是否会用两种方式进行分解?

Anthony Alford:分词本身几乎已经成为一种商品。大多数人并没有真正关注具体的 Token 数据集是什么样子的。我认为,通常情况下,你需要的是一种比字符大一点但比单词小一点的东西。研究人员已经做过实验。

Thomas Betts:我在使用 ChatGPT 或 OpenAI API 时发现,它会测量用到的 Token 的数量。有时候,你需要按 Token 数量付费。

Anthony Alford:是的,没错。因为本质上,输出是一个 Token,而对于我们提到的输入,即所谓的上下文,模型有最大 Token 数的限制。现在,很多模型的最大值是数千甚至数十万。但无论如何,它都会有一个上限,使它不能接收比那个值更大的输入。

Thomas Betts:是的,我记得在 ChatGPT 问世时,人们发现了这些限制,因为随着对话的持续,很快,你就会看到对话的第一部分掉出了上下文栈。

Anthony Alford:是的,最大上下文长度内置于模型中。这里有一个算法复杂度的问题,它是上下文长度的平方。随着上下文长度的增大,模型也会随着上下文长度平方的增大而增大,运行时间也会相应地增加,诸如此类。

效率和耗电量

Thomas Betts:这就要说到模型效率问题了。人们一直在讨论,在世界各地的数据中心中,构建并运行这些模型需要消耗多少电力。这是你有模型,这是你需要了解的。

Anthony Alford:非常多。

Thomas Betts:如果模型上下文长度是 3 万或 3.2 万个 Token,再一平方的话,这个数值一下子就变得非常非常大。

Anthony Alford:哦,是的。它不仅会以平方的形式增长,而且好像还有一个很大的乘数。训练这些模型会消耗大量的电能,只有训练它的人才知道消耗了多少。但实际上,没人知道训练 GPT-3 或 4 的云账单是多少,但一定是一笔不小的开支。

Thomas Betts:是的,这就是为什么人们不希望构建自己的模型。大多数人并不需要创建自己的 LLM。这些事情已经完成了,人们正在用它们来取代谷歌搜索。但其中一个问题是,你没有上下文,因为模型不是根据当前事件进行训练的。和使用谷歌不同,你搜索然后获得结果。模型只是预测单词。

Anthony Alford:没错。现在,他们正设法在模型中加入这一点。如果你使用必应,必应实际上已经在使用 GPT-4,它会在它的答案中包含搜索结果。我不想剧透,等我们讲到 RAG 时,再来讨论这个问题。

Transformer——GPT 意味着生成式预训练 Transformer

Thomas Betts:好吧,我们先把 RAG 放在一边,对 Transformer 进行一些更深入的探讨。我想你和 Roland 在你们的播客中已经谈过这个问题了。

Anthony Alford:没错,我们从大体上聊了聊 LLM,尤其是 GPT 家族。GPT 中的 T 代表 Transformer,这是谷歌研究团队在 2017 年提出的。他们写过一篇论文,题为 Attention is All You Need。他们当时正在研究翻译。而在此之前,翻译模型使用的是递归,这与我们所说的自回归并不相同。总之,他们提出了这个模型,其实只是使用了一种叫做 Attention 的特性或机制。他们称之为 Transformer。

 

现如今,所有的语言模型都以此为基础。这就是 GPT 中的 T 所代表的含义。GPT 代表生成式预训练 Transformer,它们都使用这种 Attention 机制。你可以把 Attention 理解成模型挑选输入序列中重要内容的一种方式。我认为,这类似于信息检索,使用了很多概念,比如查询、键和值。但总的来说,它是一种方法,让模型能够识别出输入序列的重要部分,并据此生成下一个 Token。

Attention 会对输入进行加权

Thomas Betts:它可能会丢掉你的一些输入,或者重新分类,然后说 “这些是该上下文中的重要单词”。

Anthony Alford:运算过程是,找到与查询匹配的键,然后返回与之相关的值。很多时候,它确实会侧重于输入的某些部分,而不是其他部分。

Thomas Betts:权重就是在这里加入的,对吗?

Anthony Alford:完全正确。就是这样。

Thomas Betts:你提到,这些矩阵都有权重。它会确定输入哪些单词或部分,而一个单词的权重并不总是相同的。在特定输入的上下文中,它的权重可能变高。

Anthony Alford:对,你解释得比我还清晰。

Thomas Betts:这不是我第一次尝试解释这个问题了。每次我都会解释得更好一点。这也是我想做这期节目的原因之一。

在你的产品中加入 LLM

Thomas Betts:我们已经谈了 Transformer,这只是一个术语,还有 Attention,用于确定输入的内容。我们以 GPT 为例讨论了输出,但 GPT 是一个品牌术语,LLM 才是通用术语,对吗?

Anthony Alford:是的。

Thomas Betts:这就像面巾纸和纸巾的区别。比方说,我想在我的应用程序中使用这些 LLM。我的产品负责人、首席执行官就会说,“在上面加点人工智能”。我希望看起来我们是在创新。我们必须要有一些前瞻性,比如 “看看模型怎么样并提出看法”。在这方面,我们该怎么做呢?

Anthony Alford:我能插播一篇 InfoQ 的文章吗?就在今年年初,我编辑了电子杂志《生成式人工智能的实际应用》(Practical Applications of Generative AI)。我们特别邀请了几位 LLM 专家来讨论这个问题。强烈建议大家都读一读。我们有公开发行的商业 LLM,比如 ChatGPT 的 GPT,还有 Claude,以及谷歌的 Gemini。亚马逊云科技也有一些。总之,如果你发现其中一种看上去有效,那就试试。这样,你可以利用这些商业软件中的一种,快速采用 LLM 功能。那只是一个 API,一个基于 Web 的 API。你可以使用 SDK 调用它,所以它看起来和其他 Web Service 一样。

 

这是第一点。第二,长期成本,对吧?因为这是一个 Web 服务和 API,就像我们说的,我们是按 Token 付费的。实际上,这可能很便宜。但从长远来看,成本是个问题,隐私也可能是个问题。虽然这些商业 LLM 承诺“我们不会保留你的数据,我们会保证你的数据安全",他们也确实做得更好了,但是,在代码生成等情况下,它也会把数据返回给你。

 

我记得最近发生了一起诉讼。有人的代码被用来训练模型,他们会说,这个东西输出的是我的代码,对吧?有人担心会侵犯版权。无论如何,从长远来看,如果你想将 LLM 功能引入内部,你可以使用其中的一个开源模型。你可以在自己的云中运行它,也可以在自己机器上的公有云中运行它。这样你就能更好地控制它。

Thomas Betts:就是构建和购买模型的差别,对吗?

Anthony Alford:正是如此。

Thomas Betts:“让我们看看这是否可行 ”,我喜欢这样的想法。做实验。在公有云上进行这些测试,或许可以设置一些非常严密的防护措施,以确保不会发送私人数据。这里我又得插播一条 InfoQ 的信息。最近,AI、ML 趋势报告出炉了。我听了那个播客。其中提到,在将数据发送到 OpenAI 或他们正在使用的 API 之前,由于他们做了太多的设置来过滤和清洗数据,导致一些重要的背景信息被删除,所以返回的结果并不理想。一旦将模型引入公司内部,你就可以说:"哦,数据归我们所有。数据永远不会离开我们的网络。我们可以发送任何数据"。突然之间,返回结果的质量也提高了。

Anthony Alford:毫无疑问,这个实验很容易做。如果你发现实验有效,那么将其引入公司内部也是可行的。简单来说就是这样。

自托管开源 LLM

Thomas Betts:就像你说的,“如果你想按使用付费,那很容易上手”。这是一种方法。至于你说的引入内部使用,你提到,可以在自己的云上使用模型。就像我们在 Azure 和亚马逊云科技的云上一样。那从根本上讲,是不是我启动一个 EC2 实例,然后自己安装就行了。

Anthony Alford:这是一种方法。当然,像亚马逊云科技这样的服务提供商会给你一个增值版本,并为你启动它,这与按使用付费的常规模型非常相似。没错,你可以这么做。你可以在 EC2 上实现。

Thomas Betts:好的。你有没有在做产品即服务、平台即服务、基础设施即服务,如果是的话,那么你可以在上面做任何你想做的事情。你得到的结果可能会有所不同,但这可能是你在下一阶段实验中要采用的另外一种方式。对我来说,启动个系统,部署个模型,然后说:"好吧,这是我们使用公共 API 得到的结果,这是我们在公司内部使用私有 API 得到的结果。“也许你会考虑成本,也许你会考虑结果的质量。

Anthony Alford:是的,当然。

LLM 比较

Thomas Betts:人们是怎么比较这些模型的?对于使用 OpenAI 和我从 Hugging Face 上拉取的某个模型,我该怎么做同类比较?

Anthony Alford:这确实是个问题。这些模型变得越来越好,做出这样的比较更难了。过去,对于线性回归之类的东西,对于监督学习,我们知道答案,我们可以有 一个指标,基于准确率之类的东西。平方误差的总和是多少?但如今,ChatGPT 的输出效果如何?好吧,如果你让它帮你做作业,然后你的作业得了 A,那就相当不错了。事实上,不管你信不信,他们现在经常用这些模型做这样的事,他们说:“我们训练的这个模型可以参加 AP 化学考试,并且能及格”。

 

在文献中,我还经常看到另一件事,就是他们将自己的模型与基线模型进行比较,他们会让两个模型用相同的输入生成输出,然后由人类评委对它们进行比较。就像比较可口可乐和百事可乐,五个人中有四个选择百事可乐。更有趣的是让 ChatGPT 担任评委。你可能不相信,很多人在这么做。我想这并不容易。

Thomas Betts:是的,我一般会说这些事情是非确定性的。你讨论的是概率,你不知道答案会不会出来。我问了个问题,得到了个答案。因为你可能不知道会有什么类型的问题,所以你也不知道会有什么样的结果。

Anthony Alford:是的,确实是这样。最可怕的事情之一就是你不知道会输出什么。可能发生一些非常令人不快或尴尬的事,人们在生产环境中使用这些东西时确实会有这样的担心。

Thomas Betts:是的。

在应用程序中采用 LLM 之前,请先定义成功的标准

Anthony Alford:但我要说的是... 让我们回到那份电子杂志,我们邀请的一位专家指出:“在应用程序中采用 LLM 之前,你应该定义好成功的标准”。这可能是最难的部分。我该如何知道是否已经成功?这取决于你的应用程序,但这是一个应该认真考虑的问题。

Thomas Betts:我喜欢这个说法,因为它把问题又推回给了产品负责人。首席技术官们说,“我需要一些人工智能”。你希望发生什么?因为有很多地方是不应该加入人工智能的。我在从事会计系统开发。你不应该让它猜测你的账本。

建议将 RAG(检索增强生成)作为改进 LLM 采用的早期步骤

Thomas Betts:当我们谈论自己使用这些模型时,无论是托管还是内部使用,我们如何才能获得更高质量的结果?我们是否可以直接使用它们?不久前,我从一个播客中了解到了检索增强生成技术。我经常听到有人谈论 RAG。请简要介绍一下这是什么,以及为什么这应该把它作为改进 LLM 采用的第一步。

Anthony Alford:还是在专家座谈中,他们说,“首先要尝试更好的提示”。我们都听说过提示工程。我们知道,在与 ChatGPT 交互时,你的措辞会对它的响应产生很大的影响。一定要尝试不同的提示。下一步是检索增强生成(RAG)。我想我们提到过,LLM 经过训练,但它们不知道训练后发生了什么。如果我们问谁赢了昨晚的足球比赛?它不知道,或者它可能不会说它不知道,而是会编造一些完全虚假的事情。这对企业来说是个问题,因为你希望它了解你的内部知识库,对吗?比如你想让它知道维基或文档中的内容,诸如此类。RAG 的原理是将文档分成若干块,本质上,是将一块块文本通过 LLM 生成一个个单独的向量。

 

这就是所谓的嵌入。向量以某种方式对文本的含义进行了编码。你可以对所有的文档做这样的处理,然后你就有了一个数据库,每个文档都有一个与之相关的向量,它可以告诉你一些关于文档含义的信息。然后,当你向 LLM 提问时,同样的,问题也会转化为一个向量,而向量数据库可以让你快速有效地找到与问题相近的向量,也就是意义与问题相近的向量。它会获取这些内容,并将其与你的问题一起填充到 LLM 的上下文中。现在,它连同你的问题都知道了。我们知道,这些 LLM 非常擅长... 如果你给它一大段文字,然后说 "解释一下这个” 或者 "这里有个关于这段文字的问题” 。很好,这就是意向机制的作用,让模型能够从那个文本块中找到相关的部分,来回答或解决你提出的问题。

Thomas Betts:我听到的解释是,假设我进行搜索,我愿意坐在那里输入 30 秒钟,这就是我想出的所有词,但我不会写一个非常详细的提示。恰恰相反,我会说 “根据这些文件回答问题”。我可以把所有这些文件包含到上下文中,现在它知道了, “这就是我要用的”。我不会只用基础的 LLM 预测下一个单词。我要根据上下文来预测下一个单词。

Anthony Alford:没错。检索部分会自动查找这些文件,并将它们包含在上下文中。这个部分很关键... 如果你确实知道这些文档,比方说,有人给了你这些文档,“这是我们的用户手册,请回答相关问题”。对于客户服务人员来说,这是一个很酷的用例。如果用户手册足够小巧,能够包含在上下文中,可能有数十万 Token,那就再好不过了。但也许,你没有这样的手册。也许你有一堆的知识库文章。它会找出正确的知识库文章,然后根据这些文章来回答问题。

Thomas Betts:没错,因为我们的知识库有数万篇文章,而不是几百页。

Anthony Alford:确实如此。

Thomas Betts:你还在使用 LLM,它已经有了补全句子所需的全部知识。

Anthony Alford:是的。

微调是使 LLM 更符合你需求的一个选项

Thomas Betts:不是基于知识库或训练文档新建一个模型。

Anthony Alford:没错。但假设你确实想这么做,而且在某些情况下这可能是更好的解决方案,那么有个过程叫微调。我前面提到过, GPT 中的 T 是 Transformer,P 是预训练。这是机器学习中一个完整的子领域,叫做迁移学习(transfer learning)。你可以预训练模型,而模型是通用的。然后,你可以根据具体情况对其进行微调。在 GPT-2、3 及更高版本中,他们发现你不需要这样做。它本身就已经很不错。但微调的作用是对模型进行额外的训练。不是原封不动地使用模型,而是要重新开始训练过程。你有自己的单元测试集,有自己的微调数据,知道输入和输出。微调的好处是,它所需的数据集比训练完整的 GPT 要小得多。

Thomas Betts:这是因为你是从已经存在的东西开始的。

Anthony Alford:的确如此。

Thomas Betts:你不是从基线或零开始的,只是说要调整你的模型。这就又回到了我所理解的机器学习训练的肤浅层面,“你可能过度训练数据”。如果你在一个领域给出了太多的答案,就好像 “看,我们达到了 99.9%”。但是,当有东西进来时,它却不知道,也给不出答案。这就离谱了。但在这种情况下,如果我想让模型仅限于我公司的应用程序和数据,那么那可能就是我想要的结果。我不希望有人用我的客服聊天机器人询问 Taylor Swift 的下一场演出是什么时候?

Anthony Alford:是的,没错。事实上,无论是最初的 ChatGPT 还是更新的模型,他们都会对其进行微调,以便模型能给出更有用的答案及遵循指令。GPT-3.5 也是如此。基本上,该模型是基于整个互联网进行预训练的,它能给出相当不错的答案,但他们发现,有时它给出的答案...... 就像那个笑话说的,技术上是对的,但一点用处都没有。因此,他们对其进行了微调,使其可以遵循指令给出更有用的答案。他们称其为 “对齐”。其方法是,他们有一个小型数据集,"这是输入,这是你给的输出,但这些输出更好"。他们通过对其进行微调,以获得更恰当的输出结果。

向量数据库提供最近邻搜索

Thomas Betts:我们回头看下前面提到的一个东西。你提到,创建向量时要有一个向量数据库,可以进行向量搜索。对于这个术语,人们可能会问,“我有向量数据库吗?”我想 Azure 刚刚宣布他们将……我想现在那还处于 Beta 测试阶段。基本上,把你的 Cosmos 数据库变成一个向量数据库,就像在门户中反选一个复选框那么简单,眨眼间,你就有了向量。这对我有什么用?为什么这会是一个优势呢?

Anthony Alford:好的,我即将播出的播客就是关于这个问题的。我们提到,对于一大段文字,你可以从中创建一个向量来编码其含义。这个向量的维度非常高。有成百上千个。你要解决的问题是,给定一个向量后,如何在数据库中找到与输入向量相近的向量?你可以把所有的向量都找一遍。基本上是进行全表扫描,然后对输出进行排序。这样做其实也不算错。但这种方法的复杂度很高,在大规模运行时效果也不会很好。你需要的是更类似于 B 树查找的方法,这种方法的复杂度是 log-N。实际上,向量可能不是最重要的部分,最近邻搜索才是。我们要解决的问题是,给定一个向量输入,在你的数据库中,该向量的最近邻是什么?这就是你想要以高效、可扩展的方式解决的问题。

Thomas Betts:了解了。它遍历、查看我的数据,然后说,“这是所有参数的向量”。基于此,这些是相关的单词…?

Anthony Alford:不,从字面上看不是这样的。它只是给出两个向量,以及它们有多近。

Thomas Betts:向量有多近?它不知道向量来自哪里?

Anthony Alford:没错,就是这样。现在,一旦找到了相近的向量,同一数据行中的内容或者一个指向内容的指针才是你真正关心的。

Thomas Betts:了解了。

Anthony Alford:但数据库的作用是进行最近邻搜索,你给它一个向量,它就会在数据库中找出最接近的 K 个向量。

Thomas Betts:是的,我认为,我们又回到了起点,人工智能作为一种产品的情况并不存在。我们使用模糊搜索技术已经有一段时间了。这一直是人们想要的东西,每个人都已经用惯了谷歌。我可以输入任何我想要的东西,它总能找出答案。就像你说的,你把词干... 这是另一个问题,我没有准确地说明想要什么样的答案。因此,这不是在数据库中找到这一行,而是找到与我的意图相近的记录,这才是它们正在做的。

Anthony Alford:是的,我想你可能会发现,人们称之为语义搜索或神经搜索,意思是,向量是从神经网络中生成的。

Thomas Betts:但一切都与此有关。我不知道有什么东西可以用来找出意图。

LLM 是解决自然语言处理(NLP)问题的工具

Thomas Betts:我想,在我的认识中,LLM 确实属于自然语言处理的范畴,对吗?

Anthony Alford:是的,没错。

Thomas Betts:因为它们曾经是一回事。我的团队里有数据科学家,他们从事自然语言处理领域的工作。现在它们还是一回事吗?它只是一个子集,还是说它在 LLM 相关的新闻中被滥用了?

Anthony Alford:我认为,你可以把 LLM 看作是解决自然语言处理问题的工具。例如,我们曾经研究过命名实体识别、语音识别等诸如此类的东西。这仍然是你必须做的事情,但 LLM 可以帮你做。

Thomas Betts:好的。

Anthony Alford:它可以做得很好,而且是开箱即用的。再说一下,我们说,Google 和 Attention 就是你需要的所有东西。他们提供了一个叫 BERT 的版本,可以做命名实体、词性、标记之类的事情。

LLM 很有用,因为它们非常通用,但这并不能使它们成为通用人工智能

Thomas Betts:了解。这些 LLM 都是通才。得想办法让它们更具体。如果你心中有一个特定的用例,那么你可以沿着一条微调路线前进。你可以找到另一种更符合要求的模型,这会有不少好处……运行成本会更低,答案的质量可能会更高,返回结果的速度可能会更快,如果计算量更少的话。

Anthony Alford:是的,这也是人们对 LLM 感到兴奋的一个原因,因为它们非常通用。于是人们开始问,"这是通用人工智能吗?” 这一直是人工智能研究的圣杯。是的,我们可以做出一个下棋下得很好的程序,但它不能开车。圣杯就是建立一个能解决任何问题的模型。我们自诩为人类,我们可以完成很多不同的任务。我们可以做播客。我们可以制作赛车模型或阅读书籍。人工智能的圣杯就是一个模型统治一切,而 LLM 不需要做任何额外的训练就能做很多事情。早期的 GPT 论文就是这样写的:”看,我们把这个东西做出来了。它可以完成摘要、问答、翻译、代码生成等所有任务。“这也是它让人们为之兴奋的原因之一。它看起来无所不能。

Thomas Betts:是的,我认为,现在的问题是我们如何使用它?因为它看起来很强大。但回到你的观点,你头脑中要有一个具体的产出。你的目标是什么?为什么要添加这个?因为这听起来很刺激。每个人都想使用它,但你要有一个意图。如何把它融入你的产品?如何把它融入你的解决方案?

Anthony Alford:是的。根本问题是,我要解决什么业务问题?我怎么知道我是否成功了?

AI Copilots 与 AI Agent

Thomas Betts:时间就要到了。我再问最后一个问题,然后我们就总结下。

Anthony Alford:好的。

Thomas Betts:什么都是 Copilot?这又是一个术语。它与 AI Agent 有什么不同?它们听起来都像是把一个东西人格化。关于这一点,可以另外做一番讨论。但它们不是一码事。Copilot 和 Agent 有什么区别?

Anthony Alford:我想,我们在 “趋势播客 ”中已经讨论过这个问题。Agent 有一定程度的自主权,而 Copilot 则是必须由你按下按钮让它启动。重申一下,我不想把这变成对人工智能的恐惧。在我看来,人们对人工智能的恐惧是对自主人工智能的恐惧。如果我们能通过 Copilot 来减轻这种恐惧,那么这也许就是我们要走的路。但我认为,关键在于自主性。对于 Copilot,它的回答必须有你的同意,然后它才去做。

Thomas Betts:Agent 可以自己做事情,但我们可以有主 Agent。就像你说的,“我不知道如何判断输出,所以我要问 ChatGPT,‘我是否正确地训练了我的模型?’“然后你把它反馈给另一个 AI。AI Agent 的情况是,你有一个主 Agent,它监督其他 Agent,那谁来监督主 Agent 呢?

Anthony Alford:监督监督者?是的,确实是这样。

总结

Thomas Betts:非常感谢你抽出时间。我学到了很多,希望本期内容对观众有所帮助。

Anthony Alford:我也是。

Thomas Betts:回顾并更新下我自认为已经理解的东西总是好的,而且是借助从真正懂行的人那里听来的信息。对于我们提到的内容,我会提供相关的链接。eMag 很棒。

Anthony Alford:对的。

Thomas Betts:然后是趋势报告、播客和其他一些内容。Anthony,再次感谢你参加 InfoQ 播客。

Anthony Alford:这是我的荣幸。感谢你的邀请。

Thomas Betts:希望下次你还能来参加我们的活动。

 

声明:本文为 InfoQ 翻译,未经许可禁止转载。

 

原文链接:https://www.infoq.com/podcasts/primer-ai-for-architects/

2024-11-12 16:204154

评论

发布
暂无评论
发现更多内容

依赖倒置和案例

王锟

ARTS打卡Week 04

teoking

ios LeetCode ARTS 打卡计划

用接口隔离原则优化 Cache 类的设计

朱月俊

一个包子铺看懂 I/O 模型演变

小眼睛聊技术

Java 程序员 架构 后端 nio

架构师训练营二期作业

老姜

第二周作业

武鹏

架构师训练营第二章总结

叮叮董董

第二次作业总结

朱月俊

架构师训练营第二章课后作业

叮叮董董

品软件架构原则模式之美

老姜

千万不能让程序员给娃娃取名字

码农神说

程序员

什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?

朱月俊

618你的系统顶住了么?系统发生重大灾难难道只能“删库跑路”?

punkboy

架构师训练营-第二章-依赖倒置原则&接口隔离原则

而立

极客大学架构师训练营

第二周学习总结

武鹏

产品视角看推荐算法

峰池

人工智能 算法 产品经理 推荐算法

“麻烦”的处理流程

zhoo299

随笔杂谈

第二次作业

朱月俊

老大吩咐的可重入分布式锁,终于完美的实现了!!!

楼下小黑哥

Java redis 分布式锁

做一个有原则的码农可好?

Dawn

极客大学架构师训练营

这也太拧巴了吧?结局意想不到

非著名程序员

程序员 程序人生 提升认知

依赖倒置原则

极客李

哪些框架是遵循依赖倒置原则的?

朱月俊

小师妹学JVM之:GC的垃圾回收算法

程序那些事

JVM 小师妹 JIT GC 签约计划第二季

基本的面向对象原则(Basic OO principles)

旭东(Frank)

编程思维 极客大学架构师训练营

架构师训练营 - 第二周架构师实现自己架构的主要手段

zcj

极客大学架构师训练营

架构师训练营第二周

小树林

给行动找个理由

Neco.W

行动派 决策

为什么坐车会晕车呢

石云升

生活,随想 日常思考 晕车

数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作;PG流复制踩坑;PG异机归档;MySQL架构选型;Oracle技能表;Oracle文件损坏处理……

墨天轮

数据库

架构师训练营第2周学习总结

Season

极客大学架构师训练营

Anthony Alford访谈:AI架构入门_生成式 AI_Thomas Betts_InfoQ精选文章