亚马逊AWS官方博客

构建基于 Amazon Aurora 和 Amazon Bedrock 知识库的生成式 AI 应用程序

Amazon Bedrock 是使用基础模型(FMs)构建和扩展生成式 AI 应用程序的最简单方式。基础模型经过了大量数据训练,可用于回答各种主题的问题。然而,如果您想使用基础模型回答有关存储在 Amazon Simple Storage Service(Amazon S3)存储桶或 Amazon Aurora PostgreSQL 兼容版数据库中私有数据的问题,您需要使用一种叫作检索增强生成(RAG)的技术,为您的客户提供相关答复。

Amazon Bedrock 知识库是一种全托管的 RAG 功能,允许您使用上下文相关的公司数据定制基础模型响应。Amazon Bedrock 知识库自动化了端到端的 RAG 工作流程,包括摄取、检索、提示增强和引用,从而无需您编写自定义代码来集成数据源和管理查询。

将 Amazon Bedrock 与 Amazon Aurora PostgreSQL 集成,可利用有助于加速 RAG 向量相似性搜索性能的功能。Aurora 通过 pgvector 的 HNSW 索引,比其他索引方法快 20 倍。此外,Amazon Aurora 优化读取可以将 pgvector 的向量搜索性能提高 9 倍,适用于超出常规实例内存的工作负载。这是在 Aurora 的性能和可用性功能之上,让您可以在全球范围内高效且划算地运行 Aurora,包括 Aurora Serverless 和 Amazon Aurora Global Database

本文探讨如何使用 Amazon Aurora 构建使用 RAG 的生成式 AI 应用程序。我们将逐步介绍如何设置 Aurora 集群为 Amazon Bedrock 知识库。我们还将演示如何通过简单的 SQL 命令从 Amazon Bedrock 生成嵌入,使用 Amazon Aurora Machine Learning 扩展。

解决方案概述

下图演示了 RAG 工作流程的一个示例。

RAG 工作流程包含两个部分。第一部分是获取非结构化数据(如文本、图像和视频)、使用嵌入模型将其转换为嵌入(向量)、并将其存储在向量数据库中(步骤 1-3)。嵌入是一种数值表示,可用于相似性搜索以找到与查询最相关的内容。工作流程的第二部分是请求本身。将请求转换为嵌入,并用于查询向量数据库以查找内容从而增强提示(步骤 4-5)。查询的输出被发送到 FM,然后 FM 将响应发送给用户(步骤 6-7)。构建使用 RAG 的生成式 AI 应用程序需要协调此工作流程,当然这是构建应用程序逻辑之外的额外工作。

最近,AWS 宣布了 Amazon Bedrock 知识库正式发布。使用 Amazon Bedrock 知识库,您可以为 FM 和代理提供公司私有数据源的上下文信息,以便 RAG 提供更相关、更准确和更个性化的响应。然后,您可以将知识库与 Amazon Bedrock 代理一起使用,以协调多步骤任务和促进即时工程。更多信息请参阅 Knowledge Bases now delivers fully managed RAG experience in Amazon Bedrock

在下面的章节中,我们将演示如何把 Aurora 设置为 Amazon Bedrock 的知识库。我们还将看到如何使用 Aurora Machine Learning(ML),通过 SQL 命令生成嵌入。

先决条件

本文假设您熟悉浏览 AWS Management Console。对于此示例,您还需要在 AWS 账户中启用以下资源和服务:

将 Aurora 设置为 Amazon Bedrock 的知识库

创建 Amazon Bedrock 知识库的第一步是拥有可用于增强基础模型的内容。在此示例中,我们使用 PostgreSQL 16 手册的 PDF 版本。在撰写本文时 PostgreSQL 16 是一个新版本,尚未用于公共数据的 FM 训练。RAG 中使用的数据集通常有更多数据,但我们选择一个简单示例。

配置 S3 存储桶

要开始为 Amazon Bedrock 设置知识库,您需要创建一个 S3 存储桶。请确保此存储桶是私有的。本示例使用名为 bedrock-kb-demo-aurora 的存储桶。创建存储桶后,将 PostgreSQL 16 手册上传到存储桶中。以下为上传完成后截图示例。

配置 Aurora PostgreSQL 集群

接下来,创建一个 Aurora PostgreSQL 集群。有关完整说明,请参阅将 Aurora PostgreSQL 用作 Amazon Bedrock 的知识库。我们重点介绍本示例中使用的一些特定配置选项:

  1. 在 Aurora 控制台上创建一个新集群。
  2. 对于 Engine options,选择 Aurora (PostgreSQL Compatible)。
  3. 对于 Engine version,选择您的引擎版本。

我们在此示例中选择了 PostgreSQL 15.5;我们建议使用 PostgreSQL 15.5 或更高版本,以便使用最新版本的开源 pgvector 扩展。

  1. 对于 Configuration options,选择 Aurora Standard 或 Aurora I/O Optimized。

我们选择了 Aurora I/O 优化,它为 I/O 密集型应用程序提供了改进的性能和可预测的定价。

  1. 对于 DB instance class,选择您的实例类。

我们选择使用 Amazon Aurora Serverless v2,它会根据应用程序工作负载自动调整您的计算,因此您只需根据已使用的容量付费。

  1. 启用 RDS Data API,Amazon Bedrock 将使用它来访问您的 Aurora 集群。
  2. 创建您的 Aurora 集群。
  3. 当您的 Aurora 集群正在配置时,导航到 Aurora 控制台上的集群,并选择配置选项卡。
  4. 记下集群的 Amazon 资源名称(ARN),并保存以备后期使用。

需要 ARN 来配置 Amazon Bedrock 的知识库。

Aurora PostgreSQL 集群大约需要 10 分钟完成配置。集群配置完成后,您需要运行一系列 SQL 命令来准备您的集群作为知识库。

  1. 以管理员用户(例如 postgres)或具有 rds_superuser 权限的用户身份登录到 Aurora 集群,并运行以下代码。请注意您为 bedrock_user 创建的密码,因为在稍后的配置 Secrets Manager 中的密钥时您将会需要它。还要注意表名和列名,因为它们将用于 Amazon Bedrock 控制台上的知识库工作流程。
    CREATE EXTENSION IF NOT EXISTS vector;
    CREATE SCHEMA bedrock_integration;
    CREATE ROLE bedrock_user LOGIN;
    -- 输入并记下此用户的密码
    \password bedrock_user
    GRANT ALL ON SCHEMA bedrock_integration to bedrock_user;
    SET SESSION AUTHORIZATION bedrock_user;
    CREATE TABLE bedrock_integration.bedrock_kb (
      id uuid PRIMARY KEY,
      embedding vector(1536),
      chunks text,
      metadata json
    );
    CREATE INDEX ON bedrock_integration.bedrock_kb
      USING hnsw (embedding vector_cosine_ops);
    

现在,Aurora 集群已设置为 Amazon Bedrock 的知识库。接下来,我们将在 Secrets Manager 中创建一个密钥,Amazon Bedrock 将使用它来连接集群。

在 Secrets Manager 中创建密钥

Secrets Manager 允许您存储 Aurora 凭据,以便可以安全地将它们传输到应用程序。完成以下步骤来创建密钥:

  1. 在 Secrets Manager 控制台上,创建一个新密钥。
  2. 对于 Secret type,选择 Credentials for Amazon RDS Database。
  3. 在 Credentials 下,输入用户名(在本文中,我们使用 bedrock_user)和该角色的密码。
  4. 在 Database 部分,选择您用于知识库的集群。
  5. 选择 Next。
  6. 关于 Secret name,输入密钥的名称。
  7. 选择 Next。
  8. 完成创建密钥并复制密钥 ARN。

您需要密钥 ARN 来创建知识库。

准备就绪,我们将使用 Aurora 集群作为 Amazon Bedrock 的知识库。

为 Amazon Bedrock 创建知识库

现在我们可以将集群用作知识库。完成以下步骤:

  1. 在 Amazon Bedrock 控制台上,在导航窗格中选择 Orchestration 下的 Knowledge base。
  2. 选择 Create knowledge base。
  3. 对于 Knowledge base name,输入一个名称。
  4. 对于 Runtime role,选择 Create and use a new service role 并输入服务角色名称。
  5. 选择 Next。
  6. 对于 Choose an archive in S3,选择要用作数据源的 S3 存储桶,然后选择 Choose。

在本文中,我们使用之前上传的包含 PostgreSQL 16 手册的 S3 存储桶。

  1. 对于 Embeddings model,选择您的模型(在本文中,我们使用 Amazon Titan Embeddings G1 – Text)。
  2. 对于 Vector database,选择 Choose a vector store you have created 并选择 Amazon Aurora。
  3. 提供以下额外信息(注意我们在本文中使用的示例):
    1. 对于 Amazon Aurora DB Cluster ARN,输入创建 Aurora 集群时保存的 ARN。
    2. 对于 Database name,输入 postgres
    3. 对于 Table name,输入 bedrock_integration.bedrock_kb
    4. 对于 Secret ARN,输入创建 bedrock_user 密钥时保存的 ARN。
    5. 对于 Vector field,输入 embedding
    6. 对于 Text field,输入 chunks
    7. 对于 Bedrock-managed metadata field,输入 metadata
    8. 对于 Primary key,输入 id
  4. 选择 Next。
  5. 查看摘要页面并选择 Sync。

这将开始将存储在 S3 存储桶中的非结构化数据转换为嵌入并存储在 Aurora 集群中的过程。

同步操作可能需要几分钟到几小时才能完成,这取决于存储在 S3 存储桶中的数据集的大小。在同步操作期间,Amazon Bedrock 会下载 S3 存储桶中的文档,将它们分成块(在本文中,我们选择”默认”策略),生成向量嵌入,并将嵌入存储在 Aurora 集群中。初始同步完成后,您会看到数据源显示为 Ready。

现在您可以在 Amazon Bedrock 代理中使用此知识库。我们可以将此知识库用作测试的一部分。对于此示例,我们选择了 PostgreSQL 16 手册作为我们的数据集。这可以让我们看到 RAG 在实际操作中的效果,因为基础模型可能还没有关于 PostgreSQL 16 所有功能的信息。

在以下示例中,我们使用 Amazon Bedrock 的 Test knowledge base 功能,选择 Anthropic Claude 2.1 模型,并询问有关 PostgreSQL 16 功能的问题——特别是 pg_stat_io 视图。以下为我们的答复截图。

根据提供的问题,Amazon Bedrock 查询了我们的 Aurora 集群以获取回答问题所需的额外上下文。我们的知识库包含了关于新的 pg_stat_io 功能如何工作的信息,并且能够通过 Anthropic Claude 提供增强的答复。测试工具还引用了它用于提供其如何响应归属的块。

现在我们已经看到了如何使用 Amazon Bedrock 的知识库和 Aurora PostgreSQL 集群来增强基础模型响应,让我们学习如何直接从 Aurora 集群生成嵌入。这对于将用户问题转换为嵌入是必需的,可与 Aurora 中的嵌入进行相似性搜索比较。

为 Aurora 集群创建 IAM 角色和策略

在您可以开始直接从 Aurora 生成 Amazon Bedrock 的向量嵌入之前,您可能需要调整网络配置,以便您的 Aurora 集群可以与 Amazon Bedrock 通信。有关如何执行此操作的更多信息,请参阅 Enabling network communication from Amazon Aurora MySQL to other AWS services。这些说明也适用于 Aurora PostgreSQL 集群。

要允许 Aurora ML 与 Amazon Bedrock 一起工作,必须首先创建一个 IAM 策略,允许 Aurora 集群与 Amazon Bedrock 模型通信。完成以下步骤:

  1. 在 IAM 控制台上, 选择导航窗格中的 Policies,然后选择 Create policy。
  2. 在策略编辑器中,展开 Bedrock,然后在 Read 下选择 InvokeModel 以允许该操作。
  3. 展开 Resources并选择 Specific。
  4. 对于 foundation-model,选择 Any。为了最佳实践体验,请确保只授予您的团队所需的 Amazon Bedrock 基础模型的访问权限。
  5. 对于 provisioned-model,同样选择 Any in this account。同上,为了最佳实践体验,请确保只授予您的团队所需的 Amazon Bedrock 预配置模型的访问权限。
  6. 选择 Next。
  7. 对于 Policy name,输入策略名称(例如 AuroraMLBedrock)。
  8. 选择 Create policy。
  9. 在 IAM 控制台上,选择导航窗格中的 Roles,然后选择 Create role。
  10. 对于 Trusted entity type,选择 AWS service。
  11. 对于 Service or use case,选择 RDS。
  12. 选择 RDS – Add Role to Database。
  13. 选择 Next。

现在我们将上一步中创建的 IAM 策略分配给此 IAM 角色。

  1. 对于 Permission policies,找到并选择 AuroraMLBedrock 策略。
  2. 选择 Next。
  3. 在 Role details 部分,输入名称(在本文中为 AuroraMLBedrock)和描述。
  4. 查看 IAM 角色,并确认 AuroraMLBedrock 策略已加在附件中。
  5. 选择 Create 创建角色。

现在我们需要将 AuroraMLBedrock IAM 角色分配给 Aurora 集群。

  1. 在 Amazon RDS 控制台上,导航到 Aurora 集群详细信息页面。
  2. 在 Connectivity & security 选项卡上,找到 Manage IAM roles 部分。
  3. 对于 Add IAM roles to this cluster,选择 AuroraMLBedrock 角色。
  4. 对于 Feature,选择 Bedrock。
  5. 选择 Add role。

您的集群现在可以调用 Amazon Bedrock 中的模型。

使用 Aurora ML 生成向量嵌入

Aurora 机器学习是一项 Aurora 功能,允许构建者通过 SQL 命令直接使用 AWS ML 服务(包括 Amazon Bedrock、Amazon SageMaker 和 Amazon Comprehend)。通过最近对 Amazon Bedrock 的支持,Aurora ML 可以让您访问基础模型和嵌入生成器,有助于在处理已存储在 Aurora 集群中的数据时降低延迟。这包括两个新函数:aws_bedrock.invoke_model,允许您从 SQL 查询使用基础模型,以及 aws_bedrock.invoke_model_get_embeddings,它可以从 SQL 查询生成嵌入。更多信息请参阅Amazon Aurora 机器学习与 Aurora PostgreSQL 一起使用

让我们看看如何使用 Aurora ML 从 Amazon Bedrock 生成嵌入。首先,用具有 rds_superuser 权限的账户(例如 postgres)身份登录到 Aurora 集群,并在数据库中安装 Aurora ML 扩展:

CREATE EXTENSION IF NOT EXISTS aws_ml CASCADE;

您应该会看到以下输出:

CREATE EXTENSION

现在您可以直接从 Aurora 创建嵌入。以下示例展示了如何使用 Titan Embeddings G1 – Text 嵌入模型为短语“PostgreSQL I/O monitoring views”生成嵌入:

SELECT aws_bedrock.invoke_model_get_embeddings(
   model_id      := 'amazon.titan-embed-text-v1',
   content_type  := 'application/json',
   json_key      := 'embedding',
   model_input   := '{ "inputText": "PostgreSQL I/O monitoring views"}') AS embedding;

您会看到以下输出(为清晰起见进行了缩写):

 {-1.0625,-1.1484375,0.578125,-0.08251953,0.39453125,-0.80859375,0.051513672,-0.0016479492,-1.203125,0.49609375,-0.33984375 ... -0.37695312,-0.16699219,-0.796875,1.21875,-0.36523438 }

您可以使用 aws_bedrock.invoke_model_get_embeddings 函数从已存在于数据库中的数据生成嵌入。但是,由于在单个输入上调用嵌入模型可能需要 100-400 毫秒才能完成,因此您应该在批量查询上使用 PostgreSQL 的存储过程系统,以防止单个长时间运行的事务阻塞其他进程。

以下示例展示了我们如何向现有表添加嵌入,并使用匿名块管理批量导入。首先,确保在数据库中安装了 pgvector 扩展,并创建一个将包含示例数据的表:

CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
  id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  content text NOT NULL,
  embedding vector(1536)
);
INSERT INTO documents (content)
VALUES
  ('Allow parallelization of FULL and internal right OUTER hash joins'),
  ('Allow logical replication from standby servers'),
  ('Allow logical replication subscribers to apply large transactions in parallel'),
  ('Allow monitoring of I/O statistics using the new pg_stat_io view'),
  ('Add SQL/JSON constructors and identity functions'),
  ('Improve performance of vacuum freezing'),
  ('Add support for regular expression matching of user and database names in pg_hba.conf, and user names in pg_ident.conf');

现在您可以使用以下代码批量为此数据集生成嵌入。示例代码循环遍历 documents 表中没有嵌入的所有记录。对于每个记录,代码调用 Amazon Titan 嵌入模型来生成嵌入,并将结果更新和提交到数据库。

DO
$embed$
    DECLARE
        doc RECORD;
        emb vector(1536);
    BEGIN
        FOR doc in SELECT id, content FROM documents WHERE embedding IS NULL LOOP
            EXECUTE $$ SELECT aws_bedrock.invoke_model_get_embeddings(
                    model_id      := 'amazon.titan-embed-text-v1',
                    content_type  := 'application/json',
                    json_key      := 'embedding',
                    model_input   := json_build_object('inputText', $1)::text)$$
                INTO emb
                USING doc.content;
            UPDATE documents SET embedding = emb WHERE id = doc.id;
            COMMIT;
        END LOOP;
    END;
$embed$ LANGUAGE plpgsql;

在本节中,我们看到了如何使用 Aurora ML,从已存在于 Aurora 数据库中的数据使用 Amazon Bedrock 生成嵌入。这种技术有助于加快从数据库数据创建嵌入的速度,因为您可以直接调用 Amazon Bedrock 而无需先转移到单独的系统,以减少延迟。

清理

如果您不需要使用您创建的任何资源,请在完成后将其删除:

  1. 清空并删除您的 S3 存储桶
  2. 如果您不再需要使用 Aurora ML 扩展,但希望继续使用集群,您可以通过运行以下 SQL 命令从 Aurora 集群中删除它:
    DROP EXTENSION aws_ml;
  1. 此外,如果您不再需要使用 Aurora ML 扩展,但希望继续使用 Aurora 集群,您可以从集群中删除您创建的用于访问 Amazon Bedrock 的 IAM 角色,并且可能需要更新一些网络配置。
  2. 要删除知识库,请参阅 Manage a knowledge base
  3. 如果您不再需要 Aurora 集群,请按照 Deleting Aurora DB clusters and DB instances 中的说明进行操作。

结论

RAG 是一种强大的技术,可让您将特定领域的信息与 FM 相结合,丰富生成式 AI 应用程序中的响应。在本文中,我们介绍了多个示例,说明如何将 Amazon Bedrock 与 Aurora 结合使用,为您生成式 AI 应用程序实现 RAG。其中包括如何将 Amazon Aurora PostgreSQL 设置为 Amazon Bedrock 的知识库,以及如何使用 Aurora ML 从 Amazon Bedrock 生成向量嵌入。

了解更多有关使用 Amazon Aurora PostgreSQL 和 pgvector 进行 AI 和 ML 工作负载的信息,请参阅 Leverage pgvector and Amazon Aurora PostgreSQL for Natural Language Processing, Chatbots and Sentiment Analysis


Original URL: https://aws.amazon.com/blogs/database/build-generative-ai-applications-with-amazon-aurora-and-knowledge-bases-for-amazon-bedrock/

本篇作者

Steve Dille

Amazon RDS Aurora 的高级产品经理,引导着 AWS Aurora 数据库的所有生成式 AI 战略和产品计划。在担任此职位之前,Steve 创建了 Aurora 的性能和基准测试团队,然后构建并推出了 Aurora Serverless v2 的 RDS Data API。

Jonathan Katz

Amazon RDS 团队的首席产品经理兼技术经理,常驻纽约。Jonathan 是开源 PostgreSQL 项目的核心团队成员,也是一名活跃的开源贡献者。

校译作者

Jeremy Pedersen

亚马逊云科技解决方案架构师。他专注于机器学习和教育设备,尤其是 Amazon DeepRacer。在加入亚马逊云科技之前,他在阿里云工作了五年,先是担任解决方案架构师,后来成为技术培训师。