Бесконечный цикл в dialogflow v2 detectIntent после разделения одного входного запроса на два - PullRequest
0 голосов
/ 26 августа 2018

По умолчанию Dialogflow может соответствовать только одному назначению на один вход:

например,
User asks: "How are you?"
Dialogflow Agent responds: "I am feeling good!"
(Matched intent: intents.howareyou)

Но как только пользователь задает два вопроса в одном входе, агент не может совпасть с несколькими намерениями.Только одно намерение соответствует меньшему доверительному интервалу) например,
User asks: "How are you? Do we want to go shopping?"
Dialogflow Agent responds: "Yes, lets go shopping!"
(Matched intent: intents.shopping)

Теперь есть два варианта включенияагент отвечает на оба вопроса одним входом:

  • Создайте намерение и дайте агенту возможность ответить именно на эти два вопроса.
    => Это очень плохое решение, как только вы добавите ещевозможные вопросы / намерения.Затем вам нужно будет создать каждую комбинацию для каждого вопроса.
  • Разделить один вход на несколько запросов и позволить агенту снова выполнить сопоставление намерений для разделенного запроса.
    => Это предпочтительный способ

Основано на некоторых блогах в Интернете (например, https://docs.meya.ai/docs/handle-multiple-intents-in). Второй вариант - это то, что я сделал.

Заданное по умолчанию резервное намерение настроено на использование веб-крюка Fulfillment иВыполнена небольшая часть кода:

function parseMultipleIntents (agent) {
const query = agent.query;
var pattern= /(.+?[!.?]+)/gm;
var match = pattern.exec(query);

 while (match !== null) {
  console.log(match[0]);
  handleQuery(match[0]);  //<----
  match = pattern.exec(query);
 }
}

Метод handleQuery является фактическим методом, в котором обрабатываются разделенные запросы:

function handleQuery(query){
    console.log(query);
    // The path to identify the agent that owns the created intent.
    const sessionPath = sessionClient.sessionPath("PROJECT_ID", "FIXED_SESSION_ID");

      const request = {
        session: sessionPath,
        queryInput: {
          text: {
            text: query,
            languageCode: 'de',
          },
        },
      };

    sessionClient
      .detectIntent(request)
       .then(responses => {
                console.log('Detected intent');
                const result = responses[0].queryResult;
                console.log(`  Query: ${result.queryText}`);
                console.log(`  Response: ${result.fulfillmentText}`);
                if (result.intent) {
                  console.log(`  Intent: ${result.intent.displayName}`);
                } else {
                  console.log(`  No intent matched.`);
                }
              })
              .catch(err => {
                console.error('ERROR:', err);
              });
}

Проблема: если я все комментирую вметод handleQuery за исключением console.log(query);, тогда выход консоли в консоли Firebase выглядит нормально:

originalQuery: und?warum?
11:39:58.240 PM dialogflowFirebaseFulfillment warum?
11:39:58.238 PM dialogflowFirebaseFulfillment und?

Но как только яраскомментируйте оставшуюся часть handleQuery, и код будет выглядеть так, как показано выше, я получаю следующие сообщения консоли, которые не останавливаются. Сообщения переходят в единицу, если я прокручиваю консоль. Это похоже на какой-то цикл:

-

-

Использую ли я DeteIntentправильно или у вас были такие переживания?Или вы можете определить проблему?Я предположил проблемы с синхронизацией / асинхронными вызовами, а также добавил обещания, но то же самое произошло ...

Спасибо

...