Python 还能承担下一个时代的发展重任吗?Mojo 语言的横空出世对 AI 研发生态有什么影响? 了解详情
写点什么

通过置信评分与更高准确率,在 Amazon Lex 上构建高质量对话服务

  • 2020-10-23
  • 本文字数:4655 字

    阅读完需:约 15 分钟

通过置信评分与更高准确率,在 Amazon Lex 上构建高质量对话服务

Original URL: https://aws.amazon.com/cn/blogs/machine-learning/build-more-effective-conversations-on-amazon-lex-with-confidence-scores-and-increased-accuracy/


在忙碌的日常生活中,我们往往会在对话中使用模棱两可或者并不完整的句子。例如,在与银行助理交谈时,客户可能会说,“余额还剩多少?”这样的请求显然比较模糊,客户并没有明确提到自己希望查询的到底是信用卡余额还是支票账户余额。这位客户也许只有银行支票账户,这时客服人员完全可以查找账户详细信息以确定对方提到的只可能是支票账户,借此带来良好的服务体验。在客户服务领域,客服人员经常需要结合当前用户的上下文数据以解释用户表述中的这些不确定性因素。聊天机器人程序也面临类似的歧视,同样需要添加客户上下文数据以确定对方的真实意图。


今天,我们在Amazon Lex上推出了自然语言理解的改进方案与置信评分机制。我们根据客户的反馈与研究进展不断改善服务能力,旨在实现更强大的大家还可以借此更好地处理种种模棱两可的场景,包括我们之前提到的查询场景。在这种情况下,如果有两项或者两项以上的 intent 能够以极高置信度进行匹配,则大家可以使用 intent 分类置信度评分确定能否以及如何使用业务逻辑来理解用户意图。如果用户只开通了信用卡服务,那么我们可以触发 intent 以显示信用卡余额。如果用户同时开通了信用卡与支票账户,我们则可以提出补充性问题,例如“您是指信用卡还是支票账户?”以此为基础,大家将获得更可靠的理解能力,借此管理对话流程并提升沟通效率。


本文将向大家展示如何将这些改进与置信度评分加以结合,以业务知识为基础触发最佳响应。

构建 Lex 机器人

本文将使用以下会话对机器人进行建模。


如果客户在银行中只开通了一个账户:


用户:余额还剩多少?


客服:请输入您的 ATM 卡 PIN 码以确认。 用户:5555


客服:您的支票账户余额为 1234 美元。


如果客户拥有多种账户,那么对话流程将变为:


用户:余额还剩多少?


客服:好的,您是指支票账户还是信用卡?


用户:信用卡。


客服:请输入您的卡片 CVV 编号以确认。


用户:1212。


客户:您的信用卡余额为 3456 美元。


要实现以上功能,首先需要构建一个能够支持余额查询、资金转账及账单支付等交易的 Amazon Lex 机器人。


我们可以使用GetBalanceCreditCard, GetBalanceChecking以及 GetBalanceSavings 等提供账户余额信息。PayBills intent 负责处理指向收款人的支付操作, TransferFunds 支持将资金在不同账户间往来转移。最后,您还可以使用 OrderChecks intent 进行支票补记。当用户向 Lex 机器人提出的请求无法使用以上 intent 加以处理时,则触发其他备选 intent 作为响应。

部署示例 Lex 机器人

要创建示例机器人,我们需要完成以下操作步骤。在本文中,我们需要创建一个名为 BankingBot的 Amazon Lex 机器人,以及一项名为BankingBot_Handler的 AWS Lambda 函数。


  • 下载 Amazon Lex机器人定义Lambda代码

  • 在 Lambda 控制台上,选择 Creatge function。

  • 输入函数名称 BankingBot_Handler

  • 选择 Python 运行时最新版本(例如 Python 3.8)。

  • 在 Permissions 部分, 选择 Create a new role with basic Lambda permissions

  • 选择 Create function

  • 当您的 Lambda 函数创建完成后,在 Function code 部分,选择 Actions and Upload a .zip file

  • 选择我们之前下载到的 BankingBot.zip文件。

  • 选择 Save

  • 在 Amazon Lex 控制台上, 选择 Actions, Import。

  • 选择我们之前下载到的BankingBot.zip 文件,而后选择 Import

  • 在 Amazon Lex 控制台上,选择BankingBot 机器人。

  • Fulfillment 部分,为每一项 intent,包括备选 intent(BankingBotFallback), 选择 AWS Lambda function 而后从下拉菜单中 选择 BankingBot_Handler 函数:



  • 在页面提示您向 Lambda 函数 Add permission 时 , 选择 OK .

  • 在所有 intents 更新完毕之后, 选择 Build


到这里,一个能够正常工作的 Lex 机器人就创建完成了。

设置置信度评分阈值

现在,我们可以为 intent 设置置信度评分阈值了。这项设置将根据 intent 的置信度评分,控制何时将 Amazon Lex 的 Fallback intent 作为默认选项。要完成这项设置,请执行以下操作:


  • 在 Amazon Lex 控制台上, 选择 Settings , 而后选择 General

  • us-east-1, us-west-2, ap-southeast-2eu-west-1区域中,下滚至 Advanced 选项,并选择 Yes 以选择精度改进以及置信度评分所使用的各项特征。


在默认设置下,其他区域已经直接启用了这些改进与置信度支持选项。



  • Confidence score threshold 部分,输入一个 0 到 1 之间的数字。您可以选择保留默认值,即 0.4。



  • 选择 Save ,而后选择 Build


在机器人配置完成后,Amazon Lex 会在PostTextPostContent响应当中显示置信度评分与备选 intents:


"alternativeIntents": [     {        "intentName": "string",       "nluIntentConfidence": {           "score": number       },       "slots": {           "string": "string"        }    } ]
复制代码

使用 Lambda 函数与置信度评分识别用户意图

当用户发出比较模糊的请求时,例如“账户余额还剩多少?”,Lambda 函数会解析 Amazon Lex 返回的 intent 列表。如果返回了多项 intent,则函数会检查排名最高的 intent 是否具有与AMBIGUITY_RANGE值的定义具有相似的评分。举例来说,如果某项 intent 的置信度得分为 0.95,而另一项 intent 的评分为 0.65,则前者的正确率显然更高。但如果一项 intent 的评分为 0.75,而另一项评分为 0.72,我们就需要结合应用程序中的业务知识对二者加以区分。在我们的用例中,如果客户拥有多个账户,则该函数将设置一项补充性的问题,例如“您是指信用卡还是支票账户?”但如果客户只拥有一个账户(例如支票账户),则直接向其返回该账户的余额数字。


在使用置信度评分时,Amazon Lex 会在每条响应中返回概率最高的 intent,以及最多四项备用 intent 及其对应置信度评分。如果所有 intent 的置信度评分均小于您预先定义的阈值,则 Amazon Lex 会使用AMAZON.FallbackIntent intentAMAZON.KendraSearchIntent intent或者二者兼有。您可以直接使用默认阈值,也可以根据需求另行设定。


以下代码所示,为我们在本文的示例机器人中下载的 Lambda 代码。此函数同样适用于各类其他 Amazon Lex 机器人。


此 Lambda 函数的分派器函数会将请求转发至处理程序函数,但GetBalanceCreditCard, GetBalanceChecking以及 GetBalanceSavings intents则会被其转发至determine_intent


其中还有负责检查 Lex 报告中各 top 事件及其他备选 intents 的 determine_intent 函数。如果某一备选 intent 适用于当前用户查询(以其账户为基础),且置信度评分处于 top 事件的 AMBIGUITY_RANGE 范围之内,则该 intent 将被添加至可能事件列表当中。


possible_intents = []# start with the top intent (if it is valid for the user)top_intent = intent_request["currentIntent"]if top_intent["name"] in valid_intents:    possible_intents.append(top_intent)
# add any alternative intents that are within the AMBIGUITY_RANGE# if they are valid for the userif intent_request.get("alternativeIntents", None): top_intent_score = top_intent["nluIntentConfidenceScore"] for alternative_intent in intent_request["alternativeIntents"]: alternative_intent_score = alternative_intent["nluIntentConfidenceScore"] if top_intent_score is None: top_intent_score = alternative_intent_score if alternative_intent["name"] in valid_intents: if abs(top_intent_score - alternative_intent_score) <= AMBIGUITY_RANGE: possible_intents.append(alternative_intent)
复制代码


如果用户只有一项可能的 intent,则(在找出所有缺失的 slots 之后)直接实现。


num_intents = len(possible_intents)if num_intents == 1:    # elicit any missing slots or fulfill the intent    slots = possible_intents[0]["slots"]    for slot_name, slot_value in slots.items():        if slot_value is None:            return elicit_slot(intent_request['sessionAttributes'],                          possible_intents[0]["name"], slots, slot_name)    # dispatch to the appropriate fulfillment method     return HANDLERS[possible_intents[0]['name']]['fulfillment'](intent_request)
复制代码


如果存在多项可能的 intents,则进一步请求用户做出说明。


elif num_intents > 1:    counter = 0    response = ""    while counter < num_intents:        if counter == 0:            response += "Sure. Is this for your " +                INTENT_TO_ACCOUNT_MAPPING[possible_intents[counter]["name"]]        elif counter < num_intents - 1:            response += ", " +                INTENT_TO_ACCOUNT_MAPPING[possible_intents[counter]["name"]]        else:            response += ", or " +                INTENT_TO_ACCOUNT_MAPPING[possible_intents[counter]["name"]] + "?"        counter += 1    return elicit_intent(form_message(response))
复制代码


如果没有适用于用户的 intent,则触发后备 intent。


else:    return fallback_handler(intent_request)
复制代码


要进行方案测试,大家可以调整check_available_accounts函数的返回值,以更改代码中的测试用户配置:


# This could be a DynamoDB table or other data storeUSER_LIST = {    "user_with_1": [AccountType.CHECKING],    "user_with_2": [AccountType.CHECKING, AccountType.CREDIT_CARD],    "user_with_3": [AccountType.CHECKING, AccountType.SAVINGS, AccountType.CREDIT_CARD]}
def check_available_accounts(user_id: str): # change user ID to test different scenarios return USER_LIST.get("user_with_2")
复制代码


我们可以在 Amazon Lex 控制台或 Lambda 函数的 CloudWatch Logs 日志文件中查看 Lex 的置信度评分。


置信度评分也可用于测试各机器人的不同版本。例如,如果您添加了新的 intent、话语或者 slot 值,则可以测试机器人并检查新的置信度评分,确认相关变更是否达到了预期效果。

总结

虽然人们在与机器人交互时,使用的词语往往不那么精确,但我们仍然需要努力提供自然顺畅的用户体验。Amazon Lex 此次推出的一系列自然语言理解改进与置信度评分,将帮助大家结合更多上下文信息设计出智能度更高的对话过程。您可以将,也可以在机器人开发过程中通过测试确定准确的置信度得分阈值,借此确定针对特定 intent 的样本话语更改是否能够实现预期效果。这些改进将帮助您设计出更加高效的对话流程。关于将这些技术整合至您聊天机器人内的更多详细信息,请参阅 Amazon Lex说明文档


作者介绍


Trevor Morse


Amazon AI 团队软件开发工程师。他专注于构建并扩展 Lex 的 NLU 功能。在业余时间,他喜欢运动以及陪伴家人与朋友。


Brian Yost


Brian Yost 是 AWS Professional Services 的高级顾问。在闲暇时间,他喜欢山地骑行、自酿啤酒和技术研究。


Harshal Pimpalkhute


作为 Amazon Lex 团队的产品经理,Harshal Pimpalkhute 投入大量时间尝试使机器(友好地)与人类互动。


本文转载自亚马逊 AWS 官方博客。


原文链接


通过置信评分与更高准确率,在 Amazon Lex 上构建高质量对话服务


2020-10-23 14:00810

评论

发布
暂无评论
发现更多内容

基于小程序的小区物业管理平台开发笔记

CC同学

IPv6相关翻译技术

穿过生命散发芬芳

ipv6 8月月更

学习 C++ 编程,怎么才能找到合适的练手项目?

Jackpop

ITIL与DevOps对比

阿泽🧸

ITIL 8月月更

长安链学习-build_release.sh

长安链

二叉树的递归和迭代实现(java)

秋名山码民

8月月更

Kubernetes 服务网格实现

CTO技术共享

计算机网络(五、运输层)

计算机网络 8月月更

电商秒杀系统设计

intelamd

首次公开!阿里巴巴最新高并发架构设计实录被我从Github扒下来了

程序员小毕

Java 程序员 架构 面试 高并发

应用层

武师叔

8月月更

RxJS Observable 为什么要长成这个样子?!

掘金安东尼

前端 函数式编程 8月月更

开源一夏 | 我们都是开源者

宁在春

开源 8月月更

每日一R「11」数据结构(二)切片

Samson

8月日更 ​Rust

Spring进阶(六):Spring事务问题分析及解决方案探究

No Silver Bullet

spring 8月月更 事务问题

OpenHarmony技术挑战课题征集

Geek_2d6073

开源一夏 | JavaScript实战之闭包与函数调用的相互应用详解

恒山其若陋兮

开源 8月月更

7 天学个Go,Go 结构体 + Go range 来学学

梦想橡皮擦

Python 爬虫 8月月更

计算机网络(六、应用层)

计算机网络 8月月更

收藏不迷路 —— Flutter 转场动效大合集

岛上码农

flutter 前端 安卓开发 ios 开发 8月月更

什么是 OpenJ9

HoneyMoose

长安链学习-启动脚本分析

长安链

C++多态纯虚函数和抽象类与多态案例(二)

CtrlX

c c++ 面向对象 多态 8月月更

HTTP 通信

武师叔

8月月更

HTTPS 协议

武师叔

8月月更

信用卡业务数字化专题研究2022H1

易观分析

金融 信用卡

[JS真好玩] 掘金创作者必备: 用一行JS查看所有文章的转化率,让你知道什么标题才是好标题

HullQin

CSS JavaScript html 前端 8月月更

Python自学教程1-安装pycharm和执行环境

和牛

Python 测试 8月月更

又一款超好用开源知识库管理工具!

Jackpop

毕业总结

intelamd

Kubernetes 集群API创建管理

CTO技术共享

  • 扫码加入 InfoQ 开发者交流群
通过置信评分与更高准确率,在 Amazon Lex 上构建高质量对话服务_软件工程_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章