利用 AWS 和生成式 AI 改变一对一顾客互动:构建具语音能力的订单处理代理
主要重点
本篇文章介绍如何利用 AWS 的服务和生成式 AI 技术,构建一种具语音能力的订单处理代理。随著订单处理技术的进步,企业能够更好地满足顾客需求,同时提升效率与竞争力。此解决方案主要使用 AWS Lambda、Amazon Lex 和 Amazon Bedrock,来实现自动化的订单处理流程。
在现今的一对一顾客互动过程中,尤其是在快餐店和咖啡店,仍然普遍依赖人力服务。这种传统的方式面临著多重挑战:过度依赖人工流程、难以应对顾客需求的增长、可能出现的人工错误,以及有限的营业时间。此外,在竞争激烈的市场中,依赖人工的商业模式可能无法有效提供即时且具竞争力的服务。尽管科技已进步,人性化的订单处理模式依然是主流,这导致了众多局限。
随著生成式 AI 和大型语言模型LLMs的出现,如今有了创建能高效处理自然语言的自动化系统的可能,且上手速度大为提升。 Amazon Bedrock 提供了一系列高效的基础模型,助力开发安全、隐私和负责任的生成式 AI 应用。
在这篇文章中,我们将展示如何使用 Amazon Lex、Amazon Bedrock 和 AWS Lambda 来构建一个具语音能力的订单处理代理。
解决方案概述
下图展示了我们的解决方案架构:

工作流程包括以下几个步骤:
顾客透过 Amazon Lex 下订单。Amazon Lex 机器人解读顾客的意图并触发 DialogCodeHook。一个 Lambda 函数从 Lambda 层中取出合适的提示模板,并通过顾客输入格式化模型提示。RequestValidation 提示将顾客的订单与菜单项进行确认,并通过 Amazon Lex 告知顾客若有不在菜单的项目同时提供建议。该提示也执行了初步的订单完整性验证。ObjectCreator 提示将自然语言请求转换为数据结构JSON 格式。顾客验证 Lambda 函数确认订单所需的属性,并确认处理订单所需的所有资讯是否齐全。顾客 Lambda 函数使用数据结构作为订单处理的输入,并将订单总额返回给调度 Lambda 函数。调度 Lambda 函数调用 Amazon Bedrock LLM 端点生成包括顾客数据库系统例如 Amazon DynamoDB的订单总结。订单摘要通过 Amazon Lex 回复给顾客,当顾客确认订单后,订单将被处理。前置条件
本篇文章假设您拥有一个有效的 AWS 帐户并熟悉以下概念和服务:
生成式 AIAmazon BedrockAnthropic Claude V2Amazon DynamoDBAWS LambdaAmazon LexAmazon Simple Storage ServiceAmazon S3此外,为了从 Lambda 函数访问 Amazon Bedrock,您需要确保 Lambda 运行时已安装以下库:
boto3 gt= 12857awscli gt= 12957botocore gt= 13157可以通过 Lambda 层 或使用特定的 AMI 来创建这些库。
还有,在从 Amazon SageMaker Studio 调用 Amazon Bedrock API 时,也需要这些库。可以通过运行以下代码来安装:
pythonpip install nobuildisolation forcereinstall boto3gt=12857 awscligt=12957 botocoregt=13157
最后,您需要创建以下策略,然后将其附加到任何访问 Amazon Bedrock 的角色:
json{ Version 20121017 Statement [ { Sid Statement1 Effect Allow Action bedrock Resource } ]}
创建 DynamoDB 表
在我们的具体情况中,我们创建了一个 DynamoDB 表作为我们的顾客数据库系统,但您也可以使用 Amazon Relational Database ServiceAmazon RDS。完成以下步骤以配置您的 DynamoDB 表或根据您的用例自定义设置:
在 DynamoDB 控制台中,从导航面板选择 Tables。选择 Create table。在 Table name 中输入名称例如,ItemDetails。在 Partition key 中输入键本篇中我们使用 Item。在 Sort key 中输入键本篇中我们使用 Size。选择 Create table。接下来,您可以将数据加载到 DynamoDB 表中。本文中,我们将使用 CSV 文件。可以使用 Python 代码在 SageMaker notebook 中将数据加载到 DynamoDB 表中。
首先,我们需要设置一个名为 dev 的配置文件。
在 SageMaker Studio 中打开一个新的终端,运行以下命令:bashaws configure profile dev
该命令将提示您输入 AWS 访问密钥 ID、密钥、默认 AWS 区域和输出格式。
返回 SageMaker notebook,使用 Boto3 库写入 Python 代码以设置与 DynamoDB 的连接。此代码片段创建一个使用名为 dev 的特定 AWS 配置的会话,然后使用该会话创建 DynamoDB 客户端。以下是加载数据的样本代码:pythonpip install boto3import boto3import csv
使用名为 dev 的配置创建会话
session = boto3Session(profilename=dev)
使用该会话创建 DynamoDB 资源
dynamodb = sessionresource(dynamodb)
指定您的 DynamoDB 表名称
tablename = yourtablenametable = dynamodbTable(tablename)
指定 CSV 文件的路径
csvfilepath = path/to/your/filecsv
读取 CSV 文件并将项目放入 DynamoDB
with open(csvfilepath r encoding=utf8sig) as csvfile csvreader = csvreader(csvfile)
# 跳过标题行next(csvreader None)for row in csvreader # 从 CSV 行中提取值 item = { Item row[0] # 根据您的 CSV 结构调整索引 Size row[1] Price row[2] } # 将项目放入 DynamoDB response = tableputitem(Item=item) print(f项目添加成功 {response})print(fCSV 数据已加载到 DynamoDB 表 {tablename})
或者,您可以使用 NoSQL Workbench 或其他工具快速加载数据至 DynamoDB 表。
下图是样本数据插入表格后的截图。
使用 Amazon Bedrock 调用 API 在 SageMaker notebook 中创建模板
为满足这一用例,我们将使用 Amazon Bedrock 来创建提示模板。您可以通过 AWS 管理控制台 和 API 调用访问 Amazon Bedrock。在我们的情况下,我们通过 SageMaker Studio notebook 的 API 调用来访问 Amazon Bedrock,以创建我们的提示模板,以及稍后在 Lambda 函数中使用的完整 API 调用代码。
在 SageMaker 控制台中,访问现有的 SageMaker Studio 域或创建一个新的,从而可以在 SageMaker notebook 中访问 Amazon Bedrock。创建 SageMaker 域和用户后,选择用户然后选择 Launch 和 Studio。这将打开 JupyterLab 环境。当 JupyterLab 环境准备好后,打开一个新 notebook,并开始导入必要的库。有许多 FMs 可通过 Amazon Bedrock Python SDK 获取。在此例中,我们使用由 Anthropic 开发的强大基础模型 Claude V2。
订单处理代理需要几个不同的模板。这可以根据用例变化,但我们设计了一个通用工作流程,可以应用于多个设置。在此用例中,Amazon Bedrock LLM 模板将实现以下功能:
验证顾客意图验证请求创建订单数据结构向顾客传递订单总结
创建 bedrockruntime 对象来调用模型。
python
模型 API 请求参数
modelId = anthropicclaudev2 # 变更以使用模型提供者的其他版本accept = application/jsoncontentType = application/json
import boto3import jsonbedrock = boto3client(servicename=bedrockruntime)
让我们首先开始处理意图验证的提示模板。这是一个迭代的过程,但能够依赖于 Anthropic 的提示工程指南,您可以快速创建能够完成该任务的提示。
创建第一个提示模板以及帮助准备 API 调用主体的工具函数。以下是 prompttemplateintentvalidatortxt 的代码:
json{ prompt Human 我将给您一些指示以完成我的请求。nltinstructionsgt对话中,人类和助手之间的对话,您需要确定人类想要实现的意图,并适当回应。有效的意图包括:问候、下订单、投诉、找人。请将您的回应放在 Response 标签内。同时在输出中添加一个 XML 标签,标识人类意图。n这里有几个例子:nltexamplegtltConversationgt H 嗨,您好。nnA 嗨,我今天怎么能帮您?nnH 是的。我想要一杯中杯摩卡。nlt/ConversationgtnnAltintentgt 下订单lt/intentgtltResponsegtn明白了。lt/Responsegtlt/examplegtnlt/instructionsgtnn请根据上述指示和示例完成此请求:ltrequestgtltConversationgtREPLACEMElt/Conversationgtlt/requestgtnn助手:n maxtokenstosample 250 temperature 1 topk 250 topp 075 stopsequences [nnHuman nnhuman nnCustomer nncustomer]}
betternet苹果客户端将此模板保存到文件中,以便上传至 Amazon S3 并在需要时从 Lambda 函数中调用。将模板保存为 JSON 序列化字符串的文本文件。上面的截图展示了为此达成的代码示例。对其他模板重复相同步骤。以下是对其他模板和调用 Amazon Bedrock 时的一些结果进行的截图。
以下是 prompttemplaterequestvalidatortxt 的代码:
json{ prompt Human 我将给您一些指示以完成我的请求。n根据上下文进行以下