【问题标题】:builder.IntentDialog with luis and qna dialogs, should call qna active learning if doesnt have proper match nodejs带有 luis 和 qna 对话框的 builder.IntentDialog,如果没有适当的匹配 nodejs,则应调用 qna 主动学习
【发布时间】:2018-12-29 20:30:21
【问题描述】:

我正在尝试将 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 结果,我将 dailogs 称为

 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 意图重定向到适当的对话框。

但我在上述代码中面临两个挑战:

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

有没有其他方法,比如不使用 IntentDialog 并将上下文转发到 qna。提前致谢。

【问题讨论】:

    标签: node.js botframework azure-language-understanding qnamaker


    【解决方案1】:

    对于您的第一个问题,我认为根本原因可能是您没有将适当的值设置为 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让你的请求进入this.qnaFeedbackStep(session, qnaMakerResult);。

    顺便说一句,主动学习不适用于 QnA 标记,您可以通过 https://github.com/Microsoft/BotBuilder/issues/4884 监控问题以了解任何进展。

    对于第二个问题,您当然可以使用UniversalBot 和普通对话框来实现 LUIS 和 QnA 标记机器人。请考虑以下代码sn-p:

    var luisAppUrl = '<luisAppUrl >';
    
    var luisRecognizer = new builder.LuisRecognizer(luisAppUrl)
    bot.recognizer(luisRecognizer);
    
    var recognizer = new cognitiveservices.QnAMakerRecognizer({
        knowledgeBaseId: '<knowledgeBaseId>',
        authKey: '<authKey>',
        endpointHostName: "https://<your host name>.azurewebsites.net/qnamaker",
        top: 3,
    });
    
    var basicQnAMakerDialog = new cognitiveservices.QnAMakerDialog({
        recognizers: [recognizer],
        defaultMessage: 'No match! Try changing the query terms!',
        qnaThreshold: 0.1,
        feedbackLib: customQnAMakerTools,
    });
    
    bot.dialog('kb', basicQnAMakerDialog);
    bot.dialog('QnADetect',[(session,args,next)=>{
        session.replaceDialog('kb', args)
    }]).triggerAction({
        matches: 'qna'
     })
    

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      相关资源
      最近更新 更多