如何解决带有上下文的 QnA Maker 调用不起作用
我无法让 QnA Maker 提示按钮正常工作。我正在像这样进行标准的 QnA Maker REST 调用:
if (qnAcontext == null) {
qnAcontext = {
PreviousQnaId: 0,PreviousUserQuery: null
}
}
console.log(qnAcontext);
const qnaResult = await request({
url: url,method: 'POST',headers: headers,json: {
question: query,top: 3,context: qnAcontext
}
});
机器人正确获取 qnAcontext 并将其包含在 POST 请求中。我可以看到这些值略有不同。例如。如果我在没有上下文的情况下输入提示,它会以 32.2% 的置信度返回,如果我添加上下文,它会更高,但只有 38.64%。这远低于向用户显示答案所需的分数。
如果我在 QnA Maker 测试面板中执行此操作,后续将返回 100%。根据 this help article 中的注释,这似乎是通过在服务中传递 prompt 的 qnaId 来完成的。但是,如果用户还没有选择它,我怎么知道这个 ID?提示生成到英雄卡中,我在生成卡时确实有 qnaId,但我不知道这有什么用。这是我生成提示按钮的方法:
var buttons = [];
prompts.forEach(element => {
buttons.push({
value: element.displayText,type: ActionTypes.ImBack,title: element.displayText
});
});
var heroCard = CardFactory.heroCard(
cardTitle,cardText,[],CardFactory.actions(buttons));
我想我可以对上一个问题进行单独调用并找到提交查询的 qnaId 但这似乎是不必要的开销。肯定有可能只用文本和上一个问题从 QnA Maker 中得到正确的结果吗?
编辑:我确实使用以下代码实现了这一点,但延迟绝对是明显的。我必须想象有更好的方法来完成这个......
if (qnAcontext == null) {
var qnaResult = await request({
url: url,json: {
question: query,context: qnAcontext
}
});
} else {
var firstResult = await request({
url: url,json: {
question: qnAcontext.PreviousUserQuery
}
});
var prompt = firstResult.answers[0].context.prompts.find(e => { return e.displayText == query });
var qnaResult = await request({
url: url,json: {
qnaId: prompt.qnaId
}
});
}
解决方法
实际上不需要 QnaContext。您只需要传递随后续提示提供的 qnaId。只需进行一些小的调整,您就几乎可以使用了。
假设您使用 Teams 作为您的频道,则使用 messageBack 功能,而不是 imBack。
messageBack 让你发送额外的数据
- 将一组文本回显到屏幕上
- 将单独的数据发送到机器人进行处理(在前端不可见),其中可以包括您的 qnaid 以进行后续问题。
根据您上面的代码示例,假设您已经掌握了提示的句柄,只需稍作改动:
prompts.forEach(element => {
buttons.push({
type: ActionTypes.messageBack,title: element.displayText
displayText: "<optional - echo text to conversation>",text: "User just clicked the MessageBack button",value: {
"qnaId": element.qnaid
}
});
});
单击按钮时,活动中会返回一个名为 qnaId 的附加字段。
回复 JSON 将如下所示:(数据是虚拟数据)
{
"text":"User just clicked the MessageBack button","value":{
"qnaId":"6"
},.... SNIP ....
"channelData":{
"channel":{
"id":"19:malejcou081i20ojmlcau0@thread.skype"
},"team":{
"id":"19:12d021jdoijsaeoaue0u@thread.skype"
},"tenant":{
"id":"bec8e231-67ad-484e-87f4-3e5438390a77"
}
},"replyToId": "1575667808184",}
因此,假设我们将 activity.value.qnaid 中的 qnaId 分配给名为 followUpQnaId 的属性
var qnaResult = await request({
url: url,method: 'POST',headers: headers,json: {
qnaId: followUpQnaId
}
});
请看这里:CardActions - messageBack
这意味着对于每个提示,您只有一个呼叫将卡片发送给带有嵌入式 qnaid 的用户,然后当他们回答时,您使用 qnaid 要求精确匹配跟进。它应该会减少您看到的延迟。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。