转变一对一客户互动使用 AWS 和生成性 AI 构建具备语音功能的订单处理代理 机器学习博客

利用 AWS 和生成式 AI 改变一对一顾客互动:构建具语音能力的订单处理代理

主要重点

本篇文章介绍如何利用 AWS 的服务和生成式 AI技术,构建一种具语音能力的订单处理代理。随著订单处理技术的进步,企业能够更好地满足顾客需求,同时提升效率与竞争力。此解决方案主要使用 AWSLambda、Amazon Lex 和 Amazon Bedrock,来实现自动化的订单处理流程。

在现今的一对一顾客互动过程中,尤其是在快餐店和咖啡店,仍然普遍依赖人力服务。这种传统的方式面临著多重挑战:过度依赖人工流程、难以应对顾客需求的增长、可能出现的人工错误,以及有限的营业时间。此外,在竞争激烈的市场中,依赖人工的商业模式可能无法有效提供即时且具竞争力的服务。尽管科技已进步,人性化的订单处理模式依然是主流,这导致了众多局限。

随著生成式 AI 和大型语言模型(LLMs)的出现,如今有了创建能高效处理自然语言的自动化系统的可能,且上手速度大为提升。 Amazon Bedrock提供了一系列高效的基础模型,助力开发安全、隐私和负责任的生成式 AI 应用。

在这篇文章中,我们将展示如何使用 Amazon Lex、Amazon Bedrock 和 AWS Lambda 来构建一个具语音能力的订单处理代理。

解决方案概述

下图展示了我们的解决方案架构:

删除)

工作流程包括以下几个步骤:

  1. 顾客透过 Amazon Lex 下订单。
  2. Amazon Lex 机器人解读顾客的意图并触发 DialogCodeHook
  3. 一个 Lambda 函数从 Lambda 层中取出合适的提示模板,并通过顾客输入格式化模型提示。
  4. RequestValidation 提示将顾客的订单与菜单项进行确认,并通过 Amazon Lex 告知顾客若有不在菜单的项目同时提供建议。该提示也执行了初步的订单完整性验证。
  5. ObjectCreator 提示将自然语言请求转换为数据结构(JSON 格式)。
  6. 顾客验证 Lambda 函数确认订单所需的属性,并确认处理订单所需的所有资讯是否齐全。
  7. 顾客 Lambda 函数使用数据结构作为订单处理的输入,并将订单总额返回给调度 Lambda 函数。
  8. 调度 Lambda 函数调用 Amazon Bedrock LLM 端点生成包括顾客数据库系统(例如, )的订单总结。
  9. 订单摘要通过 Amazon Lex 回复给顾客,当顾客确认订单后,订单将被处理。

前置条件

本篇文章假设您拥有一个有效的 AWS 帐户并熟悉以下概念和服务:

  • (Amazon S3)

此外,为了从 Lambda 函数访问 Amazon Bedrock,您需要确保 Lambda 运行时已安装以下库:

  • boto3 >= 1.28.57
  • awscli >= 1.29.57
  • botocore >= 1.31.57

可以通过 或使用特定的 AMI 来创建这些库。

还有,在从 调用 Amazon Bedrock API 时,也需要这些库。可以通过运行以下代码来安装:

python %pip install --no-build-isolation --force-reinstall \ "boto3>=1.28.57" \ "awscli>=1.29.57" \ "botocore>=1.31.57"

最后,您需要创建以下策略,然后将其附加到任何访问 Amazon Bedrock 的角色:

`json { "Version": "2012-10-17", "Statement": (Amazon RDS)。完成以下步骤以配置您的 DynamoDB表(或根据您的用例自定义设置):

  1. 在 DynamoDB 控制台中,从导航面板选择 Tables
  2. 选择 Create table

删除)

  1. Table name 中输入名称(例如,ItemDetails)。
  2. Partition key 中输入键(本篇中我们使用 Item)。
  3. Sort key 中输入键(本篇中我们使用 Size)。
  4. 选择 Create table

删除)

接下来,您可以将数据加载到 DynamoDB 表中。本文中,我们将使用 CSV 文件。可以使用 Python 代码在 SageMaker notebook中将数据加载到 DynamoDB 表中。

首先,我们需要设置一个名为 dev 的配置文件。

  1. 在 SageMaker Studio 中打开一个新的终端,运行以下命令:

bash aws configure --profile dev

该命令将提示您输入 AWS 访问密钥 ID、密钥、默认 AWS 区域和输出格式。
删除)

  1. 返回 SageMaker notebook,使用 Boto3 库写入 Python 代码以设置与 DynamoDB 的连接。此代码片段创建一个使用名为 dev 的特定 AWS 配置的会话,然后使用该会话创建 DynamoDB 客户端。以下是加载数据的样本代码:

# 使用名为 'dev' 的配置创建会话

session = boto3.Session(profile_name='dev')

# 使用该会话创建 DynamoDB 资源

dynamodb = session.resource('dynamodb')

# 指定您的 DynamoDB 表名称

table_name = 'your_table_name' table = dynamodb.Table(table_name)

# 指定 CSV 文件的路径

csv_file_path = 'path/to/your/file.csv'

# 读取 CSV 文件并将项目放入 DynamoDB

with open(csv_file_path, 'r', encoding='utf-8-sig') as csvfile: csvreader =
csv.reader(csvfile)

    
    
    # 跳过标题行
    next(csvreader, None)
    
    for row in csvreader:
        # 从 CSV 行中提取值
        item = {
            'Item': row[0],  # 根据您的 CSV 结构调整索引
            'Size': row[1],
            'Price': row[2]
        }
    
        # 将项目放入 DynamoDB
        response = table.put_item(Item=item)
    
        print(f"项目添加成功: {response}")
    

print(f"CSV 数据已加载到 DynamoDB 表: {table_name}") ```

或者,您可以使用 
或其他工具快速加载数据至 DynamoDB 表。

下图是样本数据插入表格后的截图。  
删除)

## 使用 Amazon Bedrock 调用 API 在 SageMaker notebook 中创建模板

为满足这一用例,我们将使用 Amazon Bedrock 来创建提示模板。您可以通过  和 API 调用访问 Amazon Bedrock。在我们的情况下,我们通过
SageMaker Studio notebook 的 API 调用来访问 Amazon Bedrock,以创建我们的提示模板,以及稍后在 Lambda函数中使用的完整 API 调用代码。

  1. 在 SageMaker 控制台中,访问现有的 SageMaker Studio 域或创建一个新的,从而可以在 SageMaker notebook 中访问 Amazon Bedrock。

删除)

  1. 创建 SageMaker 域和用户后,选择用户然后选择 **Launch** 和 **Studio** 。这将打开 JupyterLab 环境。
  2. 当 JupyterLab 环境准备好后,打开一个新 notebook,并开始导入必要的库。

删除)

有许多 FMs 可通过 Amazon Bedrock Python SDK 获取。在此例中,我们使用由 Anthropic 开发的强大基础模型 ClaudeV2。

订单处理代理需要几个不同的模板。这可以根据用例变化,但我们设计了一个通用工作流程,可以应用于多个设置。在此用例中,Amazon Bedrock LLM模板将实现以下功能:

  * 验证顾客意图
  * 验证请求
  * 创建订单数据结构
  * 向顾客传递订单总结

  * 创建 bedrock-runtime 对象来调用模型。

删除)

```python

# 模型 API 请求参数

modelId = 'anthropic.claude-v2' # 变更以使用模型提供者的其他版本 accept = 'application/json'
contentType = 'application/json'

import boto3 import json bedrock = boto3.client(service_name='bedrock-
runtime') ```

让我们首先开始处理意图验证的提示模板。这是一个迭代的过程,但能够依赖于 Anthropic 的提示工程指南,您可以快速创建能够完成该任务的提示。

  1. 创建第一个提示模板以及帮助准备 API 调用主体的工具函数。

以下是 `prompt_template_intent_validator.txt` 的代码:

`json { "prompt": "Human:
我将给您一些指示以完成我的请求。\\n<instructions>对话中,人类和助手之间的对话,您需要确定人类想要实现的意图,并适当回应。有效的意图包括:问候、下订单、投诉、找人。请将您的回应放在
Response 标签内。同时在输出中添加一个 XML 标签,标识人类意图。\\n这里有几个例子:\\n<example><Conversation> H:
嗨,您好。\\n\\nA: 嗨,我今天怎么能帮您?\\n\\nH:
是的。我想要一杯中杯摩卡。\\n</Conversation>\\n\\nA:<intent>
下订单</intent><Response>\\n明白了。</Response></example>\\n</instructions>\\n\\n请根据上述指示和示例完成此请求:<request><Conversation>REPLACEME</Conversation></request>\\n\\n助手:\\n",
"max_tokens_to_sample": 250, "temperature": 1, "top_k": 250, "top_p": 0.75,
"stop_sequences": ["\\n\\nHuman:", "\\n\\nhuman:", "\\n\\nCustomer:",
"\\n\\ncustomer:"] }`

删除)  
删除)

  1. 将此模板保存到文件中,以便上传至 Amazon S3 并在需要时从 Lambda 函数中调用。将模板保存为 JSON 序列化字符串的文本文件。上面的截图展示了为此达成的代码示例。
  2. 对其他模板重复相同步骤。

以下是对其他模板和调用 Amazon Bedrock 时的一些结果进行的截图。

以下是 `prompt_template_request_validator.txt` 的代码:

```json { "prompt": "Human: 我将给您一些指示以完成我的请求。\n根据上下文进行以下

Leave a Reply

Required fields are marked *