使用 RAG 和提示开发基于人工智能聊天的高级生成式 AI 助手 ReAct - AWS 规范指引

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

使用 RAG 和提示开发基于人工智能聊天的高级生成式 AI 助手 ReAct

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

Summary

一家典型的公司将其 70% 的数据存储在孤立的系统中。您可以使用生成式人工智能驱动的基于聊天的助手,通过自然语言交互来获取这些数据孤岛之间的见解和关系。为了充分利用生成式人工智能,输出必须可信、准确,并且包含可用的企业数据。成功的基于聊天的助手取决于以下几项:

  • 生成式人工智能模型(例如 Anthropic Claude 2)

  • 数据来源向量化

  • 用于提示模型的高级推理技术,例如ReAct 框架

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

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

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

先决条件和限制

先决条件

限制

  • LangChain 不支持每个 LLM 进行直播。支持 Anthropic Claude 模型,但不支持 AI21 Labs 中的模型。

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

  • 此解决方案只能部署在提供 Amazon Bedrock 和 Amazon Kendra 的 AWS 区域。有关可用性的信息,请参阅 Amazon BedrockAmazon Kendra 的文档。

产品版本

  • Python 版本 3.11 或更高版本

  • Streamlit 版本 1.30.0 或更高版本

  • Streamlit-chat 版本 0.1.1 或更高版本

  • LangChain 版本 0.1.12 或更高版本

  • AWS CDK 版本 2.132.1 或更高版本

架构

目标技术堆栈

  • 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,用于回答基于聊天的助手用户的查询(问题)。

架构示意图。
  1. 编排 Lambda 函数向 Amazon Bedrock 模型(Claude 2)发送 LLM 提示请求。

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

编排 Lambda 函数中的逻辑流

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

架构示意图。
  • 步骤 1 – 输入 query(问题)分为三个意图之一:

    • 一般 SageMaker 指导问题

    • 一般 SageMaker 定价(训练/推理)问题

    • 与定价相关的 SageMaker 复杂问题

  • 步骤 2 – 输入 query 启动以下三项服务之一:

    • RAG Retrieval service,可从 Amazon Kendra 向量数据库中检索相关上下文,并通过 Amazon Bedrock 调用 LLM,将检索到的上下文汇总为响应。

    • Database Query service,使用 LLM、数据库元数据和相关表中的示例行将输入 query 转换为 SQL 查询。数据库查询服务通过 Amazon A thena 对 SageMaker 定价数据库运行 SQL 查询,并将查询结果汇总为响应。

    • In-context ReACT Agent service,会在提供响应之前将输入 query 分成多个步骤。代理使用 RAG Retrieval serviceDatabase Query service 作为工具,在推理过程中检索相关信息。完成推理和操作过程后,代理会生成最终答案作为响应。

  • 步骤 3 – 来自编排 Lambda 函数的响应作为输出发送到 Streamlit 应用程序。

工具

Amazon Web Services

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

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

  • AWS Cloud Development Kit (AWS CDK) 是一个软件开发框架,可帮助您在代码中定义和预置 Amazon Web Services Cloud 基础设施。

  • AWS 命令行界面(AWS CLI)是一种开源工具,它可帮助您通过命令行 Shell 中的命令与 Amazon Web Services 交互。

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

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

  • Amazon Kendra 是一项智能搜索服务,它使用自然语言处理和高级机器学习算法,从您的数据中返回搜索问题的特定答案。

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

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

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

代码存储库

此模式的代码可在 GitHub 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 — 用于提供启动资源所需值的输入文件

最佳实践

操作说明

Task说明所需技能

为待部署堆栈的账户和 AWS 区域导出变量。

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

export CDK_DEFAULT_ACCOUNT=<12 Digit AWS Account Number> export CDK_DEFAULT_REGION=<region>
DevOps 工程师,AWS DevOps

设置 AWS CLI 配置文件。

要为账户设置 AWS CLI 配置文件,请按 AWS 文档中的说明进行操作。

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

在本地机器克隆存储库。

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

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

设置 Python 虚拟环境以及安装所需依赖项。

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

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

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

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

设置 AWS CDK 环境和合成 AWS CDK 代码。

  1. 要在您的 AWS 账户中设置 AWS CDK 环境,请运行以下命令。

    cdk bootstrap aws://ACCOUNT-NUMBER/REGION
  2. 要将代码转换为 AWS CloudFormation 堆栈配置,请运行命令cdk synth

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

预调配 Claude 模型访问权限。

要为您的 AWS 账户启用 Anthropic Claude 模型访问权限,请按照 Amazon Bedrock 文档中的说明进行操作。

AWS DevOps

在账户中部署资源。

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

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

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

  2. 克隆存储库根目录中的app.py文件包含用于部署的 AWS CloudFormation 堆栈名称。默认堆栈名称为 chatbot-stack

  3. 要部署资源,请运行命令 cdk deploy

    cdk deploy 命令使用 L3 构造创建多个 Lambda 函数,以便将文档和 CSV 数据集文件复制到 S3 存储桶。

  4. 命令完成后,登录 AWS 管理控制台,打开控制 CloudFormation 台,查看堆栈是否已成功部署

成功部署后,您可以使用 CloudFormation 输出部分中提供的 URL 访问基于聊天的助手应用程序。

AWS DevOps, DevOps 工程师

运行 AWS Glue 爬网程序,并创建数据目录表。

AWS Glue 爬网程序用于保持数据架构的动态性。该解决方案通过运行爬网程序来创建和更新 AWS Glue Data Catalog 表中的分区。将 CSV 数据集文件复制到 S3 存储桶后,运行 AWS Glue 爬网程序,并创建用于测试的 Data Catalog 表架构:

  1. 导航到 AWS Glue 控制台。

  2. 在导航窗格中,在数据目录下,选择爬网程序

  3. 选择带有后缀 sagemaker-pricing-crawler 的爬网程序。

  4. 运行爬网程序。

  5. 爬网程序成功运行后,它会创建 AWS Glue Data Catalog 表。

注意

AWS CDK 代码将 AWS Glue 爬网程序配置为按需运行,但您也可以安排其定期运行。

DevOps 工程师,AWS DevOps

启动文档索引。

将文件复制到 S3 存储桶后,使用 Amazon Kendra 对其进行抓取及编制索引:

  1. 导航到 Amazon Kendra 控制台。

  2. 选择带有后缀 chatbot-index 的索引。

  3. 在导航窗格中,选择数据来源,然后选择带有后缀 chatbot-index 的数据来源连接器。

  4. 选择立即同步,以启动索引编制过程。

注意

AWS CDK 代码将 Amazon Kendra 索引同步配置为按需运行,但您也可以使用计划参数定期运行。

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

移除 AWS 资源。

在测试解决方案后,清理资源:

  1. 若要移除解决方案部署的 AWS 资源,请运行命令 cdk destroy

  2. 从两个 S3 存储桶中删除所有对象,然后移除所有存储桶。

    有关更多信息,请参阅删除存储桶

DevOps 工程师,AWS DevOps

问题排查

问题解决方案

AWS CDK 会返回错误信息。

要获得有关 AWS CDK 问题的帮助,请参阅常见 AWS CDK 问题疑难解答

相关资源

附加信息

AWS CDK 命令

使用 AWS CDK 时,切记以下有用的命令:

  • 列出应用程序的所有堆栈

    cdk ls
  • 发出合成的 AWS 模板 CloudFormation

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

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

    cdk diff
  • 打开 AWS CDK 文档

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

    cdk destroy