

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

# 使用 Amazon Bedrock 代理和知识库开发基于聊天的全自动助手
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases"></a>

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

## Summary
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-summary"></a>

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

从 A [mazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) 开始，这项完全托管的生成式人工智能 (AI) 服务提供了各种高级基础模型 (FMs)。这有助于高效创建极其注重隐私和安全性的生成式人工智能应用程序。在文档检索的领域中，[检索增强生成（RAG）](https://docs.aws.amazon.com/sagemaker/latest/dg/jumpstart-foundation-models-customize-rag.html)是一项关键功能。该功能利用[知识库](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html)，通过来自外部来源的上下文相关信息来增强 FM 提示。A [mazon OpenSearch Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html) 索引充当 Amazon Bedrock 知识库背后的矢量数据库。通过仔细的提示工程来增强这种集成，以最大限度地减少不准确之处，并确认以事实为依据进行响应。对于数据库查询，Amazon Bedrock 将文本查询转换为包含特定参数的结构化 SQL 查询。 FMs [这样可以从数据库管理的数据库中精确检索数据。AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/define-database.html)[Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) 可用于这些查询中。

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

## 先决条件和限制
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ Docker，[已安装](https://docs.docker.com/engine/install/)
+ AWS Cloud Development Kit (AWS CDK)，[已安装](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_tools)并[引导到](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_bootstrap)或 `us-east-1` `us-west-2` AWS 区域
+ AWS CDK [工具包版本 2.114.1 或更高版本，已安装](https://docs.aws.amazon.com/cdk/v2/guide/cli.html)
+ AWS Command Line Interface (AWS CLI)，[已安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ Python 版本 3.11 或更高版本，[已安装](https://www.python.org/downloads/)
+ 在 Amazon Bedrock 中，[允许访问](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) Claude 2、Claude 2.1、Claude Instant 和 Titan Embeddings G1 – 文本

**限制**
+ 此解决方案已部署到单个 AWS 账户。
+ 此解决方案只能部署在支持 Amazon Bedrock 和 Amazon OpenSearch Serverless AWS 区域 的地方。有关更多信息，请参阅 Amazon B [edrock 和 Amazon OpenSearch ](https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-regions.html) [Serverless](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html#serverless-regions) 的文档。

**产品版本**
+ Llama-index 版本 0.10.6 或更高版本
+ Sqlalchemy 版本 2.0.23 或更高版本
+ Opensearch-py 版本 2.4.2 或更高版本
+ Requests\$1aws4auth 版本 1.2.3 或更高版本
+ 适用于 Python (Boto3) 的 AWS SDK 版本 1.34.57 或更高版本

## 架构
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-architecture"></a>

**目标技术堆栈**

[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)是一个开源软件开发框架，用于在代码中定义云基础架构并通过它进行配置 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)
+ [应用程序负载均衡器](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) 

**目标架构**

![\[使用 Amazon Bedrock 知识库和代理的架构图\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/15372718-3a5d-4918-9cfa-422c455f288d/images/ff19152e-0bb6-4758-a6dd-4f6140e55113.png)


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

## 工具
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-tools"></a>

**AWS 服务**
+ [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) 是一种交互式查询服务，可帮助您通过使用标准 SQL 直接分析 Amazon Simple Storage Service（Amazon S3）中的数据。
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) 是一项完全托管的服务，它通过统一的 API 提供来自领先的人工智能初创公司和亚马逊的高性能基础模型 (FMs) 供您使用。
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html)是一个软件开发框架，可帮助您在代码中定义和配置 AWS 云基础架构。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一个开源工具，可帮助您 AWS 服务 通过命令行 shell 中的命令进行交互。
+ [Amazon Elastic Container Service（Amazon ECS）](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)是一项快速、可扩展的容器管理服务，可帮助您运行、停止和管理集群上的容器。
+ [弹性负载均衡](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)在多个目标上分配传入的应用程序或网络流量。例如您可以将流量分配到一个或多个可用区中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例、容器以及 IP 地址。
+ [AWS Glue](https://docs.aws.amazon.com/glue/) 是一项完全托管式提取、转换、加载（ETL）服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。此模式使用 AWS Glue 爬虫和 AWS Glue Data Catalog 表格。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [Amazon OpenSearch Server](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-overview.html) less 是亚马逊 OpenSearch 服务的按需无服务器配置。在这种模式下， OpenSearch 无服务器索引充当 Amazon Bedrock 知识库的矢量数据库。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**其他工具**
+ [Streamlit](https://docs.streamlit.io/) 是一个开源 Python 框架，可用于创建数据应用程序。

**代码存储库**

此模式的代码可在 GitHub [genai-bedrock-agent-chatbot](https://github.com/awslabs/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_layer`folder — 创建 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` 字段中，您可以相应地自定义解决方案。有关自定义的更多信息，请参阅[其他信息](#develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-additional)部分。

## 最佳实践
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-best-practices"></a>
+ 此处提供的代码示例仅用于 proof-of-concept (PoC) 或试运行目的。如果您想将代码部署到生产环境，请务必使用以下最佳实践：
  + 启用 [Amazon S3 访问日志记录](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html)
  + 启用 [VPC 流日志](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)
+ 为 Lambda 函数设置监控和提醒。有关更多信息，请参阅 [Lambda 函数监控和故障排除](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)。有关最佳实践，请参阅[使用 AWS Lambda 函数的最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)。

## 操作说明
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-epics"></a>

### 在本地工作站上设置 AWS 凭据
<a name="set-up-aws-credentials-on-your-local-workstation"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 导出账户和区域的变量。 | 要使用环境变 AWS CDK 量为提供 AWS 凭证，请运行以下命令。<pre>export CDK_DEFAULT_ACCOUNT=<12-digit AWS account number><br />export CDK_DEFAULT_REGION=<Region></pre> | AWS DevOps， DevOps 工程师 | 
| 设置 AWS CLI 命名的个人资料。 | 要为账户设置 AWS CLI 指定个人资料，请按照[配置和凭据文件设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)中的说明进行操作。 | AWS DevOps， DevOps 工程师 | 

### 设置您的环境
<a name="set-up-your-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将存储库克隆到本地工作站。 | 要克隆存储库，请在终端中运行以下命令。<pre>git clone https://github.com/awslabs/genai-bedrock-agent-chatbot.git</pre> | DevOps 工程师，AWS DevOps | 
| 设置 Python 虚拟环境。 | 要设置 Python 虚拟环境，请运行以下命令。<pre>cd genai-bedrock-agent-chatbot<br />python3 -m venv .venv<br />source .venv/bin/activate</pre>要设置所需依赖项，请运行以下命令。<pre>pip3 install -r requirements.txt</pre> | DevOps 工程师，AWS DevOps | 
| 设置 AWS CDK 环境。 | 要将代码转换为 AWS CloudFormation 模板，请运行命令`cdk synth`。 | AWS DevOps， DevOps 工程师 | 

### 配置并部署应用程序
<a name="configure-and-deploy-the-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在账户中部署资源。 | 要使用在中 AWS 账户 部署资源 AWS CDK，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases.html)成功部署后，您可以使用控制台**输出**选项卡上提供的 URL 访问基于聊天的助手应用程序。 CloudFormation  | DevOps 工程师，AWS DevOps | 

### 清理解决方案中的所有 AWS 资源
<a name="clean-up-all-aws-resources-in-the-solution"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 移除 AWS 资源。 | 在测试解决方案后，要清理资源，请执行命令 `cdk destroy`。 | AWS DevOps， DevOps 工程师 | 

## 相关资源
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-resources"></a>

**AWS 文档**
+ Amazon Bedrock 资源：
  + [模型访问权限](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html)
  + [基础模型的推理参数](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html)
  + [Amazon Bedrock 的代理](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html)
  + [Amazon Bedrock 知识库](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html)
+ [使用 Python 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)
+ AWS CDK 资源：
  + [开始使用 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)
  + [常见 AWS CDK 问题疑难解答](https://docs.aws.amazon.com/cdk/v2/guide/troubleshooting.html)
  + [AWS CDK 在 Python 中使用](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [生成式 AI 应用程序生成器已开启 AWS](https://docs.aws.amazon.com/solutions/latest/generative-ai-application-builder-on-aws/solution-overview.html)

**其他 AWS 资源**
+ [适用于 Amazon OpenSearch 无服务器的矢量引擎](https://aws.amazon.com/opensearch-service/serverless-vector-engine/)

**其他资源**
+ [LlamaIndex 文档](https://docs.llamaindex.ai/en/stable/)
+ [Streamlit 文档](https://docs.streamlit.io/)

## 附加信息
<a name="develop-a-fully-automated-chat-based-assistant-by-using-amazon-bedrock-agents-and-knowledge-bases-additional"></a>

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

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

*用于知识库数据集成*

**数据准备**

1. 寻找 `assets/knowledgebase_data_source/` 目录。

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

**配置调整**

1. 打开 `cdk.json` 文件。

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

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

*用于结构数据集成*

**数据整理**

1. 在 `assets/data_query_data_source/` 目录中，创建子目录，例如 `tabular_data`。

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

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

**配置和代码更新**

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

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

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

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

1. 在 `assets/agent_api_schema/artifacts_schema.json` 文件中，解释您的 `Action group` Lambda 函数的新功能。

*常规更新*

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