AWS_AI开发者社区

AWS_AI开发者社区 查看完整档案

北京编辑  |  填写毕业院校亚马逊通技术服务(北京)有限公司  |  AI 开发者 编辑 amazonaws-china.com/cn/ 编辑
编辑

AWS_AI 开发者社区是专注于人工智能领域,开发者交流与互动的平台。在这里,你可以分享和获取一切有关人工智能的相关技术和前沿知识,也可以与同行或爱好者们交流探讨,共同成长。
进入 AWS 开发人员中心:https://amazonaws-china.com/c...,深入了解 AWS 并构建您的首个 Web 应用程序!

个人动态

AWS_AI开发者社区 发布了文章 · 1月18日

怎样从文档中提取自定义实体

image

一张纸质文档上的文字内容如何提取出来?拍照,对照片使用光学字符识别(OCR)软件进行识别,很容易就可以搞定。

然而,同样一张纸质文档上的文字,如何让计算机程序理解其中所包含的内容?单凭OCR就不行了,这时候需要用到自然语言处理和实体提取技术。

Amazon Textract是一项机器学习(ML)服务,能够轻松从各类文档扫描件中提取文本与数据。Textract超越了简单的OCR来识别表单中的字段内容和表中存储的信息。基于此,大家可以使用Amazon Textract即时「读取」几乎任何类型的文档,并在无需任何人工或代码编写的前提下准确提取其中的文本与数据。

Amazon Textract在各个领域中拥有诸多实际应用。例如,人才管理企业可以使用Amazon Textract对候选人的技能集进行自动化提取,医疗保健组织则可从文档中快速提取患者信息以满足医疗需求等。

在组织处理各类文档时,往往要求我们从文档中的非结构化文本处提取实体。例如,合同文档中可能包含大量文本段落,其中的名词与合同条款以自然语言形式直接列出,而非如表格数据般具有清晰的键/值或表单结构。Amazon Comprehend是一项自然语言处理(NLP)服务,能够从非结构化文本当中提取关键性短语、地点、名称、组织、事件以及情感等。使用自定义实体识别,大家可以将并未预先受到支持的新实体类型划归至预设的通用实体类型当中,借此根据特定业务提取实体以满足实际需求。

在本文中,我们将展示如何使用Amazon Textract与Amazon Comprehend从文档扫描件中提取自定义实体。

用例概述

在本文中,我们将对Resume Entities for NER数据集中的简历文档进行处理,提取其中的实体,并尝试以自动化方式实现整个流程以获得多种洞察见解,例如候选人掌握的具体技能等。我们使用Amazon Textract从这些简历中提取文本,并使用Amazon Comprehend自定义实体功能,将AWS、C以及C++等技能识别为自定义实体。以下截屏所示,为示例输入文档。

image

以下截屏所示,为使用Amazon Textract与Amazon Comprehend生成的相应输出。

image

解决方案概述

下图所示,为一套无服务架构解决方案。该架构能够处理传入文档,使用Amazon Textract进行自定义实体提取,并使用Amazon Comprehend对自定义模型进行训练。在将文档上传至Amazon Simple Storage Service (Amazon S3) 存储桶时,即会触发对应的AWS Lambda函数。该函数将调用Amazon Textract DetectDocumentText API以提取文本,并使用提取到的文本内容调用以进一步检测其中的自定义实体。

image

整个解决方案分为两个部分:

  • 训练:
  • 使用Amazon Textract从PDF文档中提取文本
  • 使用Amazon SageMaker Ground Truth标记结果数据
  • 使用Amazon Comprehend配合标记数据进行自定义实体识别训练
  • 推理:
  • 向Amazon Textract发送文档以进行数据提取
  • 将提取到的数据发送至Amazon Comprehend自定义模型以进行实体提取

启动AWS CloudFormation堆栈

在本文中,我们将使用AWS CloudFormation堆栈部署解决方案,并创建方案中所需要的各项资源,具体包括S3存储桶、Amazon SageMaker实例以及必要的AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色。关于各栈的更多详细信息,请参阅演练:堆栈更新

或者也可以直接选择Launch Stack以启动该栈。

  • 在Create Stack页面上,选择Upload a template file并上传我们之前下载完成的CloudFormation模板。
  • 选择Next。
  • 在下一页面中,为该堆栈输入名称。

image

  • 其他各项皆保留默认设置。
  • 在Review页面中,选择I acknowledge that AWS CloudFormation might create IAM resources with custom names(我已知悉AWS CloudFormation可能使用自定义名称创建IAM资源)。
  • 选择Create stack。

image

  • 等待该堆栈完成运行。

大家可以在Events选项卡的堆栈创建流程部分,检查各类事件。堆栈创建完成之后,请查看Resources选项卡以查看AWS CloudFormation模板创建的所有资源。

  • 在CloudFormation栈的Outputs选项卡部分,记录Amazon SageMaker实例URL。

image

在Jupyter notebook上运行工作流

要运行工作流,请完成以下操作步骤:

  • 打开在上一步中保存的Amazon SageMaker实例URL。
  • 在New下拉菜单中,选择Terminal。
  • 在终端内,克隆GitHub cd Sagemaker; git clone URL。

到这里,将看到如以下截屏所示的文件夹结构。

image

  • 打开Textract_Comprehend_Custom_Entity_Recognition.ipynb。
  • 运行各Notebook单元。

代码演练

将所有文档上传至S3存储桶。

image

现在各PDF已经准备就绪,可供Amazon Textract执行OCR处理。通过StartDocumentTextDetection异步API调用启动处理流程。

image

在本文中,我们受篇幅所限,仅展示两份PDF格式的简历。如果需要,可以使用全部220份简历。我们已经将所有简历处理完成,供您直接参考。

要使用Amazon Comprehend训练自定义实体识别模型,那么与任何模型训练工作一样,训练数据都是必不可少的前提条件。在本文中,我们使用Ground Truth标记我们的实体。在默认情况下,Amazon Comprehend能够识别诸如人员、职务以及组织之类的实体。关于更多详细信息,请参阅检测实体。为了展示自定义实体识别功能,我们将重点关注简历中的候选人技能实体。Ground Truth已经提供充足的标记数据,大家可以通过GitHub repo直接获取这部分数据(详见enity_list.csv文件)。关于标记数据的操作说明,请参阅使用Amazon SageMaker Ground Truth与Amazon Comprehend开发NER模型

现在,我们已经掌握了原始数据与标记数据,可以开始训练模型了。要启动此流程,可使用create_entity_recognizer API 调用。提交训练作业之后,可以在Amazon Comprehend控制台上看到正在训练的识别器。

image

在训练过程中,Amazon Comperhend会保留一部分数据作为测试素材。在识别器训练完成之后,大家还可以查看各实体的识别性能以及识别器自身的整体性能水平。

image

我们准备了部分文本样本,用于测试刚刚训练完成的自定义实体识别器。我们通过相同的步骤执行OCR,而后将Amazon Textract输出上传至Amazon S3,并启动自定义识别器作业。

image

在提交作业后,可以在Amazon Comprehend控制台的Analysis Jobs之下查看分析进度。

image

分析作业完成后,可以下载输出并查看结果。在本文的示例中,我们将JSON结果转换为表格形式以提高可读性。

image
总结

机器学习与人工智能能够极大提升组织的敏捷水平,将原本只能手动完成的任务转为自动化流程,借此增强执行效率。在本文中,我们演示了一套端到端架构,可通过Amazon Textract与Amazon Comprehend提取候选人技能等自定义实体。本文还将大家讲解了如何使用Amazon Textract进行数据提取,以及如何使用Amazon Comprehend通过自有数据集训练自定义实体识别器,并借此实现自定义实体识别。这一流程可以广泛应用于各个行业,例如医疗保健与金融服务等。

要了解关于Amazon Textract提供的各项文本与数据提取功能的更多详细信息,请参阅Amazon Textract工作原理解读

image

查看原文

赞 0 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 1月15日

如何为基于NLP的实体识别模型设置人工审查?

image

目前,各个行业的组织都有大量非结构化数据,供决策团队通过评估获得基于实体的洞察见解。此外,大家可能还希望添加自己的专有业务实体类型,例如专有零件编号或行业特定术语等。然而为了创建基于自然语言处理(NLP)的模型,我们首先需要根据这些特定实体进行数据标记。

Amazon SageMaker Ground Truth能够帮助大家轻松构建起用于机器学习(ML)的高精度训练数据集,Amazon Comprehend则为模型训练作业快速选择正确的算法与参数。最后,Amazon Augmented AI(Amazon A2I)使我们能够审计、核对并扩充得出的预测结果。

本文将介绍如何使用Ground Truth命名实体识别(Named entity recognition,简称NER)进行特征标记,借此为自定义实体构建起标记数据集;并将介绍如何使用Amazon Comprehend训练一套自定义实体识别器,以及如何使用Amazon A2I提供的人工审核机制对置信度低于特定阈值的Amazon Comprehend预测进行复核。

我们将使用一套示例Amazon SageMaker Jupyter notebook,在演练中完成以下步骤:

  1. 预处理输入文件。
  2. 创建一项Ground Truth NER标记作业。
  3. 训练Amazon Comprehend自定义实体识别器模型。
  4. 使用Amazon A2I设置人工审核循环,借此检测低置信度预测结果。

先决条件

在开始之前,请通过以下步骤设置Jupyter notebook:

确保Amazon SageMaker notebook拥有Notebook中先决条件部分所提及的必要AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色及权限。

  • 在Notebook处于活动状态时,选择Open Jupyter。
  • 在Jupyter仪表上选择New, 而后选择Terminal。
  • 在终端内,输入以下代码:
cd SageMaker
git clone “https://github.com/aws-samples/augmentedai-comprehendner-groundtruth”
  • 在augmentedai-comprehendner-groundtruth文件夹中选择SageMakerGT-ComprehendNER-A2I-Notebook.ipynb以打开该Notebook。

现在,我们可以在Notebook单元中执行以下操作步骤。

预处理输入文件

在本用例中,大家正在查看聊天消息或几份提交的工单,希望弄清它们是否与AWS产品有关。我们使用Ground Truth中的NER 标记功能,将输入消息中的SERVICE或VERSION实体标记出来。之后,我们训练Amazon Comprehend自定义实体识别器,借此从推特或工单注释等文本当中识别出对应实体。

样本数据集可通过GitHub repo中的data/rawinput/aws-service-offerings.txt处获取。以下截屏所示,为本次演练中使用的数据集示例。

image

通过对文件进行预处理,我们将生成以下文件:

  • inputs.csv – 使用此文件为Ground Truth NER标记生成输入manifest文件。
  • Train.csv与test.csv – 使用这些文件作为自定义实体训练的输入。我们可以在Amazon Simple Storage Service (Amazon S3) 存储桶中找到这些文件。

关于数据集生成方法,请参阅Notebook中的步骤1a与1b部分。

创建一项Ground Truth NER标记作业

我们的目标是对输入文件中的句子进行注释与标记,将其归类于我们的各自定义实体。在本节中,大家需要完成以下步骤:

  • 创建Ground Truth所需要的manifest文件。
  • 设置标记工作人员。
  • 创建标记作业。
  • 启动标记作业并验证其输出结果。

创建一个manifest文件

我们使用在预处理过程中生成的inputs.csv文件创建NER标记特征所需要的manifest文件。我们将生成的manifest文件命名为prefix+-text-input.manifest,用于在创建Ground Truth作业时进行数据标记。详见以下代码:

# Create and upload the input manifest by appending a source tag to each of the lines in the input text file.
# Ground Truth uses the manifest file to determine labeling tasks
manifest_name = prefix + '-text-input.manifest'
# remove existing file with the same name to avoid duplicate entries
!rm *.manifest
s3bucket = s3res.Bucket(BUCKET)
with open(manifest_name, 'w') as f:
 for fn in s3bucket.objects.filter(Prefix=prefix +'/input/'):
 fn_obj = s3res.Object(BUCKET, fn.key)
 for line in fn_obj.get()['Body'].read().splitlines(): 
 f.write('{"source":"' + line.decode('utf-8') +'"}n')
f.close()
s3.upload_file(manifest_name, BUCKET, prefix + "/manifest/" + manifest_name)

NER标记作业需要将输入manifest位于{"source": "embedded text"}中。下列截图展示了从input.csv生成的input.manifest文件内容。

image

创建专有标记工作人员

在Ground Truth中,我们使用专有工作人员创建一套经过标记的数据集。

大家可以在Amazon SageMaker控制台上创建专有工作人员。关于具体操作说明,请参阅使用Amazon SageMaker Ground Truth与Amazon Comprehend开发NER模型中的创建专有工作团队部分。

或者也可以按照Notebook中的指导分步操作。

在本演练中,我们使用同一专有工作人员在自定义实体训练完成之后,使用Amazon A2I标记并扩充低置信度数据。

创建一项标记作业

下一步是创建NER标记作业。本文将重新介绍其中的关键步骤。关于更多详细信息,请参阅使用Amazon SageMaker Ground Truth添加数据标记工作流以实现命名实体识别

  • 在Amazon SageMaker控制台的Ground Truth之下,选择Labeling jobs
  • 选择Create labeling job。
  • 在Job name部分,输入一个作业名称。
  • 在Input dataset location部分,输入之前创建的输入manifest文件所对应的Amazon S3存储位置(s3://_bucket_//_path-to-your-manifest.json_)。
  • 在Output Dataset Location部分,输入带有输出前缀的S3存储桶(例如s3://_bucket-name_/output)。
  • 在IAM role部分,选择Create a new Role。
  • 选择Any S3 Bucket。
  • 选择Create。
  • 在Task category部分,选择Text。
  • 选择Named entity recognition。

image

  • 选择Next。
  • 在Worker type部分,选择Private。
  • 在Private Teams当中,选择所创建的团队。
  • 在Named Entity Recognition Labeling Tool部分的Enter a brief description of the task位置,输入:Highlight the word or group of words and select the corresponding most appropriate label from the right。
  • 在Instructions对话框中,输入:Your labeling will be used to train an ML model for predictions. Please think carefully on the most appropriate label for the word selection. Remember to label at least 200 annotations per label type。
  • 选择Bold Italics。
  • 在Labels部分,输入希望向工作人员展示的标签名称。
  • 选择Create。

启动标记作业

工作人员(或者是由我们亲自担任工作人员)将收到一封包含登录说明的电子邮件。

  • 选择the URL provided and enter your user name and password.

随后将被定向至标记任务UI。

  • 通过为词组选择标签以完成标记任务。
  • 选择Submit。

image

  • 在对所有条目进行过标记之后,UI将自动退出。
  • 要检查作业状态,请在Amazon SageMaker控制台的Ground Truth之下,选择Labeling jobs。
  • 等待,直至作业状态显示为Complete。

image

验证注释输出

验证注释输出,请打开S3存储桶并前往_<S3 Bucket Name>/output/<labeling-job-name>_/manifests/output/output.manifest。我们可以在这里查看Ground Truth创建的manifest文件。以下截屏所示,为本次演练中的示例条目。

image

训练一套自定义实体模型

现在,我们可以使用经过注释的数据集或者之前创建的output.manifest Ground Truth训练一套自定义实体识别器了。本节将引导大家完成Notebook中提及的具体步骤。

处理经过注释的数据集

大家可以通过实体列表或者注释,为Amazon Comprehend自定义实体提供标签。在本文中,我们将使用Ground Truth标记作业生成注释内容。大家需要将经过注释的output.manifest文件转换为以下CSV格式:

File, Line, Begin Offset, End Offset, Typedocuments.txt, 0, 0, 11, VERSION

运行Notebook中的以下代码以生成此annotations.csv文件:

# Read the output manifest json and convert into a csv format as expected by Amazon Comprehend Custom Entity Recognizer
import json
import csv
# this will be the file that will be written by the format conversion code block below
csvout = 'annotations.csv'
with open(csvout, 'w', encoding="utf-8") as nf:
 csv_writer = csv.writer(nf)
 csv_writer.writerow(["File", "Line", "Begin Offset", "End Offset", "Type"])
 with open("data/groundtruth/output.manifest", "r") as fr:
 for num, line in enumerate(fr.readlines()):
 lj = json.loads(line)
 #print(str(lj))
 if lj and labeling_job_name in lj:
 for ent in lj[labeling_job_name]['annotations']['entities']:
 csv_writer.writerow([fntrain,num,ent['startOffset'],ent['endOffset'],ent['label'].upper()])
 fr.close()
nf.close() 
s3_annot_key = "output/" + labeling_job_name + "/comprehend/" + csvout
upload_to_s3(s3_annot_key, csvout)

下图所示,为该文件的具体内容。

image

设置一套自定义实体识别器

本文在示例中使用API,但大家可以选择在Amazon Comprehend控制台上创建识别与批量分析作业。关于具体操作说明,请参阅使用Amazon Comprehend构建自定义实体识别器

  • 输入以下代码。在s3_train_channel当中使用我们在预处理阶段生成的train.csv文件,借此进行识别器训练。在s3_annot_channel当中,使用annotations.csv作为标签以训练您的自定义实体识别器。
custom_entity_request = {
 "Documents": {
 "S3Uri": s3_train_channel
 },
 "Annotations": {
 "S3Uri": s3_annot_channel
 },
 "EntityTypes": [
 {
 "Type": "SERVICE"
 },
 {
 "Type": "VERSION"
 }
 ]
}
  • 使用CreateEntityRecognizer创建实体识别器。该实体识别器使用最低数量训练样本进行训练,借此生成Amazon A2I工作流中需要的部分低置信度预测结果。详见以下代码:
import datetime
id = str(datetime.datetime.now().strftime("%s"))
create_custom_entity_response = comprehend.create_entity_recognizer(
 RecognizerName = prefix + "-CER",
 DataAccessRoleArn = role,
 InputDataConfig = custom_entity_request,
 LanguageCode = "en"
)

在实体识别器作业完成之后,我们将获得一款附带性能分数的识别器。如前所述,我们使用最低数量的训练样本进行识别器训练,借此生成Amazon A2I工作流中需要的部分低置信度预测结果。我们可以在Amazon Comprehend控制台上找到这些指标,具体参见以下截屏。

image

  • 创建一项批量实体检测分析作业,用以检测大量文件中的相应实体。

使用Amazon Comprehend StartEntitiesDetectionJob操作以检测文件中的自定义实体。关于使用自定义实体识别器创建实时分析端点的具体操作说明,请参阅启动Amazon Comprehend自定义实体识别实时端点以执行注释任务

要使用EntityRecognizerArn进行自定义实体识别,我们需要为识别器提供访问权限以进行自定义实体检测。执行CreateEntityRecognizer操作即可通过响应结果获得此ARN。

  • 运行自定义实体检测作业,通过Notebook运行以下单元,对预处理步骤当中创建的测试数据集做出预测:
s3_test_channel = 's3://{}/{}'.format(BUCKET, s3_test_key) s3_output_test_data = 's3://{}/{}'.format(BUCKET, "output/testresults/")
test_response = comprehend.start_entities_detection_job( InputDataConfig={
'S3Uri': s3_test_channel,
'InputFormat': 'ONE_DOC_PER_LINE'
},
OutputDataConfig={'S3Uri': s3_output_test_data
},
DataAccessRoleArn=role,
JobName='a2i-comprehend-gt-blog',
EntityRecognizerArn=jobArn,
LanguageCode='en')

以下截屏所示,为本次演练中得出的测试结果。

image

建立人工审核循环

在本节中,我们将为Amazon A2I中的低置信度检测建立起人工审核循环,具体包括以下步骤:

  • 选择工作人员。
  • 创建人工任务UI。
  • 创建一项工作人员任务模板创建器函数。
  • 创建流定义。
  • 检查人员循环状态,并等待审核人员完成任务。

选择工作人员

在本文中,我们使用由为Ground Truth标记作业创建的专有工作人员。使用工作人员ARN为Amazon A2I设置工作人员。

创建人工任务UI

使用liquid HTML中的UI模板创建人工任务UI资源。每当需要人工循环时,皆需要使用这套模板。

以下示例代码已通过测试,能够与Amazon Comprehend实体检测相兼容:

template = """
<script data-original="https://assets.crowd.aws/crowd-html-elements.js"></script>
<style>
 .highlight {
 background-color: yellow;
 }
</style>
<crowd-entity-annotation
 name="crowd-entity-annotation"
 header="Highlight parts of the text below"
 labels="[{'label': 'service', 'fullDisplayName': 'Service'}, {'label': 'version', 'fullDisplayName': 'Version'}]"
 text="{{ task.input.originalText }}"
> 
 <full-instructions header="Named entity recognition instructions">
 <ol>
 <li><strong>Read</strong> the text carefully.</li>
 <li><strong>Highlight</strong> words, phrases, or sections of the text.</li>
 <li><strong>Choose</strong> the label that best matches what you have highlighted.</li>
 <li>To <strong>change</strong> a label, choose highlighted text and select a new label.</li>
 <li>To <strong>remove</strong> a label from highlighted text, choose the X next to the abbreviated label name on the highlighted text.</li>
 <li>You can select all of a previously highlighted text, but not a portion of it.</li>
 </ol>
 </full-instructions>
 <short-instructions>
 Select the word or words in the displayed text corresponding to the entity, label it and click submit
 </short-instructions>
 <div id="recognizedEntities" style="margin-top: 20px">
 <h3>Label the Entity below in the text above</h3>
 <p>{{ task.input.entities }}</p>
 </div>
</crowd-entity-annotation>
<script>
 function highlight(text) {
 var inputText = document.getElementById("inputText");
 var innerHTML = inputText.innerHTML;
 var index = innerHTML.indexOf(text);
 if (index >= 0) {
 innerHTML = innerHTML.substring(0,index) + "<span class='highlight'>" + innerHTML.substring(index,index+text.length) + "</span>" + innerHTML.substring(index + text.length);
 inputText.innerHTML = innerHTML;
 }
 }
 document.addEventListener('all-crowd-elements-ready', () => {
 document
 .querySelector('crowd-entity-annotation')
 .shadowRoot
 .querySelector('crowd-form')
 .form
 .appendChild(recognizedEntities);

 });
</script>

"""

创建一项工作人员任务模板创建器函数

此函数属于对Amazon SageMaker软件包方法的高级抽象,用于创建人工审核工作流。详见以下代码:

def create_task_ui():
 '''
 Creates a Human Task UI resource.
 Returns:
 struct: HumanTaskUiArn
'''
 response = sagemaker.create_human_task_ui(
 HumanTaskUiName=taskUIName,
 UiTemplate={'Content': template})
 return response
# Task UI name - this value is unique per account and region. You can also provide your own value here.
taskUIName = prefix + '-ui'
# Create task UI
humanTaskUiResponse = create_task_ui()
humanTaskUiArn = humanTaskUiResponse['HumanTaskUiArn']
print(humanTaskUiArn)

创建流定义

我们可以在流定义中指定以下内容:

  • 作为任务接收方的工作人员
  • 工作人员收到的标记指示

本文使用API,但也可以选择在Amazon A2I控制台上创建这项工作流定义。

关于更多详细信息,请参阅如何创建流定义

要设置触发人工循环审核的条件,请输入以下代码(可以设置CONFIDENCE_SCORE_THRESHOLD阈值,借此调整触发人工审核的具体置信度):

human_loops_started = []
import json
CONFIDENCE_SCORE_THRESHOLD = 90
for line in data:
 print("Line is: " + str(line))
 begin_offset=line['BEGIN_OFFSET']
 end_offset=line['END_OFFSET']
 if(line['CONFIDENCE_SCORE'] < CONFIDENCE_SCORE_THRESHOLD):
 humanLoopName = str(uuid.uuid4())
 human_loop_input = {}
 human_loop_input['labels'] = line['ENTITY']
 human_loop_input['entities']= line['ENTITY']
 human_loop_input['originalText'] = line['ORIGINAL_TEXT']
 start_loop_response = a2i_runtime_client.start_human_loop(
 HumanLoopName=humanLoopName,
 FlowDefinitionArn=flowDefinitionArn,
 HumanLoopInput={
 "InputContent": json.dumps(human_loop_input)
 }
 )
 print(human_loop_input)
 human_loops_started.append(humanLoopName)
 print(f'Score is less than the threshold of {CONFIDENCE_SCORE_THRESHOLD}')
 print(f'Starting human loop with name: {humanLoopName} n')
 else:
 print('No human loop created. n')

检查人工循环状态并等待审核人员完成任务

要定义一项检查人工循环状态的函数,请输入以下代码:

completed_human_loops = []
for human_loop_name in human_loops_started:
 resp = a2i_runtime_client.describe_human_loop(HumanLoopName=human_loop_name)
 print(f'HumanLoop Name: {human_loop_name}')
 print(f'HumanLoop Status: {resp["HumanLoopStatus"]}')
 print(f'HumanLoop Output Destination: {resp["HumanLoopOutput"]}')
 print('n')
 if resp["HumanLoopStatus"] == "Completed":
 completed_human_loops.append(resp)

导航至专有工作人员门户(为Notebook在上一步骤中的单元2输出结果),详见以下代码:

workteamName = WORKTEAM_ARN[WORKTEAM_ARN.rfind('/') + 1:]
print("Navigate to the private worker portal and do the tasks. Make sure you've invited yourself to your workteam!")
print('https://' + sagemaker.describe_workteam(WorkteamName=workteamName)['Workteam']['SubDomain'])

这套UI模板类似于Ground Truth NER标记功能。Amazon A2I显示从输入文本中识别出的实体(即低置信度预测结果)。而后,工作人员可以根据需要更新或验证实体标签,并选择Submit。

image

此项操作将生成更新的注释,其中包含由人工审核员高亮标注的偏移量与实体。

资源清理

为了避免产生不必要的费用,请在完成本演练后删除相应资源,包括Amazon SageMaker notebook实例、Amazon Comprehend自定义实体识别器,以及Amazon S3当中不再使用的模型工件。

总结

本文演示了如何使用Ground Truth NER为Amazon Comprehend自定义实体识别结果创建注释。我们还使用Amazon A2I以更新并改进Amazon Comprehend的低置信度预测结果。

大家可以使用Amazon A2I生成的注释更新所创建的注释文件,并逐步训练自定义识别器以不断提升模型精度。

关于视频演示、Jupyter示例Notebook以及更多与用例相关的详细信息,包括文档处理、内容审核、情感分析与文本翻译等,请参阅Amazon Augmeneted AI资源。期待大家在实际应用中扩展出更多解决方案,也欢迎您提供反馈与建议。

image

查看原文

赞 0 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 1月12日

案例分享 | 将Caffe2 计算机视觉流水线任务迁移至SageMaker中的Managed Spot Training

image

本文由来自SNCF和Olexya的客座作者联合撰写。

本文将介绍法国国有铁路公司Société Nationale des Chemins de fer Français(SNCF)如何在技术合作伙伴Olexya的帮助下,运用AWS提供的ML服务,研究、开发与部署创新的计算机视觉解决方案。

背景介绍

SNCF成立于1938年,目前拥有超过27万名员工。SNCF Réseau为SNCF旗下子公司,负责铁路网络基础设施的管理与运营工作。SNCF Réseau及其技术合作伙伴Olexya部署了一整套创的解决方案,希望以协助基础设施运营的同时,对基础设施安全性与质量保持高水平。现场团队使用计算机视觉检测基础设施中出现的异常。

SNCF Réseau的研究人员拥有丰富的ML经验,有一个团队已使用Caffe2深度学习框架开发出本地计算机视觉检测模型。接着,科学家们联系到SNCF Réseau的技术合作伙伴Olexya,他们帮助申请配置GPU资源来支持迭代模型。为了继续保持较低的运营开销与较高的生产效率,同时保持科学代码的全面灵活性,Olexya决定使用Amazon SageMaker编排Caffe2模型的训练与推理。

整个流程涉及以下步骤:

  1. 创建自定义Docker。
  2. 通过Amazon Simple Storage Service (Amazon S3)数据通道配置训练数据读取。
  3. 通过Amazon SageMaker Spot GPU训练实现有成本效益的训练。
  4. 使用Amazon SageMaker训练API实现有成本效益的推理。

创建自定义Docker

该团队创建一个Docker镜像,其中打包有符合Amazon SageMaker Docker规范的原始Caffe2代码。Amazon SageMaker能够容纳多个数据源,而且与Amazon S3进行了高级集成。存储在Amazon S3中的数据集能够被自动提取至运行在Amazon SageMaker上的训练容器当中。

为了顺畅处理Amazon S3中的可用训练数据,Olexya需要指定训练代码从关联的本地路径opt/ml/input/data/_<channel name>_处执行读取。相似的,模型写入位置必须设定为opt/ml/model。使用这种方式,在训练作业完成之后,Amazon SageMaker就能自动将训练完成的模型工件压缩并发送至Amazon S3。

通过Amazon Simple Storage Service数据通道配置训练数据读取

原始Caffe2训练代码通过详尽且灵活的YAML配置文件实现参数调整,所以研究人员能够直接更改模型设置,而无需更改科学代码。外部文件很容易被保留在外部并在训练时使用数据通道读取到容器中。这里所说的数据通道,是指在训练过程中传递至Amazon SageMaker SDK的Amazon S3 ARN,其会在训练开始时被添加至Amazon SageMaker容器当中。Olexya将数据通道配置为通过副本读取的形式(即副本模式),这也是Amazon SageMaker中的默认配置。我们也可以根据需求通过Unix管道(即Pipe模式)实现数据的流式传输。

通过Amazon SageMaker Spot GPU训练实现有成本效益的训练

该团队采用ml.p3.2xlarge GPU加速计算实例配置了训练基础设施。Amazon SageMaker ml.p3.2xlarge计算实例特别适用于深度学习计算机视觉类工作负载,其配备了一块有5120个核心的英伟达V100 GPU与16GB高带宽内存(HBM),能够快速训练大型模型。

此外,Amazon SageMaker训练API被设置激活使用托管Spot实例,与Amazon SageMaker按需实例价格相比,Spot实例被报告节省了71%成本。Amazon SageMaker Managed Spot Training是Amazon SageMaker提供的功能选项,可使用Amazon Elastic Compute Cloud (Amazon EC2) Spot实例资源进行训练。Amazon EC2 Spot实例将处于闲置状态的冗余Amazon EC2计算容量以高折扣方式出售给客户。在Amazon SageMaker当中,Spot实例的实际使用由服务本身全面托管,用户可以设置两项训练SDK参数随时加以调用:

  • train_use_spot_instances=True,用于请求Amazon SageMaker Spot实例的资源使用量。
  • train_max_wait,用于设置以秒为单位的最大可接受等待时长。

Amazon SageMaker训练API实现有成本效益的推理

在本次研究计划中,最终用户可以接受推理中断与实例化延迟。因此,为了进一步优化成本,团队使用Amazon SageMaker训练API运行推理代码,在托管的Amazon SageMaker Spot实例之上同样可以用来推理。除了成本优势之外,使用训练API还能够降低学习曲线,因为在模型训练与推理周期之内使用相同的API。

时间与成本节省效果

通过以上四个步骤,Olexya成功将本地Caffe2深度计算机视觉检测模型移植到Amazon SageMaker当中,实现训练与推理。更令人印象深刻的是,该团队在约三周之内完成了工具学习,并将模型的训练周期由三天缩减至十个小时!该团队还进一步估计,与原有的本地可用GPU集群相比,Amazon SageMaker得以将总体拥有成本(TCO)降低71%。除此之外,其他优化技术能够进一步降低成本,例如使用Amazon SageMaker自动模型调优进行超参数智能搜索,并使用与之匹配的深度学习框架进行混合精度训练等。

除SNCF Réseau之外,不少来自运输与物流行业的AWS客户也都在ML技术的帮助下,切实改善了自身业务运营与创新能力。具体案例包括:

  • 来自迪拜的物流公司Aramex使用ML技术解决了地址解析与运输时间预测问题。该公司使用了150个模型,每天执行45万项预测作业。
  • 新南威尔士州运输局使用云服务预测整个运输网络中的乘客数量,借此更好地规划劳动力与资产利用率,进而提升客户满意度。
  • 大韩航空使用Amazon SageMaker启动多个创新项目,旨在预测并提前对飞机机群进行维护。

总结

Amazon SageMaker支持从数据注释、到生产部署、再到运营监控的整个ML开发周期。正如Olexya与SNCF Réseau的工作所示,Amazon SageMaker具有良好的框架中立性,能够容纳各类深度学习工作负载及框架。除了预先为Sklearn、TensorFlow、PyTorch、MXNet、XGBoost以及Chainer创建配套Docker镜像与SDK对象以外,用户也可以使用自定义Docker容器,几乎任何框架,如PeddlePaddle、Catboost、R以及Caffe2。对于ML从业者,不要犹豫,请开始测试AWS SageMaker服务,并分享在构建中总结出的经验与心得!

image

查看原文

赞 0 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 1月8日

【月度文章集锦】2020年11-12月AWS人工智能精华内容一文速览

image

欢天喜地迎来2021年,你的各种大目标、小目标都该开始实施了吧。今年你打算学习哪些新知识?又打算在项目中应用哪些新技术呢?大步前进的同时,别忘了回顾一下之前的干货知识点,没准也能带给你一些启发。

2020年11月和12月,我们照惯例与大家分享了大量有关AWS AI、机器学习、深度学习等内容的技术文章,现在就一起来回顾一下吧。

机器学习

众多AWS客户已经开始利用Amazon Lex机器人在电话及其他多种渠道上增强Amazon Connect自助服务的对话体验。借助Amazon Lex,呼叫方能够快速获取问题的答案,几乎不需要人工客服的介入。但这同时也给服务可用性提出了更高的要求,因此引发了新的问题:我们该使用哪种架构模式提升机器人可用性?其实我们可以通过一种跨区域方法,在多个区域中部署Amazon Lex机器人以提高服务可用性。详细方法请参阅:机器人客服你见得多了,不过高可用的机器人你会造吗?

在使用机器学习技术进行预测时,最麻烦的问题莫过于数据缺失导致的预测结果不准确。但如果你的预测系统使用了Amazon Forecast,那就简单了,利用该服务自带的缺失补全功能,数据问题迎刃而解。本文将使用Forecast GitHub repo中的Notebook示例,向大家展示为相关及目标时间序列(TTS)数据集进行缺失值补全的功能。敬请阅读:数值缺失的情况下如何进行机器学习预测?Amazon Forecast帮你来补全

Amazon SageMaker提供了一套全托管式解决方案,可用于构建、训练以及部署各种机器学习(ML)模型。在本文中,我们将演示如何使用Amazon SageMaker Processing Jobs配合开源项目Papermill执行Jupyter Notebook。Amazon SageMaker与Amazon CloudWatch、AWS Lambda以及整个AWS栈的结合,向我们提供了实时和按计划扩展作业所需模块化骨干。欢迎阅读:「工具人」何必彻夜守候,SageMaker帮你灵活调度Notebook

欺诈用户与恶意账户每年可能给企业造成数十亿美元的营收损失。尽管不少企业已经在使用基于规则的筛选器防止系统中存在的各类恶意活动,但这类筛选器往往相当脆弱,而且无法捕捉到全部恶意行为。本文介绍了如何使用Amazon SageMaker与Deep Graph Library(DGL)训练GNN模型,进而检测恶意用户或欺诈事务。详见:面对「不讲武德」的骗子,我们这样对付Ta

一般来说,开发出来的ML模型还需要不断地完善才能提供让人满意的结果。然而在很多场景,例如在电子商务应用等多种实际环境中,单靠离线评估并不足以保证模型质量,我们需要在生产期间对模型进行A/B测试,并据此做出模型更新决策。借助Amazon SageMaker,大家可以在端点之上运行多个生产模型变体,轻松对ML模型执行A/B测试。这些生产模型变体可以分别对应由不同训练数据集、算法以及ML框架训练而成的ML模型,再配合不同的云实例类型,即可建立起多种测试因素组合。具体做法请参阅:软件开发领域常用的A/B测试,也能用给ML模型啦

Amazon SageMaker已经在全球各服务区域预装R内核。此项功能开箱即用,同时预安装有reticulate库。该库负责为Amazon SageMaker Python SDK提供R接口,允许大家直接从R脚本中调用Python模块。本文将介绍如何在Amazon SageMaker内置的R内核之上创建自定义R环境(内核),以及如何在会话之间实现环境持久化。此外还将介绍如何在R环境中安装新的软件包,如何在Amazon Simple Storage Service(Amazon S3)上保存这套新环境,以及如何使用它通过Amazon SageMaker生命周期配置创建新的Amazon SageMaker实例。详见:在SageMaker上玩转R环境,这些必会技巧你知道几个?

深度学习

尝试过的童鞋都知道,要想玩转深度学习,尤其是模型的训练,可得准备好性能足够强的电脑。CPU倒是无所谓,但GPU,越多越好,越快越好。可就算你不差钱,装备了最高端的AI专用GPU计算卡,面对复杂的模型,训练起来依然要花大量时间等等等等……老板和客户都等着你快点出结果,怎么提高训练速度?多找几台电脑,进行分布式训练吧,效果杠杠滴!具体怎么做?多征用几台电脑,今天我们一起玩玩多GPU分布式训练的深度学习

GPU能够显著加快深度学习的训练速度,有望将训练周期由几个星期缩短至数小时。但要全面发挥GPU资源的强大性能,还需要考量很多问题。本文将重点介绍在Amazon SageMaker上进行训练时,能够切实提高I/O以优化GPU性能的通用型技术。这些技术方法具有良好的普适性,不对基础设施或深度学习框架本身做出任何要求。通过优化I/O处理例程,整个GPU训练中的性能提升最多可提升至10倍水平。敬请阅读:深度学习训练如何更快些?GPU性能的I/O优化你试过吗?

人工智能

有时候我们可能很难找到合适的词汇来描述自己想要寻找的东西。而正如俗语所言:「一图抵千言」,一般来说,展示真实示例或者图像,对于目标的表达效果确实要比纯文字描述好上不少。这一点,在使用搜索引擎查找所需内容时显得尤其突出。其实类似的能力在很多应用中都有,不过你是否想过自己该如何实现?如何快速上手从零开始构建一款视觉图像搜索应用程序,并且让其中包含用于提供视觉搜索结果的全栈Web应用程序?敬请阅读:「视觉搜索」,看似神奇,亲自试试其实没那么难

卷积神经网络(CNN)的运作机制如同黑匣子,如果无法理解预测的推理过程,我们很可能在使用时遭遇问题。同样的,在模型部署完成之后,与专门用于模型训练的数据相比,用于推理的数据可能遵循完全不同的数据分布。这种现象通常被称为数据漂移(Data drift),有可能导致模型预测错误。在这种情况下,理解并解释导致模型预测错误的原因就成了冲出迷雾的唯一希望。本文将部署一套用于交通标志分类的模型,并设置Amazon SageMaker Model Monitor以自动检测与预期不符的模型行为,例如始终较低的预测得分或者对某些图像类别的过度预测。详见:SageMaker Model Monitor与Debugger神助攻,理解卷积神经网络这个「黑匣子」

数据科学家们试图使用监督学习技术解决问题时,通常需要在着手建模之前整理出高质量的标记数据集。这可是个辛苦活。好在Amazon SageMaker Ground Truth的出现让每个人都能针对多种不同的任务(例如文本分类与对象检测),轻松地获得自己需要的数据集。Ground Truth还能帮助大家为用户自定义的任务构建自定义数据集,对其中的任意内容做出标注。具体做法可参阅:Angular x Ground Truth,数据集标记作业从未能如此简单

对数据科学家来说,R语言无异于一个利器,可以非常方便直观地解决大量与数据分析有关的挑战。这样一个神器与SageMaker的机器学习能力相结合又能产生多大的威力?目前,已经有不少AWS客户开始将流行的开源统计计算与图形软件R全面引入大数据分析与数据科学领域。本文我们将了解如何在Amazon SageMaker notebook实例上使用R实现机器学习模型的训练、部署与预测结果检索。欢迎阅读:SageMaker支持R编程,数据科学家们,欢呼吧!

各行各业的组织都需要处理大量纸质文件,其中又以发票类票据居多。以往,对于包含表格、表单、段落以及复选框的各类扫描文档,我们往往很难从中提取出有效信息。虽然目前不少组织已经通过人工、自定义代码或者光学字符识别(OCR)等技术解决了信息提取难题,但其中仍然需要借助完善的表单提取与自定义工作流模板。此外,在从文档中提取到文本或其他形式的内容之后,用户还希望从收据或发票中帮助最终用户整理出更多深层洞见。但这又需要构建起复杂的自然语言处理(NLP)模型,模型的训练又要占用大量训练数据与计算资源。机器学习模型的构建与训练往往既昂贵、又极为耗时。本文将向大家介绍如何使用AWS AI服务自动实现文本数据处理与洞见发现。借助AWS AI服务,我们可以设置自动化无服务器解决方案以满足上述要求。详见:年底忙着整发票的财务人员,这个好东西你可一定要试试

AWS提供了一个名为Amazon Translate的机器翻译服务,支持全球各大主要语言的双向互译。除了把一种语言的文字内容复制粘贴到Amazon Translate中并翻译为指定的语言外,最近更新之后的Amazon Translate也开始支持对DOCX、PPTX以及XLSX格式的Office Open XML文档进行翻译。本文将介绍如何在AWS管理控制台上翻译文档。详见:海外客户发来的文档到底在说啥?不懂就问,Amazon Translate告诉你答案

案例分享

作为一家大型企业,思科旗下多个业务部门都在应用机器学习(ML)与人工智能(AI)技术。该公司中向CTO直接报告的思科AI团队主要负责在公司内部各业务部门中推广开源AI/ML最佳实践,同时也是Kubeflow开源项目与MLPerf/MLCommons的主要贡献者。该部门希望在机器学习领域开发出要同时供思科业务部门与客户使用的工件与最佳实践,并以参考架构的形式共享这些解决方案。那么他们是怎么做的?欢迎阅读:思科结合SageMaker与Kubeflow打造的混合机器学习工作流

在机器学习领域,生成对抗网络(GAN)算法已经成为构建Deepfake的最流行算法。Deepfake算法所使用的底层技术,与电影及主机游戏中为我们带来逼真动画效果的方法完全相同。遗憾的是,恶意人士使用这些无辜的算法模糊了现实与虚假之间的区别。Deepfake视频的本质,在于使用人工智能操纵音频与视频,导致最终结果呈现出人物做出或说出了客观上并不存在的行为或语言。2019年10月,AWS与Facebook、微软以及Patnership on AI共同组织了首届Deepfake检测挑战赛。他们是如何运用AWS服务顺利举行本次活动的?敬请阅读:Amazon EC2助力Deepfake检测挑战赛

面对激烈竞争,几乎每个零售商都在努力为客户提供量身定制的个性化体验。但在恰当的时间,通过恰当的渠道,将恰当的产品,以恰当的方式,推荐给恰当的客户…… 这真想做好谈何容易!来自美国底特律的初创公司StockX主要围绕运动鞋和街头潮牌服饰开展自己的业务,他们致力于通过独特的买卖双向报价革新现有电商销售模式。为了用更加个性化的体验吸引客户,他们经过广泛对比和评估,决定基于Amazon Personalize服务来打造自己的个性化推荐引擎。他们是如何实现这一切的?欢迎阅读:如何借助个性化推荐将客户整体参与度提高50%

image

查看原文

赞 0 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 1月6日

不用「拉人头」,营销活动这样办,大家当然会踊跃参加

image

今时今日,「流量」意味着一切……只要你能引来足够大的流量,无论是产品推广或是直播带货,这种事情做起来简直就是小菜一碟。然而对于企业营销人员来说,最惨的事情莫过于辛辛苦苦规划并举办的营销活动,到最后无人问津,所有努力都打了水漂……

毕竟如今的营销服务商掌握多种客户交流渠道,而此时的重点在于:如何在正确的时间,以正确的渠道,向正确的客户,发出正确的信息!

在数字化技术的帮助下,这个问题其实很好解决。本文将介绍如何将Braze(一套以AWS为基础,面向即时需求且强调持续联系的客户参与平台)与Amazon Personalize结合,尝试解决营销活动参与度难题,进而为客户提供充满惊喜的使用体验。

Braze能够帮助营销人员轻松将客户组织为受众,并根据其行为及个人资料特征进行实时更新,进而创建消息交付宣传,通过电子邮件、短信及推送通知等渠道定位目标受众。我们也可以使用Braze Canvas设计出多步骤、多渠道参与流程。Campaign与Canvas可根据计划,甚至是客户的实际操作手动触发。当然,向客户发送个性化消息的实际效果,直接取决于客户个人资料中透露出的倾向性内容。大家需要根据每位客户在Web与移动端应用互动时表现出的偏好,据此组织产品与内容推荐,从而真正在每一条宣传消息中引入个性化元素。

Amazon Personalize 是一项AWS服务,使用机器学习算法根据客户的行为数据创建推荐系统。这款推荐器为AWS账户专有,且仅根据所提供的数据进行内容生成。配合Braze Connected Content功能,我们可以将Braze接入用于在Web及移动端应用中提供推荐消息的同一套Amazon Personalize推荐器,借此通过Braze发送的消息准确反映受众的当前偏好与意图。

解决方案概述

在本文中,我们将介绍两套架构:其一使用Braze加Amazon Personalize进行实时推荐,其二则是牺牲一部分实时建议新鲜度以换取为更具成本效益的批处理方法。我们对于方法的具体选择,应该与受众宣传策略的目标以及消息传递的规模需求相适应。幸运的是,Braze与Amazon Personalize提供了丰富的功能与集成选项,能够满足我们对于运营灵活性的各种实际需求。

实时集成

首先从实时集成架构开始。下图所示,为电子商务应用程序中的各相关组件,大家将在其中使用Amazon Personalize提供的机器学习(ML)支持型推荐器,即本文中的解决方案。在构建这套解决方案时,主要涉及的数据为用户与各商品条目的交互历史。在电子商务应用程序中,还应包含具体事件,例如客户查看商品、将商品添加至购物车以及实际购买商品的行为。在拥有丰富的事件、条目与用户元数据可供使用时,大家即可对这些元数据加以合并,从而进一步提高推荐系统与推荐内容的相关性水平。

元数据的具体内容可以涵盖多个层面,包括客户使用的设备类型、所在位置以及事件发生的时间(购物季)等;商品的类别、类型与价格区间;以及用户的年龄、性别与订阅倾向。在创建解决方案之后,只需单击几下,即可创建出被称为campaigns的自动扩展API端点,借此检索个性化推荐内容。

后文还将介绍如何在AWS账户中部署这款应用程序。此应用程序还附带自助式研讨课程,我们可以借此了解如何使用Braze向客户发送个性化宣传邮件。

image

我们的示例电子商务应用程序将从Recommendations微服务中检索个性化建议,由此建议将Amazon Personalize提供的推荐商品ID附加至Products微服务当中以丰富产品信息。当用户与应用程序交互,并通过查看商品、将商品添加至购物车乃至购买商品以表达自己的兴趣时,与这些操作相关的事件将通过AWS Amplify JavaScript客户端库被流式传输至Amazon Personalize,再由后者自动根据用户的实时活动做出推荐调整。

通过在应用程序当中内置个性化设置,我们可以将Amazon Personalize与Braze对接起来,通过电子邮件、短信以及推送通知等出向推广渠道为客户提供个性化推荐结果。

大家还可以通过Braze创建消息模板。此类模板通过Liquid模板语言,使用客户个人资料乃至其他外部资源中的值以替换模板中的原始占位符。在实时架构中,我们使用的示例应用程序将Recommendations微服务作为外部资源,并使用Braze Connected Content功能检索个性化推荐,而后将适用的推荐内容包含在消息模板当中。在以下Connected Content Liquid标签(位于电子邮件开头部分)中,我们可以看到如何从Braze处调用Recommendations服务以为当前用户检索推荐信息。

{% connected_content http://<RecommendationsServiceHostName>/recommendations?userID={{${user_id}}}&fullyQualifyImageUrls=1&numResults=4 :save result %}

标签当中包含以下元素:

  • Liquid标签位于{%与%}当中,我们可以借此向消息模板中添加标签、表达式,甚至是文本或HTML。
  • 标签类型将在标签开始之后立即声明。在本用例中,标签类型为connected_content。关于所支持标签的完整列表,请参阅使用Liquid标签实现个性化设置
  • 接下来,我们需要为各用户定义一条由Connected Content进行调用的、指向对应HTTP资源的标准URL。请将其中的<RecommendationsServiceHostName>部分替换为Elastic Load Balancer的主机名称,用于在示例应用程序部署当中实现Recommendations服务。
  • Recommendations服务将为不同的个性化功能提供相应资源。我们可以通过/recommendations路径访问用户推荐资源。
  • 接下来是查询字符串参数。用户通过userID参数进行身份验证,而{{${user_id}}}表达式则用于指示Braze在每次服务调用中插入用户ID。
  • 最后两项查询字符串参数为fullyQualifyImageUrls=1与numResults=4,用于告知Recommendations服务必须保证商品图像URL正确可用,从而顺利显示在用户的电子邮件客户端当中。另外在本示例中,应仅返回前四条推荐商品。
  • :save result表达式用于告知Braze将来自Recommendations服务的JSON响应分配至名为result的模板变量。在响应保存完成后,我们可以使用模板中其余部分的Liquid标签访问该响应中的各项元素。

以下代码所示,为来自Recommendations服务的响应格式:

[
 {
 "product": {
 "id": "2",
 "url": "http://recs.cloudfront.net/#/product/2",
 "sk": "",
 "name": "Striped Shirt",
 "category": "apparel",
 "style": "shirt",
 "description": "A classic look for the summer season.",
 "price": 9.99,
 "image": "http://recs.cloudfront.net/images/apparel/1.jpg",
 "featured": "true"
 }
 },
 {
 "product": {
 "id": "1",
 "url": "http://recs.cloudfront.net/#/product/1",
 "sk": "",
 "name": "Black Leather Backpack",
 "category": "accessories",
 "style": "bag",
 "description": "Our handmade leather backpack will look great at the office or out on the town.",
 "price": 109.99,
 "image": "http://recs.cloudfront.net/images/accessories/1.jpg",
 "featured": "true"
 }
 },
 ...
]

为了简便起见,以上代码仅显示前两款推荐商品。我们可以在Braze消息模板中使用多条商品属性以代表各项建议。要访问其中的数组或列表中的特定元素,则可在Liquid标签中使用数组下标符号。例如,以下标签会在响应当中插入第一款推荐商品的产品名称。对应之前的示例响应,标签解析后对应“Striped Shirt”:

{{result[0].product.name}}

在将来自Recommendations服务的个性化推荐响应信息与Liquid标签相结合之后,我们即可根据需求设计出无数种消息构建方式。以下代码所示,为在HTML电子邮件模板当中显示推荐商品。

<table>
 <tr>
 <td>
 <a href="{{result[0].product.url}}" target="_blank">
 <img data-original="{{result[0].product.image}}" width="200" alt="{{result[0].product.name}}" />
 </a>
 </td>
 <td>
 <h2>{{result[0].product.name}}</h2>
 <p>{{result[0].product.description}}</p>
 <p>Only <strong>$ {{result[0].product.price}}</strong>!</p>
 <a class="button" href="{{result[0].product.url}}">Buy Now</a>
 </td>
 </tr>
</table>

批量集成

批量集成架构使用Amazon Personalize批量推荐作业代替Braze Connected Content功能,专门负责将属性更新推送至Braze。批量推荐需要在Amazon Simple Storage Service (Amazon S3)存储桶内创建文件,其中包含作为推荐对象的用户。接下来,引用此文件以将作业提交至Amazon Personalize,由后者为文件内的各用户生成推荐,并将结果输出至选定的另一个Amazon S3文件处。我们可以使用批量推荐作业的输出结果,将个性化推荐与Braze中的用户个人资料共同关联为自定义属性。如此一来,我们在前一种架构的消息模板中看到的Liquid标签,将在这种架构内调整为通过用户个人资料(而非Connected Content响应)访问作为自定义属性的推荐结果。

如前所述,大家在使用批处理方法时需要做出权衡,即通过牺牲实时推荐的新鲜度,以换取更具成本效益的解决方案。由于批量推荐不需要Amazon Personalize中的campaign作为支持,也就消除了各用户由Connected Content发往campaign的额外请求。对于体量庞大且包含众多细分受众类型的Braze campaign,这种方式能够大大减少请求总量。此外,如果不需要针对其他用途使用Amazon Personalize campaigns,或者打算创建专门用于邮件个性化的Amazon Personalize解决方案,也可以完全不创建任何campaign。

下图所示,为设计这套批处理架构的一种可行方法。我们仍然可以在这里使用实时架构中的某些Web应用程序组件;但为了简洁起见,我们排除掉了所有与实时架构相重复的组件。

image

我们可以使用Amazon CloudWatch Events定期触发AWS Lambda函数,由此函数为Amazon Personalize批量推荐作业构建输入文件。批量推荐作业完成之后,将由另一项Lambda函数处理输出文件,使用丰富的商品信息进一步充实推荐条目,并在Amazon Kinesis Data Streams当中建立用户更新事件队列。最后,通过另一项新的Lambda函数使用流事件,并使用Braze User API更新用户个人资料。

使用Kinesis数据流将带来一系列重要助益,包括将批处理作业与事务性Braze用户更新流程解耦开来,同时提供对用户更新事件的暂停、重新启动与重放等功能。

实时集成演练

大家可以通过Retail Demo Store示例电子商务应用体验如何实现实时集成。在本文中,我们将分步引导大家完成在AWS账户部署此项目的具体流程,并阐述如何启动应用程序当中绑定的自助式Braze研习课程。

具体操作步骤如下:

  • 使用其中提供的AWS CloudFormation模板,将Retail Demo Store项目部署至AWS账户(需要25到30分钟)。
  • 构建Amazon Personalize解决方案,以及用于提供个性化推荐的campaigns(需要2小时)。
  • 将用户导入Braze,并使用Connected Content构建一项Braze campaign,借此从Amazon Personalize中检索个性化推荐内容(需要1小时)。
  • 清理资源。

先决条件

在本演练中,大家需要满足以下先决条件:

  • 一个AWS账户
  • AWS账户中须包含一个用户,且具备部署项目所需要的各项权限
  • 一个Braze账户

如果还没有Braze账户,请联系Braze客户代表。此外,大家还至少需要完成Braze LAB的入门课程

步骤1:将Retail Demo Store部署至AWS账户

通过下表,我们应在选定的区域当中选择Launch Stack。这里提供的区域列表并不代表一定能够在其中部署项目,仅代表示例部署中对应的各个区域。

区域启动
美国东部(北弗吉尼亚州)Launch Stack
美国西部(俄勒冈州)Launch Stack
欧洲(爱尔兰)Launch Stack

接受模板中的各项默认参数值,而后启动模板。项目的资源部署大约需要25到30分钟。

步骤2:构建Amazon Personalize campaigns

在提供个性化产品推荐之前,首先需要训练ML模型并在Amazon Personalize中配置推荐内容检索所需要的推理端点。步骤1中部署的CloudFormation模板中包含一个Amazon SageMaker notebook实例,该实例为Jupyter notebook提供了详尽的分步操作说明。Notebook的构建大约需要2个小时才能完成。

  • 登录至在步骤1中用于部署CloudFormation模板的AWS账户。
  • 在Amazon SageMaker控制台上,选择Notebook instances
  • 如果还没有看到RetailDemoStore Notebook实例,请保证确实处于项目部署所在的同一区域内。
  • 要访问该Notebook实例,请选择Open Jupyter或者Open JupyterLab。
  • 在为Notebook实例加载Jupyter Web界面后,选择workshop/1-Personalization/1.1-Personalize.ipynb。

各Notebooks将以目录的形式进行结构组织,因此可能需要选择Workshop文件夹才能查看Notebook中的各子目录。

  • 在打开1.1-Personalize Notebook后,阅读并运行各个单元以爱步完成研习流程。

我们也可以从Jupyter工具栏中选择Run,以依次运行各单元中的代码。

image

步骤3:由Braze发出个性化消息

通过使用Amazon Personalize解决方案与campaigns生成个性化推荐。现在,我们可以将各用户导入自己的Braze账户,构建使用Braze Connected Content对Amazon Personalize推荐内容进行检索的消息传递模板,而后构建一项Braze campaign以将目标电子邮件发送给用户。

与步骤1中的个性化研习课程类似,Braze消息传递研习课程也将逐步引导您完成整个流程。此Notebook大约需要1个小时才能运行完成。

  • 如有必要,请重复步骤1中的操作,通过Retail Demo Store部署中的Amazon SageMaker Notebook实例打开Jupyter或者JupyterLab浏览器窗口。
  • 在Notebook实例加载Jupyter Web界面后,选择workshop/4-Messaging/4.2-Braze.ipynb Notebook。

与之前一样,我们可能需要选择Workshop文件夹以查看Notebook下的各子目录。

  • 打开4.2-Braze Notebook后,通过阅读并运行各个单元以分步完成研习流程。

image

步骤4:资源清理

为避免产生不必要的费用,请删除Retail Demo Store项目中的各类资源,具体方法为删除我们在部署期间使用的CloudFormation模板。关于本文中所使用的源代码以及完整Retail Demo Store项目的更多详细信息,请参阅GitHub repo

总结

时至今日,营销人员正通过各类消息力争吸引到客户的注意力,这也意味着大家必须能够在正确的时间、以正确的渠道将正确的消息传递给明确定位的正确用户。Braze为前三项难题提供解决方案,而大家也可以将Braze Connected Content与Amazon Personalize集成起来以攻克最后一个挑战,真正整理出能够反映每一位客户当前偏好、具有高度个性化的产品与内容建议。

image

查看原文

赞 3 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 2020-12-30

机器人客服你见得多了,不过高可用的机器人你会造吗?

image

不知道从什么时候开始,当我们联系一些企业的客服时,越来越多的联系和支持工作都开始由AI机器人程序代为完成了。无论是电话下单,查询订单状态,咨询业务问题,或者其他什么类型的求助,这些机器人通常都能很好地完成,而一些比较「黑科技」的机器人,甚至在成功解决问题之后,我们都无法判断电话那头的到底是人还是程序……

就是因为效果太好,很多企业甚至已经开始主要通过这种方式向用户提供服务,甚至开始缩减人工客服的岗位。那么这就可能产生一个问题:如果机器人客服的程序挂了,你的客户该由谁来提供服务?

如果你的智能客服是基于Amazon Lex构建的,那么可以考虑创建高可用性的多区域机器人,这样就算一个区域的机器人故障,也可以自动交由其他区域来接待客户,从根本上解决这种问题。

众多AWS客户已经开始利用Amazon Lex机器人在电话及其他多种渠道上增强Amazon Connect自助服务的对话体验。借助Amazon Lex,呼叫方(用Amazon Connect术语描述,即客户)能够快速获取问题的答案,几乎不需要人工客服的介入。但这同时也给服务可用性提出了更高的要求,因此引发了新的问题:我们该使用哪种架构模式提升机器人可用性?在本文中,我们将探讨一种跨区域方法,通过在多个区域中部署Amazon Lex机器人以提高服务可用性。

架构概述

在这套解决方案中,一旦Amazon Lex出现服务可用性问题,Amazon Connect流能够将中断影响控制在最低程度,借此实现业务连续性。此架构模式使用以下组件:

  • 两个Amazon Lex机器人,各自处于不同的区域内。
  • 两个机器人由负责区域检查的AWS Lambda函数进行触发,并集成至Amazon Connect流内。
  • 用于检查机器人运行状况的Lambda函数。
  • 为Amazon Connect区域中的主机器人创建一套Amazon DynamoDB表,并通过Lambda函数进行读取。
  • 使用DynamoDB表保存Amazon Connect与Amazon Lex之间的区域映射。由之前提到的运行状态检查函数负责更新此表。区域检查函数读取此表,以获取Amazon Connect与Amazon Lex的最新主区域映射。

之所以要在两个区域内设置完成相同的Amazon Lex机器人,是为了能够随时在辅助区域中启动该机器人,进而在主区域发生故障时及时替换。
image

Amazon Lex的多区域模式

随后的两节,主要描述集成有Amazon Lex机器人的Amazon Connect流如何在主区域发生服务故障或中断的情况下,快速实现恢复并使用辅助区域内的Amazon Lex正常响应客户呼叫。

运行状况检查函数将根据TEST_METHOD Lambda环境变量对两个Amazon Lex运行时API之一进行调用(PutSession或PostText)。我们可以根据自己的喜好及用例要求选择其中一个。PutSession API调用不会产生任何额外的Amazon Lex关联费用,但无法测试Amazon Lex提供的自然语言理解(NLU)功能。PostTextAPI则允许我们检查Amazon Lex的NLU功能,且额外成本不高。

运行状况检查函数会将通过测试的区域名称,更新至DynamoDB表(lexDR)中的lexRegion列。如果主区域正常通过运行状况检查,则lexRegion将被更新为主区域名称。如果运行状况检查失败,则该函数将基于辅助区域内的TEST_METHOD环境变量向相应的运行时API发出调用。如果测试成功,则DynamoDB表中的lexRegion列将被更新为辅助区域;如果测试仍然失败,则更新为err,代表两个区域皆已发生服务中断。

在Amazon Connect收到的每项呼叫中,都会发出区域运行状况检测函数调用,借此获取当前Amazon Connect区域中的活动Amazon Lex区域。由区域运行状况检查函数返回的主区域将作为最新条目,由该检查函数写入至DyanmoDB表。由区域检查函数返回的可用区域内Amazon Lex机器人,将通过Get Customer Input Block配置接受Amazon Connect的调用。如果函数返回的是辅助区域,则Amazon Connect将调用辅助区域中的机器人。

部署Amazon Lex机器人

大家需要在主区域与辅助区域中创建相同的对话机器人。在本文中,我们将us-east-1作为主区域,us-west-2作为辅助区域。接下来,先使用主区域us-east-1创建机器人:

  • 在Amazon Lex控制台上点击Create。
  • 在Try a Sample部分,选择OrderFlowers,而后在COPPA中选择No。
  • 其他设置项皆保留默认值,点击Create。
  • 此机器人的创建与构建操作将自动进行。
  • 在机器人构建完成(约需1至2分钟)后,选择Publish。
  • 创建一个别名,名称为ver_one。

对us-west-2区域重复上述步骤。现在,我们已经在us-east-1与us-west-2中建立起能够正常运行的Amazon Lex机器人。

创建DynamoDB

请确保当前处于us-east-1区域内。

  • 在DynamoDB控制台选择Create。
  • 在Table name部分,输入lexDR。
  • 在Primary key部分,输入connectRegion且类型为String。
  • 其他各项保留默认值,而后选择Create。
  • 在Items选项卡中,选择Create item。
  • 将connectRegion的值设置为us-east-1,而后Append一个类型为String、名称为lexRegion的新列,并将其值设置为us-east-1。

image

  • 点击Save。

image

为Lambda函数创建IAM角色

在此步骤中,我们将为两项Lambda函数创建一个AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色。

  • 在IAM控制台上,点击Access management并选择Policies。
  • 点击Create Policy。
  • 点击JSON。
  • 粘贴以下自定义IAM策略,此策略允许对DynamoDB表lexDR进行读取/写入访问。请将策略中的“xxxxxxxxxxxx”部分替换为我们的AWS账户编号。
{
 "Version": "2012-10-17",
 "Statement": [{
 "Sid": "VisualEditor0",
 "Effect": "Allow",
 "Action": ["dynamodb:GetItem", "dynamodb:UpdateItem"],
 "Resource": "arn:aws:dynamodb:us-east-1:xxxxxxxxxxxx:table/lexDR"
 }]
}
  • 点击Review Policy。
  • 将其命名为DynamoDBReadWrite,而后点击Create Policy。
  • 在IAM控制台上,点击Access management下的Roles,而后点击Create Role。
  • 为该服务选择Lambda,而后点击Next。
  • 附加以下权限策略:

    • AWSLambdaBasicExecutionRole
    • AmazonLexRunBotsOnly
    • DynamoDBReadWrite
  • 点击Next: Tags。接下来点击Next: Review以跳过Tags页面。
  • 将角色命名为lexDRRole,而后点击Save。

部署区域检查函数

我们首先需要创建一项Lambda函数,用于从DynamoDB表中读取记录,借此判断哪个Amazon Lex机器人与Amazon Connect实例处于同一区域当中。Amazon Connect或者使用此机器人的应用程序后续将调用此函数。

  • 在Lambda控制台上,选择Create function。
  • 在Function name部分,输入lexDRGetRegion。
  • 在Runtime部分,选择Python 3.8。
  • 在Permissions之下,选择Use an existing role。
  • 选择角色lexDRRole。
  • 选择Create function。
  • 在Lambda代码编辑器中,输入以下代码(下载自lexDRGetRegion.zip):
import json
import boto3
import os
import logging
dynamo_client=boto3.client('dynamodb')
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def getCurrentPrimaryRegion(key):
 result = dynamo_client.get_item(
 TableName=os.environ['TABLE_NAME'],
 Key = {
 "connectRegion": {"S": key }
 }
 )
 logger.debug(result['Item']['lexRegion']['S'] )
 return result['Item']['lexRegion']['S']
def lambda_handler(event, context):
 logger.debug(event)
 region = event["Details"]["Parameters"]["region"]
 return {
 'statusCode': 200,
 'primaryCode': getCurrentPrimaryRegion(region)
 }
  • 在Environment variables部分,选择Edit。
  • 添加一项环境变量,其中Key为TABLE_NAME,Value为lexDR。
  • 点击Save以保存该环境变量。
  • 点击Save以保存该Lambda函数。

image

部署运行状况检查函数

在us-east-1当中创建另一项Lambda函数,用以实现运行状况检查功能。

  • 在Lambda控制台上,选择Create function。
  • 在Function name部分,输入lexDRTest。
  • 在Runtime部分,选择Python 3.8。
  • 在Permissions之下,选择Use an existing role。
  • 选择lexDRRole。
  • 选择Create function。
  • 在Lambda代码编辑器中,输入以下代码(下载自lexDRTest.zip):
import json
import boto3
import sys
import os
dynamo_client = boto3.client('dynamodb')
primaryRegion = os.environ['PRIMARY_REGION']
secondaryRegion = os.environ['SECONDARY_REGION']
tableName = os.environ['TABLE_NAME']
primaryRegion_client = boto3.client('lex-runtime',region_name=primaryRegion)
secondaryRegion_client = boto3.client('lex-runtime',region_name=secondaryRegion)
def getCurrentPrimaryRegion():
 result = dynamo_client.get_item(
 TableName=tableName,
 Key={ 
 'connectRegion': {'S': primaryRegion} 
 }
 )
 return result['Item']['lexRegion']['S']
def updateTable(region):
 result = dynamo_client.update_item(
 TableName= tableName,
 Key={ 
 'connectRegion': {'S': primaryRegion }
 }, 
 UpdateExpression='set lexRegion = :region',
 ExpressionAttributeValues={
 ':region': {'S':region}
 }
 )
#SEND MESSAGE/PUT SESSION ENV VA
def put_session(botname, botalias, user, region):
 print(region,botname, botalias)
 client = primaryRegion_client
 if region == secondaryRegion:
 client = secondaryRegion_client
 try:
 response = client.put_session(botName=botname, botAlias=botalias, userId=user)
 if (response['ResponseMetadata'] and response['ResponseMetadata']['HTTPStatusCode'] and response['ResponseMetadata']['HTTPStatusCode'] != 200) or (not response['sessionId']): 
 return 501
 else:
 if getCurrentPrimaryRegion != region:
 updateTable(region)
 return 200
 except:
 print('ERROR: {}',sys.exc_info()[0])
 return 501
def send_message(botname, botalias, user, region):
 print(region,botname, botalias)
 client = primaryRegion_client
 if region == secondaryRegion:
 client = secondaryRegion_client
 try:
 message = os.environ['SAMPLE_UTTERANCE']
 expectedOutput = os.environ['EXPECTED_RESPONSE']
 response = client.post_text(botName=botname, botAlias=botalias, userId=user, inputText=message)
 if response['message']!=expectedOutput:
 print('ERROR: Expected_Response=Success, Response_Received='+response['message'])
 return 500
 else:
 if getCurrentPrimaryRegion != region:
 updateTable(region)
 return 200
 except:
 print('ERROR: {}',sys.exc_info()[0])
 return 501
def lambda_handler(event, context):
 print(event)
 botName = os.environ['BOTNAME']
 botAlias = os.environ['BOT_ALIAS']
 testUser = os.environ['TEST_USER']
 testMethod = os.environ['TEST_METHOD']
 if testMethod == 'send_message':
 primaryRegion_response = send_message(botName, botAlias, testUser, primaryRegion)
 else:
 primaryRegion_response = put_session(botName, botAlias, testUser, primaryRegion)
 if primaryRegion_response != 501:
 primaryRegion_client.delete_session(botName=botName, botAlias=botAlias, userId=testUser)
 if primaryRegion_response != 200:
 if testMethod == 'send_message':
 secondaryRegion_response = send_message(botName, botAlias, testUser, secondaryRegion)
 else:
 secondaryRegion_response = put_session(botName, botAlias, testUser, secondaryRegion)
 if secondaryRegion_response != 501:
 secondaryRegion_client.delete_session(botName=botName, botAlias=botAlias, userId=testUser)
 if secondaryRegion_response != 200:
 updateTable('err')
 #deleteSessions(botName, botAlias, testUser)
 return {'statusCode': 200,'body': 'Success'}
  • 在Environment variables部分,选择Edit,而后添加以下环境变量:

    • BOTNAME – OrderFlowers
    • BOT_ALIAS – ver_one
    • SAMPLE_UTTERANCE – I would like to order some flowers. (向机器人发送的示例话语。)
    • EXPECTED_RESPONSE – What type of flowers would you like to order? (机器人在收到以上示例话语后应做出的预期响应。)
    • PRIMARY_REGION – us-east-1
    • SECONDARY_REGION – us-west-2
    • TABLE_NAME – lexDR
    • TEST_METHOD – put_session或send_message

      • send_message:此方法将调用Lex运行时函数postText,该函数将提取语音并将其映射至训练得出的某一intent。postText将测试Lex的自然语言理解能力,每项请求的使用成本为0.00075美元,几乎可以忽略不计。
      • put_session:此方法将调用Lex运行时函数put_session,该函数为用户创建一个新的会话。put_session不会测试Lex的自然语言理解能力。
    • TEST_USER – test
  • 点击Save以保存此环境变量。
  • 在Basic Settings section当中,将Timeout的值更新为15秒。
  • 点击Save以保存此Lambda函数。

image

创建一条Amazon CloudWatch规则

为了每5分钟触发一次运行状况检查函数,我们需要创建一条Amazon CloudWatch规则。

  • 在CloudWatch控制台的Events之下,选择Rules。
  • 选择Create rule。
  • 在Event Source之下,将选项切换为Schedule。
  • 将Fixed rate of设置为5 minutes。
  • 在Targets之下,选择Add target。
  • 选择目标Lambda function。
  • 在Function部分,选择lexDRTest。
  • 在Configure input之下,选择Constant(JSON text),而后输入{}。
  • 选择Configure details。
  • 在Rule definition之下的Name部分,输入lexHealthCheckRule。
  • 选择Create rule。

现在,我们应该已经建立起lexHealthCheckRule CloudWatch规则,能够每5分钟调用一次lexDRTest函数。这项操作将检查主机器人的运行状况是否正常,并将结果对应更新至DynamoDB表。

创建Amazon Connect实例

随后我们需要创建一个Amazon Connect实例,借此在创建lexDRTest函数的同一区域之内测试机器人的多区域模式。

  • 如果还没有Amazon Connect实例,请首先创建一个
  • 在Amazon Connect控制台上,选择作为Amazon Connect传输流目标的实例别名。
  • 选择Contact flows。
  • 在Amazon Lex之下,从us-east-1区域中选择OrderFlowers机器人,而后点击Add Lex Bot。
  • 在us-west-2区域中选择OrderFlowers机器人,而后点击Add Lex Bot。

image

  • 在AWS Lambda之下,选择lexDRGetRegion并点击Add Lambda Function。
  • 点击左侧面板中的Overview再点击登录链接,借此登录至Amazon Connect实例。
  • 点击左侧面板中的Routing,而后点击下拉菜单中的Contact Flows。
  • 点击Create Contact Flow按钮。
  • 点击Save按钮旁的向下箭头按钮,再点击Import Flow。
  • 下载联系流程Flower DR Flow。在Import Flow对话框中上传此文件。

image

  • 在Contact Flow中,点击Inovke AWS Lambda Function部分,借此在屏幕右侧打开一个属性面板。
  • 选择lexDRGetRegion并点击Save。
  • 点击Publish按钮,发布当前联系流程。

将电话号码关联至联系流程

接下来,我们需要将电话号码关联至联系流程,借此调用并测试OrderFlowers机器人。

  • 点击左侧导航栏中的Routing选项。
  • 点击Phone Numbers。
  • 点击Claim Number。
  • 选择国家代码并选择电话号码。
  • 在Contact flow/IVR选择框中,选择我们在之前步骤中导入的联系流程Flower DR Flow。
  • 等待几分钟,而后呼叫该号码以与OrderFlowers机器人交互。

测试集成效果

要测试这套解决方案,可以执行以下操作以模拟us-east-1区域发生故障的场景:

  • 在us-east-1区域中打开Amazon Lex控制台。
  • 选择OrderFlowers机器人。
  • 点击Settings。
  • 删除机器人别名ver_one。

在下一次进行运行状况检查时,解决方案将尝试与us-east-1区域的Lex机器人进行通信。由于机器人别名不存在,因此无法获得成功响应。因此,本示例随后会呼叫辅助区域us-west-2并收到成功响应。在收到响应后,示例将使用us-west-2更新lexDR以及DynamoDB表中的lexRegion列。

接下来,所有指向us-east-1区域内Connect的后续呼叫都将与us-west-2区域内的Lex机器人进行实际交互。通过这一自动切换,可以证明当前架构模式确实能够在发生服务故障时保障业务连续性。

在删除机器人别名到下一次运行状况检查之间的时段内,对Amazon Connect的呼叫都将失败。但在运行状况检查之后,系统将自动实现业务连续性保障。因此,每一轮运行状况检查之间的间隔越短,则停机时间越短。我们可以通过编辑Amazon CloudWatch规则lexHealthCheckRule以调整每次运行状况检查之间的间隔时长。

要让us-east-1区域再次通过运行状况检查,请在us-east-1中重新创建OrderFlowers机器人的别名ver_one。

资源清理

为了避免产生不必要的额外成本,请删除本示例中创建的所有资源。

  • 创建在us-east-1与us-west-2当中的Amazon Lex机器人OrderFlowers
  • CloudWatch规则lexHealthCheckRule
  • DynamoDB表lexDR
  • Lambda函数lexDRTest与lexDRGetRegion
  • IAM角色lexDRRole
  • 联系流程Flower DR Flow

总结

配合Amazon Lex提供的自助服务,Amazon Connect将帮助我们轻松创建便捷直观的客户服务体验。本文提供一种跨区域形式的高可用性实现方法,保证能够在某一区域中的机器人或支持实现API不可用时,使用来自其他区域的资源以继续响应客户呼叫。

image

查看原文

赞 6 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 2020-12-28

在SageMaker上玩转R环境,这些必会技巧你知道几个?

image
很多童鞋可能已经知道,Amazon SageMaker已经在全球各服务区域预装R内核。此项功能开箱即用,同时预安装有reticulate库。该库负责为Amazon SageMaker Python SDK提供R接口,允许大家直接从R脚本中调用Python模块。之前我们曾经发布过一篇文章介绍这件事,欢迎点击这里回顾。

如果你想进一步将这个功能发挥出更多价值,那么本文就值得关注了。

下文,我们将介绍如何在Amazon SageMaker内置的R内核之上创建自定义R环境(内核),以及如何在会话之间实现环境持久化。此外还将介绍如何在R环境中安装新的软件包,如何在Amazon Simple Storage Service(Amazon S3)上保存这套新环境,以及如何使用它通过Amazon SageMaker生命周期配置创建新的Amazon SageMaker实例。本文也提供相应bash脚本,供大家在创建或启动Amazon SageMaker notebook实例时配置生命周期。

背景介绍

Amazon SageMaker中的R内核以IRKernel软件包构建而成,该软件包将在Jupyter环境中安装名为ir且显示名称R的内核。

我们可以使用Conda管理这套环境,并安装特定的软件包与依赖项。但在默认情况下,从Notebook实例处安装的R内核无法持久至其他Notebooke实例的会话当中。每当启动及停止Amazon SageMaker实例时,R内核都会返回其默认环境。

本文将引导大家使用以下资源在Amazon SageMaker中安装R软件包:

  • Anaconda Cloud
  • CRAN
  • Github

在环境创建完成之后,我们可以将其保存在实例的Amazon Elastic Block Store(Amazon EBS)存储当中以实现持久化。我们也可以将该环境存储在Amazon S3上,并使用它为新的Amazon SageMaker实例构建自定义R环境。关于更多详细信息,请参阅使用生命周期配置脚本定制Notebook实例

创建一个基于R内核的Amazon SageMaker notebook实例

要创建一个基于R内核的Amazon SageMaker notebook实例,请完成以下操作步骤:

在打开新的Notebook后,我们将在Notebook区域的右上角看到R徽标。

关于创建基于R内核的Amazon SageMaker notebook实例的更多详细信息,请参阅在Amazon SageMaker notebook实例上使用R代码

在Amazon SageMaker的R内核中安装软件包

Amazon SageMaker R内核提供超过140种标准软件包。要获取已安装软件包的清单,可以在配合R内核的SageMaker notebook中运行以下脚本:

installed.packages()

如果需要安装其他软件包,则可以通过Anaconda Cloud、CRAN归档或者直接通过GitHub进行安装。

通过Anaconda Cloud安装

R软件包的首选安装方法,是从Anaconda Cloud存储库进行安装。我们可以通过这种方式访问不同的通道(例如R与Conda Forge),从而安装软件包的特定版本。如果使用R内核在Amazon SageMaker中执行此项操作,请使用system()命令以提交conda install命令。

如果是在Amazon SageMaker Jupyter bash终端上进行安装,则可使用conda install,如下所示:

conda install -n R -c conda-forge r-rjava

但在Amazon SageMaker中,请输入以下代码:

system("conda install -n R -c conda-forge r-rjava")

上述代码使用conda-forge通道,此通道负责安装rJava的0.9_12版本(截至本文发布之时)。但如果使用以下代码(使用r channel),则将安装0.9_11版本(截至本文发布之时):

system("conda install -n R -c r r-rjava")

要搜索特定软件包名称并为版本选择正确的通道,请访问Anaconda Cloud网站并搜索对应软件包。R软件包的命名格式为“r-<package_name>”。

image

Conda是安装软件包的首选方法,而Anaconda Cloud则凭借接入Conda环境最稳定版本的取向成为最佳归档选项。

通过CRAN归档安装

作为Anaconda的替代方案,大家也可以使用综合R归档网络(CRAN)归档完成安装。CRAN归档是一套由FTP与Web服务器组成的网络,分布于世界各地,其中保存有相同的R代码以及说明文档的最新版本。我们可以使用此归档文件通过install.packages()在R中安装软件包,以保证安装的是软件包的最新版本。具体参见以下代码:

install.packages(c('mlbench', 'MVar'),
 repo = 'http://cran.rstudio.com',
 dependencies = TRUE)

使用以下代码将该软件包导入R代码:

library(mlbench)

Amazon SageMaker实例使用Amazon Linux AMI,这是一套从CentOS演变而来的发行版,可用于在Amazon Elastic Compute Cloud(Amazon EC2)实例当中运行Amazon SageMaker。如果打算直接通过源代码安装软件包,请保证选择正确的操作系统。大家可以在Amazon SageMaker Jupyter bash终端中使用以下脚本检查操作系统:

sh-4.2$ cat /etc/os-release

输出结果如下所示(截至本文发布之时):

NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL=http://aws.amazon.com/amazon-linux-ami/

通过Github安装

我们还可以使用devtools与install_github直接从软件包开发者的库中获取内容。具体参见以下代码:

install.packages("devtools")
devtools::install_github("malcolmbarrett/ggdag")

上述代码将安装软件包及其依赖项。但请注意,我们不推荐将此作为Amazon SageMaker当中的首选软件包安装方法。

在不同会话间实现自定义R环境持久化

在默认情况下,每当我们停止及启动Amazon SageMaker实例时,Amazon SageMaker都会启动基础R内核。而在停止实例时,我们所安装的所有其他软件包都将丢失,且再次启动实例时又需要重新安装各软件包 —— 很明显,这种方式既费时又麻烦。解决方案是将环境保存在实例的EBS存储之上,并在启动时使用Amazon SageMaker生命周期配置脚本将EBS存储与自定义R内核相对接。更多信息请参阅使用生命周期配置脚本实现Notebook实例定制化

本节将概述实现自定义R环境持久化的各个操作步骤。

将环境保存在Amazon SageMaker EBS

首先需要通过环境克隆操作,将当前环境保存在实例的EBS存储之上。我们可以在Amazon Sagemaker Jupyter bash终端中运行以下脚本:

conda create --prefix /home/ec2-user/SageMaker/envs/custom-r --clone R

这将在我们有权访问的实例EBS上的Amazon SageMaker文件夹下创建一个envs/custom-r文件夹,具体参见以下截屏内容。

image

如果希望稍后在同一Amazon SageMaker实例(注意,并非在其他不同实例中)中使用这套自定义环境,则可跳过生命周期配置部分内容,直接前往本文中的使用自定义R环境启动实例部分。

在Amazon S3中保存环境以创建新的Amazon SageMaker实例

如果需要在创建Amazon SageMaker实例时重复使用同一套自定义R环境(例如在开发团队内部),可以将该环境以.zip文件形式保存至Amazon S3,并在Create步骤中将其下载至实例当中。我们可以在Amazon SageMaker Juypyter bash终端内运行以下脚本:

zip -r ~/SageMaker/custom_r.zip ~/SageMaker/envs/
aws s3 cp ~/SageMaker/custom_r.zip s3://[YOUR BUCKET]/

通过生命周期配置,使用自定义R环境创建新实例

要创建新实例,并在该实例中使用已有的自定义环境,需要将.zip环境从Amazon S3引入当前实例。我们可以使用生命周期配置脚本在Amazon SageMaker控制台上自动执行此项操作。该脚本将.zip文件从Amazon S3下载至实例EBS上的/SageMaker/文件夹当中、解压该文件、重新创建/envs/文件夹,而后删除冗余文件夹。

  • 在Amazon SageMaker控制台的Notebook之下,选择Lifecycle configurations。
  • 选择Create Configuration。
  • 将其命名为Custom-R-Env。
  • Create notebook选项卡中,输入以下脚本。
## On-Create: Bringing custom environment from S3 to SageMaker instance
## NOTE: Your SageMaker IAM role should have access to this bucket
#!/bin/bash 
sudo -u ec2-user -i <<'EOF'
aws s3 cp s3://[YOUR BUCKET]/custom_r.zip ~/SageMaker/
unzip ~/SageMaker/custom_r.zip -d ~/SageMaker/
mv ~/SageMaker/home/ec2-user/SageMaker/envs/ ~/SageMaker/envs
rm -rf ~/SageMaker/home/
rm ~/SageMaker/custom_r.zip
EOF

image

  • 点击Create Configuration。

通过生命周期配置,使用自定义R环境启动实例

无论是在同一实例中创建自定义R环境并将其克隆至./envs/文件夹,还是在创建实例时从Amazon S3上下载.zip文件,此步骤的具体操作都完全相同。

此脚本将在./evns/文件夹(其中包含自定义R环境)与Anaconda Custom-R-Env环境之间创建一个链接,从而在Amazon SageMaker内核中列出该环境。

  • 在Amazon SageMaker控制台的Notebook下,选择Lifecycle configurations。
  • 选择Create Configuration。
  • 将其命名为Custom-R-Env(如果已经在之前的步骤中创建了该配置,则可直接从列表中选定配置并选择Edit)。
  • 在Start notebook选项卡上,输入以下脚本:
## On-Start: After you set up the environment in the instance
## then you can have this life-cycle config to link the custom env with kernel
#!/bin/bash 
sudo -u ec2-user -i <<'EOF' 
ln -s /home/ec2-user/SageMaker/envs/custom-r /home/ec2-user/anaconda3/envs/custom-r
EOF
echo "Restarting the Jupyter server..."
restart jupyter-server

image

  • 点击Create Configuration(如果要编辑现有配置,则点击Update)。

将生命周期配置指定给Amazon SageMaker实例

在创建Notebook实例时,我们可以为其指定生命周期配置。关于更多详细信息,请参阅使用生命周期配置脚本定制Notebook实例

要使用生命周期配置(Custom-R-Env)创建一个Notebook,需要在Additional Configuration部分将该脚本指定给当前Notebook。其他操作步骤与创建常规Amazon SageMaker实例相同。

image

使用自定义R环境

在打开创建该自定义环境的现有实例时,我们会看到各相关文件、代码以及/envs/文件夹已经存在。

但如果创建了一个新实例,并使用生命周期脚本从Amazon S3处提取该环境,则需要完成以下操作步骤:

  • 当实例状态显示为In Service时,打开Jupyter,可以看到Amazon SageMaker文件中存在一个/envs/文件夹,这就是我们的自定义环境。
  • 在New下拉菜单当中,选择conda_r_custom-r。

image

现在,我们已经拥有一个包含自定义R环境的Notebook。在此Notebook中,我们会在Jupyter环境的右上角看到R徽标,这代表当前内核为R内核,内核名称应为conda_r_custom-r。要测试这套环境,请导入自定义环境中包含的某一套库(例如rJava)。

image

现在,我们的自定义R环境已经启动并在实例中正常运行,可以使用reticulate软件包在R中进行编程了。

结论

本文引导大家为Amazon SageMaker notebook实例创建自定义持久R环境。关于Amazon SageMaker上的R notebook,请参阅Amazon SageMaker示例GitHub repo。关于创建基于R内核的Amazon SageMaker notebook实例的更多详细信息,请参考在Amazon SageMaker notebook实例上使用R代码博文。关于如何通过R使用Amazon SageMaker更多功能的详细信息,请访问Amazon SageMaker R用户指南。此外,大家可以参考AWS机器学习博客获取关于Amazon SageMaker的更多专业扩展资源。

image

查看原文

赞 8 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 2020-12-25

海外客户发来的文档到底在说啥?不懂就问,Amazon Translate告诉你答案

image

又到了年底节假日扎堆的时节,首先祝大家各种节日快乐~

很多业务出海的企业日常可能会遇到一个比较麻烦的问题:和海外客户或合作伙伴交流,总会因为语言的隔阂造成很多不便。虽然网上有很多免费的文本甚至Office文档翻译服务,但平时随便用用也就罢了,真要涉及工作中一些机密文档,谁能放心让这些外部服务来翻译!请专职或兼职翻译吧,虽然效果很好,但速度往往很慢,还得公司「不差钱」才行……

别头疼了,你应该知道,AWS云就提供了一个名为Amazon Translate的机器翻译服务,支持全球各大主要语言的双向互译,效果也许不如人工翻译那么好,但胜在速度够快,如果只是希望了解外文资料的大致意思,用这样的服务已经足矣满足大部分场景的需求。

除了把一种语言的文字内容复制粘贴到Amazon Translate中并翻译为指定的语言外,最近更新之后的Amazon Translate也开始支持对DOCX、PPTX以及XLSX格式的Office Open XML文档进行翻译。作为一种全托管神经机器翻译服务,Amazon Translate能够高质量地以合理价格提供多达55种语言翻译服务。关于所支持语言的完整列表,请参见受支持的语言与语言代码。支持批量翻译的AWS区域,同时也支持文档翻译。请参阅异步批处理查看更多信息。

在本文中,我们将逐步了解如何在AWS管理控制台上翻译文档。大家也可以通过AWS命令行界面(AWS CLI)或者AWS SDK访问Amazon Translate BatchTranslation API进行文档翻译。

解决方案概述

本文将引导大家完成以下步骤:

创建IAM角色以访问S3存储桶

在本文中,我们创建一个能够访问账户中所有S3存储桶的角色,用于翻译文档、电子表格以及演示文稿。我们将该角色提供给Amazon Translate,确保其能够访问S3输入与输出位置。关于更多信息,请参阅AWS身份与访问管理说明文档

  • 登录至个人AWS账户。
  • 在IAM控制台的Access management之下,选择Roles。
  • 选择Create role。

image

  • 选择Another AWS account。
  • 在Account ID部分,输入ID。

image

  • 前往下一页面。
  • 在Filter policies部分,搜索并添加AmazonS3FullAccess策略。

image

  • 前往下一页面。
  • 为角色输入一个名称,例如TranslateBatchAPI。
  • 查看刚刚创建完成的角色。
  • 在Trust relationships选项卡中,选择Edit trust relationship。

image

  • 输入以下服务主体:
"Service": [
"translate.aws.internal",
"translate.amazonaws.com"
],

具体示例,详见以下截屏:
image

对文档排序

Amazon Translate批量翻译适用于存储在S3存储桶内文件夹中的各类文档。如果直接将文件保存在S3存储桶的根目录中,则批量翻译将无法工作。批量翻译也不支持翻译嵌套文件。因此,我们首先需要将待翻译文档上传至S3存储桶的一个文件夹内,而后对文档进行排序,使当前文件夹内只包含相同类型(DOCX、PPTX、XLSX)相同语言的文件。如果需要翻译多个包含不同文件类型的文档,请对文档进行排序,保证每个Amazon S3前缀只有相同语言的同一种文档格式。

  • 在Amazon S3控制台上,选择Create bucket。
  • 执行下列步骤创建存储桶。

image

在本文中,我们创建两个存储桶,分别为:input-translate-bucket与output-translate-bucket。
image

这些存储桶中分别包含以下文件类型的文件夹:

  • docx
  • pptx
  • xlsx

image

执行批量翻译

要执行批量翻译,请完成以下步骤:

image

在本文中,我们翻译DOCX格式的文档。

  • 在Name部分,输入BatchTranslation。
  • 在Source language部分,选择En。
  • 在Target language部分,选择Es。
  • 在Input S3 location部分,输入s3://input-translate-bucket/docx/。
  • 在File format部分,选择docx。
  • 在Output S3 location部分,输入s3://output-translate-bucket/。
  • 在Access permissions部分,选择Use an existing IAM role。
  • 在IAM role部分,输入TranslateBatchAPI。

由于这里执行的是异步翻译,因此实际翻译操作要等待机器资源分配完成之后才会正式开始,此过程最多可能需要15分钟。关于执行批量翻译作业的更多信息,请参阅启动批量翻译作业

以下截屏是BatchTranslation作业的详细信息。
image

在翻译完成之后,我们可以在S3存储桶的文件夹内找到输出结果,参见以下截屏。
image

总结

在本文中,我们探讨了如何通过异步批量翻译对DOCX格式的文档进行翻译。关于翻译电子表格与演示文稿,其过程与翻译DOCX文件相同。AWS提供的翻译服务Amazon Translate使用简单,且只需要根据翻译的每种格式的文档中的字符数(包含空格)进行付费。我们现在可以在支持批量翻译的所有区域内翻译Office文档。如果还不熟悉Amazon Translate,不妨先从Free Tier免费套餐起步。此套餐将从提交的第一项翻译请求开始,在随后的12个月内每月提供2百万个字符的免费翻译配额。

image

查看原文

赞 5 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 2020-12-23

年底忙着整发票的财务人员,这个好东西你可一定要试试

image

临近年底大家都忙,而公司的财务人员尤为忙碌。各种工作需要处理,尤其是发票相关的那些。虽然很多地方已经可以提供电子版发票,但纸质发票在很多时候依然是唯一的选择。如果只是整理在一起进行归档,那还好说;但如果你需要从一大堆纸质发票中找出某些信息,这时候该怎么办?

===

各行各业的组织都需要处理大量纸质文件,其中又以发票类票据居多。以往,对于包含表格、表单、段落以及复选框的各类扫描文档,我们往往很难从中提取出有效信息。虽然目前不少组织已经通过人工、自定义代码或者光学字符识别(OCR)等技术解决了信息提取难题,但其中仍然需要借助完善的表单提取与自定义工作流模板。

此外,在从文档中提取到文本或其他形式的内容之后,用户还希望从收据或发票中帮助最终用户整理出更多深层洞见。但这又需要构建起复杂的自然语言处理(NLP)模型,模型的训练又要占用大量训练数据与计算资源。机器学习模型的构建与训练往往既昂贵、又极为耗时。

并且对于最终用户来说,提供类似于人的界面来与这些文档交互是很麻烦的。虽然最终用户可以通过给服务台打电话的方式得到不少帮助,但随着时间的推移,组织成本总会因此而不断提升。

本文将向大家介绍如何使用AWS AI服务自动实现文本数据处理与洞见发现。借助AWS AI服务(包括Amazon TextractAmazon Comprehend以及Amazon Lex),我们可以设置自动化无服务器解决方案以满足上述要求。我们将分步引导您完成以下操作流程:

  • 使用Amazon Textract从收据或发票扫描件(PDF或图片格式)中提取文本。
  • 通过Amazon Comprehend得出洞见。
  • 使用Amazon Lex以自然语言形式实现与这些洞见的交互。

接下来,我们将介绍用于构建这样一套解决方案的具体服务与架构选项。

相关服务

这套解决方案将使用以下AI服务、无服务器技术以及托管服务建立起一套可扩展且具备成本效益的架构:

  • Amazon Cognito—— 帮助我们快速在Web与移动应用中添加用户注册、登录与访问控制等功能。
  • AWS Lambda—— 执行代码以响应触发器,执行数据更改、系统状态变化或用户操作等。由于Amazon S3能够直接触发Lambda函数,因此我们可以借此构建起各类实时无服务器数据处理系统。
  • Amazon Lex—— 提供用于创建会话式聊天机器人的接口。
  • Amazon Comprehend——NLP服务,使用机器学习技术从文本中提取洞见与关系。
  • Amazon Textract—— 使用机器学习技术从PDF、JPEG或者PNG格式的扫描文档中提取文本与数据。
  • Amazon Simple Storage Service(Amazon S3)—— 为文档提供对象存储支持,并允许用户通过细粒度访问控制机制实现集中管理。

架构

下图所示,为这套解决方案的基本架构。
image

此架构包含以下操作步骤:

  • 后端用户或管理员使用AWS管理控制台或AWS命令行界面(AWS CLI)将PDF文档或图像上传至S3存储桶。
  • Amazon S3上传动作触发AWS Lambda函数。
  • Lambda函数调用Amazon Textract StartDocumentTextDetection API,后者设置一项异步作业以检测上传的PDF中的文本内容。
  • 当文本处理完毕之后,Amazon Textract向Amazon Simple Notification Service(Amazon SNS)发出通知。
  • 当作业完成文本检测任务之后,由另一项Lambda函数从SNS主题处获取通知。
  • 当Lambda收到Amazon SNS发来的作业完成通知后,调用Amazon Textract GetDocumentTextDetection API以接收异步操作结果,并将结果加载至S3存储桶内。
  • 使用Amazon Lex完成意图整理与分析,我们还需要使用另外一项Lambda函数。关于更详尽的交互序列,请参阅「使用CloudFormation部署架构」部分中的「构建聊天机器人」内容。
  • Amazon Comprehend使用机器学习技术从文本中提取洞见与关系。Lambda函数使用由Amazon Comprehend提供的boto3 API执行实体与关键短语检测。

    *在聊天机器人显示欢迎致辞之后,用户输入「Show me the invoice summary(显示发票摘要)」即可调用GetInvoiceSummary Lex意图,并由Lambda函数调用Amazon Comprehend DetectEntities API以检测要实现的实体。

    *当用户输入「Get me the invoice details(获取发票明细)」时,即可调用GetInvoiceDetails意图,Amazon Lex会提示用户输入发票编号,并由Lambda函数调用Amazon Comprehend DetectEntities API以返回发票的详细信息。

    *在用户输入「Can you show me the invoice notes for <invoice number>(能否显示〈发票编号〉发票注释)」时,即可调用GetInvoiceNotes意图,由Lambda函数调用Amazon Comprehend DetectKeyPhrases API以返回与发票相关的注释内容。

    *使用现有CloudFormation栈作为嵌套栈,大家可以将Lexbot Web UI部署在AWS CloudFormation模板中。要下载该栈,请参阅为聊天机器人部署Web UI。该嵌套栈将部署一套Lex Web UI,并将此网页作为S3存储桶的静态网站。Web UI使用Amazon Cognito生成用于身份验证的访问令牌,并使用AWS CodeStar设置交付管道。最终用户将通过Web UI与该聊天机器人进行交互。

使用AWS CloudFormation部署此架构

我们需要部署一套CloudFormation模板,用于置备必要的AWS身份与访问管理(AWS Indentity and Access Management,简称IAM)角色、服务,并提供解决方案所必需的Amazon S3、Lambda、Amazon Textract、Amazon Comprehend以及Amazon Lex聊天机器人等组件。

  • 在美国东部(北弗吉尼亚州)区域启动以下CloudFormation模板:
  • 请不要修改栈名称或者参数botname InvoiceBot。
  • 在Capabilities and transforms部分,勾选全部三个复选项,确认由AWS CloudFormation创建IAM资源并扩展模板。

image

关于上述资源的更多详细信息,请参阅AWS IAM资源

此模板使用AWS无服务器应用程序模式(AWS Serverless Application Model,AWS SAM)以简化面向无服务器应用程序的函数与API定义流程,同时为各项服务提供环境变量等功能支持。

  • 选择Create stack。

image

以下截屏所示,为Stack Detail页面中显示的栈状态,目前为CREATE_IN_PROGRESS。在20分钟之内,该状态将转换为CREATE_COMPLETE,代表栈创建完成。
image

  • 在Outputs选项卡中,复制LexLambaFunctionArn、AssetsUploadBucket、ExtractedTextfilesBucket以及LexUIWebAppUrl的值。

image
将文档上传至S3存储桶

要将文档上传至新的S3存储桶,请选择与之前复制的AssetsUploadBucket相对应的S3存储桶URL。上传PDF或图像,即可开始文本提取流程。

我们也可以从GitHub repo下载本文中使用的发票数据,并将其上传至AssetsUploadBucket S3 URL。建议在发票模板中使用自定义解决方案。关于上传文件的更多详细信息,请参阅如何向S3存储桶上传文件与文件夹?

在上传完成之后,可以在Amazon S3控制台的Overview选项卡中看到该文件。
image
在文件上传完毕后,即可开始文档文本提取流程。要查看待提取的文档,请打开存储桶并选择之前复制的URL。

image
在Overview选项卡中,可以下载该文件并检查内容,审核其是否与上传的文档完全相同。
image

构建聊天机器人

我们将使用以下会话对机器人进行建模:

Bot: Welcome to InvoiceBot. You can ask me to provide your invoice summary, or details of your invoices, or your invoice notes__(欢迎访问InvoiceBot__。您可以要求我提供发票摘要、发票明细或发票注释)

用户:Show me the invoice summary(显示发票摘要)

Bot: I reviewed your input documents and found 1 invoice with invoice numbers 35678-9 totaling $2100.0. I can get you invoice details or invoice notes. Simply type your request__(我检查了您的输入文件,发现其中包含1__张发票,发票编号为35678-9__,金额总计2100__美元。我可以为您提供发票详细信息或发票注释。请输入您的要求)

用户:Get me the invoice details(获取发票明细)
Bot: Please enter the invoice number__(请输入发票编号)
用户:35678-9

Bot: Invoice Details for 35678-9: On 5/10/2019 for the item One there is a charge of 1500.00. On 5/11/2019 for the item Merchant Two there is a charge of 100.00. On 5/12/2019 for the item Merchant Three there is a charge of 300.00. On 5/13/2019 for the item Merchant Three there is a charge of 200.00. You can request me for invoice notes or simply close this chat.__(35678-9__发票明细:2019/5/10__,费用项一金额为1500__美元。2019/1/11__,费用项二为100__美元。2019/5/12__,费用项三为300__美元。20195/13__,费用项四为200__美元。您可以要求我提供发票记录,也可以直接关闭本次聊天。)

用户:Can you show me the invoice notes for 35678-9(显示35678-9号发票注释)

Bot: Invoice Notes for 35678-9: 5/13/2019 Merchant Three 200.00 Merchant Three 300.00 Laptop Office Supplies Merchant Two 100.00 Team Dinner Food 5/12/2019 5/11/2019 Desks and Office Supplies 5/10/1019 Merchant One 1500.00 Chairs . Feel free to try the options again or you can simply close this chat__(35678-9__号发票注释:2019/5/13__,购入三项计200__美元。购入三项计300__美元,为电脑办公桌。2019/5/12__购入两项100__美元,为团队晚餐。2019/5/11__,为办公桌与办公服务器。2019/5/10 _购入一项计1500__美元,为椅子。_

我们还可以使用以下意图构建其他Amazon Lex机器人(InvoiceBot):

  • GetInvoiceSummary – 用户请求查看发票摘要时所调用的意图。由Lambda函数完成,可返回当前可用发票的数量与发票总金额
  • GetInvoiceDetails – 用户请求查看发票明细时所调用的意图。可通过Lambda函数实现,用于提供发票各条目明细,包括日期、数量与条目明细。
  • GetInvoiceNotes – 用户请求查看发票注释时所调用的意图。通过Lambda函数完成,提供带有日期与项目描述的发票注释信息。

发布聊天机器人

之前的解决方案概述中所提到,我们可以使用Amazon Lex聊天机器人(InvoiceBot)与Amazon Comprehend提取自Amazon Textract文本中的洞见进行交互。

要发布聊天机器人,请完成以下操作步骤:

  • 在Amazon Lex控制台上,选择Bots。
  • 选择所创建的聊天机器人。

image

  • 在Intents下,选择GetInvoiceSummary。
  • 在Fulfilment下,选择Lambda函数。
  • 输入LexLambdaFunction以搜索该函数,并选定正确结果。

这时系统会出现显示弹框。

  • 选择OK。

image

  • 选择Save intent。
  • 在另外两项意图GetInvoiceDetails与GetInvoiceNotes中,重复上述步骤。
  • 选择Build。
  • 在构建完成后,选择Publish。

image

  • image在Create an alias部分,输入Latest。我们也可以使用其他名称,例如测试、开发、beta或者生产等皆可,用于代指机器人的运行环境。
  • 选择Publish。

在机器人发布完成后,系统将打开以下页面。
image

  • 选择Close。

使用聊天机器人
我们的聊天机器人现在已经就绪并可供使用。导航至复制自AWS CloudFormation Outputs选项卡处的URL LexUIWebAppUrl。以下截屏所示,为用户与该机器人的对话结果(从左至右阅读):
image

总结
本文介绍了如何在Amazon Lex中创建一款会话式聊天机器人,使用Amazon Textract从图像或PDF文档中提取文本,使用Amazon Comprehend从文本中提取洞见,并通过机器人实现与洞见的交互。本文中所使用的代码皆发布在GitHub repo当中,供大家随意使用及扩展。

image

查看原文

赞 6 收藏 0 评论 0

AWS_AI开发者社区 发布了文章 · 2020-12-18

re:Invent 重磅回顾 | AWS 重塑机器学习的四大亮点,触及每一位 AI 工作者!

image

作为全球云计算的年度指标性大会,亚马逊 re:Invent 2020 大会已进行了二周。其中热点话题——人工智能(AI)机器学习(ML)也是新意多多,亮点频频。AWS 人工智能副总裁 Swami Sivasubramanian 博士亲自担纲了 2 小时的主题演讲,全景阐述了 Amazon Web Services (AWS) 在机器学习领域的各项 re:Invent – 重塑

image

不仅如此,AWS 首席执行官 Andy Jassy 就已在其 AWS 整体阐述中,用了相当长的时间,就机器学习及其在多种行业应用的“重塑” 加以重点介绍。下面,我们就和大家一起快速浏览一下这里面的重点和新意。

强大的计算基础
与以往一样,产品技术的新发布、新功能新特性的面市等,依然“如期到来”。“提供坚强的基础”,这既是演讲开篇的第一章,也是后续一切的“基础”。在此,AWS 提供种类丰富的计算实例,既有支持一般训练加推理运用的通用型实例,也有针对高性能要求的训练实例如 P4d 或推理实例如 Inf1, G4dn 等。在此,以下几个新发布值得关注。

一个是基于 Habana Gaudi AI 处理器的 Amazon EC2 实例,专门用来进行高强度机器学习训练。测试表明,它比目前基于 GPU 的 Amazon EC2 机器学习训练实例的综合性价比还要高出 40%!

第二是 AWS 自研的机器学习训练芯片 AWS Trainium,并将用于 Amazon EC2 实例中,或对 Amazon SageMaker 机器学习开发平台进行底层支持。

第三,更快速的分布式训练,并作为 Amazon SageMaker 能力中的一部分进行提供。相对此前的模式,分布式训练使其速度大幅提高,例如在视觉识别领域的 Mask-RCNN 训练中,TensorFlow 的训练时间由 28 分钟降低为 6 分 13 秒,PyTorch 的训练时间由 27 分钟降低为 6 分 45 秒,这些将对诸如自动驾驶领域的 AI 应用产生重大作用。

image

如果你想要了解更多重磅的新发布资讯,点击这里观看精彩视频,AWS Developer Advocate 谢洪恩 (Pahud Hsieh) 将带你回顾机器学习基础架构等主题演讲的精彩内容,详细解读 re:Invent 的重磅新发布!

image

为开发者和数据科学人员赋能

“将机器学习交付到每一个开发者手中”,这一直是 AWS 在机器学习领域的愿景。降低他们在机器学习开发中的各项操作复杂度,并透过一体化机器学习开发平台 Amazon SageMaker 加以实施。

对此,在“创建最短成功路径”这一章节中 Swami 博士进行了具体阐述,并发布了一系列新品。例如用于数据准备的 Amazon SageMaker Data Wrangler、用于留存各种模型特征的 Amazon SageMaker Feature Store、用于工作流自动化的 Amazon SageMaker Pipelines、…… 等等,不一而足。这些都可视为开发者通过 Amazon SageMaker 平台更便捷开发机器学习时可以用到的“十八般兵器”

其中最值得一提的是 Amazon SageMaker Clarify 的发布,专门用来处理“数据偏见(Bias,学术翻译为偏差)”。通俗理解的话,是指人们在工作中,由于各种原因不经意把并非完整客观的数据进行收集并处理,而使得结果产出发生“偏见”。

image

例如:在视频节目推荐中,仅对“戏剧类”节目的数据进行分析处理后,就认为是“娱乐”类的总体并加以推荐。“数据偏见”是人工智能社会化应用的一个重要课题,是确保技术客观公平应用的基础之一。现在,AWS 将偏见检测贯穿整个 ML 工作流程,这使得相关应用的开发不仅节省时间,并且提升了模型的整体质量,在模型老化过程中产生的漂移等,都可以被标注出来了。

机器学习的“扩张”

机器学习很高深,但尚处早期,受众有限。寻找更广泛的“圈外”开发者加入进来,使他们基于既有知识体系就“轻松上手”,这是机器学习长远发展之所在。AWS 显然洞悉到了这点。因此在第三章节“将机器学习向更多构建者扩展”中,Swami 博士带领团队一口气发布了 Amazon Aurora ML、Amazon Athena ML、Amazon Redshift ML、Amazon Neptune ML、Amazon QuickSight Q 等一众产品服务,它们分别代表了关系型数据库、Amazon Simple Storage Service (Amazon S3) 的 SQL 查询、数据仓库、图数据库、商业智能等与机器学习集合一处的“re:Invent”

image

最关键的,是开发者只需使用早已烂熟的 SQL 语句,就能进行连带机器学习功能的操作。之所以能如此,是因为 AWS 在后台进行了“系统集成”。以 Amazon Aurora ML 为例,当用户通过 SQL 查询客户信息以试图找到一些负面反馈时,Amazon Aurora ML 会自动调度 Amazon Comprehend 这样的 AI 服务来返回具备 AI 支持的查询结果。这极大降低了机器学习更广泛应用的门槛,使得学术一般的技术真的开始走入“大众视野”。

解决真正的业务问题

一个有趣的现象是,AWS 首席执行官 Andy Jassy 和 Swami 博士都先后在其演讲的后半段专门设置了“行业应用“或“解决业务问题”这样的章节。Andy 在演讲中引用了 Clay Christensen * 的一段话:“客户寻找产品和服务的目的是为了完成他的工作。…我找你不是为了机器学习,而是为了一项特定工作。如果你用机器学习的方式把工作完成了,很好,或其他方式其实也行。但我最终找你是要把工作完成。”

有鉴于此,AWS 此次发布将机器学习向行业应用领域也进行了大幅度扩展。例如应用于客服中心领域的 Amazon Connect,全面集成了各项 AI/ML 服务,并增加了 Amazon Connect Wisdom、Amazon Connect Customer Profiles、Real-Time Contact Lens for Amazon Connect、…等新功能服务,使得座席人员可以通过机器学习对知识库的加持、智能搜寻客户各项问题的解答、机器读取客户电话并分析语义等,实现与来话客户互动中的即时应答,秒级响应,进而提高客服满意度。

又比如在工业制造领域,AWS 发布了 Amazon Monitron 系列套件方案,通过传感器(检测震动和温度)、网关、AWS 云、移动应用等形成一个整体,为基于 AI 的设备维护提供端到端方案。这对诸如发电机、大型机床、重型装备等场合都有很实用的价值。此外还有 Amazon Lookout for Equipment、Amazon Lookout for Vision 等其他相关服务的配套发布。在工业智能检测方面,Amazon Panorama Appliance 的发布,为计算机视觉、IoT、机器学习等的集成应用,树立了一个新的“标杆”。此外还有……,篇幅所限,就不再过多展开了。

image

re:Invent 的确是一场“盛宴”,它系统展现了这一年来亚马逊在云计算领域的各项进展。今年尤其新意的是在上述各项应用领域里的“挺进”,从中我们仿佛看到了“工业 4.0”如何具体实施的身影,一个结合了人工智能、人机协同、流程优化、可持续迭代改进的工业制造身影,一个和现有普遍认知已经很大不同的身影!

* Clay Christensen,《破坏性创新》一书的作者,《福布斯》称之为“过去 50 年来最有影响力的商业理论之一”。2017 年在全球 Thinker 50 的排名中位列第三。

亚马逊 re:Invent 中国网站演讲视频现已上线!
亚马逊 re:Invent 2020 邀你一起出发!
各位开发者们,扫描下图中的二维码或点击这里报名参会吧!~(PS:中文字幕呦)
image

image

查看原文

赞 11 收藏 0 评论 0

认证与成就

  • SegmentFault 讲师
  • 获得 1206 次点赞
  • 获得 7 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 7 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-04-24
个人主页被 13.5k 人浏览