Как передать обработку между намерениями во время диалога? - PullRequest
0 голосов
/ 15 июня 2019

Я работаю над навыком Alexa, который будет иметь 6 основных намерений. Во время каждого намерения пользователь должен будет выбрать элемент из динамического списка. Я подскажу им что-то вроде:

скажем, выберите 1 для красного, 2 для синего или 3 для зеленого

Мой план прямо сейчас заключается в том, чтобы иметь намерение, которое отвечает Select Item {ItemIndex}. Однако, как только у меня есть выбранный индекс, мне нужно вернуться к первоначальному намерению. Диалог будет выглядеть примерно так:

спросите My Car Shopper, какие Форды есть в наличии поблизости (обрабатывается LookForCarIntentHandler)

Конечно. Какой цвет вы ищете? Скажите 1 для Красного Капура, 2 для Зеленого Балтийского моря или 3 для Серебряной ели

Выберите пункт 2 (обрабатывается SelectItemIntentHandler)

Отлично. Я нашел 3 брода в Серебряной ели в 3 милях от вас. Хотите, чтобы я рассказал вам о первом? (ответ от LookForCarIntentHandler)

В этом надуманном примере цвета довольно необычные и управляются API, поэтому я не могу предварительно заполнить значения слотов. Динамические значения слотов также сложно из-за ограничений, когда я могу их установить. В любом случае, в какой-то момент мне нужно иметь возможность выбирать по индексу как запасной вариант.

Я рассмотрел 3 варианта:

Опция 1 : добавьте слот {SelectedIndex} (и высказывания) к каждому намерению и просто используйте их для сбора индекса слота. Мне не нравится это из-за количества шаблонов, которыми я должен управлять, но по крайней мере это будет работать.

Вариант 2 : подтвердить выбор индекса (даже если я не очень хочу) в оригинале и обновить намерение в этом ответе. То есть иметь ответ SelectItemIntentHandler с директивой elicitSlot, которая указывает обработчику обратно на исходное намерение с подсказкой «Я слышал, вы говорите, пункт 1 ... это правильно?» Тогда У 6 намерений верхнего уровня должен быть тип слота Yes/No и слот для сбора значения подтверждения. Мне не очень нравится эта опция.

Опция 3 : пусть SelectItemIntentHandler идентифицирует предыдущее намерение и вызывает обработчик этого намерения, возвращая свой результат. Это не кажется удивительным, но это сработало бы в крайнем случае.

Опция 4 : полностью исключить логику из обработчиков намерений. По сути, создайте свой собственный конечный автомат, который обрабатывает логику вне обработчиков намерений. Тогда обработчики намерений несут ответственность только за то, чтобы выслушать материал и передать его в машину состояний Например, у меня есть CoffeeBuilder, CarSearchBuilder и BurritoBuilder. Каждый обработчик узнает, какой компоновщик активен, передаст в него текущее состояние. Построитель обновляет состояние и возвращает ответ.

Тогда никогда не имеет значения, что намерение делает, потому что намерения в любом случае глупы. Так, в зависимости от состояния и активного Builder, SelectItemIntentHandler может сказать: «Отлично, хотите ли вы картошку с этим?» или «Этот автомобиль поставляется с 2 или 4 двери. Сколько дверей вы хотите? "

Мне нравится звук этого подхода; Однако это сложно. Очевидно, что я действительно хотел бы сказать: «Хорошо, похоже, выбран правильный индекс элемента, поэтому OrderCoffeeIntentHandler, продолжайте и завершите диалог. K Thx Bye». Я просто не вижу способа сделать это.

...