使用 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 时遇到这个问题时,这是我能想到的唯一解决方法。 希望对你有帮助。