AI 大模型怯魅

2024 年 06 月 24 日

离开上家公司之后,暂时没上班,一直在跟朋友一起做一些 AI 相关的尝试。在研究的过程中,发现很多人对 AI 的观点已经近乎于玄学,哪怕是有技术背景的人也可能会出现这种情况。也就是说,很多人因为不了解 AI 的实现原理,所以对其脑补了太多貌似合理的理论。对于我这种理性逻辑比较强的人来说,这完全不合逻辑。所以,我想根据我现在的了解,来尝试说明一下,我们现在面对的 AI 大模型,到底是怎么做到现在我们所见到的这些功能的。

注:以下内容得到了 gpt-4o@chatgpt 的大力支持,我就不感谢了,因为感谢了它也不知道。

AI 大模型做了什么

先从简单的地方开始。

所有的计算机程序运行起来,说到底无非不过就是两点:输入 -> 输出。就是说,你给它输入了一系列数据,它根据它的程序逻辑,给你输出一系列数据。

AI 大模型也只是一个程序,它的输入 + 输出可能是下面这样的:

  • 输入文字 -> 输出文字:比如最常见的问答,故事补全等。
  • 输入文字/图片 -> 输出结构化数据:比如问题分类/数据提取,给它一张图片,它告诉你图片里是否有一只猫。
  • 输入文字 -> 输出图片/视频
  • 输入图片 -> 输出视频
  • 其他类似 ……

这个列表还可以很长,但其实本质是类似的。下面以最基础的输入文字 + 输出文字的类型来说明。这种类型叫做 LLM(Large Language Model),因此后面说到 AI 大模型时,我就只说 LLM 了。

LLM 如何根据输入的文字来输出文字

几乎所有人看到 ChatGPT 的时候,都会惊叹于它输出的回答像人一样,包括我在内。

但如果对它的理解仅止于此,必然会对它产生很多不切实际的想象。这对于开发者来说,可没有什么好处。

用尽量简单的话来说,LLM 其实是在 补全 你的问题

常见的一个简单例子是这样的,你的问题是:"The sky is",LLM 补上 "blue"。这就成为一段完整的话。

所以简单来说,LLM 其实就是”根据你输入的文字“,查询模型本身保存的数据,根据查询结果预测”最接近的完整的一段话“,然后把这段话剩下的部分输出给你。

正如我们平时看到的那样,LLM 的回答都是一个词一个词的蹦出来的。就是说,预测的过程不是一蹴而就的。实际上,LLM 每次都只是预测下一个词(或者一个短语),直到满足它的停止条件。

预测下一个词的过程,叫做语言生成(Language Generation)。

接下来,这个过程还可以再展开一层来说。

如何预测下一个词

没有问 ChatGPT 之前,我以为这里只是简单的根据文本的余弦相似性来判断的。有兴趣的朋友可以去查一下这个关键字。不过这不重要,因为按照 ChatGPT 的描述,实际的过程比余弦相似性要复杂的多。所以我在这里只是简单尝试描述一下大概的过程。

  1. 将词转换为词向量

首先,LLM 会对我们输入的所有的词转化为词向量(Word Vectors),这个过程叫做嵌入(Word Embedding)。这些概念都是公开的,我就不去照搬 ChatGPT 的大段回答了。简单来说,这一步将我们输入的文字,转化为了数值向量的形式。一些词义近似的词,即使文字差别很大,他们的数值向量将会非常的接近。

将词转化为词向量的方法,是根据词嵌入模型(Word Embedding Models)来的,比如 Word2Vec,GloVe 这些,在这里就没有必要展开了。

  1. 将向量集合转换为 Attention Outputs

经过词向量的转换,实际上我们得到了一个向量集。这个时候要考虑上下文,就会使用 Transformer 了。GPT(Generative Pre-trained Transform)就是一种 Transformer。

还是尽量用简单的概念去解释,Transformer 实际上是根据其训练时大量输入的数据集,捕捉输入序列中词与词之间的关系,从而得到的一个多层的权重矩阵。这里的措辞肯定是不精确的(Transformer 的范围实际上更大),但从简化理解的角度来讲,我觉得还好。

用得到的向量集,跟 Transform 中的权重矩阵进行运算(这里的概念请回忆线性代数)。经过运算之后,会得到一个新的值矩阵,叫做 Attention Output,其中的值都是所谓 Attention Score。

这里,Attention Outputs 实际就是结合了“输入序列的词之间关系”的“新的数据表示”。

  1. 通过 Attention Outputs 预测下一个词

接下来就是根据 Attention Outputs,来计算“哪一个词会成为下一个词”的概率了。其实前面的过程应该算是 Transformer 模型中的编码器(Encoder)执行的,也就是将输入的文字(包括已经生成的部分输出)转换为 Attention Outputs。接下来的过程是由解码器(Decoder)完成的。

解码器经过运算,得到当前词汇表中,所有可能的下一个词的概率分布。这里经过了线性层(Linear Layer)和 softmax 层。细节我不太清楚,也就不多解释了,需要了解的话,专门去看这一层就好。

得到了概率分布,选择下一个词就不是太困难了。注意这里并不一定是选择概率最高的,也有可能会加入一些随机性。

  1. 迭代生成

预测得到下一个词之后,将新的词追加到原有的输入后面,就得到了一个新的输入。然后再把这个输入丢进去,预测下一个词,直到满足停止条件(比如得到了生成完成的标记,或是长度超出了限制等等)。

从基本的概念上来讲,LLM 就是按照上面的流程生成一段完整的回答的。很明显,这里并不是玄学。当然,我的表述无法涵盖所有细节,甚至细节上可能有错,但基本的逻辑上我相信是正确的。

根据 GPT 的版本迭代可以看出,在当前阶段,更大的模型将得到更好的结果。那么在更大的模型到来之前,还有很多方法可以使得 LLM 的输出更好。比如微调和 RAG。

微调(Fine Tune)和 RAG(检索增强生成)

注:经常有人说 RAG,但没人说检索增强生成,后者中文太拗口。微调这个词就反过来了,是英文太拗口。

微调和 RAG 这两种技术,都是用来改善输出质量的。也就是说,让 LLM 的输出更好。

关于 “改善输出质量”,这个说法其实也比较绕。具体一点说,LLM 在训练时,出于通用性(或者说泛化)的考虑,是没办法把一些特定的知识放进去的。拿常见的情况来说,比如法律专业有大量的案例,使用各种专有名词。如果普通人提问的时候,LLM 老是拿法律文书上的语法和措辞来回答的话,给人的感觉就不好了。但如果是法律专业人士提问的话,LLM 不使用业内专有名词和语法,反而会让他们感觉不好。

所以说,要想让 LLM 能够支持专用的场景,就必须给它专用的数据。这就是微调和 RAG 所做的事,也就是给 LLM 添加专用的数据。这两种方法做法不同,各有优劣。

微调

就像前面说过的,LLM 实际上主要是一个多层的权重矩阵,微调的本质就是,根据新的输入,调整这个权重矩阵中的值。这样输入进来就会得到不同的输出。

微调的好处很明显,如果某个专业的知识量巨大,历史信息非常丰富,那么经过微调,这些信息都会被写入到原有的权重矩阵中。就好像是一个人背过了很多本书,你问他什么问题他都可以随口引用书上的内容回答你。

但这样也有缺点。还是拿背书来打比方。一个人的脑力是有限的,背了太多书之后,其他方面的知识他就记不住了,甚至可能影响他记忆一些常识性的知识。

RAG

RAG 不去改 LLM 的权重矩阵的值,对于 LLM 而言,它是一套外部的系统。

对于所有提出的问题,要先经过 RAG 溜一圈。RAG 根据分词、关键字查找、向量计算等等各种方法,在其知识库中找到可能跟问题相关的段落,然后将问题和和这些段落一起丢给 LLM。然后由 LLM 去整理回答。

还是拿人做比方。如果微调是让一个人记忆了很多新书,那么 RAG 就只是给这个人递了小抄。

RAG 的好处是即时性,特别是对于私密数据而言。比如一个人的行程,昨天干了什么,今天干了什么。LLM 训练时是不可能知道的。RAG 可以在本地查找其最新的私密数据,交给 LLM,由 LLM 给出输出。

RAG 还有一个好处是精确,LLM 由于随机性、错误的输入等等原因,可能会出现答非所问的所谓“幻觉”问题。RAG 可以限定 LLM 在其给出的数据范围内精确回答,可以大幅降低 LLM 出现“幻觉”的可能性。

但 RAG 的缺点也很明显,就是所谓的上下文窗口限制,或者可以说是小抄的长度。LLM 能接受的输入长度是有限的,但 RAG 查找到的数据量很可能超出这个长度。

所以什么时候用微调?什么时候用 RAG?

个人认为,根据如下简单判断:

  1. 特定领域,大量专业数据,需要对数据做深入理解和分析,用微调。
  2. 动态信息,私人数据,数据量相对较小的情况下,用 RAG。

微调和 RAG 都只是改善 LLM 输出结果的。要做一个专用的完整功能,这还不够,要考虑 Agent。

Agent 在做什么

既然 LLM 已经简化为输入文字 -> 输出文字,它就跟程序中的一个函数没啥区别了。

通常来说,要做一个完整的功能,要写完一个完整的程序。对于基于 LLM 或者其他 AI 大模型的应用来说,这个完整的程序就是 Agent。

比如说,帮用户生成简历这种功能,可能要重复跟用户交互,引导用户输入相关信息,然后收集这些信息,再让 LLM 整理后输出一份完整的简历文档。这就是一个完整的 Agent 可以做到的功能。现有的 Agent 平台通常可以提供各种辅助的组件,让使用者通过工作流组合得到一个 Agent,减少或避免使用者编程的工作,降低门槛。

从这个角度来说,我觉得所有的 Agent 平台都没有太大不同。只要是主流的 Agent 平台,任何一家出现新的功能,估计都会很快的被其他家抄走。

吴恩达最近讲了 Agent 设计的四种设计模式,从中可以看出 Agent 到底能做些什么:

  • Reflection,反馈,也就是说人工对回答进行评价,使得 AI 调整其输出。或者也可以理解为 AI 自行反馈,比如生成一段代码然后自行调试直到通过。
  • Tool use,即 Agent 使用工具增强其能力。比如调用已有的一些 API 接口,或者搜索引擎,可以让 Agent 去得到新的数据,然后将这些新的数据整合到输入或输出中。
  • Planning,规划,这个解释起来比较复杂,给人的感觉似乎是根据规划算法,分析一个任务的执行方法,然后调用各种工具去尝试完成。
  • Multiagent collaboration,多个 Agent 协同工作,比如一个做设计师,一个做程序员,一个做测试。微软的 Autogen 似乎就是能够支持这种模式的一个框架。

但实际上,Agent 并不一定非得要在 Agent 平台上创建。Agent 平台只是降低了普通人创建 Agent 的难度,但同样增加了限制。对于开发者来说,直接写代码有更大的自由度和性能优势。

总结

所有新技术在一开始出现时,都如同神迹。如果不去深究,那么它对我们来说就会一直保持神秘感。但深入分析一下,就可以看出它并不是那么的不可捉摸。了解的越多,我们就越可以猜测它未来的走向,然后去分析我们可以基于它做些什么,而不是凭感觉在那里猜测。我觉得这才是做技术的人应有的态度。

Top