生存中的很多对话,对咱们人类来说,联合上下文很容易就能判断出实在意思。例如网传的一道「汉语八级考试题」:
——「你的牙真难看!」
——「哦,那是假的。」
——「啊?真的假的?」
——「真的。」
问:牙到底是真的还是假的?
然而对于程序来说,要想弄清楚这里的弯弯绕可就不容易了。然而很多时候,取得相似这样的能力往往是改善客户体验的要害。例如当一位客户与银行柜员交谈时,客户可能会问「余额还剩多少?」这样的申请显然比拟含糊,客户并没有明确提到本人心愿查问的到底是信用卡余额还是支票账户余额。这位客户兴许只有支票账户,这时客服人员齐全能够查找账户详细信息以确定对方提到的只可能是支票账户,借此带来良好的服务体验。
在客户服务畛域,客服人员常常须要联合以后用户的上下文数据以解释用户表述中的这些不确定性因素。聊天机器人程序也面临相似的问题,同样须要增加客户上下文数据以确定对方的实在用意。
明天,咱们在 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
的 Amazon 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以及Upload a .zip file。
- 抉择咱们之前下载到的BankingBot.zip文件。
- 抉择Save。
- 在Amazon Lex管制台上,抉择Actions-Import。
- 抉择咱们之前下载的BankingBot.zip文件,而后抉择Import。
- 在Amazon Lex管制台上,抉择BankingBot机器人。
- 在Fulfillment局部,为每一项intent,包含备选intent(BankingBotFallback)抉择Amazon 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-2或eu-west-1区域中,下滚至Advanced选项,并抉择Yes以抉择精度改良以及置信度评分所应用的各项特色。
在默认设置下,其余区域曾经间接启用了这些改良与置信度反对选项:
在Confidence score threshold局部,输出一个0到1之间的数字。咱们能够抉择保留默认值,即0.4。
随后抉择Save,而后抉择Build。
在机器人配置实现后,Amazon Lex会在PostText及PostContent响应当中显示置信度评分与备选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 intent、AMAZON.KendraSearchIntent intent 或二者兼有。咱们能够间接应用默认阈值,也能够依据需要另行设定。
以下代码所示,为咱们在本文的示例机器人中下载的Lambda代码。此函数同样实用于各类其余 Amazon Lex 机器人。
此 Lambda 函数的分派器函数会将申请转发至处理程序函数,但GetBalanceCreditCard、GetBalanceChecking 以及 GetBalanceSavings intent 则会被其转发至 determine_intent。
其中还有负责查看Lex报告中各top事件及其他备选intent的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)
如果存在多项可能的intent,则进一步申请用户做出阐明。
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阐明文档。