

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Terraform 和 Amazon AWS Bedrock 部署 RAG 用例
<a name="deploy-rag-use-case-on-aws"></a>

*Martin Maritsch、Nicolas Jacob Baer、Olivier Brique、Julian Ferdinand Grueber、Alice Morano 和 Nicola D Orazio，Amazon Web Services*

## Summary
<a name="deploy-rag-use-case-on-aws-summary"></a>

AWS 提供了各种选项来构建支持[检索增强生成 (RAG)](https://aws.amazon.com/what-is/retrieval-augmented-generation/) 的生成式 AI 用例。这种模式为基于矢量存储且兼容 Amazon Aurora PostgreSQL 的基于 RAG 的应用程序提供了解决方案。 LangChain 您可以使用 Terraform 将此解决方案直接部署到您的中， AWS 账户 并实现以下简单的 RAG 用例：

1. 用户将文件手动上传到 Amazon Simple Storage Service（Amazon S3）存储桶，例如 Microsoft Excel 文件或 PDF 文档。（有关支持的文件类型的更多信息，请参阅[非结构化](https://docs.unstructured.io/open-source/core-functionality/partitioning)文档。）

1. 文件内容会被提取并嵌入到基于无服务器 Aurora PostgreSQL 兼容版的知识数据库中，且该数据库支持近乎实时地将文档摄取到向量存储中。这种方法使得 RAG 模型能够访问和检索相关信息，以适用于对低延迟有严格要求的使用案例。

1. 当用户使用文本生成模型时，可通过从先前上传的文件中增强相关内容的检索，进而加强交互。

此模式使用 [Amazon Titan 文本嵌入 v2](https://docs.aws.amazon.com/bedrock/latest/userguide/titan-embedding-models.html) 作为嵌入模型，以及使用 [Anthropic Claude 3 Sonnet](https://aws.amazon.com/bedrock/claude/) 作为文本生成模型，两者在 Amazon Bedrock 上皆有提供。

## 先决条件和限制
<a name="deploy-rag-use-case-on-aws-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ AWS Command Line Interface (AWS CLI) 已安装并配置为你的 AWS 账户。有关安装说明，请参阅 AWS CLI 文档 AWS CLI中的[安装或更新到最新版本](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)的。要查看您的 AWS 凭证和对账户的访问权限，请参阅 AWS CLI 文档中的[配置和凭证文件设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。
+ 在您 AWS 账户的 Amazon Bedrock 控制台中为所需的大型语言模型 (LLMs) 启用的模型访问权限。此模式需要以下内容 LLMs：
  + `amazon.titan-embed-text-v2:0`
  + `anthropic.claude-3-sonnet-20240229-v1:0`

**限制**
+ 此示例架构不包括使用向量数据库进行编程问答的接口。如果您的用例需要 API，可以考虑添加带有运行检索和问答任务 AWS Lambda 功能[的 Amazon API Gat](https://docs.aws.amazon.com/apigateway/latest/developerguide) eway。 
+ 此示例架构不包括对已部署基础设施的监控功能。如果您的使用案例需要监控，请考虑添加 [AWS 监控服务](https://docs.aws.amazon.com/prescriptive-guidance/latest/implementing-logging-monitoring-cloudwatch/welcome.html)。
+ 如果您在短时间内将大量文档上传到 Amazon S3 存储桶，则 Lambda 函数可能会遇到速率限制。作为解决方案，您可以将 Lambda 函数与 Amazon Simple Queue Service（Amazon SQS）队列分开，而在此队列中，您可以控制 Lambda 调用的速率。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然后选择相应服务的链接。

**产品版本**
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) 版本 2 或更高版本
+ [Docker](https://docs.docker.com/get-started/) 版本 26.0.0 或更高版本
+ [Poetry](https://pypi.org/project/poetry/) 版本 1.7.1 或更高版本
+ [Python](https://www.python.org/downloads/) 版本 3.10 或更高版本
+ [Terraform](https://developer.hashicorp.com/terraform/install) 版本 1.8.4 或更高版本

## 架构
<a name="deploy-rag-use-case-on-aws-architecture"></a>

下图显示了此模式的工作流和架构组件。

![\[使用 Aurora PostgreSQL LLMs 和亚马逊 Bedrock 创建基于 RAG 的应用程序的工作流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/8f184945-7f17-4760-8806-6d0eaeef372a/images/3771b7a0-05bd-4eb3-ad5b-199e22f86184.png)


该图阐明了以下流程：

1. 在 Amazon S3 存储桶 `bedrock-rag-template-<account_id>` 中创建对象时，[Amazon S3 通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html)会调用 Lambda 函数 `data-ingestion-processor`。

1. Lambda 函数 `data-ingestion-processor` 基于存储在 Amazon Elastic Container Registry（Amazon ECR）存储库 `bedrock-rag-template` 中的 Docker 映像。

   该函数使用 [LangChain S3 FileLoader](https://python.langchain.com/v0.1/docs/integrations/document_loaders/aws_s3_file/) 将文件作为[LangChain 文档](https://api.python.langchain.com/en/v0.0.339/schema/langchain.schema.document.Document.html)读取。然后，根据Amazon Titan文本嵌入V2嵌入模型的最大令牌大小，给定a `CHUNK_SIZE` 和a对每个文档进行分[LangChain RecursiveCharacterTextSplitter](https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/recursive_text_splitter/)块。`CHUNK_OVERLAP`接下来，Lambda 函数会在 Amazon Bedrock 上调用嵌入模型，将分块嵌入到数值向量表示中。最后，这些向量会存储在 Aurora PostgreSQL 数据库中。要访问数据库，Lambda 函数首先从中检索用户名和密码。 AWS Secrets Manager

1. 在 Amazon SageMaker AI [笔记本实例](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi.html)上`aws-sample-bedrock-rag-template`，用户可以编写问题提示。该代码在 Amazon Bedrock 上调用 Claude 3，并将知识库信息添加到提示的上下文中。因此，Claude 3 使用文档中的信息提供回复。

此模式的联网和安全方法如下：
+ Lambda 函数 `data-ingestion-processor` 位于虚拟私有云（VPC）的私有子网中。由于 Lambda 函数具有安全组，因此不允许向公有互联网发送流量。因此，流向 Amazon S3 和 Amazon Bedrock 的流量仅可通过 VPC 端点路由。因此，流量不会遍历公有互联网，从而降低延迟，并在联网层面额外增加一层安全层。
+ 只要适用，就会使用带别名的 AWS Key Management Service (AWS KMS) 密钥对所有资源和数据进行加密`aws-sample/bedrock-rag-template`。

**自动化和扩展**

此模式使用 Terraform 将基础设施从代码库部署到 AWS 账户。

## 工具
<a name="deploy-rag-use-case-on-aws-tools"></a>

**AWS 服务**
+ [Amazon Aurora PostgreSQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是一个完全托管的、与 ACID 兼容的关系数据库引擎，可帮助您建立、运行和扩展 PostgreSQL 部署。在此模式中，Aurora PostgreSQL 兼容版使用 pgvector 插件作为向量数据库。
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) 是一项完全托管的服务，它通过统一的 API 提供来自领先的人工智能初创公司和亚马逊的高性能基础模型 (FMs) 供您使用。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一个开源工具，可帮助您 AWS 服务 通过命令行 shell 中的命令进行交互。
+ [Amazon Elastic Container Registry（Amazon ECR）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)是一项安全、可扩展且可靠的托管容器映像注册表服务。在此模式下，Amazon ECR 会托管 `data-ingestion-processor` Lambda 函数的 Docker 映像。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Key Management Service （AWS KMS）](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)可以创建和控制加密密钥，从而帮助保护您的数据。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。在此模式中，Lambda 会将数据摄取到向量存储中。
+ [Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/?id=docs_gateway) 是一项托管机器学习 (ML) 服务，可帮助您构建和训练机器学习模型，然后将其部署到生产就绪的托管环境中。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 进行的 API 调用，以便以编程方式检索此密钥。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [Amazon Virtual Private Cloud（亚马逊 VPC）](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络，并具有使用 AWS的可扩展基础设施的优势。VPC 包括用于控制流量的子网和路由表。

**其他工具**
+ [Docker](https://docs.docker.com/manuals/) 是一组平台即服务（PaaS）产品，它们利用操作系统级的虚拟化技术在容器中提供软件。
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一款基础设施即代码（IaC）工具，可帮助您使用代码来预调配和管理云基础设施和资源。
+ [Poetry](https://pypi.org/project/poetry/) 是 Python 中用于管理和打包依赖项的工具。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码存储库**

此模式的代码可在-ama GitHub [terraform-rag-template-usingzon-](https://github.com/aws-samples/terraform-rag-template-using-amazon-bedrock) bedrock 存储库中找到。

## 最佳实践
<a name="deploy-rag-use-case-on-aws-best-practices"></a>
+ 尽管此代码示例可以部署到任何位置 AWS 区域，但我们建议您使用美国东部（弗吉尼亚北部）`us-east-1`或美国西部（加利福尼亚北部）`us-west-1`。该建议基于此模式发布时 Amazon Bedrock 中基础模型和嵌入模型的可用性。有关 Amazon Bedrock 基础模型支持的 up-to-date列表 AWS 区域，请参阅 Amazon Bedrock 文档 AWS 区域中的[模型支持](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html)。有关将此代码示例部署到其他区域的信息，请参阅[其他信息](#deploy-rag-use-case-on-aws-additional)。
+ 此模式仅提供 proof-of-concept（PoC）或试点演示。如果您想将代码部署到生产环境，请务必使用以下最佳实践：
  + 启用 Amazon S3 服务器访问日志记录。
  + 为 Lambda 函数设置[监控和提醒](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)。
  + 如果您的使用案例需要 API，则可以考虑添加 Amazon API Gateway，其中包含可运行检索和问答任务的 Lambda 函数。
+ 遵循最低权限原则，并授予执行任务所需的最低权限。有关详情，请参阅 IAM 文档中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPracticesAndUseCases.html)。

## 操作说明
<a name="deploy-rag-use-case-on-aws-epics"></a>

### 将解决方案部署在 AWS 账户
<a name="deploy-the-solution-in-an-aws-account"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 要克隆此模式提供的 GitHub 存储库，请使用以下命令：<pre>git clone https://github.com/aws-samples/terraform-rag-template-using-amazon-bedrock</pre> | AWS DevOps | 
| 配置变量。 | 要配置此模式的参数，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html) | AWS DevOps | 
| 部署解决方案。 | 要部署该解决方案，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html)基础设施部署在 VPC 内配置一个 SageMaker AI 实例，并具有访问 Aurora PostgreSQL 数据库的权限。 | AWS DevOps | 

### 测试解决方案
<a name="test-the-solution"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 运行演示。 | 成功部署之前的基础设施后，使用以下步骤在 Jupyter Notebook 中运行演示：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html)Jupyter Notebook 将引导您完成以下过程：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html) | 常规 AWS | 

### 清理基础设施
<a name="clean-up-infrastucture"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 清理基础设施。 | 要移除所有创建的不再需要的资源，请使用以下命令：<pre>terraform destroy -var-file=commons.tfvars</pre> | AWS DevOps | 

## 相关资源
<a name="deploy-rag-use-case-on-aws-resources"></a>

**AWS resources**
+ [使用 Python 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)
+ [基础模型的推理参数](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html)
+ [访问 Amazon Bedrock 基础模型](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html)
+ [矢量数据库在生成式人工智能应用中的作用](https://aws.amazon.com/blogs/database/the-role-of-vector-datastores-in-generative-ai-applications/)（AWS 数据库博客）
+ [使用 Amazon Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)

**其他资源**
+ [pgvector 文档](https://github.com/pgvector/pgvector)

## 附加信息
<a name="deploy-rag-use-case-on-aws-additional"></a>

**实施向量数据库**

此模式使用 Aurora PostgreSQL 兼容版来为 RAG 实施向量数据库。作为 Aurora PostgreSQL 的替代品 AWS ，为 RAG 提供其他功能和服务，例如亚马逊 Bedrock 知识库和亚马逊服务。 OpenSearch 您可以选择最适合您特定要求的解决方案：
+ [Amazon Ser OpenSearch v](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html) ice 提供分布式搜索和分析引擎，可用于存储和查询大量数据。
+ [Amazon Bedrock 知识库](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html)旨在构建和部署知识库，并作为额外抽象来简化 RAG 的摄取和检索过程。亚马逊 Bedrock 知识库可以与 Aurora PostgreSQL 和亚马逊服务一起使用。 OpenSearch 

**部署到其他 AWS 区域**

如[架构](#deploy-rag-use-case-on-aws-architecture)中所述，我们建议您使用区域美国东部（弗吉尼亚州北部）– `us-east-1` 或美国西部（北加利福尼亚）– `us-west-1` 来部署此代码示例。但是，有两种潜在方法可以将此代码示例部署到 `us-east-1` 和 `us-west-1` 之外的其他区域。您可以在 `commons.tfvars` 文件中配置部署区域。对于跨区域基础模型访问，请考虑以下选项：
+ **遍历公有互联网** – 如果流量可以遍历公有互联网，请将互联网网关添加到 VPC。然后，调整分配给 Lambda 函数`data-ingestion-processor`和 SageMaker AI 笔记本实例的安全组，以允许公共互联网的出站流量。
+ **未遍历公共互联网** – 要将此示例部署到除 `us-east-1` 或 `us-west-1` 之外的任何区域，请执行以下操作：

1. 在 `us-east-1` 或 `us-west-1` 区域中，为 `bedrock-runtime` 创建一个额外的 VPC，包括一个 VPC 端点。

1. 使用 [VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)或通往应用程序 VPC 的[传输网关](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-peering.html)，创建对等连接。

1. 在 `us-east-1` 或 `us-west-1` 之外的任何 Lambda 函数中配置 `bedrock-runtime` boto3 客户端时，请将 `us-east-1` 或 us-west-1 中的 `bedrock-runtime` 的 VPC 端点的私有 DNS 名称作为 `endpoint_url` 传递给 boto3 客户端。