Amazon Lex插槽无法在其中节省价值返回空

问题描述

我正在尝试执行一项检查,该检查使用户可以选择在 confirmIntent 步骤中在用户 Denies 之后更新意图中特定插槽的值。>

我有一个 newUser 意图,该意图具有以下位置:

Slots defined in intent

updateNewUser 是具有以下条目的自定义广告位类型(扩展值):

enter image description here

现在,当用户 Denies 在confirmIntent步骤中时,我问该用户要更新/更改的插槽,并将用户输入的值存储在 updateNewUser 中>使用Lambda函数elicitSlot的插槽。但是问题来了。

  • Bot播放包含所有捕获值的确认提示
  • 用户在confirmIntent上说“否”
  • Bot通过询问“您具有什么价值来引出 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,'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,str(updateSlot)
        )


    
if updateSlot:                      # this code won't run because updateSlot is empty
    
    return build_validation_result(     
            False,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','email address']:
        return build_validation_result(
            False,'<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,'<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拒绝,机器人会询问要更新哪个值:

enter image description here

  1. 用户说“姓名”,机器人会跳至确认提示

enter image description here

  1. 如果将精确匹配的单词提供给Lex,则接受该单词:

enter image description here

  1. 在输入“名称”的情况下,返回存储在updateNewUser中的bot值:

enter image description here

  1. 一个例子:

enter image description here

在我的情况下,它仅接受完全匹配。但是,如果我将 updateNewUser 插槽设置为必填项/必填项,它也会开始接受类似的单词,并且效果很好。但是我需要此插槽为可选。我的目标是更新一个插槽,而不是重复整个意图。我在做什么错了?

解决方法

乍一看,我建议将import pandas as pd df=pd.read_csv('my_file.csv') Wind_Direction=df.filter(regex='^Wind Direction',axis=1) 插槽类型的分辨率更改为受限值和同义词。这样一来,您便可以添加与您的基本值匹配的同义词。

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

这简化了您的lambda,因为您只需要满足每行一个值即可。

Custom Slot Types