项目展示

Our Projects

创建一个端到端无服务器的数字助手,用于语义搜索与 Amazon Bedrock 机器学习博客

项目展示

创建一个端到端无服务器的数字助手,用于语义搜索与 Amazon Bedrock 机器学习博客

2026-01-27 13:15:05 29

使用 Amazon Bedrock 创建端到端无服务器数字助手以实现语义搜索

关键要点

随着生成性人工智能的兴起,越来越多的组织使用数字助手,让最终用户可以针对特定领域的问题进行提问。本文介绍了一种基于无服务器架构的解决方案,旨在创建端到端的数字助手网页应用,以满足安全性和操作成本优化的需求。通过 Amazon Bedrock 的混合搜索功能,提高了检索结果的相关性,同时实现了身份和访问管理。实现此解决方案涉及多个 AWS 服务,如 Amazon Bedrock、Amazon OpenSearch Serverless、AWS Amplify 等。

随着生成性人工智能的快速发展,许多组织开始采用数字助手,利用检索增强生成RAG技术回答用户关于特定领域的问题。组织在从概念验证转向生产工作负载时,通常目标是以最小的操作开销运行和扩展工作负载,同时优化成本。此外,组织还需要实施常见的安全做法,比如身份和访问管理,确保只有经过授权和认证的用户可以执行特定操作或访问某些资源。

本文将介绍如何创建一个基于无服务器架构的端到端数字助手网页应用,旨在满足这些需求。由于该解决方案组件主要使用无服务器技术,它提供了多个好处,例如自动扩展、内置高可用性和按需付费的计费模型以优化成本。该解决方案还包含身份验证层和授权层,以管理身份和权限。

本解决方案利用了 Amazon Bedrock 知识库的混合搜索功能,通过 RAG 提高检索结果的相关性。当接收用户查询时,混合搜索同时进行语义搜索和关键词搜索:

语义搜索根据查询中的含义和意图提供结果关键词搜索根据查询中的特定实体如产品代码或缩略词提供结果

例如,如果用户提交的提示包含关键词,基于文本的搜索可能优于语义搜索。这就是混合搜索需结合这两种方法的原因:结合语义搜索的精度和关键词的覆盖范围。有关混合搜索的更多信息,请参见 Amazon Bedrock 知识库现在支持混合搜索。

解决方案概述

解决方案架构的步骤如下:

用户登录数字助手网页应用进行身份验证。Amazon Cognito 验证身份信息。用户通过网页应用提交请求。请求由网页应用发送到 API。API 调用 Lambda 授权器以确认用户是否有权执行操作。请求从 API 传递到 Lambda 函数。Lambda 函数将请求作为提示提交给知识库Amazon Bedrock 知识库,并明确请求进行混合搜索。Amazon Bedrock 使用混合搜索从向量存储中检索相关数据。Amazon Bedrock 将提示提交给基础模型。

以下图表展示了该工作流程。

前提条件

要跟随本文并设置此解决方案,您需要具备以下条件:

一个 AWS 账户可访问您 AWS 账户的设备,要求如下:安装 Python 312安装 Nodejs 20120配置 AWS Amplify CLI对以下 Amazon Bedrock 模型的 模型访问权限:Titan Embeddings G1 Text 和 Claude Instant

上传文档并创建知识库

在本节中,我们将在 Amazon Bedrock 中创建一个知识库。该知识库将从我们的数据源在此案例中为上传到 S3 桶中的文档中提取上下文信息,以丰富提交给 Amazon Bedrock 基础模型的提示。

创建知识库时,还将创建一个 向量存储,以摄取作为向量编码的文档,使用嵌入模型。嵌入模型可以将数据编码为向量,以捕捉样本文档的含义和上下文。这使我们能够找到与最终用户提示相关的数据。

飞跃加速器下载

针对我们的用例,我们使用 OpenSearch Serverless 的向量引擎 作为向量存储,并将 Titan Text Embeddings G1 模型 作为嵌入模型。

完成以下步骤以创建一个 S3 桶,上传文档,并将其与 Amazon Bedrock 中的知识库进行同步:

在您的账户中创建 S3 桶。上传 以下文档到 S3 桶中:AWS 概述 白皮书。AWS 良好架构框架 文档。在 AWS 上实现微服务 白皮书。创建知识库,并使用以下配置:在 知识库名称 中输入 assistantknowledgebase。在 知识库描述 中输入 数字助手的知识库。在 IAM 权限 中选择 创建并使用新服务角色。在 数据源名称 中输入 assistantknowledgebasedatasource。在 S3 URI 中输入先前创建的 S3 桶的 URI例如,s3//#s3bucketname#。在 嵌入模型 中选择 Titan G1 Embeddings Text。在 向量数据库 中选择 快速创建新向量存储。摄取 并将文档同步到知识库中。

创建 API 和后端

在本节中,我们将创建以下资源:

用于网页身份验证和授权的用户目录,通过 Amazon Cognito 用户池 创建。通过 Amazon API Gateway 创建的 API。这将为我们的数字助手网页应用提供一个单一入口。API 中的授权层,以保护我们的后端不受未授权用户的访问。这将通过 Lambda 授权函数来实现,以验证传入请求是否包含有效的授权细节。API 后面的 Lambda 函数,将提示提交给知识库并将响应返回给 API。

完成以下步骤以使用 AWS CloudFormation 模板创建数字助手网页应用的 API 和后端:

克隆 GitHub 仓库。导航到 api 文件夹,该文件夹包括以下内容:名为 webappuserpoolstackyml 的模板用于 Amazon Cognito 用户池名为 webapplambdastackyml 的模板用于调用知识库的 Lambda 函数名为 webappapistackyml 的模板用于 API 和 Lambda 授权函数包含 Lambda 授权函数代码的子文件夹 lambdaauth包含调用知识库的 Lambda 函数的子文件夹 lambdaknowledgebase脚本 cognitocreatetestusersh 用于在 Amazon Cognito 用户池中创建测试用户使用以下 AWS 命令行界面 (AWS CLI) 命令创建网页应用的 Amazon Cognito 用户池:

bash aws cloudformation createstack stackname webappuserpoolstack templatebody file//webappuserpoolstackyml

进入 lambdaknowledgebase 文件夹并使用以下命令下载依赖项:

bash pip install r requirementstxt t

创建一个名为 lambdaknowledgebasezip 的压缩文件,其中包含 Lambda 代码及其依赖项压缩文件的根目录必须包含 Lambda 代码及其依赖项。从 api 文件夹进入 lambdaauth 文件夹,使用以下命令下载依赖项:

bash pip install r requirementstxt t

创建一个名为 lambdaauthzip 的压缩文件,其中包含 Lambda 代码及其依赖项压缩文件的根目录必须包含 Lambda 代码及其依赖项。创建 S3 桶在您的账户中。上传两个 zip 文件lambdaauthzip 和 lambdaknowledgebasezip到 S3 桶中。

返回到 api 文件夹,使用以下 AWS CLI 命令创建网页应用的 Lambda 函数提供您的 S3 桶和知识库 ID:

bashaws cloudformation createstack stackname webapplambdaknowledgebasestack capabilities CAPABILITYIAM templatebody file//webapplambdaknowledgebasestackyml parameters ParameterKey=BedrockKnowledgeBaseIdParameterValue=#bedrockknowledgebaseid# ParameterKey=BedrockLambdaS3BucketParameterValue=#lambdacodes3bucketname# ParameterKey=BedrockLambdaS3KeyParameterValue=lambdaknowledgebasezip

您可以通过运行以下 AWS CLI 命令检索知识库 ID:

bashaws bedrockagent listknowledgebases output text query knowledgeBaseSummaries[name==assistantknowledgebase]knowledgeBaseId

使用以下 AWS CLI 命令创建网页应用的 API提供您的桶名称:

bashaws cloudformation createstack stackname webappapistack capabilities CAPABILITYIAM templatebody file//webappapistackyml parameters ParameterKey=LambdaAuthorizerS3BucketParameterValue=#lambdacodes3bucketname# ParameterKey=LambdaAuthorizerS3KeyParameterValue=lambdaauthzip

配置 Amazon Cognito 用户池

在本节中,我们将在 Amazon Cognito 用户池中创建一个用户。该用户将用于登录我们的网页应用。

完成以下步骤以配置在前一节中创建的 Amazon Cognito 用户池:

在 Amazon Cognito 控制台,访问名为 webappuserpool 的用户池。在 用户 标签下,选择 创建用户。对于 邀请消息,选择 发送电子邮件邀请。在 电子邮件地址 部分,输入您的电子邮件地址,并选择 将电子邮件地址标记为已验证。对于 临时密码,选择 生成密码。选择 创建用户。

您还可以通过运行 api 文件夹中提供的脚本 cognitocreatetestusersh 完成这些步骤提供您的电子邮件地址:

bash/cognitocreatetestusersh #youremailaddress#

创建用户后,您应收到一封包含临时密码的电子邮件,格式为:“ 您的用户名是 #youremailaddress#,临时密码是 #temporarypassword#。 ”

请记下这些登录详情电子邮件地址和临时密码,以便后续测试网页应用。

创建网页应用

在本节中,我们将使用 Amplify 创建一个网页应用,并将其发布,使其通过终端 URL 可访问。要完成此部分,您必须首先安装并配置 Amplify CLI,正如在前提条件中讨论的那样。

完成以下步骤以创建数字助手的网页应用:

返回到仓库的根文件夹,打开 frontend 文件夹。运行脚本 amplifysetupsh 以创建 Amplify 应用:

bash /amplifysetupsh

该 amplifysetupsh 脚本创建了一个 Amplify 应用,并将其配置为与您在前面模块中创建的资源整合:

Amazon Cognito 用户池用于通过网页应用的登录页面进行用户身份验证

Amazon API Gateway 用于处理通过网页应用的聊天界面提交的提示

使用以下命令配置 Amplify 应用的托管:

bash amplify add hosting

选择以下选项:在 选择要执行的插件模块中,选择 使用 Amplify 控制台进行托管拥有自定义域的托管,持续部署。在 选择类型 中,选择 手动部署。

在此步骤中,我们配置如何部署和托管网页应用:

网页应用将使用 Amplify 控制台进行托管,提供完全托管的托管服务

网页应用将通过手动部署进行发布,使我们能够将网页应用发布到 Amplify 控制台,而无需连接 Git 提供者

使用以下命令发布 Amplify 应用:

bash amplify publish yes

网页应用现在可供测试,并将显示一个 URL,如下所示。请记下该 URL,以便在下一节中使用。

测试数字助手

在本节中,您将测试数字助手的网页应用:

在浏览器中打开 Amplify 应用的 URL。输入您的登录信息您的电子邮件和您在配置 Amazon Cognito 用户池时收到的临时密码,然后选择 登录。

当被提示时,输入新密码并选择 更改密码。

您应该能看到聊天界面。问一个问题以测试助手。例如,“ 与良好架构框架中运营健康相关的 OPS 编号是什么? ”

您应该能收到一个响应,以及相关的资源,如下图所示。

清理资源

为确保不产生额外费用,请删除在您的账户中配置的资源。在删除以下资源之前,请确保您处于正确的 AWS 账户中。

删除知识库。删除 CloudFormation 堆栈提供您创建资源的 AWS 区域:

bash aws cloudformation deletestack stackname webappapistack region #region# aws cloudformation deletestack stackname webapplambdaknowledgebasestack region #region# aws cloudformation deletestack stackname webappuserpoolstack region #region#

使用以下 AWS CLI 命令删除 Amplify 应用提供您的应用 ID 和创建区域:

bash aws amplify deleteapp appid #appid# region #region#

创建一个端到端无服务器的数字助手,用于语义搜索与 Amazon Bedrock 机器学习博客

4