使用 GKE 且支持 RAG 的生成式 AI 应用的基础架构

Last reviewed 2024-04-02 UTC

本文档提供了一个参考架构,可用于设计基础架构,以便运行使用 Google Kubernetes Engine (GKE)、Cloud SQL 和开源工具(例如 Ray、Hugging Face 和 LangChain)且具有检索增强生成 (RAG) 功能的生成式 AI 应用。为了帮助您实验此参考架构,GitHub 中提供了示例应用和 Terraform 配置。

本文档适用于希望使用开源工具和模型快速构建和部署支持 RAG 的生成式 AI 应用的开发者。本文档假定您具有使用 GKE 和 Cloud SQL 的经验,并且您对 AI、机器学习 (ML) 和大语言模型 (LLM) 有概念性了解。本文档未提供有关如何设计和开发生成式 AI 应用的指导。

架构

下图简要展示了 Google Cloud 中支持 RAG 的生成式 AI 应用的架构:

Google Cloud 中支持 RAG 的生成式 AI 应用的概要架构。

该架构包含服务子系统和嵌入子系统。

  • 服务子系统处理应用与其用户之间的请求-响应流。该子系统包含前端服务器、推理服务器和 Responsible AI (RAI) 服务。服务子系统通过矢量数据库与嵌入子系统进行交互。
  • 嵌入子系统可在架构中实现 RAG 功能。此子系统执行以下操作:
    • 从 Google Cloud、本地和其他云平台的数据源注入数据。
    • 将注入的数据转换为矢量嵌入。
    • 将嵌入存储在矢量数据库中。

下图展示了此架构的详细视图:

Google Cloud 中支持 RAG 的生成式 AI 应用的详细架构。

如上图所示,前端服务器、推理服务器和嵌入服务部署在 Autopilot 模式的区域级 GKE 集群中。用于 RAG 的数据通过 Cloud Storage 存储桶注入。该架构使用将 pgvector 扩展程序作为矢量数据库的 Cloud SQL for PostgreSQL 实例来存储嵌入并执行语义搜索。矢量数据库旨在高效存储和检索高维矢量。

以下部分介绍了架构的每个子系统中的组件和数据流。

嵌入子系统

以下是嵌入子系统中的数据流:

  1. 来自外部源和内部源的数据由真人用户或以编程方式上传到 Cloud Storage 存储桶。上传的数据可能处于文件、数据库或流式数据中。
  2. (架构图中未显示。)数据上传活动会触发一个事件,该事件会发布到 Pub/Sub 等消息传递服务。消息传递服务会向嵌入服务发送通知。
  3. 当嵌入服务收到数据上传事件通知时,它会执行以下操作:
    1. 通过 Cloud Storage FUSE CSI 驱动程序从 Cloud Storage 存储桶检索数据。
    2. 读取上传的数据并使用 Ray Data 对其进行预处理。预处理可能包括将数据分块并将其转换为适合于嵌入生成的格式。
    3. 运行 Ray 作业,以便使用部署在同一集群中的开源模型(例如 intfloat/multilingual-e5-small)创建预处理的数据的矢量化嵌入。
    4. 将矢量化嵌入写入 Cloud SQL for PostgreSQL 矢量数据库。

如下一部分所述,当服务子系统处理用户请求时,它会使用矢量数据库中的嵌入来检索特定于领域的相关数据。

服务子系统

以下是服务子系统中的请求-响应流:

  1. 用户通过基于网络的聊天界面向前端服务器提交自然语言请求。前端服务器在 GKE 上运行。
  2. 前端服务器运行执行以下操作的 LangChain 进程:
    1. 使用嵌入服务所用的相同模型和参数,将自然语言请求转换为嵌入。
    2. 通过对矢量数据库中的嵌入执行语义搜索来检索相关的标准答案关联数据。语义搜索可帮助根据提示的意图(而不是其文本内容)来查找嵌入。
    3. 通过将原始请求与检索到的标准答案关联数据进行组合,来构建情景化提示。
    4. 将情景化提示发送到在 GKE 上运行的推理服务器。
  3. 推理服务器使用 Hugging Face TGI 服务框架来提供开源 LLM,例如 Mistral-7B-InstructGemma 开放模型
  4. LLM 生成对提示的响应,推理服务器将响应发送到前端服务器。

    您可以在 Cloud Logging 中存储和查看请求-响应活动的日志,并且可以使用 Cloud Monitoring 设置基于日志的监控。您还可以将生成的响应加载到 BigQuery 中,以进行离线分析。

  5. 前端服务器会调用 RAI 服务,将所需的安全过滤器应用于响应。您可以使用 Sensitive Data ProtectionCloud Natural Language API 等工具对响应中的敏感内容进行发现、过滤、分类和去标识化。

  6. 前端服务器将过滤后的响应发送给用户。

使用的产品

下面总结了上述架构使用的 Google Cloud 和开源产品:

Google Cloud 产品

  • Google Kubernetes Engine (GKE):一种 Kubernetes 服务,可用于使用 Google 的基础架构来大规模部署和操作容器化应用。
  • Cloud Storage:适用于各种数据类型的费用低廉且不受限制的对象存储。数据可从 Google Cloud 内部和外部访问,并且跨位置进行复制以实现冗余。
  • Cloud SQL:一种全托管式关系型数据库服务,可帮助您在 Google Cloud 上预配、操作和管理 MySQL、PostgreSQL 和 SQL Server 数据库。

开源产品

使用场景

RAG 是一种可提高从 LLM 生成的输出质量的有效技术。本部分提供可使用支持 RAG 的生成式 AI 应用的应用场景示例。

个性化产品推荐

在线购物网站可能会使用由 LLM 提供支持的聊天机器人来帮助客户查找产品或获取与购物相关的帮助。可以使用有关用户购买行为和网站互动模式的历史数据来增强用户提出的问题。数据可能包括存储在非结构化数据存储区中的用户评价和反馈,或存储在网络分析数据仓库中的搜索相关指标。然后,LLM 可以处理增强的问题,以生成个性化回复,用户可能认为这些回复更具吸引力和说服力。

临床辅助系统

医院中的医生需要快速分析和诊断患者的健康状况,从而做出有关适当的护理和药物的决策。使用 Med-PaLM 等医疗 LLM 的生成式 AI 应用可用于辅助医生完成临床诊断过程。应用生成的响应可以基于患者历史记录,具体方法是将医生的提示与来自医院电子健康记录 (EHR) 数据库或外部知识库(例如 PubMed)的数据结合在一起。

借助由生成式 AI 提供支持的法律研究,律师可以快速查询大量法规和判例法,以确定相关的法律先例或总结复杂的法律概念。可以使用从律师事务所专有的合同语料库、过往法律沟通和内部案例记录中检索到的数据来增强律师的提示,从而改进此类研究的输出结果。这种设计方法可确保生成的响应与律师专门从事的法律领域相关。

设计考虑事项

本部分提供的指导可帮助您开发和运行由 GKE 托管的支持 RAG 的生成式 AI 架构,以满足您在安全性和合规性、可靠性、费用和性能方面的特定要求。本部分中的指导并非详尽无遗。根据应用的特定要求以及您使用的 Google Cloud 产品和功能,您可能需要考虑其他设计因素和权衡因素。

如需与此参考架构中的开源工具(例如 Hugging Face TGI)相关的设计指导,请参阅适用于这些工具的文档。

安全性、隐私权和合规性

本部分介绍在 Google Cloud 中设计和构建满足安全性、隐私权和合规性要求且支持 RAG 的生成式 AI 应用时应考虑的因素。

产品 设计考虑事项
GKE

在 Autopilot 操作模式下,GKE 会根据安全性方面的最佳实践预先配置集群并管理节点,从而使您可以专注于特定于工作负载的安全性。详情请参阅以下内容:

如需确保增强对 GKE 中运行的应用的访问权限控制,您可以使用 Identity-Aware Proxy (IAP)。IAP 可与 GKE Ingress 资源集成,确保只有拥有正确 Identity and Access Management (IAM) 角色且经过身份验证的用户才能访问应用。如需了解详情,请参阅为 GKE 启用 IAP

默认情况下,GKE 中的数据使用 Google 管理的加密密钥进行静态加密和传输中加密。作为适用于敏感数据的一层额外的安全防护,您可以借助 Cloud KMS,使用自己所拥有和管理的密钥在应用层加密数据。如需了解详情,请参阅在应用层对 Secret 加密

如果您使用 Standard GKE 集群,则可以使用以下额外的数据加密功能:

Cloud SQL

无需可从公共互联网访问架构中的 Cloud SQL 实例。如果需要从外部访问 Cloud SQL 实例,您可以使用 SSL/TLSCloud SQL Auth 代理连接器加密外部连接。Auth 代理连接器使用 IAM 提供连接授权。该连接器使用采用 256 位 AES 加密的 TLS 1.3 连接来验证客户端和服务器身份并加密数据流量。 对于使用 Java、Python、Go 或 Node.js 创建的连接,请使用适当的语言连接器,而不是 Auth 代理连接器。

默认情况下,Cloud SQL 使用 Google 管理的数据加密密钥 (DEK) 和密钥加密密钥 (KEK) 来加密静态数据。如果您需要使用自己控制和管理的 KEK,则可以使用客户管理的加密密钥 (CMEK)

如需防止在未经授权的情况下访问 Cloud SQL Admin API,您可以使用 VPC Service Controls 创建服务边界。

如需了解如何配置 Cloud SQL 以帮助满足数据驻留要求,请参阅数据驻留概览

Cloud Storage

默认情况下,存储在 Cloud Storage 中的数据使用 Google 管理的加密密钥进行加密。如果需要,您可以使用 CMEK 或您自己的通过外部管理方法(如客户提供的加密密钥 [CSEK])管理的密钥。如需了解详情,请参阅数据加密选项

在 Cloud Storage 中,您可以通过以下两种方法控制对存储桶和对象的访问权限:IAM 和访问控制列表 (ACL)。在大多数情况下,我们建议使用 IAM,这可让您在存储桶级和项目级授予权限。如需了解详情,请参阅访问权限控制概览

您通过 Cloud Storage 加载到数据注入子系统的数据可能包含敏感数据。如需保护此类数据,您可以使用 Sensitive Data Protection 来发现数据并对其进行分类以及去标识化处理。如需了解详情,请参阅将 Sensitive Data Protection 与 Cloud Storage 搭配使用

如需降低 Cloud Storage 中发生数据渗漏的风险,您可以使用 VPC Service Controls 创建服务边界。

Cloud Storage 可帮助您满足数据驻留要求。数据会在您指定的区域内存储或复制。

此架构中的所有产品

默认情况下,系统会为此参考架构中使用的所有 Google Cloud 服务启用管理员活动审核日志。您可以通过 Cloud Logging 访问日志,并使用日志来监控用于修改 Google Cloud 资源配置或元数据的 API 调用或其他操作。

默认情况下,系统还会为此架构中的所有 Google Cloud 服务启用数据访问审核日志。您可以使用这些日志监控以下内容:

  • 用于读取资源配置或元数据的 API 调用。
  • 用于创建、修改或读取用户所提供的资源数据的用户请求。

如需了解有关 AI 应用需要考虑的安全原则的一般指导,请参阅 Google 的安全 AI 框架简介

可靠性

本部分介绍在 Google Cloud 中为支持 RAG 的生成式 AI 应用构建和操作可靠基础设施时应考虑的设计因素。

产品 设计考虑事项
GKE

通过此架构中使用的 Autopilot 操作模式,GKE 可提供以下内置可靠性功能:

  • 您的工作负载使用区域级 GKE 集群。控制平面和工作器节点分布在一个区域内的三个不同可用区中。您的工作负载可稳健可靠地应对可用区服务中断。区域级 GKE 集群的正常运行时间服务等级协议 (SLA) 高于可用区级集群。
  • 您无需创建节点或管理节点池。GKE 会自动创建节点池并根据工作负载的要求对其进行自动扩缩。

如需确保可提供在自动扩缩 GKE 集群时所需的足够 GPU 容量,您可以创建并使用预留。预留会在特定可用区中为指定资源提供有保障的容量。预留可以专用于某个项目,也可以在多个项目中共享。即使未预配或使用预留的资源,您也需要为预留的资源付费。如需了解详情,请参阅使用预留的可用区级资源

Cloud SQL

如需确保矢量数据库稳健可靠地应对数据库故障和可用区服务中断,请使用配置了高可用性的 Cloud SQL 实例。如果发生主要数据库故障或可用区服务中断,Cloud SQL 会通过故障切换机制自动切换到另一个可用区中的备用数据库。您无需更改数据库端点的 IP 地址。

如需确保 Cloud SQL 实例在服务等级协议 (SLA) 的涵盖范围内,请遵循建议的运维指南。例如,确保 CPU 和内存大小适合工作负载,并启用存储空间自动扩容功能。如需了解详情,请参阅运维指南

Cloud Storage 您可以在以下三种 位置类型之一中创建 Cloud Storage 存储桶:单区域、双区域或多区域。存储在区域级存储桶中的数据会跨一个区域内的多个可用区同步复制。为了获得更高的可用性,您可以使用双区域或多区域存储桶,其中数据会跨区域异步复制。

费用优化

本部分提供的指导可帮助您优化在 Google Cloud 中设置和操作支持 RAG 的生成式 AI 应用的费用。

产品 设计考虑事项
GKE

在 Autopilot 模式下,GKE 会根据工作负载要求优化集群基础架构的效率。您无需持续监控资源利用率或管理容量来控制费用。

如果您可以预测 GKE Autopilot 集群的 CPU、内存和临时存储空间用量,则可以通过获取承诺使用折扣来节省资金。如需了解详情,请参阅 GKE 承诺使用折扣

如需降低应用运行费用,您可以为 GKE 节点使用 Spot 虚拟机。Spot 虚拟机的价格低于标准虚拟机,但无法保证可用性。如需了解使用 Spot 虚拟机的节点的优势、它们在 GKE 中的工作方式以及如何在此类节点上调度工作负载,请参阅 Spot 虚拟机

如需详细了解费用优化指导,请参阅在 GKE 上运行费用经过优化的 Kubernetes 应用的最佳实践

Cloud SQL

当可用区或实例不可用时,高可用性 (HA) 配置有助于减少 Cloud SQL 数据库的停机时间。但是,配置了高可用性的实例的费用高于独立实例的费用。如果您不需要为矢量数据库实现高可用性,可以使用独立实例来降低费用,不过这类实例无法稳健可靠地应对可用区服务中断。

您可以使用由 Active Assist 提供支持的 Cloud SQL 费用分析洞见和建议,检测 Cloud SQL 实例是否超额预配并优化账单。如需了解详情,请参阅减少超额预配的 Cloud SQL 实例

如果您可以预测 Cloud SQL 实例的 CPU 和内存要求,则可以通过获取承诺使用折扣来节省资金。如需了解详情,请参阅 Cloud SQL 承诺使用折扣

Cloud Storage 对于用于将数据加载到数据注入子系统的 Cloud Storage 存储桶,请选择适当的存储类别。选择存储类别时,请考虑工作负载的数据保留和访问频率要求。例如,如需控制存储费用,您可以选择 Standard 类别并使用对象生命周期管理。这样,系统就会根据您设置的条件将对象自动降级为费用较低的存储类别或删除对象。

如需估算您的 Google Cloud 资源的费用,请使用 Google Cloud 价格计算器

性能优化

本部分介绍在 Google Cloud 中设计和构建满足性能要求且支持 RAG 的生成式 AI 应用时应考虑的因素。

产品 设计考虑事项
GKE 根据工作负载的性能要求,为 Pod 选择合适的计算类别。对于运行推理服务器和嵌入服务的 Pod,我们建议您使用 GPU 机器类型,例如 nvidia-l4
Cloud SQL

如需优化 Cloud SQL 实例的性能,请确保分配给实例的 CPU 和内存足以满足工作负载的需求。如需了解详情,请参阅优化预配不足的 Cloud SQL 实例

如需缩短近似最近邻 (ANN) 矢量搜索的响应时间,请使用经过平面压缩的倒排文件 (IVFFlat) 索引或 分层可导航小世界 (HNSW) 索引

为了帮助您分析和提升数据库的查询性能,Cloud SQL 提供了一个 Query Insights 工具。您可以使用此工具监控性能并跟踪有问题的查询的来源。如需了解详情,请参阅使用“查询数据分析”提高查询性能

如需简要了解数据库的状态和性能以及查看详细指标(如峰值连接数和磁盘利用率),您可以使用“系统数据分析”信息中心。如需了解详情,请参阅使用“系统数据分析”提高系统性能

Cloud Storage 如需上传大型文件,您可以使用一种名为并行复合上传的方法。使用此策略时,大文件会拆分为各个块。这些块会并行上传到 Cloud Storage,然后数据会在云中重新组合。如果网络带宽和磁盘速度不是限制因素,则并行复合上传可能比常规上传操作更快。 但是,此策略存在一些限制和费用影响。如需了解详情,请参阅并行复合上传

部署

如需部署基于此参考架构的拓扑,您可以下载并使用 GitHub 代码库中提供的开源示例代码。示例代码不适用于生产应用场景。您可以使用该代码来试验如何为启用了 RAG 的生成式 AI 应用设置 AI Infrastructure。

示例代码会执行以下操作:

  1. 预配 Cloud SQL for PostgreSQL 实例以充当矢量数据库。
  2. 将 Ray、JupyterHub 和 Hugging Face TGI 部署到您指定的 GKE 集群。
  3. 将基于 Web 的示例聊天机器人应用部署到 GKE 集群,以便您可验证 RAG 功能。

如需了解如何使用示例代码,请参阅代码的自述文件。如果您使用示例代码时发生了任何错误,并且对于这些错误不存在相应的待解决 GitHub 问题,请在 GitHub 中创建问题。

示例代码会部署可计费的 Google Cloud 资源。使用完代码后,移除不再需要的任何资源。

后续步骤

贡献者

作者: Kumar Dhanagopal | 跨产品解决方案开发者

其他贡献者: