本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 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) 支持的应用程序后端。
对于向基于聊天的助手提出的询问,首先会按照初始意图进行分类,然后再根据分类结果将其路由到三个可能的工作流之一。最复杂的工作流包含一般性咨询指引和复杂的定价分析。您可以根据企业、公司和工业使用案例对模式进行调整。
先决条件和限制
先决条件
AWS 命令行界面(AWS CLI)已安装并配置
AWS Cloud Development Kit(AWS CDK)Toolkit 2.114.1 或更高版本已安装并配置
基本熟悉 Python 和 AWS CDK
Git
已安装 Docker
已安装 Python 3.11 或更高版本
已安装并配置(有关更多信息,请参阅工具部分) Amazon Bedrock 服务启用了 Amazon Titan 和 Anthropic Claude 模型访问权限
在终端环境中正确配置的 AWS 安全凭证,包括
AWS_ACCESS_KEY_ID
限制
LangChain 不支持每个 LLM 进行直播。支持 Anthropic Claude 模型,但不支持 AI21 Labs 中的模型。
此解决方案部署至单个 AWS 账户。
此解决方案只能部署在提供 Amazon Bedrock 和 Amazon Kendra 的 AWS 区域。有关可用性的信息,请参阅 Amazon Bedrock 和 Amazon 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,用于回答基于聊天的助手用户的查询(问题)。

编排 Lambda 函数向 Amazon Bedrock 模型(Claude 2)发送 LLM 提示请求。
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 Athena 对 SageMaker 定价数据库运行 SQL 查询,并将查询结果汇总为响应。 In-context ReACT Agent service,会在提供响应之前将输入query分成多个步骤。代理使用RAG Retrieval service和Database 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— 用于提供启动资源所需值的输入文件
注意:AWS CDK 代码使用 L3(第 3 层)构造和由 AWS 管理的 AWS Identity and Access Management(IAM)策略来部署解决方案。 |
|---|
最佳实践
此处提供的代码示例仅适用于 proof-of-concept (PoC) 或试点演示。如果您想将代码部署到生产环境,请务必使用以下最佳实践:
为 Lambda 函数设置监控和警报。有关更多信息,请参阅 Lambda 函数监控和故障排除。有关使用 Lambda 函数时的一般最佳实践标准,请参阅 AWS 文档
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
为待部署堆栈的账户和 AWS 区域导出变量。 | 要使用环境变量为 AWS CDK 提供 AWS 凭证,请运行以下命令。
| DevOps 工程师,AWS DevOps |
设置 AWS CLI 配置文件。 | 要为账户设置 AWS CLI 配置文件,请按 AWS 文档中的说明进行操作。 | DevOps 工程师,AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
在本地机器克隆存储库。 | 要克隆存储库,请在终端中运行以下命令。
| DevOps 工程师,AWS DevOps |
设置 Python 虚拟环境以及安装所需依赖项。 | 要设置 Python 虚拟环境,请运行以下命令。
要设置所需依赖项,请运行以下命令。
| DevOps 工程师,AWS DevOps |
设置 AWS CDK 环境和合成 AWS CDK 代码。 |
| DevOps 工程师,AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
预调配 Claude 模型访问权限。 | 要为您的 AWS 账户启用 Anthropic Claude 模型访问权限,请按照 Amazon Bedrock 文档中的说明进行操作。 | AWS DevOps |
在账户中部署资源。 | 若要使用 AWS CDK 在 AWS 账户中部署资源,请执行以下操作:
成功部署后,您可以使用 CloudFormation 输出部分中提供的 URL 访问基于聊天的助手应用程序。 | AWS DevOps, DevOps 工程师 |
运行 AWS Glue 爬网程序,并创建数据目录表。 | AWS Glue 爬网程序用于保持数据架构的动态性。该解决方案通过运行爬网程序来创建和更新 AWS Glue Data Catalog 表中的分区。将 CSV 数据集文件复制到 S3 存储桶后,运行 AWS Glue 爬网程序,并创建用于测试的 Data Catalog 表架构:
注意AWS CDK 代码将 AWS Glue 爬网程序配置为按需运行,但您也可以安排其定期运行。 | DevOps 工程师,AWS DevOps |
启动文档索引。 | 将文件复制到 S3 存储桶后,使用 Amazon Kendra 对其进行抓取及编制索引:
注意AWS CDK 代码将 Amazon Kendra 索引同步配置为按需运行,但您也可以使用计划参数定期运行。 | AWS DevOps, DevOps 工程师 |
| Task | 说明 | 所需技能 |
|---|---|---|
移除 AWS 资源。 | 在测试解决方案后,清理资源:
| 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