使用 CodeHook 验证时,Amazon Lex 不提示缺少变量
Amazon Lex not prompting for missing variables when using CodeHook Validation
我正在 Amazon Lex 中构建一个具有大约 3 个意图的代理。所有 3 个意图都有一个变量,已勾选为 'required',这意味着当用户查询缺少它时,代理必须提示输入这些变量。
然而,当我使用 lambda 函数作为 codehook 验证时,函数被触发而没有提示缺少变量。
例如:描述与特定人员通话的通话记录的意图:
提示是“指定你想看其笔记的人的名字”
lambda函数的objective是打印出"Call notes for the person is XYZ'
当我不通过 codehook 验证使用任何 lambda 函数时,我得到一个输入人名的提示,
但是当我使用 codehook 验证时,lambda 函数被触发,我得到的回复是 "Call notes for None is XYZ"。
None 因为,用户查询中没有提及此人的姓名,也没有提示我输入此人的姓名。
有人可以帮忙吗?我在 lambda 函数中尝试了各种修改,但提示符不应该是 lambda 函数的独立功能吗?
从 2~3 天开始,我一直在浏览和尝试与此相关的事情,但遇到了死胡同。
发生这种情况是因为 Lambda 初始化和验证 发生在 Amazon Lex 中的 槽填充 之前。
您仍然可以检查用户是否在 DialogCodeHook 中提供了 "person" 插槽,即验证部分。
类似下面的代码将完成您的工作:
def build_validation_result(is_valid, violated_slot, message_content):
if message_content == None:
return {
'isValid': is_valid,
'violatedSlot': violated_slot
}
return {
'isValid': is_valid,
'violatedSlot': violated_slot,
'message': {'contentType': 'PlainText', 'content': message_content}
}
def validate_person(person):
# apply validations here
if person is None:
return build_validation_result(False, 'person', 'Please enter the person name')
return build_validation_result(True, None, None)
def get_notes(intent_request):
source = intent_request['invocationSource']
output_session_attributes = intent_request['sessionAttributes'] if intent_request['sessionAttributes'] is not None else {}
slots = intent_request['currentIntent']['slots']
person = slots['person']
if source == 'DialogCodeHook':
# check existence of "person" slot
validation_result = validate_person(person)
if not validation_result['isValid']:
slots[ticket_validation_result['violatedSlot']] = None
return elicit_slot(
output_session_attributes,
intent_request['currentIntent']['name'],
slots,
validation_result['violatedSlot'],
validation_result['message']
)
return delegate(output_session_attributes, slots)
如果"person"槽为空,用户将收到错误信息提示。这样您就不需要在插槽上勾选 "Required"。
当我在使用 DialogCodeHook 时遇到这个问题时,这是我能想到的唯一解决方法。
希望对你有帮助。
我正在 Amazon Lex 中构建一个具有大约 3 个意图的代理。所有 3 个意图都有一个变量,已勾选为 'required',这意味着当用户查询缺少它时,代理必须提示输入这些变量。
然而,当我使用 lambda 函数作为 codehook 验证时,函数被触发而没有提示缺少变量。
例如:描述与特定人员通话的通话记录的意图:
提示是“指定你想看其笔记的人的名字”
lambda函数的objective是打印出"Call notes for the person is XYZ'
当我不通过 codehook 验证使用任何 lambda 函数时,我得到一个输入人名的提示,
但是当我使用 codehook 验证时,lambda 函数被触发,我得到的回复是 "Call notes for None is XYZ"。
None 因为,用户查询中没有提及此人的姓名,也没有提示我输入此人的姓名。
有人可以帮忙吗?我在 lambda 函数中尝试了各种修改,但提示符不应该是 lambda 函数的独立功能吗?
从 2~3 天开始,我一直在浏览和尝试与此相关的事情,但遇到了死胡同。
发生这种情况是因为 Lambda 初始化和验证 发生在 Amazon Lex 中的 槽填充 之前。 您仍然可以检查用户是否在 DialogCodeHook 中提供了 "person" 插槽,即验证部分。 类似下面的代码将完成您的工作:
def build_validation_result(is_valid, violated_slot, message_content):
if message_content == None:
return {
'isValid': is_valid,
'violatedSlot': violated_slot
}
return {
'isValid': is_valid,
'violatedSlot': violated_slot,
'message': {'contentType': 'PlainText', 'content': message_content}
}
def validate_person(person):
# apply validations here
if person is None:
return build_validation_result(False, 'person', 'Please enter the person name')
return build_validation_result(True, None, None)
def get_notes(intent_request):
source = intent_request['invocationSource']
output_session_attributes = intent_request['sessionAttributes'] if intent_request['sessionAttributes'] is not None else {}
slots = intent_request['currentIntent']['slots']
person = slots['person']
if source == 'DialogCodeHook':
# check existence of "person" slot
validation_result = validate_person(person)
if not validation_result['isValid']:
slots[ticket_validation_result['violatedSlot']] = None
return elicit_slot(
output_session_attributes,
intent_request['currentIntent']['name'],
slots,
validation_result['violatedSlot'],
validation_result['message']
)
return delegate(output_session_attributes, slots)
如果"person"槽为空,用户将收到错误信息提示。这样您就不需要在插槽上勾选 "Required"。 当我在使用 DialogCodeHook 时遇到这个问题时,这是我能想到的唯一解决方法。 希望对你有帮助。