【问题标题】:Amazon Lex slot won't save value in it. Returns emptyAmazon Lex 插槽不会在其中节省价值。返回空
【发布时间】:2020-10-07 13:00:57
【问题描述】:

我正在尝试实施一项检查,让用户可以选择在用户在 confirmIntent 步骤拒绝之后更新意图内特定插槽的值。 p>

我有一个 newUser 意图,它具有以下插槽:

updateNewUser 是一个自定义槽类型(扩展值),具有以下条目:

现在,当用户在 confirmIntent 步骤拒绝时,我会询问用户他/她想要更新/更改的插槽,并将用户输入值存储在 updateNewUser 使用 Lambda 函数 elicitSlot 的插槽。但是问题来了。

  • Bot 使用所有捕获的值播放确认提示
  • 用户在 ConfirmIntent 中说“不”
  • 机器人通过询问“你有什么价值”来引出 updateNewUser 槽 要更新吗?”
  • 如果用户说出的词与 updateNewUser 自定义槽类型,然后就可以正常工作了
  • 如果用户说出类似(不完全匹配)的字词,例如“姓名”或“电子邮件” 或“数字”,没有值存储在 updateNewUser 和机器人 继续确认提示。

以下是我的 Lambda 代码:

def newUser(intent_request):

slot_details = intent_request['currentIntent']['slotDetails']
slots = intent_request['currentIntent']['slots']
f_name = slots['f_name']
l_name = slots['l_name']
cellNum = slots['cellNum']
emailAdd = slots['emailAdd']
updateSlot = slots['updateNewUser']
session_attributes = intent_request['sessionAttributes'] if intent_request['sessionAttributes'] is not None else {}
confirmation_status = intent_request['currentIntent']['confirmationStatus']


if intent_request['invocationSource'] == 'DialogCodeHook':
    validation_result = validate_newusr(intent_request['currentIntent']['slots'], intent_request['currentIntent']['slotDetails'])
    if not validation_result['isValid']:
        slots = intent_request['currentIntent']['slots']
        slots[validation_result['violatedSlot']] = None
        slots['updateNewUser'] = None
        return elicit_slot(
            session_attributes,
            intent_request['currentIntent']['name'],
            slots,
            validation_result['violatedSlot'],
            validation_result['message']
        )
    
    if confirmation_status == 'Denied':
        slots = intent_request['currentIntent']['slots']
        
        return elicit_slot(
            session_attributes,
            intent_request['currentIntent']['name'],
            slots,
            'updateNewUser',
            {
                'contentType': 'SSML',
                'content': '<speak>Which value do you want to change?</speak>'
            }
        )
    
    
    return delegate(
        session_attributes,
        intent_request['currentIntent']['slots']
    )
    
return close(
        session_attributes,
        'Fulfilled',
        {
            'contentType': 'SSML',
            'content': '<speak>Your account has been created, and you will shortly receive an email to set up your password. Now, would you like to make a reservation for yourself, or for somone else?</speak>'
        }
    )

以下是验证码:

def validate_newusr(slots, slot_details):

f_name = slots['f_name']
l_name = slots['l_name']
cellNum = slots['cellNum']
emailAdd = slots['emailAdd']
updateSlot = slots['updateNewUser']


if f_name:
    if ' ' in f_name:
        f_name = f_name.replace(' ', '')
        slots['f_name'] = f_name
            
if l_name:
    if ' ' in l_name:
        l_name = l_name.replace(' ', '')
        slots['l_name'] = l_name

if cellNum and (len(cellNum) != 10):
    return build_validation_result(
        False,
        'cellNum',
        '<speak>Please provide a valid, 10 digit phone number.</speak>'
    )
    
    
return build_validation_result(     #I use this to check whether updateNewUser stores something or not. But of course I only paste this code here at confirmIntent step; not before.
            False,
            'updateNewUser',
            str(updateSlot)
        )


    
if updateSlot:                      # this code won't run because updateSlot is empty
    
    return build_validation_result(     
            False,
            'updateNewUser',
            str(updateSlot)
        )
    
    if len(slot_details['updateNewUser']['resolutions']) == 1 and str(list(slot_details['updateNewUser']['resolutions'][0].values())[0]).lower() in ['last name','first name', 'cell phone number', 'email address']:
        slots['updateNewUser'] = list(slot_details['updateNewUser']['resolutions'][0].values())[0]
    
    if len(slot_details['updateNewUser']['resolutions']) == 0 or str(list(slot_details['updateNewUser']['resolutions'][0].values())[0]).lower() not in ['last name','first name', 'cell phone number', 'email address']:
        return build_validation_result(
            False,
            'updateNewUser',
            '<speak>Sorry, I could not understand. Please say first name, last name, phone number, or email address.</speak>'
        )
        
    if slots['updateNewUser'] == 'first name':
        return build_validation_result(
            False,
            'f_name',
            '<speak>Please say your updated first name.</speak>'
        )
        
    if slots['updateNewUser'] == 'last name':
        return build_validation_result(
            False,
            'l_name',
            '<speak>Please say your updated last name.</speak>'
        )
        
    if slots['updateNewUser'] == 'cell phone number':
        return build_validation_result(
            False,
            'cellNum',
            '<speak>Please say, or type your updated phone number.</speak>'
        )
        
    if slots['updateNewUser'] == 'email address':
        return build_validation_result(
            False,
            'emailAdd',
            '<speak>Please say your updated email address.</speak>'
        )
        
return {'isValid': True}

以下是聊天截图:

  1. 用户在 confirmIntent 时拒绝,机器人询问要更新哪个值:

  1. 用户说出“姓名”,机器人跳转到确认提示

  1. 如果向 Lex 提供了完全匹配的单词,它会接受它:

  1. 如果输入“名称”,则返回 bot 存储在 updateNewUser 中的值:

  1. 另一个例子:

在我的情况下,它只接受完全匹配。但是,如果我将 updateNewUser 插槽设为强制/必需,它也会开始接受类似的单词并且工作正常。但我需要这个插槽作为可选。我的目标是更新单个插槽而不是重复整个意图。我做错了什么?

【问题讨论】:

    标签: aws-lambda amazon-lex amazon-connect


    【解决方案1】:

    乍一看,我建议将updateNewUser 槽类型的分辨率更改为受限值和同义词。这将使您能够添加与您的基本值匹配的同义词。

    确保您的valueSelectionStrategyTOP_RESOLUTION,以便您获得基本值而不是用户的原始输入。

    这简化了您的 lambda,因为您只需为每行提供一个值。

    Custom Slot Types

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多