使用 Amazon Bedrock 等构建生成式 AI 代理
关键要点
生成式 AI 代理能够通过调用基础模型FMs和其他工具,基于用户输入生成类人响应。本文示范了如何使用 Amazon Bedrock 构建金融服务生成式 AI 代理,帮助用户获取账户信息、申请贷款等。该解决方案为开发人员提供了创建个性化对话代理的启动平台。代码和部署资产可在 GitHub 仓库 找到。生成式 AI 代理能够生成类人响应并进行自然语言对话,其方法是根据用户输入协调对基础模型FMs及其他增强工具的多个调用。代理不仅仅通过一个静态决策树满足预定义意图,而是在其工具套件的上下文中具备自主性。 Amazon Bedrock 是一项完全托管的服务,通过 API 提供来自 AI 公司的领先 FMs,结合开发工具,帮助构建和扩展生成式 AI 应用。
在这篇文章中,我们将演示如何构建一个由 Amazon Bedrock 驱动的金融服务生成式 AI 代理。该代理能够帮助用户查找账户信息、完成贷款申请,或回答自然语言问题,同时引用提供答案的来源。这个解决方案旨在为开发人员提供创建个性化对话代理的起点,适用于各种应用场景,如虚拟工作人员和客户支持系统。
Amazon Lex 提供自然语言理解NLU和自然语言处理NLP接口,嵌入在开源 LangChain 对话代理中,并集成在 AWS Amplify 网站上。该代理配备了诸如在 Amazon Bedrock 上托管的 Anthropic Claude 21 FM 和存储在 Amazon DynamoDB 和 Amazon Kendra 上的合成客户数据等工具,以提供以下功能:
功能描述提供个性化响应查询 DynamoDB 以获取客户账户信息,如抵押贷款摘要、到期余额和下次付款日期访问一般知识利用代理的推理逻辑和通过 Amazon Bedrock 提供的多种 FMs 进行预训练所用的海量数据,为客户提示生成回复策划有观点的答案通过配置了权威数据源的 Amazon Kendra 索引,使用存储在 Amazon S3 的客户文件和配置为客户网站的 Amazon Kendra 网页爬虫 来告知代理的响应解决方案概述
演示录制
以下演示录制强调了代理功能和技术实现细节。
解决方案架构
以下图示说明了解决方案架构。
图 1:解决方案架构概述
代理的响应工作流程包括以下步骤:
用户通过网页、短信或语音渠道与代理进行自然语言对话。网页渠道包括一个托管在 Amplify 上的虚构客户的 Amazon Lex 嵌入式聊天机器人。短信和语音渠道可以通过 Amazon Connect 和 消息集成 进行可选配置。每个用户请求通过 Amazon Lex 进行处理,以确定用户意图,这一过程称为意图识别,涉及分析和解释用户的输入文本或语音,以理解用户的意图或目的。然后,Amazon Lex 调用一个 AWS Lambda 处理程序以实现用户意图的满足。与 Amazon Lex 聊天机器人关联的 Lambda 函数包含处理用户意图所需的逻辑和业务规则。根据用户的输入,Lambda 执行特定的操作或获取信息,做出决策并生成适当的响应。Lambda 通过 LangChain 对话代理实现金融服务代理的逻辑,能够访问存储在 DynamoDB 上的客户特定数据,利用您使用 Amazon Kendra 编制的文档和网页提供有观点的响应,并通过 Amazon Bedrock 上的 FM 提供一般知识答案。通过 Amazon Kendra 生成的响应包括来源归属,从而证明如何通过 检索增强生成RAG为代理提供额外的上下文信息。
代理架构
以下图示说明了代理架构:
图 2:LangChain 对话代理架构
代理的推理工作流程包括以下步骤:
LangChain 对话代理集成了对话记忆功能,使其能够以上下文生成的方式响应多个查询。这个记忆允许代理提供考虑到正在进行的对话背景的响应。这是通过上下文生成实现的,代理根据它记住的对话信息生成相关且上下文适当的响应。简单来说,代理记住早前所说的内容,并利用这些信息以合乎逻辑的方式回应多个问题。我们的代理使用 LangChain 的 DynamoDB 聊天消息历史类 作为对话记忆缓冲区,以能回忆过去的互动并用更具意义、上下文感知的响应提升用户体验。代理使用 Amazon Bedrock 上的 Anthropic Claude 21 完成所需的任务,通过一系列精心自生成的文本输入称为 提示。提示工程的主要目标是引导 FM 生成特定和准确的响应。不同的提示工程技术包括:零样本 仅提出一个问题,不提供额外线索。模型被期望仅基于该问题生成响应。少样本 在实际问题之前包含一组示例问题及其相应答案。通过将这些示例提供给模型,它学习以类似方式响应。思路链 一种特定的少样本提示形式,其中提示旨在包含一系列中间推理步骤,指导模型通过逻辑思考过程,最终达到所需的答案。我们的代理利用思路链推理方式,在接收请求后执行一系列操作。在每个操作之后,代理进入观察步骤,表达一个思考。如果最终答案尚未达成,代理会迭代选择不同的操作,以推进达到最终答案。以下是示例代码:
Thought Do I need to use a tool YesAction The action to takeAction Input The input to the actionObservation The result of the action
Thought Do I need to use a tool NoFSI Agent [answer and source documents]
作为代理不同推理路径及自我评估选择的一部分,代理能够通过 Amazon Kendra 索引检索工具 访问合成客户数据源。通过 Amazon Kendra,代理在各种内容类型包括文档、常见问题解答、知识库、手册和网站中执行上下文搜索。有关支持的数据源的更多细节,请参考 数据源。代理可以使用此工具为用户提示提供带观点的回应,应该使用客户提供的权威知识库回答,而不是使用用于预训练 Amazon Bedrock FM 的一般知识语料库。部署指南
在接下来的部分中,我们将讨论部署解决方案的关键步骤,包括部署前和部署后的工作。
部署前
在部署解决方案之前,您需要创建自己的分支版本的解决方案代码库,并使用令牌保护的 Webhook 自动化持续部署您的 Amplify 网站。Amplify 配置指向一个 GitHub 源代码库,从中构建我们网站的前端。
分支并克隆 generativeaiamazonbedrocklangchainagentexample 仓库
为了控制构建您 Amplify 网站的源代码,请按照 分支仓库的说明 创建 generativeaiamazonbedrocklangchainagentexample 仓库的分支。这将创建一个与原始代码库断开的副本,因此您可以进行相应的修改。请记录您的分支仓库 URL,以便在下一步中克隆仓库,并配置解决方案部署自动化脚本中使用的 GITHUBPAT 环境变量。使用以下 git clone 命令克隆您的分支仓库:git clone ltYOURFORKEDREPOSITORYURLgt
创建 GitHub 个人访问令牌
Amplify 托管的网站使用 GitHub 个人访问令牌PAT 作为第三方源控制的 OAuth 令牌。该 OAuth 令牌用于创建 Webhook 和使用 SSH 克隆的只读部署密钥。
要创建您的 PAT,请按照 创建个人访问令牌经典 的说明进行。您可能更倾向于使用 GitHub 应用 代表组织访问资源或进行长期集成。在关闭浏览器之前,请记下您的 PAT 您将使用它来配置解决方案部署自动化脚本中使用的 GITHUBPAT 环境变量。该脚本将使用 AWS 命令行界面AWS CLI命令将您的 PAT 发布到 AWS Secrets Manager,并将其密钥名称作为 GitHubTokenSecretName AWS CloudFormation 参数。部署
解决方案部署自动化脚本使用参数化的 CloudFormation 模板 GenAIFSIAgentyml 来自动化配置以下解决方案资源:
一个 Amplify 网站以模拟您的前端环境。一个通过机器人导入部署包配置的 Amazon Lex 机器人。四个 DynamoDB 表:UserPendingAccountsTable 记录待处理的事务例如,贷款申请。UserExistingAccountsTable 包含用户账户信息例如,抵押贷款账户摘要。ConversationIndexTable 跟踪对话状态。ConversationTable 存储对话历史。
一个 S3 存储桶,包含 Lambda 代理处理程序、Lambda 数据加载器和 Amazon Lex 部署包,以及客户 FAQ 和抵押申请示例文档。
两个 Lambda 函数:代理处理程序 包含 LangChain 对话代理逻辑,可基于用户输入智能地使用多种工具。数据加载器 将示例客户账户数据加载到 UserExistingAccountsTable,并作为自定义 CloudFormation 资源在堆栈创建时调用。
一个 Amazon Kendra 索引,提供客户权威信息的可搜索索引,包括文档、常见问题解答、知识库、手册、网站等。
两个 Amazon Kendra 数据源:Amazon S3 托管一个 示例客户 FAQ 文档。Amazon Kendra 网页爬虫 配置了一个根域名,模拟客户特定网站例如,com。
AWS 身份和访问管理 (IAM) 权限,用于上述资源。
AWS CloudFormation 会用模板中提供的默认值预填充堆栈参数。要提供替代输入值,您可以指定作为环境变量的参数,并在以下 Shell 脚本的 aws cloudformation createstack 命令中引用这些环境变量。
加速器ios免费在运行 Shell 脚本之前,导航到您分支的 generativeaiamazonbedrocklangchainagentexample 仓库,并修改 Shell 脚本权限为可执行:# 如果尚未分支,请分支远程仓库 (https//githubcom/awssamples/generativeaiamazonbedrocklangchainagentexample),并将工作目录更改为其 shell 文件夹: cd generativeaiamazonbedrocklangchainagentexample/shell/ chmod ux createstacksh
设置你在部署前步骤中创建的 Amplify 仓库和 GitHub PAT 环境变量:shell export AMPLIFYREPOSITORY=ltYOURFORKEDREPOSITORYURLgt # 部署前的分支仓库 URL不要包括git export GITHUBPAT=ltYOURGITHUBPATgt # 从部署前步骤中复制的 GitHub PAT export STACKNAME=ltYOURSTACKNAMEgt # 堆栈名称必须为小写,以符合 S3 桶命名约定 export KENDRAWEBCRAWLERURL=ltYOURWEBSITEROOTDOMAINgt # Kendra 通过网页爬虫索引的公共或内部 HTTPS 网站如 https//wwwltyourcompanygtcom 请参阅 https//docsawsamazoncom/kendra/latest/dg/datasourcewebcrawlerhtml
最后,运行解决方案部署自动化脚本以部署解决方案资源,包括 GenAIFSIAgentyml CloudFormation 堆栈:shell source /createstacksh
解决方案部署自动化脚本
前面的 source /createstacksh shell 命令运行以下 AWS CLI 命令以部署解决方案堆栈:
shellexport ACCOUNTID=(aws sts getcalleridentity query Account output text)export S3ARTIFACTBUCKETNAME=STACKNAMEACCOUNTIDexport DATALOADERS3KEY=agent/lambda/dataloader/loaderdeploymentpackagezipexport LAMBDAHANDLERS3KEY=agent/lambda/agenthandler/agentdeploymentpackagezipexport LEXBOTS3KEY=agent/bot/lexzip
aws s3 mb s3//{S3ARTIFACTBUCKETNAME} region useast1aws s3 cp /agent/ s3//{S3ARTIFACTBUCKETNAME}/agent/ recursive exclude DSStore
export BEDROCKLANGCHAINLAYERARN=(aws lambda publishlayerversion layername bedrocklangchainpdfrw description Bedrock LangChain pdfrw layer licenseinfo MIT content S3Bucket={S3ARTIFACTBUCKETNAME}S3Key=agent/lambdalayers/bedrocklangchainpdfrwzip compatibleruntimes python311 query LayerVersionArn output text)
export GITHUBTOKENSECRETNAME=(aws secretsmanager createsecret name STACKNAMEgitpat secretstring GITHUBPAT query Name output text)
aws cloudformation createstack stackname {STACKNAME} templatebody file///cfn/GenAIFSIAgentyml parameters ParameterKey=S3ArtifactBucketParameterValue={S3ARTIFACTBUCKETNAME} ParameterKey=DataLoaderS3KeyParameterValue={DATALOADERS3KEY} ParameterKey=LambdaHandlerS3KeyParameterValue={LAMBDAHANDLERS3KEY} ParameterKey=LexBotS3KeyParameterValue={LEXBOTS3KEY} ParameterKey=GitHubTokenSecretNameParameterValue={GITHUBTOKENSECRETNAME} ParameterKey=KendraWebCrawlerUrlParameterValue={KENDRAWEBCRAWLERURL} ParameterKey=BedrockLangChainPyPDFLayerArnParameterValue={BEDROCKLANGCHAINLAYERARN} ParameterKey=AmplifyRepositoryParameterValue={AMPLIFYREPOSITORY} capabilities CAPABILITYNAMEDIAM
aws cloudformation describestacks stackname STACKNAME query Stacks[0]StackStatusaws cloudformation wait stackcreatecomplete stackname STACKNAME
export LEXBOTID=(aws