Как использовать процесс водопада в Nodejs с помощью LUIS

У меня создано приложение LUIS с 1 намерением (заказ пиццы) и 9 объектами (заказ, вид, подпись, размер, начинки, адрес, время, продолжительность, диапазон).

Мне нужно создать бота в Azure Bot Framework. Я не могу понять и использовать водопад для всех сущностей. Пожалуйста, дайте мне знать, как это сделать

Код:

 dialog.matches('OrderPizza', [
 function (session, args, next) {

   var order = builder.EntityRecognizer.findEntity(args.entities, 'order');
   var kind = builder.EntityRecognizer.findEntity(args.entities, 'Kind');
   session.dialogData.intentScore = args.score;

   if (!order) {
       builder.Prompts.text(session, 'welcome please order pizza');
   } else {
       session.dialogData.order = order;
       next();
   }
 },
 function (session, results) {
   var order = session.dialogData.order;
   if (results.response) {
       session.send('what kind?');
   }else{
       session.send(`we don't have that kind of pizza`);
   }
 }

    ]);

Как продвинуться дальше для других сущностей?


person Anagha    schedule 14.06.2017    source источник
comment
Попробуйте документацию   -  person stuartd    schedule 14.06.2017
comment
Спасибо, попробовал. Но может написать только 2 функции. После чего он не выполняется   -  person Anagha    schedule 14.06.2017


Ответы (1)


Я не уверен, что вы имеете в виду, говоря, что можете написать только 2 функции; но если вы пытаетесь вызвать LUIS внутри своего диалога, вы можете следовать этому примеру . Вы вызовете LuisRecognizer внутри ступени водопада на session.message.text. Фрагмент из примера ниже:

builder.LuisRecognizer.recognize(session.message.text, '<model url>', function (err, intents, entities) {
   if (entities) {
     var entity = builder.EntityRecognizer.findEntity(entities, 'TYPE');
     // do something with entity...
   }
});

Это позволит вам вызывать LUIS внутри водопада для распознавания сообщений вашего пользователя.

Что касается вашего кода, есть ряд проблем:

// Original Code
dialog.matches('OrderPizza', [
  function (session, args, next) {
   var order = builder.EntityRecognizer.findEntity(args.entities, 'order');
   var kind = builder.EntityRecognizer.findEntity(args.entities, 'Kind');
   session.dialogData.intentScore = args.score;

   if (!order) { // What about kind?
       builder.Prompts.text(session, 'welcome please order pizza');
   } else {
       session.dialogData.order = order; // What about kind?
       next();
   }
 },
 function (session, results) {
   var order = session.dialogData.order;
   if (results.response) {
       session.send('what kind?');
   }else{
       session.send(`we don't have that kind of pizza`);
   }
 }
]); 

На первом этапе водопада вы не сохраняете объект "Kind" в свой dialogData.

function (session, args, next) {
  var order = builder.EntityRecognizer.findEntity(args.entities, 'order');
  var kind = builder.EntityRecognizer.findEntity(args.entities, 'Kind');
  session.dialogData.intentScore = args.score;

  if (kind) {
    session.dialogData.kind = kind;
  }

  if (!order) {
    builder.Prompts.text(session, 'welcome please order pizza');
  } else {
     session.dialogData.order = order;
     next();
  }
}

На втором этапе водопада вы не вызываете next и не отправляете Prompt пользователю, что приводит к зависанию после двух функций.

function (session, results, next) {
  var order = session.dialogData.order ? session.dialogData.order : results.response;
  var kind = session.dialogData.kind;

  if (results.response && !kind) {
    builder.Prompts.text(session, 'what kind?');
  } else {
    session.send('we don\'t have that kind of pizza');
    next();
  }
}
person Steven G.    schedule 14.06.2017