Как справиться да / нет в разговоре - PullRequest
0 голосов
/ 31 января 2019

В настоящее время я создаю навык Alexa, который обрабатывает вопросы и ответы, и вопросы, которые приводят к прямому ответу, работают нормально, однако у меня есть вопросы относительно того, когда alexa ожидает другой ответ.

Например, если пользователь спрашивает,

  • "Что я должен есть"

  • Алекса ответит "Хотите ли вы есть макароны?"

  • Пользователь скажет «да» или «нет»

    • И Алекса либо ответит «Вот макароны», если пользователь скажет «да», либо предложит что-то еще, если пользователь скажет «нет "
  • Если пользователь скажет что-то еще, кроме да или нет, ему будет предложено ответить да или нет.

На данный момент у меня есть следующий код:

if (intentName == "WhatShouldIEat")
{
    EatQuestion = true;
    reprompt = "Answer with yes or no";
    return MakeSkillResponse(FAQHelper.getQuestionInformation(intentName)); //returns the voice response on alexa
}

//Check if users says yes or no for for eating that food
if (EatQuestion)
{
    switch (intentName)
    {
        case "AMAZON.YesIntent":
            intentName = "YesFood"; //sets response to when user says yes
            EatQuestion = false;
            reprompt = "Ask me another question";
            break;
        case "AMAZON.NoIntent":
            intentName = "NoFood"; //sets response for when user says no
            EatQuestion = false;
            reprompt = "Ask me another question";
            break;
        default:
            intentName = "YesNoPrompt"; //Alexa will ask the user to say either yes or no
            break;
    }
}    

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

Однако мне было интересно, есть ли лучший способ добиться этого, так как функциональностьв настоящее время в FunctionHandler, и он довольно запутан с делами переключателей, и расширяет текущий код для других вопросов, требующих да, без подтверждения также будет довольно грязно.

В основном я хочу знать, есть ли более чистый способделать ту же функциональность в коде выше.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Вы также можете использовать States для этого.Подобно ответу, предоставленному Shailesh Pratapwar, он сохранит состояние в данных сеанса, а затем ответит в соответствии с состоянием, в котором находится пользователь. Вот пример потока пользователей «Приключенческой игры» из нашей Приключенческой игрыAlexa Skill и Google Action Course :

enter image description here

Если это полезно, вы можете найти полную часть, которая вводит понятие состояний здесь: Шаг 5: Введение в состояния .

0 голосов
/ 01 февраля 2019

AMAZON.YesIntent или AMAZON.NoIntent будут срабатывать всякий раз, когда пользователь говорит «да» или «нет», и могут возникнуть другие вопросы, которые могут иметь «да» или «нет» в качестве ответа.Вы можете определить или отследить, что было задано ранее или контекст разговора, используя sessionAttributes.

Используя атрибуты сеанса
Представьте свое мастерствос "states".Каждый многоуровневый разговор имеет состояние, а состояние означает контекст вашего разговора или то, о чем вы говорите.Поэтому, когда есть разговор, вы устанавливаете состояние / контекст в sessionAttributes, чтобы при поступлении следующего запроса вы предпринимали действия на основе state.

Пример:

User: What should I eat?

[SelectFoodIntent is triggered]
[SelectFoodIntent handler receives this request]
[SelectFoodIntent can set usefull information like]
"sessionAttribute": {
   "state":"SELECT_FOOD",
   "givenChoice":"pasta"
} 
[SelectFoodIntent sends the response back with the sessionAttribute]

Alexa: "Do you want to eat pasta?"

User: no

[AMAZON.NoIntent is triggered]

Когда запрос поступит в ваш бэкэнд, вы получите все sessionAttributes, которые вы установили ранее, и с этим вы можете определить, что state равно "SELECT_FOOD" так что это "НЕТ" для макаронных изделий.Теперь вы можете ответить другим продуктом и установить sessionAttributes соответственно.

"sessionAttribute": {
   "state":"SELECT_FOOD",
   "givenChoice":"Noodle"
} 

Alexa: What about some noodle?

User: Yes

AMAZON.YesIntent срабатывает и с помощью sessionAttributes вы знаете, что это «Да» для «Лапша».

Подход состоит в том, чтобы сначала рассмотреть state, а внутри него есть цели , которые необходимы.И одно и то же намерение может быть использовано в разных состояниях, таких как AMAZON.YesIntent или AMAZON.NoIntent.Таким образом, у вас будет набор обработчиков намерений для каждого состояния, которые будут запускаться только для этого конкретного состояния.

Помните, что также может быть запрос без state, поэтому убедитесь, что ваш код обрабатывает его тоже.

Пример:

+-----------------+------------------+---------------------+
| State           | FOOD_SELECT      | PLACE_ORDER         |
+-----------------+------------------+---------------------+
| Inetnt Handlers | AMAZON.YesIntent | AMAZON.YesIntent    |
+                 +------------------+---------------------+
|                 | AMAZON.NoIntent  | AMAZON.NoIntent     |
+                 +------------------+---------------------+
|                 |                  | SelectAddressIntent |
+-----------------+------------------+---------------------+

Проверьте ASK-nodejs-1042 * SDK *.Это поможет вам достичь этого с гораздо меньшими усилиями по разработке.

0 голосов
/ 31 января 2019

Правильно используйте атрибуты Session

У вас будут отдельные классы обработчиков для yesintent и nointent.

Когда ваш обработчик whatShouldIEat отправляет вопрос обратно пользователю, ожидающему yes -нет ответа, установите атрибут сеанса lastHandler = whatShouldIEat.

Теперь, когда пользователь ответит, управление придет в yeshandler или nohandler.В этом вы можете проверить из атрибутов сеанса, для чего это да или нет, и вызвать определенный обработчик.Таким образом, вы можете использовать тот же yeshandler, nohandler и для других вопросов.

Теперь вам решать, что вы хотели бы сохранить в атрибутах сеанса, будь то логический флаг, любая переменная или любой объект-обработчик.Цель состоит в том, чтобы идентифицировать последнее действие.

Кроме того, вы можете использовать структуру данных стека, чтобы отслеживать, какой обработчик вызывать в случае, если необходимо выполнить несколько действий.Верхний элемент (обработчик) в стеке сообщит о последнем действии, которое будет вызвано.Следующий элемент после этого сообщит о следующем действии, которое будет вызвано.

...