Amazon Lex принимает ConfirmIntent при любом ответе

У меня есть intent-A, который запускается некоторым пользователем. Когда пользователь получает ответ, я использовал ConfirmIntent вместо Close, чтобы я мог переключить / связать другое намерение (скажем, intent-B).

В идеале, если пользователь вводит "yes", тогда намерение должно срабатывать, а если пользователь вводит "no", то не должно. Проблема в том, что intent-B запускается независимо от того, что я набираю.

Я прочитал о ConfirmIntent из здесь, здесь и здесь.

Телефонный код:

session_attributes = {"confirmationContext": "AutoPopulate"}
return confirm_intent(session_attributes , 'intent-B', slots, 'Do you want to invoke intent-B')

Код подтверждения:

def confirm_intent(session_attributes, intent_name, slots, message):
    return {
        'sessionAttributes': session_attributes,
        'dialogAction': {
            'type': 'ConfirmIntent',
            'intentName': intent_name,
            'slots': slots,
            'message': {
                'contentType': 'PlainText',
                'content': message
            }
        }
    }

В журналах я вижу это confirmationStatus': 'Denied', когда я набираю "no ", но даже тогда вызывается intent-B.

Я что-то упустил или все устроено таким образом?

ПРИМЕЧАНИЕ. Для обходного пути я добавляю код ниже в DialogCodeHook intent-B

if 'confirmationStatus' in intent_request['currentIntent'] and intent_request['currentIntent']['confirmationStatus'] == 'Denied':
    return close("Ok, let me know if you need anything else.", session_attributes)

person sid8491    schedule 14.12.2017    source источник


Ответы (1)


Вы справляетесь с этим правильно.

Когда вы передаете intent-B в свой confirm_intent запрос. Вы говорите Лексу передать ответ пользователя intent-B. Когда пользователь отвечает "no", значение Denied передается правильно.

В качестве альтернативы вы можете указать intent-A в своем confirm_intent запросе. Затем, когда ответ достигает intent-A, вы можете использовать Close для отказа и Delegate для confirmation, чтобы передать поток на intent-B. Это «более правильно», но приведет к дополнительным вычислениям, так что это компромисс.

Если у вас есть несколько последующих запросов, вы можете использовать ElicitIntent, чтобы вместо этого спросить пользователя "What can I help you with?". Имея намерение с помощью таких высказываний, как "nothing", "goodbye" будет улавливать отрицательные ответы. Это немного другой вариант использования, который может вам не подойти.

person Milk    schedule 14.12.2017
comment
так что намерение-B будет всегда вызываться, но мы можем остановить его выполнение в DialogCodeHook, проверив confirmStatus. это верно? - person sid8491; 14.12.2017
comment
@ sid8491 Я добавил еще один подход, который вы можете использовать, используя Delegate, чтобы вызывать intent-B только при необходимости. Это более затратно с точки зрения вычислений, так что это ваш выбор, если вы думаете, что это лучший способ. - person Milk; 17.12.2017
comment
Привет, @Milk! confirmationStatus устанавливается на Confirmed, даже если я набираю отдельные слова, такие как outlook, printer и т. Д., Которые нигде не ближе к да. как решить эту проблему ... любая идея? - person sid8491; 20.12.2017