Apache Kafka + 矢量数据库 + LLM = 实时 GenAI

news/2024/11/14 11:15:52/

公众号:Halo咯咯

生成式人工智能 (GenAI) 支持先进的人工智能用例和创新,但也改变了企业架构的外观。大型语言模型 (LLM)、向量数据库和检索增强生成 (RAG) 需要新的数据集成模式和数据工程最佳实践。 Apache Kafka 和 Apache Flink 的数据流在大规模实时摄取和整理传入数据集、连接各种数据库和分析平台以及解耦独立业务部门和数据产品方面发挥着关键作用。这篇博文探讨了事件流与传统请求响应 API 和数据库之间的可能架构、示例以及权衡。

Apache Kafka 和 GenAI 的用例

生成式人工智能(GenAI)是用于自然语言处理(NLP)、图像生成、代码优化和其他任务的下一代人工智能引擎。它可以帮助现实世界中的许多项目实现服务台自动化、客户与聊天机器人的对话、社交网络中的内容审核以及许多其他用例。

Apache Kafka 成为这些机器学习平台中的主要编排层,用于集成各种数据源、大规模处理和实时模型推理。

Kafka数据流已经为许多 GenAI 基础设施和软件产品提供支持。可能出现非常不同的情况:

  • 数据流作为整个机器学习基础设施的数据结构
  • 通过流处理进行模型评分,以进行实时预测和内容生成
  • 使用输入文本、语音或图像生成流数据管道
  • 大语言模型实时在线训练

下面介绍了大语言模型 (LLM)、检索增强生成 (RAG) 与向量数据库和语义搜索以及 Apache Kafka 和 Flink 的数据流相结合的具体架构。

为什么生成式人工智能与传统机器学习架构不同?

机器学习 (ML) 允许计算机找到隐藏的见解,而无需对要查找的位置进行编程。这称为模型训练,是分析大数据集的批处理过程。输出是一个二进制文件,即分析模型。

应用程序将这些模型应用于新的传入事件以进行预测。这称为模型评分,可以通过将模型嵌入到应用程序中或通过对模型服务器(部署模型)进行请求响应 API 调用来实时或批量进行。

然而,与传统的机器学习流程相比,LLM和 GenAI 具有不同的要求和模式,正如我的前同事 Michael Drogalis 在两个简单、清晰的图表中所解释的那样。

具有复杂数据工程的传统预测机器学习

预测人工智能做出预测。专门构建的模型。线下培训。这就是我们在过去十年左右的时间里进行机器学习的方式。

在传统的机器学习中,大部分数据工程工作发生在模型创建时。特征工程和模型训练需要大量的专业知识和努力:

新用例需要数据工程师和数据科学家构建新模型。

使用大型语言模型 (LLM) 的生成式人工智能实现人工智能的民主化

生成人工智能 (GenAI) 创建内容。可重复使用的模型。情境学习。

对于大型语言模型,每次查询都会发生数据工程。不同的应用程序重复使用相同的模型

GenAI 用例的大型语言模型面临的挑战

大型语言模型 (LLM) 是可重用的。这使得人工智能的民主化成为可能,因为并非每个团队都需要人工智能专业知识。相反,人工智能专业知识水平较低就足以使用现有的LLM。

然而,LLM存在一些巨大的权衡

  • 昂贵的培训:像 ChatGPT 这样的LLM需要花费数百万美元的计算资源(这不包括构建模型所需的专业知识)
  • 静态数据LLM“及时冻结”,意味着模型没有最新信息。
  • 缺乏领域知识LLM通常从公共数据集学习。因此,数据工程师抓取万维网并将其输入到模型训练中。然而,企业需要在自己的环境中使用LMM来提供商业价值。
  • 愚钝LLM不像人类那么聪明。例如,ChatGPT 甚至无法计算您提示的句子中的单词数。

这些挑战造成了所谓的幻觉……

避免幻觉以生成可靠的答案

结果就是产生幻觉,即最佳猜测答案。而且LLM不会告诉你这是编造的。幻觉是一种现象,即人工智能模型生成的内容并非基于真实数据或信息,而是创建完全虚构或不切实际的输出。当生成模型(例如文本或图像生成器)生成不连贯、不真实或与输入数据或上下文不相关的内容时,可能会出现幻觉。这些幻觉可以表现为文本、图像或其他类型的内容,这些内容看似合理,但完全是由模型捏造的。

幻觉在生成人工智能中可能会出现问题,因为它们可能导致生成误导性或虚假信息

由于这些原因,生成式人工智能出现了一种新的设计模式:检索增强生成(RAG)。让我们首先看看这个新的最佳实践,然后探讨为什么使用 Apache Kafka 和 Flink 等技术进行数据流是 GenAI 企业架构的基本要求。

语义搜索和检索增强生成 (RAG)

许多支持 GenAI 的应用程序都遵循检索增强生成 (RAG) 的设计模式,将LLM与准确且最新的上下文相结合。 Pinecone(一个完全托管的矢量数据库)背后的团队使用此图进行了很好的解释:

来源:松果

从较高层面来看,RAG 通常是两个独立的步骤。第一个是数据增强步骤,其中对不同的(通常是非结构化的)操作数据进行分块,然后使用嵌入模型创建嵌入。嵌入被索引到向量数据库中。矢量数据库是一种工具,可让语义搜索为不需要精确关键字匹配的提示找到相关上下文。

其次是推理步骤,GenAI 模型接收问题和上下文以生成可靠的答案(没有幻觉)。 RAG 不会更新嵌入,但会检索相关信息并与提示一起发送给 LLM。

用于嵌入语义搜索的向量数据库

矢量数据库,也称为矢量存储或矢量索引,是一种专门设计用于高效存储和检索矢量数据的数据库。在这种情况下,矢量数据是指数值矢量的集合,它可以表示多种数据类型,例如文本、图像、音频或任何其他结构化或非结构化数据的嵌入。矢量数据库在与机器学习、数据检索、推荐系统、相似性搜索等相关的应用中非常有用。

矢量数据库擅长执行相似性搜索,通常称为语义搜索。他们可以根据各种相似性度量(例如余弦相似性或欧几里得距离)快速找到与给定查询向量相似或接近的向量。

矢量数据库(不一定)不是一个单独的数据库类别。 Gradient Flow 在其检索增强生成的最佳实践中解释道:

“矢量搜索不再局限于矢量数据库。许多数据管理系统(包括 PostgreSQL)现在都支持矢量搜索。根据您的具体应用,您可能会找到满足您特定需求的系统。优先考虑近实时还是流媒体?查看 Rockset 的产品。您已经在使用知识图了吗? Neo4j 对矢量搜索的支持意味着您的 RAG 结果将更容易解释和可视化。”

对于另一个具体示例,请参阅 MongoDB 的教程“使用 MongoDB 构建生成式 AI 应用程序:利用 Atlas 矢量搜索和开源模型的力量”。将 GenAI 用例的向量数据库与 Apache Kafka 相结合有多种选择。以下是事件驱动世界中可能的架构。

事件驱动架构:数据流+Vector DB+LLM

事件驱动的应用程序可以更有效地实现检索增强生成(RAG)、数据增强和模型推理这两个步骤。使用 Apache Kafka 和 Apache Flink 的数据流可以实现任何规模的数据一致同步(实时,如果应用程序或数据库可以处理)和数据管理(= 流式 ETL)。

下图显示了利用事件驱动的数据流在整个 GenAI 管道中进行数据摄取和处理的企业架构:

此示例使用数据流将航班预订和更改实时提取到 Kafka 的事件存储中,以便稍后使用 GenAI 技术进行处理。 Flink 在调用嵌入模型为向量数据库生成嵌入之前对数据进行预处理。与此同时,用Python构建的实时客户服务应用程序会消耗所有相关的上下文数据(例如,航班数据、客户数据、嵌入等)来提示大型语言模型。LLM可以创建可靠的预测,例如建议乘客重新预订另一航班。

在大多数企业场景中,出于安全和数据隐私原因,所有处理都在企业防火墙后面进行。LLM甚至可以与预订引擎等交易系统集成,以执行重新预订并将结果输入相关应用程序和数据库。

使用 API 进行请求-响应与事件驱动的数据流

在理想的世界中,一切都是基于事件的流数据。现实世界是不同的。因此,使用 HTTP/REST 或 SQL 进行请求-响应的 API 调用在企业架构的某些部分是完全没问题的。由于 Kafka 真正解耦了系统,每个应用程序都可以选择自己的通信范式和处理速度。因此,了解HTTP/REST API 和 Apache Kafka 之间的权衡非常重要。

何时在 Apache Kafka 中使用请求-响应? ——这个决定通常是根据延迟、解耦或安全性等权衡做出的。然而,对于大型LLM,情况发生了变化。由于LLM的培训成本非常昂贵,因此现有LLM的可重用性至关重要。与使用决策树、集群甚至小型神经网络等算法构建的其他模型相反,将 LLM 嵌入到 Kafka Streams 或 Flink 应用程序中没有什么意义。

同样,增强模型通常通过 RPC/API 调用进行集成。通过将其嵌入到 Kafka Streams 微服务或 Flink 作业中,增强模型变得紧密耦合。如今,专家们主持了其中的许多活动,因为操作和优化它们并非易事。

托管 LLM 和增强模型的解决方案通常只提供 RPC 接口,例如 HTTP。这在未来可能会改变,因为请求-响应是流数据的反模式。 Seldon 是模型服务器演变的一个很好的例子。同时提供 Kafka 原生接口。请阅读文章使用 Kafka 原生模型部署进行流式机器学习,了解有关请求-响应与流式模型服务的更多信息。

LLM 与企业其他部门之间的直接集成?

在撰写本文时,OpenAI 宣布使用 GPT创建 ChatGPT 的自定义版本,该版本结合了指令、额外知识和任意技能组合。对于企业用途,最有趣的功能是开发人员可以将 OpenAI 的 GPT 连接到现实世界,即其他软件应用程序、数据库和云服务:

“除了使用我们的内置功能之外,您还可以通过向 GPT 提供一个或多个 API 来定义自定义操作。与插件一样,操作允许 GPT 集成外部数据或与现实世界交互。将 GPT 连接到数据库、将其插入电子邮件或使它们成为您的购物助手。例如,您可以集成旅行列表数据库、连接用户的电子邮件收件箱或促进电子商务订单。”

使用直接集成的权衡是紧密耦合和点对点通信。如果您已经使用 Kafka,您就会了解具有真正解耦的领域驱动设计的价值。

有关微服务或数据网格架构中真正解耦的重要性和价值的更多详细信息,请查看这两篇文章,了解与传统中间件的紧密耦合和具有基于事件的数据流的解耦数据产品之间的区别

  • Apache Kafka 与企业服务总线 (ESB) — 是朋友、敌人还是亦敌亦友?
  • 为什么数据流与具有集成平台即服务 (iPaaS) 解决方案的数据集成不同

最后但并非最不重要的一点是:公共 GenAI API 和 LLM 的安全和治理策略较弱。随着人工智能数据需求的出现和点对点集成数量的增加,数据访问、沿袭和安全挑战不断升级。

Kafka、Flink 和 GenAI 的数据流实践

在了解了很多理论之后,让我们看一下将数据流与 GenAI 相结合的具体示例、演示和真实案例研究:

  • 示例:Flink SQL + OpenAI API
  • 演示:ChatGPT 4 + Confluence Cloud + 用于 RAG 和矢量搜索的 MongoDB Atlas
  • 成功案例:Elemental Cognition — 由 Confluence Cloud 提供支持的实时人工智能平台

示例:Flink SQL + OpenAI API

使用Kafka和Flink进行流处理可以实现实时数据和历史数据的数据关联。一个很好的例子,特别是对于生成式人工智能来说,是特定情境的客户服务。我们在这里以航空公司和航班取消为例。

有状态流处理器从CRM、忠诚度平台和其他应用程序获取现有客户信息,将其与客户对聊天机器人的查询相关联,并对LLM 进行 RPC 调用

下图使用Apache Flink 和 Flink SQL 用户定义函数 (UDF)。 SQL 查询将预处理后的数据输入 OpenAI API 以获得可靠的答案。答案被发送到下游应用程序使用它的另一个 Kafka 主题,例如用于重新预订机票、更新忠诚度平台,以及将数据存储在数据湖中以供以后的批处理和分析。

演示:ChatGPT 4 + Confluence Cloud + 用于 RAG 和矢量搜索的 MongoDB Atlas

以下是一个出色的零售演示,展示了用于数据集成和处理的 Kafka 与用于存储和语义向量搜索的 MongoDB 的结合。 AI视频创作平台D-ID通过用可视化AI头像代替命令行界面,让演示更加美观。

完全托管和深度集成的服务Confluence Cloud 和 MongoDB Atlas 允许专注于构建业务逻辑

该架构与我上面的基于事件的流式传输示例不同。核心仍然是Kafka来真正解耦应用。大多数服务都是通过请求-响应 API 集成的。这很简单,很好理解,而且通常足够好。您稍后可以使用 Python Kafka API 轻松迁移到基于事件的模式、更改 Kafka 的数据捕获 (CDC)、将 LangChain Python UDF 嵌入 Apache Flink 或使用 AsyncAPI 等异步接口。

成功案例:Elemental Cognition — 由 Kafka 和 Confluence Cloud 提供支持的实时 GenAI 平台

David Ferrucci 博士是著名的人工智能研究员和 IBM 突破性 Watson 技术的发明者,于 2015 年创立了 Elemental Cognition。该公司利用 GenAI 来加速和改进关键决策,而信任、精确度和透明度都很重要

元素认知技术可跨行业和用例使用。主要目标是医疗保健/生命科学、投资管理、情报、物流和调度以及联络中心。

该人工智能平台开发负责任且透明的人工智能,帮助解决问题并提供可以理解和信任的专业知识

Elemental Cognition 的方法将不同的人工智能策略结合在一个新颖的架构中,该架构获取并推理人类可读的知识,以协作和动态地解决问题。其结果是将专家解决问题的情报更加透明且更具成本效益地交付到对话和发现应用程序中。

Confluence Cloud 为 AI 平台提供支持,以实现可扩展的实时数据和数据集成用例。我建议您查看他们的网站,从各种令人印象深刻的用例中学习。

Apache Kafka 作为 GenAI 企业架构的中枢神经系统

生成式人工智能(GenAI)需要改变人工智能/机器学习企业架构。增强模型、LLM、带有向量数据库的 RAG 和语义搜索需要数据集成、关联和解耦。使用 Kafka 和 Flink 进行数据流可以为您提供帮助。

许多应用程序和数据库使用 REST/HTTP、SQL 或其他接口进行请求-响应通信。那完全没问题。为您的数据产品和应用程序选择正确的技术和集成层。但要保证数据的一致性。

使用 Apache Kafka 和 Apache Flink 进行数据流处理使开发人员和数据工程师能够专注于其数据产品或集成项目中的业务问题,因为它真正解耦了不同的领域。可以通过 HTTP、Kafka API、AsyncAPI、来自数据库的 CDC、SaaS 接口和许多其他选项与 Kafka 集成

Kafka 能够将系统与任何通信范例连接起来。其事件存储以毫秒为单位共享数据(即使在极端规模下),但也为速度较慢的下游应用程序保留数据并重播历史数据。数据网格的心脏必须实时跳动。对于任何优秀的企业架构来说都是如此。 GenAI 没有区别。

如果觉得文章对于有帮助,欢迎点赞+收藏并关注哈~(也可以关注我的公众号:Halo咯咯)


http://www.ppmy.cn/news/1400345.html

相关文章

[LeetCode][233]数字 1 的个数

题目 233. 数字 1 的个数 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0 提示&#xff1a; 0 < n < 10^9 解…

原型链-(前端面试 2024 版)

来讲一讲原型链 原型链只存在于函数之中 四个规则 1、引用类型&#xff0c;都具有对象特性&#xff0c;即可自由扩展属性。 2、引用类型&#xff0c;都有一个隐式原型 __proto__ 属性&#xff0c;属性值是一个普通的对象。 3、引用类型&#xff0c;隐式原型 __proto__ 的属…

iOS - Runtime-isa详解(位域、union(共用体)、位运算)

文章目录 iOS - Runtime-isa详解&#xff08;位域、union&#xff08;共用体&#xff09;、位运算&#xff09;前言1. 位域介绍1.1 思路1.2 示例 - 结构体1.3 示例 - union&#xff08;共用体&#xff09;1.3.1 说明 1.4 结构体 对比 union&#xff08;共用体&#xff09; 2. a…

SQL Server 实验二:数据库视图的创建和使用

目录 第一关 相关知识 什么是表 操作数据表 创建数据表 插入数据 修改表结构 删除数据表 编程要求 第一关实验代码&#xff1a; 第二关 相关知识 视图是什么 视图的优缺点 视图的优点 视图的缺点 操作视图 创建视图 通过视图向基本表中插入数据 通过视图修改基本表的…

设计模式——结构型——外观模式Facade

处理器类 public class Cpu {public void start() {System.out.println("处理器启动了...");} } 内存类 public class Memory {public void start() {System.out.println("内存启动了...");} } 硬盘类 public class Disk {public void start() {Syste…

【Boost搜索引擎项目】项目思维导图+项目总结

Boost搜索引擎 1.项目思维导图2.项目总结3.项目地址 1.项目思维导图 2.项目总结 该项目是基于Boost库实现一个搜索引擎功能&#xff0c;部署在Linux服务器上。支持多用户同时并发的访问服务器。用户可以通过浏览器访问服务器IP地址端口号使用搜索引擎&#xff0c;通过搜索关键…

爬取b站音频和视频数据,未合成一个视频

一、首先找到含有音频和视频的url地址 打开一个视频&#xff0c;刷新后&#xff0c;找到这个包&#xff0c;里面有我们所需要的数据 访问这个数据包后&#xff0c;获取字符串数据&#xff0c;用正则提取&#xff0c;再转为json字符串方便提取。 二、获得标题和音频数据后&…

MySQL实现读写分离

1. mycat实现读写分离 MyCAT 是使用 JAVA 语言进行编写开发&#xff0c;使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性&#xff0c;所以要求必须在 JDK7 以上的版本上运行。 官网下载jdk并解压文件 [rootmycat ~]# tar -xf jdk-8u181-linux-x…