View a markdown version of this page

使用 Amazon Bedrock 代理和知识库开发基于聊天的全自动助手 - AWS 规范指引

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

使用 Amazon Bedrock 代理和知识库开发基于聊天的全自动助手

Jundong Qiao、Shuai Cao、Noah Hamilton、Kiowa Jackson、Praveen Kumar Jeyarajan 和 Kara Yang,Amazon Web Services

Summary

基于聊天的助手能够编排不同的数据来源以提供全面答案,因此许多组织在创建此类助手时都面临着挑战。此模式提供了一种解决方案,可用于开发基于聊天的助理,其中该助理能够回答来自文档和数据库的查询,并且部署简单直接。

从 A mazon Bedrock 开始,这项完全托管的生成式人工智能 (AI) 服务提供了各种高级基础模型 (FMs)。这有助于高效创建极其注重隐私和安全性的生成式人工智能应用程序。在文档检索的领域中,检索增强生成(RAG)是一项关键功能。该功能利用知识库,通过来自外部来源的上下文相关信息来增强 FM 提示。A mazon OpenSearch Serverless 索引充当 Amazon Bedrock 知识库背后的矢量数据库。通过仔细的提示工程来增强这种集成,以最大限度地减少不准确之处,并确认以事实为依据进行响应。对于数据库查询,Amazon Bedrock 将文本查询转换为包含特定参数的结构化 SQL 查询。 FMs 这样可以从数据库管理的数据库中精确检索数据。AWS GlueAmazon Athena 可用于这些查询中。

要处理更复杂的查询,获得全面的答案,就需要获取来自文档和数据库的信息。Amazon Bedrock 代理是一项生成式人工智能功能,可帮助您构建能够理解复杂任务的自主代理,并将其分解为更简单的任务以进行编排。在 Amazon Bedrock 自主代理的推动下,整合擷取自简化任务中的见解,可以增强信息的合成,从而得出更全面、更详尽的答案。此模式演示了如何使用 Amazon Bedrock 以及自动解决方案中的相关生成式人工智能服务和功能来构建基于聊天的助手。

先决条件和限制

先决条件

限制

  • 此解决方案已部署到单个 AWS 账户。

  • 此解决方案只能部署在支持 Amazon Bedrock 和 Amazon OpenSearch Serverless AWS 区域 的地方。有关更多信息,请参阅 Amazon B edrock 和 Amazon OpenSearch Serverless 的文档。

产品版本

  • Llama-index 版本 0.10.6 或更高版本

  • Sqlalchemy 版本 2.0.23 或更高版本

  • Opensearch-py 版本 2.4.2 或更高版本

  • Requests_aws4auth 版本 1.2.3 或更高版本

  • 适用于 Python (Boto3) 的 AWS SDK 版本 1.34.57 或更高版本

架构

目标技术堆栈

AWS Cloud Development Kit (AWS CDK)是一个开源软件开发框架,用于在代码中定义云基础架构并通过它进行配置 AWS CloudFormation。此模式中使用的 AWS CDK 堆栈部署以下 AWS 资源: 

  • AWS Key Management Service (AWS KMS)

  • Amazon Simple Storage Service(Amazon S3)

  • AWS Glue Data Catalog,用于 AWS Glue 数据库组件

  • AWS Lambda

  • AWS Identity and Access Management (IAM)

  • Amazon OpenSearch 无服务器

  • Amazon Elastic Container Registry(Amazon ECR) 

  • Amazon Elastic Container Service(Amazon ECS)

  • AWS Fargate

  • Amazon Virtual Private Cloud (Amazon VPC)

  • 应用程序负载均衡器

目标架构

使用 Amazon Bedrock 知识库和代理的架构图

该图显示了在单个 AWS AWS 区域云原生环境中使用多个 AWS 服务设置的全面云原生设置。基于聊天的助手的主接口是托管在 Amazon ECS 集群上的 Streamlit 应用程序。应用程序负载均衡器可管理可访问性。通过此接口进行的查询会激活 Invocation Lambda 函数,然后该函数可与 Amazon Bedrock 代理进行交互。该代理通过查阅 Amazon Bedrock 知识库或调用 Agent executor Lambda 函数来回应用户的询问。此函数会按照预定义的 API 架构触发一组与代理关联的操作。Amazon Bedrock 的知识库使用 OpenSearch 无服务器索引作为其矢量数据库的基础。此外,该Agent executor函数还会生成通过 Amazon Athena 对 AWS Glue 数据库执行的 SQL 查询。

工具

AWS 服务

  • Amazon Athena 是一种交互式查询服务,可帮助您通过使用标准 SQL 直接分析 Amazon Simple Storage Service(Amazon S3)中的数据。

  • Amazon Bedrock 是一项完全托管的服务,它通过统一的 API 提供来自领先的人工智能初创公司和亚马逊的高性能基础模型 (FMs) 供您使用。

  • AWS Cloud Development Kit (AWS CDK)是一个软件开发框架,可帮助您在代码中定义和配置 AWS 云基础架构。

  • AWS Command Line Interface (AWS CLI) 是一个开源工具,可帮助您 AWS 服务 通过命令行 shell 中的命令进行交互。

  • Amazon Elastic Container Service(Amazon ECS)是一项快速、可扩展的容器管理服务,可帮助您运行、停止和管理集群上的容器。

  • 弹性负载均衡在多个目标上分配传入的应用程序或网络流量。例如您可以将流量分配到一个或多个可用区中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例、容器以及 IP 地址。

  • AWS Glue 是一项完全托管式提取、转换、加载(ETL)服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。此模式使用 AWS Glue 爬虫和 AWS Glue Data Catalog 表格。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。

  • Amazon OpenSearch Server less 是亚马逊 OpenSearch 服务的按需无服务器配置。在这种模式下, OpenSearch 无服务器索引充当 Amazon Bedrock 知识库的矢量数据库。

  • Amazon Simple Storage Service(Amazon S3)是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

其他工具

  • Streamlit 是一个开源 Python 框架,可用于创建数据应用程序。

代码存储库

此模式的代码可在 GitHub genai-bedrock-agent-chatbot存储库中找到。此代码存储库包含以下文件和文件夹:

  • assets 文件夹 – 静态资产,例如架构图和公有数据集。

  • code/lambdas/action-lambda 文件夹 – Lambda 函数的 Python 代码,可用于充当 Amazon Bedrock 代理的操作。

  • code/lambdas/create-index-lambda文件夹 — 用于创建 OpenSearch 无服务器索引的 Lambda 函数的 Python 代码。

  • code/lambdas/invoke-lambda 文件夹 – Lambda 函数的 Python 代码,可直接从 Streamlit 应用程序调用 Amazon Bedrock 代理。

  • code/lambdas/update-lambda文件夹 — Lambda 函数的 Python 代码,用于在通过部署资源后更新或删除 AWS 资源。 AWS CDK

  • code/layers/boto3_layer文件夹 — 用于创建所有 Lambda 函数共享的 Boto3 层的 AWS CDK 堆栈。

  • code/layers/opensearch_layerfolder — 创建 OpenSearch 无服务器层的 AWS CDK 堆栈,该层安装所有依赖项以创建索引。

  • code/streamlit-app文件夹 — 在 Amazon ECS 中作为容器映像运行的 Python 代码。

  • code/code_stack.py— AWS CDK 构造用于创建 AWS 资源的 Python 文件。

  • app.py— 在目标 AWS 账户中部署 AWS 资源的 AWS CDK 堆栈 Python 文件。

  • requirements.txt— 必须为安装的所有 Python 依赖项的列表 AWS CDK。

  • cdk.json – 用于提供创建资源所需值的输入文件。此外,在 context/config 字段中,您可以相应地自定义解决方案。有关自定义的更多信息,请参阅其他信息部分。

最佳实践

操作说明

Task说明所需技能

导出账户和区域的变量。

要使用环境变 AWS CDK 量为提供 AWS 凭证,请运行以下命令。

export CDK_DEFAULT_ACCOUNT=<12-digit AWS account number> export CDK_DEFAULT_REGION=<Region>
AWS DevOps, DevOps 工程师

设置 AWS CLI 命名的个人资料。

要为账户设置 AWS CLI 指定个人资料,请按照配置和凭据文件设置中的说明进行操作。

AWS DevOps, DevOps 工程师
Task说明所需技能

将存储库克隆到本地工作站。

要克隆存储库,请在终端中运行以下命令。

git clone https://github.com/awslabs/genai-bedrock-agent-chatbot.git
DevOps 工程师,AWS DevOps

设置 Python 虚拟环境。

要设置 Python 虚拟环境,请运行以下命令。

cd genai-bedrock-agent-chatbot python3 -m venv .venv source .venv/bin/activate

要设置所需依赖项,请运行以下命令。

pip3 install -r requirements.txt
DevOps 工程师,AWS DevOps

设置 AWS CDK 环境。

要将代码转换为 AWS CloudFormation 模板,请运行命令cdk synth

AWS DevOps, DevOps 工程师
Task说明所需技能

在账户中部署资源。

要使用在中 AWS 账户 部署资源 AWS CDK,请执行以下操作:

  1. 在克隆的存储库根目录中,在 cdk.json 文件中,为日志记录参数提供输入。示例值包括 INFODEBUGWARNERROR

    这些值定义了 Lambda 函数和 Streamlit 应用程序Lambda 函数的日志级别消息。

  2. 克隆存储库根目录中的cdk.json文件包含用于部署的 AWS CloudFormation 堆栈名称。默认堆栈名称为 chatbot-stack。默认 Amazon Bedrock 代理名称为 ChatbotBedrockAgent,而默认 Amazon Bedrock 代理别名为 Chatbot_Agent

  3. 要部署资源,请运行命令 cdk deploycdk deploy 命令使用第 3 层构造创建多个 Lambda 函数,以便将文档和 CSV 数据集文件复制到 S3 存储桶。该命令还为 Amazon Bedrock 代理部署了 Amazon Bedrock 代理、知识库和 Action group Lambda 函数。

  4. 登录 AWS 管理控制台,然后打开CloudFormation 控制台

  5. 确认堆栈已成功部署。有关说明,请参阅在AWS CloudFormation 主机上查看您的堆栈

成功部署后,您可以使用控制台输出选项卡上提供的 URL 访问基于聊天的助手应用程序。 CloudFormation

DevOps 工程师,AWS DevOps
Task说明所需技能

移除 AWS 资源。

在测试解决方案后,要清理资源,请执行命令 cdk destroy

AWS DevOps, DevOps 工程师

相关资源

AWS 文档

其他 AWS 资源

其他资源

附加信息

使用您自己的数据自定义基于聊天的助手

要集成用于部署解决方案的自定义数据,请遵循以下结构化指南。这些步骤旨在确保无缝高效的集成流程,使您能够使用定制数据有效地部署解决方案。

用于知识库数据集成

数据准备

  1. 寻找 assets/knowledgebase_data_source/ 目录。

  2. 将您的数据集放置在此文件夹中。

配置调整

  1. 打开 cdk.json 文件。

  2. 导航到 context/configure/paths/knowledgebase_file_name 字段,然后对其进行相应更新。

  3. 导航到 bedrock_instructions/knowledgebase_instruction 字段,然后对其进行更新,以准确反映新数据集的细微差别和上下文。

用于结构数据集成

数据整理

  1. assets/data_query_data_source/ 目录中,创建子目录,例如 tabular_data

  2. 将您的结构化数据集(可接受的格式包括 CSV、JSON、ORC 和 Parquet)放置在这个新创建的子文件夹中。

  3. 如果您要连接到现有数据库,请更新 code/lambda/action-lambda/build_query_engine.py 中的函数 create_sql_engine(),以连接您的数据库。

配置和代码更新

  1. cdk.json 文件中,更新 context/configure/paths/athena_table_data_prefix 字段,以使其与新的数据路径保持一致。

  2. code/lambda/action-lambda/dynamic_examples.csv通过加入与您的数据集对应的新 text-to-SQL示例进行修改。

  3. 修改 code/lambda/action-lambda/prompt_templates.py 以反映结构化数据集的属性。

  4. cdk.json 文件中,更新 context/configure/bedrock_instructions/action_group_description 字段,以解释 Action group Lambda 函数的目的和功能。

  5. assets/agent_api_schema/artifacts_schema.json 文件中,解释您的 Action group Lambda 函数的新功能。

常规更新

cdk.json 文件中,考虑到新集成的数据,在 context/configure/bedrock_instructions/agent_instruction 部分中,全面描述了 Amazon Bedrock 代理的预期功能和设计目的。