本章介绍本书的核心理念:构建 GenAI 应用,最好的方式是使用成熟的软件工程工具、抽象和模式,而不是重新发明轮子。
在本章中,我们将研究抽象和设计模式在 GenAI 中的作用;学习如何把新的 GenAI 术语映射到熟悉的 IT 概念;从高层视角概览 LLM、向量数据库和嵌入;从直觉层面理解 LLM 的工作方式;并理解什么是智能体式 AI,以及为什么在选择任何工具或框架之前,都应该先理解其底层模式。本章为后续所有内容奠定概念基础,因此在阅读其他章节之前,应该先阅读本章。
本章将涵盖以下主题:
- 词汇桥梁:GenAI 术语及其 IT 等价概念
- 学习 GenAI
- 关于抽象和模式的使用
- 本书如何使用模式
- 将 GenAI 微架构拆解为组成模式的好处
- 什么是 LLM?
- LLM 如何工作?
- 什么是智能体式 AI?
GenAI 正在被证明很可能是软件工程师和 IT 部门迄今为止面对的最具变革性的力量。幸运的是,在过去几十年中,工程最佳实践已经不断演进,使我们能够在这个快速变化的技术世界中继续发展。在这些最佳实践中,抽象和模式的使用尤其突出。
如果你曾经使用过白板,那么你很可能已经直觉上理解了抽象和模式。本章将概览你需要了解的关于抽象和模式的内容。在本书使用某些模式的地方,我们会事先对相关模式进行详细解释。
围绕 GenAI 的许多讨论会把它视为一种完全崭新的事物,暗示 GenAI 项目需要全新的技术和方法。但现实是,只有使用现有工具、范式以及长期形成的工程最佳实践,才能真正把 GenAI 应用构建好。在本书中,我们将展示如何使用成熟且可信赖的工具和流程来构建 GenAI 应用。
自本书最初构思以来,模式出现了一种新的用途。模式不仅有助于记录架构并向架构师和工程师沟通架构,它们也非常适合那些希望向 AI 描述自己想让 LLM 生成什么应用的 vibe coder。因此,软件模式也已经成为 vibe coding 的通用语言。
词汇桥梁:GenAI 术语及其 IT 等价概念
在一个高度碎片化的世界里,多种技术和工具供应商相互竞争以争夺主导地位,旧概念有时会被遗忘或重新发明,熟悉的术语也会被重新定义。GenAI 也不例外。至少目前,我们看到一种趋势:人们更倾向于把一切重新发明成新的东西,而不是扩展既有知识和软件最佳实践。这有时会让学习 GenAI 变得令人困惑。
表 1.1 是一份方便的速查表,用于把新的 GenAI 专有术语翻译成传统 IT 中更熟悉的术语。请注意,每一个听起来很新的 GenAI 概念,都有一个软件工程师已经使用多年的成熟等价概念。
| GenAI 术语 | 传统 IT 等价概念 |
|---|---|
| Agentic pattern | 由 GoF 和 Fowler 模式组成的微架构 |
| Agent | 组件 |
| Short-term memory | 会话状态 |
| Long-term memory | 记录系统 / 权威数据系统 |
| Multi-agent system | 组件架构 |
| Tool | 适配器 |
表 1.1——术语速查表:GenAI 术语与传统 IT 等价概念的映射
如果我们深入观察当今许多新工具的内部,就会发现它们使用的仍然是多年来企业系统中一直使用的编排和协作模式。然而,这些新工具往往还不具备老牌工具那样的成熟度和可靠性。统一的词汇也有助于我们更好地理解所使用工具之间的相似性,并帮助我们为任务找到合适的技术。
本章余下部分将概览 GenAI 图景,包括从高层视角介绍向量数据库、嵌入和 LLM。虽然讨论层次较高,但它覆盖了构建 GenAI 应用所需的核心知识,并为你理解本书后续内容,以及整个 GenAI 学习和实践旅程奠定基础。
学习 GenAI
关于 GenAI 的知识,应该感觉像是软件工程经验的自然延伸。编排和协作是 GenAI 的核心。你过去在集成或消息系统方面做过的任何工作,都可以直接迁移过来。
事实上,如果你曾经做过 Web 服务编排或消息路由,那么你已经具备了一些关键技能,例如消息路由、后台系统集成,以及集成模式的应用,而这些技能对于构建 GenAI 应用来说至关重要。
Hohpe 和 Woolf 的集成模式,以及 GoF 模式,支撑着所有所谓的智能体式模式。
为了保留 Fowler 和 GoF 所定义的模式含义,本书通篇使用“微架构”这个术语,而不是使用“agentic pattern”。
以下是一些有效学习 GenAI 的建议:
走中间道路: 当你开始 AI 学习之旅时,最好先跳过数学方面的深度钻研。关于 AI 的许多深层问题目前还没有答案。事实上,AI 是历史上第一个拥有两条研究分支的领域:一条分支不断产生新的发现,另一条分支则试图弄清楚为什么这些发现会起作用。对于你可能提出的许多问题,可能还没有人知道答案。幸运的是,我们作为工程师的工作,是使用 AI 完成任务,而不是弄清楚 AI 为什么有效。
先打基础: 如前所述,通过学习某个特定工具或产品来学习 GenAI 有几个缺点。即使 LLM 只有很小的渐进式进步,也可能带来巨大的连锁影响,进一步加剧本来就已经碎片化的工具和微架构市场。如果你不先学习基础原理,那么每一种更高级的方法,都需要更多时间和精力才能吸收。
利用你已经知道的东西: 在学习一个新主题时,如果能够把新内容和自己已经知道的东西联系起来,学习速度会大幅提升。模式在软件中无处不在,GenAI 也不例外。模式提供了一种心智模型,几乎可以立刻让陌生事物变得熟悉。仅仅因为你正在使用一个 LLM RESTful 服务或 API,并不意味着你需要重新发明轮子。
意识到端点挑战: 与 LLM 端点打交道的挑战在于,需要将它们集成到要求速度、可靠性、安全性和可扩展性的环境中,而这些特性并不总是由这些端点本身保证。你很可能已经遇到过行为不佳的端点或 API。无论如何,软件世界已经花费了大量时间来解决这类问题,而这些解决方案可以直接迁移过来。
不要只见树木,不见森林: 使用抽象可以避免陷入过多低层细节之中。在学习快速演进的技术时,这一点尤其重要,因为重大变化甚至可能在学习材料最终定稿之前就已经发生。
有经验的工程师会通过抽象的视角来理解关键知识,过滤掉那些本来会造成干扰的低层细节。在学习如何构建 GenAI 应用时,这种策略更加明智。不要受诱惑,把自己的职业发展绑定到某个产品或框架上。选择工具就像赌赛马:如果选错了马,就会空着口袋回家。这场比赛里有很多匹马。谨慎的做法是通过抽象和模式来学习。至于以后选择哪些工具或产品,并不重要。
无论你选择哪种工具,只要你先理解了本书中的原则,你就能够快速学会它,并且更深入地理解它的工作方式。
本章余下部分将致力于建立关于 LLM 和 GenAI 应用如何工作的直觉,同时回顾抽象和模式。后续章节都会假设你已经阅读并理解了本章。
建议你不要跳读;阅读本章将为你理解本书余下内容提供必要背景。
关于抽象和模式的使用
在本节中,你将通过考察 GenAI 应用中使用的微架构,并将其拆解为组成模式和抽象,来学习 GenAI。通过研究组成性的抽象和模式来学习如何构建 GenAI 应用,有许多优势。作为工程师,我们不希望在快速演进的技术激流中陷得比必要程度更深,尤其不希望不必要地纠缠于某个仍在快速变化的产品或技术细节。
在 GenAI 中使用抽象和设计模式,最有说服力的理由之一,是需要让 GenAI 与既有 IT 架构和技术文档保持协调一致。协调一致要求每个人在描述相似事物时使用相同词汇。当两个领域用不同词汇描述同一概念时,思想交流会变得加倍困难。
图 1.1——AI 专家与软件工程师之间的词汇鸿沟。根据说话群体的不同,同一概念会以完全不同的名称出现
本书如何使用模式
设计模式是软件开发中针对反复出现问题的通用、可复用解决方案。它们最早通过一些奠基性著作被广泛普及,例如《设计模式:可复用面向对象软件的基础》,也就是通常所说的“四人组”或 GoF 一书,以及《企业集成模式》。学习模式是学习任何新技术或新工具的一条捷径。大多数开发者文档都会使用围绕模式和其他抽象构建的图示。
用模式来思考,尤其适用于 GenAI,因为它依赖于软件工程中的两个关键概念,而这两个概念又高度依赖设计模式:
编排: 在这种模型中,一个中心组件发布一个事件,然后触发其他组件中的动作。控制流由中心统一协调。
协同: 在这里,没有中心控制器。相反,每个组件根据预定义规则和交互知道自己何时行动,从而使系统以去中心化、自组织的方式进行协调。
编排和协同都是企业软件中的常见范式,并且得到了 RabbitMQ 的良好支持。RabbitMQ 是一种消息代理软件,作为中间件促进服务之间的通信。
需要提醒的是,你不需要事先了解这些工具,也可以完成本书中的练习。我们使用它们,也不应该被视为一种推荐。选择它们的主要原因是,它们支持许多编程语言,因此使用自己已熟悉语言的工程师也能理解和扩展它们。
如前所述,学习模式是理解 GenAI 微架构的一种自然方式。接下来我们将看看这种方法的具体好处。
将 GenAI 微架构拆解为组成模式的好处
学习 GenAI 的很大一部分,就是学习它的微架构。请记住,本书使用“微架构”这个术语,而不是“agentic pattern”,是为了清楚地区分长期存在的软件模式和新的、尚未得到充分验证的“智能体式模式”。我们理解微架构的方法,是把它们拆解为模式和抽象。
将 GenAI 微架构拆解为其组成模式,会带来多重好处:
允许构建自定义解决方案: GenAI 有许多所谓的“agentic pattern”,也就是我们更愿意称之为“微架构”的东西,同时也有越来越多的工具,可以对 GenAI 组件和 IT 其他部分之间的协作进行编排和协同。然而,这些微架构和框架通常粒度太粗,无法满足复杂真实世界需求的挑战,而这些需求往往要求独特的解决方案。实施微架构时的容量规划,也需要理解它们在底层如何工作。通过把它们拆解为熟悉的模式,工程师就能有信心地推理性能、可扩展性和故障模式。
允许你扩展企业工具以处理 GenAI 用例: 一旦理解了 GenAI 中使用的模式,我们就可以识别已经支持这些模式的成熟工具和库,并用它们来帮助我们构建解决方案。这样做的优势在于,其中许多工具和库是可信赖的,并且已经被企业用于连接后台系统。
这些工具从工程师和技术领导者那里赢得的信任,将使采用和集成过程更加顺畅。
能够快速学习新的工具和产品: 在通过模式学习基础之后,学习新的工具和产品会变得容易。在日益碎片化的 GenAI 世界中,保持知识更新所需的努力会少得多,因为你的基础建立在原则之上,而不是建立在某个具体实现之上。
要聪明地构建 GenAI 应用,就应该对 LLM 的工作方式有高层理解和良好直觉。LLM 的使用正是定义 GenAI 的关键。在下一节中,你将学习什么是 LLM,以及它们如何工作。我们会跳过数学和深度学习层面,重点使用有助于建立直觉理解的示例。
什么是 LLM?
“某个东西是什么”这个问题,可以有很多有效答案。例如,如果有人问“斑马是什么?”,我们可能会得到以下答案:
- 一种看起来像马的、有条纹的动物
- 马属动物的一种
- 一种生活在非洲平原上的马的近亲,肩高 3.81 到 4.79 英尺,体重 450 到 948 磅
这些答案都没有错。事实上,在某些情境下,每个答案都可能是最好的答案。这个小小的岔题说明,找到正确答案,往往意味着要在许多正确答案中寻找那个在特定语境下最有用的答案。作为工程师,我们应该寻找一个最有助于构建 LLM 应用的答案,来回答“什么是 LLM?”这个问题。
LLM 可以用许多方式描述,包括:
- 大数据之后的下一代文本处理技术
- 一个非确定性、性能不佳、不可靠、不安全,并且通常具有高延迟的 RESTful 端点
第一种视角让我们瞥见 LLM 在功能层面的行为方式,而第二种视角则指导我们解决基础设施挑战。让我们从这两个视角仔细观察 LLM。
作为大数据延续的 LLM
数据曾被称为新的石油。世界上 90% 的数据仅在过去两年内产生,而每天产生的数据量高达惊人的 402.74 百万 TB。几十年来,人们已经投入数十亿美元,从数据中提取价值,并为此创造了大量新技术。许多公司无论对错,都相信数据是一种“魔法子弹”,可以帮助它们深入理解客户,从而找到新的营销方式。
尽管当时可用的工具与 LLM 相比非常原始,而且处理的数据量也相对较小,公司仍然非常愿意每年花费数十亿美元,从自己的数据中收获细微洞察。公司常常通过聚合 PB 级自有数据,并将其与有时花费巨资购买的数据结合起来,创建数据湖。在聚合这些数据之后,它们使用数据仓库、商业分析平台、数据挖掘软件和云分析服务等工具来提取洞察。
LLM 可以被视为这些工具的下一代。然而,LLM 相较上一代工具已经领先太多,以至于人们甚至会犹豫是否还应把它们归入同一类别。与前辈不同,LLM 给人一种令人信服的印象,仿佛它们理解数据;它们可以在几乎整个互联网之上进行训练,并将知识压缩进数十亿个参数。LLM 还能够回应用户问题,也就是所谓的 prompt,从而用自然语言查询替代仪表盘和分析。可以正确地说,LLM 正在交付大数据曾经承诺过的价值,而且远不止于此。
作为行为不佳的 RESTful 端点的 LLM
在你将面对的许多挑战中,例如确保应用安全、可扩展和可靠,你所调用的端点恰好是一个 LLM 这一事实,往往并不重要。它的行为本质上与具有相同特征的任何其他 Web 服务一样。你可以使用所有已经用于非 LLM 端点的相同技术和工具。
作为工程师,你已经知道,写出能运行的代码并不意味着任务已经完成。大多数应用都必须实现对日志、消息、并行执行、异步调用、瓶颈管理、错误处理、安全、故障转移和冗余的支持。如果你想构建一个健壮的产品,实现 GenAI 应用也不例外。
使用正确的软件模式,也能解决我们在构建 GenAI 系统时遇到的若干挑战。在后续章节中,我们将介绍多个这样的挑战,并展示如何使用高级消息机制,以及提供常见 GenAI 工程问题即插即用解决方案的容器和编排技术来克服它们。
Grok、ChatGPT 和 Gemini 等 LLM 已经成为我们日常生活的一部分。虽然 GenAI 依赖高级数学和深度学习,但它的核心建立在少数高层概念之上。在下一节中,我们将探讨支撑 LLM 的关键思想和概念。
LLM 如何工作?
让我们深入理解 LLM 底层是如何工作的。在本节中,我们将构建所谓的 LLM 理想化视图,使用抽象来掠过低层细节,使大思想浮现出来并被清楚看见。没有人应该嘲笑那些使用理想化视图的人。理想化是一种被科学家广泛接受的技术,包括理论物理学家在探索高度复杂主题时也会使用。事实上,理想化一个主题,只不过是应用抽象的另一种方式。
关于 LLM 如何工作的核心知识是:它们使用概率来寻找句子中的下一个词或一组词。请花一点时间想想这意味着什么。这里没有逻辑,没有 if-else 语句。LLM 只是扫描数十亿个句子,并寻找最可能的补全。
我们可以通过使用 Google 或 Amazon 搜索框的补全功能做一个小实验,来建立对这一过程的直觉。与 LLM 类似,搜索框也是以概率方式运行,在给定一串词之后,寻找最可能的下一个词或一组词。
例如,如果你在 Google 或 Amazon 搜索框中输入查询“I want to buy”,你会看到一个下拉列表,根据搜索历史提供若干建议,例如“I want to buy a couple of magazines”、“I want to buy a car one you have one”以及“I want to buy a new jacket”。
图 1.2——搜索补全:输入部分短语会返回概率性建议,这类似于 LLM 预测下一个 token 的方式
如果你选择其中一个选项,例如“I want to buy a new jacket”,系统会展示一个新的句子补全列表,其中每一项都反映了在目前已选择词语上下文下,统计上最可能的延续:
图 1.3——更新后的句子补全:选择一个建议会基于目前已输入的完整上下文,细化概率预测
继续这个选择建议的过程,你最终会得到一个完整句子。我们可以推断 Google、Amazon 以及其他公司如何生成查询补全:它们的工程师很可能构建了一个系统,用来记录历史查询,并跟踪每个查询被输入过多少次。系统返回出现次数最高的句子,而这些句子对应的就是最有可能匹配用户意图的查询。
现在,想象一下,如果这个句子列表不仅来自历史查询数据库,而是来自几乎整个互联网。从高层来看,这就是 LLM 所做的事情,也正因如此,它们能够补全诗歌中的诗节、撰写研究报告、回答数学问题,以及完成更多任务。
为什么这在很大程度上仍然是一个谜?即使你觉得这个解释不完整或令人困惑,也不用担心——没有人完全理解它。AI 有一整个研究分支,专门用来理解它为什么能够产生这些结果。无法完全解释结果,是该领域的基本特征,而不是本书的缺陷。
发挥 LLM 的能力,通常不仅需要一个 prompt,而是需要许多承担不同角色的组件相互协作。现在,让我们看看智能体式 AI,以了解如何在复杂应用中使用 LLM。
什么是智能体式 AI?
智能体式 AI,是将基于组件的架构应用到使用 LLM 的系统中。几十年来,组件架构相对于单体架构的优势一直被公认为最佳实践。
AI 智能体是智能体式应用的基本构建块,它可以被训练并擅长不同类型的任务。例如,一个 LLM 可能擅长推理,而另一个 LLM 可能更擅长总结大量文本。人们会立刻开始思考这些“智能体”如何协作。也许推理智能体寻找问题的解决方案,并把结果传递给总结智能体进行压缩。或者,也许总结智能体先压缩数 MB 文本,再传递给推理智能体。
专门化智能体之间的这种协作,是 GenAI 的一个重要焦点。事实证明,智能体之间有一些特定交互方式被认为特别有用,而另一些协作方式则会引发问题。我们将在本书后续章节中考察这些模式,以及实现这些模式的工具——这些工具同时受到 IT 领导者和工程师的信任。
今天,市场上有许多用于构建智能体式 AI 应用的产品,其中一些相当不错。然而,你并不需要智能体工具才能构建智能体式应用。在本书中,我们采用一种技术和语言无关的方法;我们不教授工具或产品。对于编程作业,你可以使用自己偏好的语言来扩展我们将提供的框架。
你也可以探索使用消息代理如 RabbitMQ 所支持的高级消息机制,以及企业服务总线等反向代理来构建自己的微架构。这些工具几乎为每一种流行编程语言都提供绑定。无论如何,使用成熟且经过充分测试的工具来构建智能体式应用,可以说是最好的方法,尤其是当你打算在大型公司部署应用,或者预期应用要服务许多用户时。
本书的重点,是理解用于构建智能体式应用的底层原则和模式,而不是学习某种具体实现。通过使用你已经熟悉的语言完成本书中的练习,你将清楚理解如何为自己正在构建的任何东西做出最佳开发选择。
总结
在本章中,我们探讨了 GenAI 应用与传统软件应用之间的共同点,远比人们通常暗示的要多。我们讨论了将长期存在的软件工程实践应用于 GenAI 开发的重要性,并解释了使用成熟、经过实战检验的工具,相比成为未经验证的 GenAI 专用框架早期采用者的优势。
我们介绍了一份术语速查表,展示 GenAI 术语与熟悉 IT 概念之间的等价关系。通过一个简单的搜索补全类比,我们看到 LLM 的工作方式类似于极其复杂的概率文本补全引擎。我们从两个角度考察了 LLM:作为大数据工具的继承者,以及作为具有熟悉工程挑战的 RESTful 端点。
最后,我们将智能体式 AI 定义为把基于组件的架构应用到由 LLM 驱动的系统中,并指出 GenAI 引入了新的微架构,但并没有引入新的基础软件模式。
下一章将探讨向量嵌入:它们是什么,如何把意义表示为数字,以及为什么它们对 LLM 理解和生成语言至关重要。你将学习为什么嵌入对于构建有效的 GenAI 应用至关重要,以及它们如何支撑语义搜索、相似性匹配和检索增强生成,也就是 RAG。理解嵌入,是后续所有内容的基础。