

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

# 使用 RAG 和提示开发基于人工智能聊天的高级生成式 AI 助手 ReAct
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting"></a>

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

## Summary
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-summary"></a>

一家典型的公司将其 70% 的数据存储在孤立的系统中。您可以使用生成式人工智能驱动的基于聊天的助手，通过自然语言交互来获取这些数据孤岛之间的见解和关系。为了充分利用生成式人工智能，输出必须可信、准确，并且包含可用的企业数据。成功的基于聊天的助手取决于以下几项：
+ 生成式人工智能模型（例如 Anthropic Claude 2）
+ 数据来源向量化
+ 用于提示模型的高级推理技术，例如[ReAct 框架](https://www.promptingguide.ai/techniques/react)

此模式提供了从数据来源（例如 Amazon Simple Storage Service（Amazon S3）存储桶、AWS Glue 和 Amazon Relational Database Service（Amazon RDS））检索数据的方法。通过将[检索增强生成 (RAG)](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html) 与 chain-of-thought方法交织在一起，可以从这些数据中获得价值。这些结果表明，基于聊天的复杂助手对话能够利用公司存储的全部数据。

这种模式以亚马逊 SageMaker 手册和定价数据表为例，探索基于人工智能聊天的生成式助手的功能。您将构建一个基于聊天的助手，通过回答有关定价和 SageMaker 服务功能的问题来帮助客户评估服务。该解决方案使用Streamlit库来构建前端应用程序，并使用 LangChain 框架来开发由大型语言模型 (LLM) 支持的应用程序后端。

对于向基于聊天的助手提出的询问，首先会按照初始意图进行分类，然后再根据分类结果将其路由到三个可能的工作流之一。最复杂的工作流包含一般性咨询指引和复杂的定价分析。您可以根据企业、公司和工业使用案例对模式进行调整。

## 先决条件和限制
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-prereqs"></a>

**先决条件**
+ [AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)已安装并配置
+ [AWS Cloud Development Kit（AWS CDK）Toolkit 2.114.1 或更高版本](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)已安装并配置
+ 基本熟悉 Python 和 AWS CDK
+ [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) 已安装
+ [Docker](https://docs.docker.com/get-docker/) 已安装
+ [Python 3.11 或更高版本](https://www.python.org/downloads/)已安装并配置（有关更多信息，请参阅[工具](#develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-tools)部分）
+ 通过使用 [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html) 引导的[活跃 AWS 账户](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-creating.html)。
+ Amazon Bedrock 服务启用了 Amazon Titan 和 Anthropic Claude [模型访问权限](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html#add-model-access)
+ 在终端环境中正确配置的 [AWS 安全凭证](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)，包括 `AWS_ACCESS_KEY_ID`

**限制**
+ LangChain 不支持每个 LLM 进行直播。支持 Anthropic Claude 模型，但不支持 AI21 Labs 中的模型。
+ 此解决方案部署至单个 AWS 账户。
+ 此解决方案只能部署在提供 Amazon Bedrock 和 Amazon Kendra 的 AWS 区域。有关可用性的信息，请参阅 [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html#bedrock-regions) 和 [Amazon Kendra](https://docs.aws.amazon.com/general/latest/gr/kendra.html) 的文档。

**产品版本**
+ Python 版本 3.11 或更高版本
+ Streamlit 版本 1.30.0 或更高版本
+ Streamlit-chat 版本 0.1.1 或更高版本
+ LangChain 版本 0.1.12 或更高版本
+ AWS CDK 版本 2.132.1 或更高版本

## 架构
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-architecture"></a>

**目标技术堆栈**
+ Amazon Athena
+ Amazon Bedrock
+ Amazon Elastic Container Service（Amazon ECS）
+ AWS Glue
+ AWS Lambda
+ Amazon S3
+ Amazon Kendra
+ Elastic Load Balancing

**目标架构**

AWS CDK 代码将部署所有资源，这些资源是在 AWS 账户中设置基于聊天的助手应用程序的必要条件。下图所示的基于聊天的助手应用程序旨在回答用户的 SageMaker 相关查询。用户可通过应用程序负载均衡器连接到 VPC，而该 VPC 包含托管 Streamlit 应用程序的 Amazon ECS 集群。编排 Lambda 函数连接到应用程序。S3 存储桶数据来源通过 Amazon Kendra 和 AWS Glue 向 Lambda 函数提供数据。Lambda 函数连接到 Amazon Bedrock，用于回答基于聊天的助手用户的查询（问题）。

![架构示意图。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/b4df6405-76ab-4493-a722-15ceca067254/images/4e5856cf-9489-41f8-a411-e3b8d8a50748.png)


1. 编排 Lambda 函数向 Amazon Bedrock 模型（Claude 2）发送 LLM 提示请求。

1. Amazon Bedrock 将 LLM 响应发回编排 Lambda 函数。

**编排 Lambda 函数中的逻辑流**

当用户通过 Streamlit 应用程序提问时，该应用程序会直接调用编排 Lambda 函数。下图显示了调用 Lambda 函数时的逻辑流程。

![架构示意图。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/b4df6405-76ab-4493-a722-15ceca067254/images/70ae4736-06a6-4d3a-903a-edc5c10d78a0.png)

+ 步骤 1 – 输入 `query`（问题）分为三个意图之一：
  + 一般 SageMaker 指导问题
  + 一般 SageMaker 定价（训练/推理）问题
  + 与定价相关的 SageMaker 复杂问题
+ 步骤 2 – 输入 `query` 启动以下三项服务之一：
  + `RAG Retrieval service`，可从 [Amazon Kendra](https://aws.amazon.com/kendra/) 向量数据库中检索相关上下文，并通过 [Amazon Bedrock](https://aws.amazon.com/bedrock/) 调用 LLM，将检索到的上下文汇总为响应。
  + `Database Query service`，使用 LLM、数据库元数据和相关表中的示例行将输入 `query` 转换为 SQL 查询。数据库查询服务通过 [Amazon A](https://aws.amazon.com/athena/) thena 对 SageMaker 定价数据库运行 SQL 查询，并将查询结果汇总为响应。
  + `In-context ReACT Agent service`，会在提供响应之前将输入 `query` 分成多个步骤。代理使用 `RAG Retrieval service` 和 `Database Query service` 作为工具，在推理过程中检索相关信息。完成推理和操作过程后，代理会生成最终答案作为响应。
+ 步骤 3 – 来自编排 Lambda 函数的响应作为输出发送到 Streamlit 应用程序。

## 工具
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-tools"></a>

**Amazon Web Services**
+ [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) 是一个软件开发框架，可帮助您在代码中定义和预置 Amazon Web Services Cloud 基础设施。
+ [AWS 命令行界面（AWS CLI）](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)是一种开源工具，它可帮助您通过命令行 Shell 中的命令与 Amazon Web Services 交互。
+ [Amazon Elastic Container Service（Amazon ECS）](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)是一项快速、可扩展的容器管理服务，可帮助您运行、停止和管理集群上的容器。
+ [AWS Glue](https://docs.aws.amazon.com/glue/) 是一项完全托管的提取、转换、加载（ETL）服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。此模式使用 AWS Glue 爬网程序与 AWS Glue Data Catalog 表。
+ [Amazon Kendra](https://docs.aws.amazon.com/kendra/latest/dg/what-is-kendra.html) 是一项智能搜索服务，它使用自然语言处理和高级机器学习算法，从您的数据中返回搜索问题的特定答案。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，而无需预置或管理服务器。它仅在需要时运行您的代码，并且能自动扩缩，因此您只需为使用的计算时间付费。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [弹性负载均衡（ELB）](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)将传入的应用程序或网络流量分配到多个目标。例如，您可以将流量分发到一个或多个可用区中的 Amazon Elastic Compute Cloud（Amazon EC2）实例、容器以及 IP 地址。

**代码存储库**

此模式的代码可在 GitHub [genai-bedrock-chatbot](https://github.com/awslabs/genai-bedrock-chatbot)存储库中找到。

此代码存储库包含以下文件和文件夹：
+ `assets` 文件夹 – 静态资产、架构图和公有数据集
+ `code/lambda-container` 文件夹 – 在 Lambda 函数中运行的 Python 代码
+ `code/streamlit-app` 文件夹 – 在 Amazon ECS 中作为容器映像运行的 Python 代码
+ `tests` 文件夹 – 用于对 AWS CDK 构造进行单元测试而运行的 Python 文件
+ `code/code_stack.py` – 用于创建 AWS 资源的 AWS CDK 构造 Python 文件
+ `app.py` – 用于在目标 AWS 账户中部署 AWS 资源的 AWS CDK 堆栈 Python 文件
+ `requirements.txt` – AWS CDK 必须安装的所有 Python 依赖项列表
+ `requirements-dev.txt` – AWS CDK 为运行单元测试套件而必须安装的所有 Python 依赖项列表
+ `cdk.json` — 用于提供启动资源所需值的输入文件


| 
| 
| 注意：AWS CDK 代码使用 [L3（第 3 层）构造](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)和[由 AWS 管理的 AWS Identity and Access Management（IAM）策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)来部署解决方案。 | 
| --- |

## 最佳实践
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-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)。
  + [Amazon Kendra 企业版索引](https://docs.aws.amazon.com/whitepapers/latest/how-aws-pricing-works/amazon-kendra.html)已启用。
+ 为 Lambda 函数设置监控和警报。有关更多信息，请参阅 [Lambda 函数监控和故障排除](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)。有关使用 Lambda 函数时的一般最佳实践标准，请参阅 [AWS 文档](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)

## 操作说明
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-epics"></a>

### 在本地机器上设置 AWS 凭证
<a name="set-up-aws-credentials-on-your-local-machine"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为待部署堆栈的账户和 AWS 区域导出变量。 | 要使用环境变量为 AWS CDK 提供 AWS 凭证，请运行以下命令。<pre>export CDK_DEFAULT_ACCOUNT=<12 Digit AWS Account Number><br />export CDK_DEFAULT_REGION=<region></pre> | DevOps 工程师，AWS DevOps | 
| 设置 AWS CLI 配置文件。 | 要为账户设置 AWS CLI 配置文件，请按 [AWS 文档](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/keys-profiles-credentials.html)中的说明进行操作。 | DevOps 工程师，AWS DevOps | 

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


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在本地机器克隆存储库。 | 要克隆存储库，请在终端中运行以下命令。<pre>git clone https://github.com/awslabs/genai-bedrock-chatbot.git</pre> | DevOps 工程师，AWS DevOps | 
| 设置 Python 虚拟环境以及安装所需依赖项。 | 要设置 Python 虚拟环境，请运行以下命令。<pre>cd genai-bedrock-chatbot<br />python3 -m venv .venv<br />source .venv/bin/activate</pre><br />要设置所需依赖项，请运行以下命令。<pre>pip3 install -r requirements.txt</pre> | DevOps 工程师，AWS DevOps | 
| 设置 AWS CDK 环境和合成 AWS CDK 代码。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html) | DevOps 工程师，AWS DevOps | 

### 配置和部署基于聊天的助手应用程序
<a name="configure-and-deploy-the-chat-based-assistant-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 预调配 Claude 模型访问权限。 | 要为您的 AWS 账户启用 Anthropic Claude 模型访问权限，请按照 [Amazon Bedrock 文档](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html#add-model-access)中的说明进行操作。 | AWS DevOps | 
| 在账户中部署资源。 | 若要使用 AWS CDK 在 AWS 账户中部署资源，请执行以下操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html)<br />成功部署后，您可以使用 CloudFormation **输出**部分中提供的 URL 访问基于聊天的助手应用程序。 | AWS DevOps， DevOps 工程师 | 
| 运行 AWS Glue 爬网程序，并创建数据目录表。 | [AWS Glue 爬网程序](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)用于保持数据架构的动态性。该解决方案通过运行爬网程序来创建和更新 [AWS Glue Data Catalog 表](https://docs.aws.amazon.com/athena/latest/ug/querying-glue-catalog.html)中的分区。将 CSV 数据集文件复制到 S3 存储桶后，运行 AWS Glue 爬网程序，并创建用于测试的 Data Catalog 表架构：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html)AWS CDK 代码将 AWS Glue 爬网程序配置为按需运行，但您也可以[安排](https://docs.aws.amazon.com/glue/latest/dg/schedule-crawler.html)其定期运行。 | DevOps 工程师，AWS DevOps | 
| 启动文档索引。 | 将文件复制到 S3 存储桶后，使用 Amazon Kendra 对其进行抓取及编制索引：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html)AWS CDK 代码将 Amazon Kendra 索引同步配置为按需运行，但您也可以使用[计划参数](https://docs.aws.amazon.com/kendra/latest/dg/data-source.html#cron)定期运行。 | AWS DevOps， DevOps 工程师 | 

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


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 移除 AWS 资源。 | 在测试解决方案后，清理资源：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html) | DevOps 工程师，AWS DevOps | 

## 问题排查
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| AWS CDK 会返回错误信息。 | 要获得有关 AWS CDK 问题的帮助，请参阅[常见 AWS CDK 问题疑难解答](https://docs.aws.amazon.com/cdk/v2/guide/troubleshooting.html)。 | 

## 相关资源
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-resources"></a>
+ Amazon Bedrock：
  + [模型访问权限](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html)
  + [基础模型的推理参数](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html)
+ [使用 Python 构建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)
+ [AWS CDK 入门](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)
+ [在 Python 中使用 AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [AWS 上的生成式人工智能应用程序构建者](https://docs.aws.amazon.com/solutions/latest/generative-ai-application-builder-on-aws/solution-overview.html)
+ [LangChain 文档](https://python.langchain.com/docs/get_started/introduction)
+ [Streamlit 文档](https://docs.streamlit.io/)

## 附加信息
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-additional"></a>

**AWS CDK 命令**

使用 AWS CDK 时，切记以下有用的命令：
+ 列出应用程序的所有堆栈

  ```
  cdk ls
  ```
+ 发出合成的 AWS 模板 CloudFormation 

  ```
  cdk synth
  ```
+ 将堆栈部署至您的默认 AWS 账户和区域

  ```
  cdk deploy
  ```
+ 将已部署的堆栈与当前状态比较

  ```
  cdk diff
  ```
+ 打开 AWS CDK 文档

  ```
  cdk docs
  ```
+ 删除 CloudFormation 堆栈并移除 AWS 部署的资源

  ```
  cdk destroy
  ```