最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Botmaker解决Qnamaker后续问题

IT培训 admin 1浏览 0评论

Botmaker解决Qnamaker后续问题

对于我当前的项目,我尝试使用仅上下文跟踪提示。

我的问题是,后续提示中的某些问题是相同的。

在qna ui中,上下文的分隔很好,但是当用户从我在应用程序中实现的聊天中回答问题时,qna返回错误的答案。

产品编号:Botbuilder版本:4.5.3NodeJS:12.10.0

onMessage(){.....

let results = qna.getAnswer(context);
if(results[0].context.prompts.length){ //  Answer with Follow-up
      return context.sendActivity(CardHelper.GetHeroCard(results[0].answer, results[0].context.prompts))
   }else{ // normal answer
      return context.sendActivity(results[0].answer)
   }
}
回答如下:

首先要了解的是,多轮对话和后续提示在预览中。通常,这意味着人们应该期待错误和功能缺失。在这种情况下,这意味着该功能不仅在SDK中缺失,甚至在API参考中甚至缺失。您可以在Generate Answer reference中看到对generateAnswer端点的调用在其主体中包含context属性,但是该对象的类型未记录。它链接到在响应中返回的Context对象类型,而不是您应该在请求中输入的对象类型。

由于您的问题提到CardHelper.GetHeroCard,所以我想您已经对QnA Maker prompting sample很熟悉。在这种情况下,这正是您应该向希望帮助您的人们提供的自愿信息。忽略这些信息会削弱我们回答您问题的能力。将来,您应该链接到您到现在所用的所有资源,以帮助您的助手并为他们提供背景信息。

[如果您偶然不熟悉该示例,则它是QnA Maker中多回合对话的最终真理来源。该示例包含问题的完整答案,因此我不确定为什么不使用它。但是,您还应该在the documentation you should be following中看到需要执行的操作:

返回非初始答案和后续提示的JSON请求

填充context对象以包含先前的上下文。

在以下JSON请求中,当前问题为使用Windows Hello登录],上一个问题为帐户和登录

{
  "question": "Use Windows Hello to sign in",
  "top": 10,
  "userId": "Default",
  "isTest": false,
  "qnaId": 17,
  "context": {
    "previousQnAId": 15,
    "previousUserQuery": "accounts and signing in"
  }
}

QnA Maker不会自行保存任何状态,因此它取决于您的机器人为其提供上一回合的上下文。您的机器人没有这样做,这就是为什么它不起作用。这是示例代码的简化版本,可帮助您了解需要执行的操作:

async testQnAMaker(turnContext) {
    var qna = new QnAMaker({
        knowledgeBaseId: '<GUID>',
        endpointKey: '<GUID>',
        host: 'https://<APPNAME>.azurewebsites/qnamaker'
    });

    var context = await this.qnaState.get(turnContext) || {
        PreviousQnaId: 0,
        PreviousUserQuery: null
    };

    // We're passing a context property into the QnAMakerOptions
    // even though it's not part of the interface yet
    var results = await qna.getAnswers(turnContext, { context });
    var firstResult = results[0];

    if (firstResult) {
        var answer = firstResult.answer;
        var resultContext = firstResult.context;
        var prompts = resultContext && resultContext.prompts;

        if (prompts && prompts.length) {
            await this.qnaState.set(turnContext, {
                PreviousQnaId: firstResult.id,
                PreviousUserQuery: turnContext.activity.text
            });

            answer = ChoiceFactory.forChannel(
                turnContext,
                prompts.map(prompt => prompt.displayText),
                answer);
        }

        await turnContext.sendActivity(answer);
    } else {
        await turnContext.sendActivity("I can't answer that");
    }
}

由于您使用的是当前正在预览的功能,因此在弄清楚如何使用它时,您需要使用自己的独创性。我只是使用状态属性访问器在每个回合中保存上一个问题的上下文,但是您很可能希望将其构建到对话框中,并将每个用户查询保存为对话框状态。关键是,如果您希望后续提示起作用,则必须保存QnA Maker状态。

Botmaker解决Qnamaker后续问题

对于我当前的项目,我尝试使用仅上下文跟踪提示。

我的问题是,后续提示中的某些问题是相同的。

在qna ui中,上下文的分隔很好,但是当用户从我在应用程序中实现的聊天中回答问题时,qna返回错误的答案。

产品编号:Botbuilder版本:4.5.3NodeJS:12.10.0

onMessage(){.....

let results = qna.getAnswer(context);
if(results[0].context.prompts.length){ //  Answer with Follow-up
      return context.sendActivity(CardHelper.GetHeroCard(results[0].answer, results[0].context.prompts))
   }else{ // normal answer
      return context.sendActivity(results[0].answer)
   }
}
回答如下:

首先要了解的是,多轮对话和后续提示在预览中。通常,这意味着人们应该期待错误和功能缺失。在这种情况下,这意味着该功能不仅在SDK中缺失,甚至在API参考中甚至缺失。您可以在Generate Answer reference中看到对generateAnswer端点的调用在其主体中包含context属性,但是该对象的类型未记录。它链接到在响应中返回的Context对象类型,而不是您应该在请求中输入的对象类型。

由于您的问题提到CardHelper.GetHeroCard,所以我想您已经对QnA Maker prompting sample很熟悉。在这种情况下,这正是您应该向希望帮助您的人们提供的自愿信息。忽略这些信息会削弱我们回答您问题的能力。将来,您应该链接到您到现在所用的所有资源,以帮助您的助手并为他们提供背景信息。

[如果您偶然不熟悉该示例,则它是QnA Maker中多回合对话的最终真理来源。该示例包含问题的完整答案,因此我不确定为什么不使用它。但是,您还应该在the documentation you should be following中看到需要执行的操作:

返回非初始答案和后续提示的JSON请求

填充context对象以包含先前的上下文。

在以下JSON请求中,当前问题为使用Windows Hello登录],上一个问题为帐户和登录

{
  "question": "Use Windows Hello to sign in",
  "top": 10,
  "userId": "Default",
  "isTest": false,
  "qnaId": 17,
  "context": {
    "previousQnAId": 15,
    "previousUserQuery": "accounts and signing in"
  }
}

QnA Maker不会自行保存任何状态,因此它取决于您的机器人为其提供上一回合的上下文。您的机器人没有这样做,这就是为什么它不起作用。这是示例代码的简化版本,可帮助您了解需要执行的操作:

async testQnAMaker(turnContext) {
    var qna = new QnAMaker({
        knowledgeBaseId: '<GUID>',
        endpointKey: '<GUID>',
        host: 'https://<APPNAME>.azurewebsites/qnamaker'
    });

    var context = await this.qnaState.get(turnContext) || {
        PreviousQnaId: 0,
        PreviousUserQuery: null
    };

    // We're passing a context property into the QnAMakerOptions
    // even though it's not part of the interface yet
    var results = await qna.getAnswers(turnContext, { context });
    var firstResult = results[0];

    if (firstResult) {
        var answer = firstResult.answer;
        var resultContext = firstResult.context;
        var prompts = resultContext && resultContext.prompts;

        if (prompts && prompts.length) {
            await this.qnaState.set(turnContext, {
                PreviousQnaId: firstResult.id,
                PreviousUserQuery: turnContext.activity.text
            });

            answer = ChoiceFactory.forChannel(
                turnContext,
                prompts.map(prompt => prompt.displayText),
                answer);
        }

        await turnContext.sendActivity(answer);
    } else {
        await turnContext.sendActivity("I can't answer that");
    }
}

由于您使用的是当前正在预览的功能,因此在弄清楚如何使用它时,您需要使用自己的独创性。我只是使用状态属性访问器在每个回合中保存上一个问题的上下文,但是您很可能希望将其构建到对话框中,并将每个用户查询保存为对话框状态。关键是,如果您希望后续提示起作用,则必须保存QnA Maker状态。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论