Как получить событие подтверждения для запуска правильного намерения диалогового потока

#javascript #dialogflow-es #actions-on-google

# #javascript #dialogflow-es #действия в Google

Вопрос:

Я работаю над агентом Dialogflow, кодирую на Javascript и размещаю свой код на функциях Firebase. Агент на шведском языке, если это уместно, но я перевел разговоры на английский здесь, чтобы вам было проще. У меня много проблем с пониманием того, что я делаю неправильно при использовании помощника по подтверждению действий в Google.

Это текущее состояние моего намерения подтверждения: когда пользователь отвечает «да» или любым его синонимом, код работает как ожидалось, но «нет» или подобное вместо этого запускают резервное намерение.

В Dialogflow я указал правильные входные контексты (выходные контексты обрабатываются в webhook), а также разрешенные вызовы webhook. Я добавил actions.intent.ПОДТВЕРЖДЕНИЕ как событие в намерении подтверждения (намерение, которое должно быть инициировано пользователем, говорящим «да» или «нет»), и у меня есть обучающие фразы, которые все являются синонимами yes . Если я полностью удалю обучающие фразы, «да» также запускает резервное намерение, что заставляет меня думать, что событие подтверждения никогда не запускается или запускается неправильно. Если я добавлю синонимы no к обучающим фразам, «нет» от пользователя интерпретируется как «да».

Код в webhook выглядит в основном так (сохраняется только соответствующий код из-за NDA, второе намерение является асинхронным из-за вызовов API, происходящих между пользовательским вводом и ответом приложения):

 const setContext = (context, conv) => {
    conv.data.fallbackCount = 0;
    conv.contexts.set(context, 2);
};
const clearContext = (context, conv) => {
    conv.data.fallbackCount = 0;
    conv.contexts.set(context, 0);
};

app.intent(intents.correct, (conv) => {
    clearContext(contexts.what_help, conv);
    setContext(contexts.results_confirm, conv);
    conv.ask(new Confirmation("can you confirm?"));
});

app.intent(intents.results_confirm, async (conv, params, confirmation) => {
    clearContext(contexts.results_confirm, conv);
    if (confirmation) {
        //API-call
        setContext(contexts.dividend_confirm, conv);
        conv.ask(/*Dialog built by the API-call*/);
    } else {
        setContext(contexts.what_help, conv);
        conv.ask("ok, can I help with something else?");
    }
});
 

Когда пользователь отвечает «да», значение подтверждения во втором намерении равно «да», если пользователь отвечает «нет», намерение никогда не срабатывает, и пользователь отправляется на резервное намерение.

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


Редактировать: в настоящее время я решил проблему, добавив отдельные намерения «да» и «нет» и направляя пользователя к ним с помощью контекстов. Похоже, должен быть способ избежать подобных вещей, но если у кого-то такая же проблема, как у меня, это единственное решение, которое я нашел до сих пор. Мне все еще очень интересно узнать больше о событиях подтверждения, если кто-нибудь может объяснить, что я сделал не так в моем первоначальном решении, поэтому я пишу это как редактирование вместо ответа.

Комментарии:

1. Испытываете ли вы такое же поведение с синонимами «нет»?

2. Если я изменю обучающие фразы на «no»-синонимы, Dialogflow не поймет, что «да», а «нет» выполняет код в блоке «if (confirmation) {}», а не код в else {}.