По умолчанию 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правильно или у вас были такие переживания?Или вы можете определить проблему?Я предположил проблемы с синхронизацией / асинхронными вызовами, а также добавил обещания, но то же самое произошло ...
Спасибо