带有luis和qna对话框的builder.IntentDialog,如果没有正确的匹配nodejs,应调用qna主动学习

时间:2018-07-22 00:00:25

标签: node.js botframework luis qnamaker

我正在尝试将luis与有效的QNA主动学习机器人集成。 我用Luis和QNA对话框创建了意图对话框

var luisRecognizer = new builder.LuisRecognizer(config.luisEndPoint)
luisRecognizer.onFilter(function(context, result, callback) {
  if (result.intent != 'None' && result.score < 0.8) {
    callback(null, { intent: 'None', score: 0});
  } else {
    callback(null, result);
  }
});


const qnaRecognizer = new cognitiveServices.QnAMakerRecognizer({
    knowledgeBaseId: process.env.KBID,
	  endpointHostName: process.env.HOST_NAME,
    authKey: process.env.SUBSCRIPTION_KEY,
    top: 4
});

var feedbackTool = new feedbackTool.FeedbackTool();
bot.library(feedbackTool.createLibrary());

const qnaMakerDialog = new cognitiveServices.QnAMakerDialog({
    recognizers: [qnaRecognizer],
    defaultMessage: DefaultMessageQNA,
    qnaThreshold: qnaThreshold,
    feedbackLib:feedbackTool
});


  var intentsDialog = new builder.IntentDialog({ recognizers: [luisRecognizer, qnaMakerDialog ] });
bot.dialog('/', intentsDialog);

,并且根据luis结果,iam将dailog称为

 intentsDialog.matches("someIntent", [someIntent.getDialog()]);
intentsDialog.matches("anotherIntent", [anotherIntent.getDialog()]);

intentsDialog.matches('qna', [
    function (session, args, next) {
        //problem 1
        qnaMakerDialog.invokeAnswer(session, args, qnaThreshold, defaultMessageQNA)
    }
]);


intentsDialog.onDefault( [
    function (session) {
       //problem 2
       session.send('Sorry, I don\'t know that.');
    }
]);

此代码为有效的QNA提供正确的结果,并根据luis意图将其重定向到适当的对话框。

但是我在上面的代码中面临2个挑战:

  1. 当intentsDialog与qna匹配时,qna没有平直的ans,并提供选择选项。在这种情况下,我无法捕获用户选择的选项并将其发送给qna有效的学习代码。(我将qnaMakerDialog.defaultWaitNextMessage覆盖为将新问题存储到KB)
  2. 当intentsDialog与qna和luis不匹配时,即使在这种情况下,我也希望将数据发送到qna活动学习部分,但无法发送。

还有其他没有使用IntentDialog并将上下文转发到qna的方法吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

对于第一个问题,我认为根本原因可能是您没有将适当的值设置为threshold

请参考https://github.com/Microsoft/BotBuilder-CognitiveServices/blob/master/Node/lib/QnAMakerDialog.js#L74上的源代码:

if (qnaMakerResult.score >= threshold && qnaMakerResult.answers.length > 0) {
            if (this.isConfidentAnswer(qnaMakerResult) || this.qnaMakerTools == null) {
                this.respondFromQnAMakerResult(session, qnaMakerResult);
                this.defaultWaitNextMessage(session, qnaMakerResult);
            }
            else {
                this.qnaFeedbackStep(session, qnaMakerResult);
            }
        }
        else {
            session.send(noMatchMessage);
            this.defaultWaitNextMessage(session, qnaMakerResult);
        }

threshold的默认值为0.3,因此您的问题可能会进入else条件,您可以设置较低的threshold以使您的请求进入{{1 }}。

顺便说一句,主动学习不适用于QnA标记,您可以在https://github.com/Microsoft/BotBuilder/issues/4884上监测问题的进展。

对于第二个问题,您当然可以在常规对话框中使用this.qnaFeedbackStep(session, qnaMakerResult);来实现LUIS和QnA标记机器人。请考虑以下代码段:

UniversalBot