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)
- 暂无评论