我尝试在QnAMaker中使用后续提示,但我对“后续提示”创建对话框中标记为“显示文本”的字段的用途感到困惑。https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/how-to/multiturn-conversation将此字段描述为“在后续提示中显示的自定义文本。”对我来说,这意味着它只是一个后续提示的标签,通常呈现为一个按钮。因此,我假设文本除了作为标签之外没有其他用途,并且按钮将直接链接到所选的问题/答案对。但是,从QnAMaker知识库的实验来看,似乎“显示文本”实际上传递给了QnAMaker服务,并且该文本用于搜索答案。这意味着为了标记按钮和成功找到后续答案,必须选择"Display text“值。
这意味着我不能使用简短的后续提示,比如“我该如何付款?”或者“我如何加入它?”其中,主Q/A对与各种服务之一相关,因为这些字符串不会可靠地返回预期的答案。相反,提示必须是更冗长的“我如何为服务A付费”和“我如何加入服务A”。
我对此理解正确了吗?我认为文档并没有把这一点说清楚...
发布于 2019-10-03 06:09:50
多轮QnA Maker对话仍在预览中,目前还没有SDK可以帮助你构建一个知道如何与后续提示API交互的机器人。你最终掌握了控制权,所以你可以让你的机器人随心所欲地处理显示的文本。所有“显示文本”都是一个值,您已将其插入到知识库中的答案中,以便在调用generateAnswer后将其与答案一起返回。
让您的显示文本与您要链接的问题的文本相匹配非常有用,因为只要QnA调用中包含上下文,就可以使用提示符的显示文本来访问正确的后续API对。这就是在this sample中发生的事情。听起来你想让它工作,而不是让提示符的显示文本与后续问题的文本相匹配。这可能会变得棘手,但这是您可以做的事情。
请记住,在进行后续提示时,您指定的不仅仅是显示文本。您还可以链接到特定的QnA对。这允许应用编程接口将该QnA ID与显示的文本一起返回给您。您还没有提到您的机器人针对的是哪个通道,但是如果您使用的是支持postBack或messageBack操作的通道,那么您可以将QnA ID以不可见的方式传递给您的机器人,然后您的机器人可以使用它来访问答案。如果采用这种方式,您可能甚至不需要担心对话框或状态。您也没有提到您正在用什么语言编写您的机器人,但这里有一个如何在Node.js中实现的示例:
async testQnAMaker(turnContext) {
var qna = new QnAMaker({
knowledgeBaseId: '<GUID>',
endpointKey: '<GUID>',
host: 'https://<APPNAME>.azurewebsites.net/qnamaker'
});
var value = turnContext.activity.value;
var qnaId = value && value.qnaId;
// qnaId will be undefined if value is empty
var results = await qna.getAnswers(turnContext, { qnaId });
var firstResult = results[0];
if (firstResult) {
var answer = firstResult.answer;
var resultContext = firstResult.context;
var prompts = resultContext && resultContext.prompts;
if (prompts && prompts.length) {
var card = CardFactory.heroCard(
answer,
[],
prompts.map(prompt => ({
type: 'messageBack',
title: prompt.displayText,
displayText: prompt.displayText,
text: prompt.displayText,
value: { qnaId: prompt.qnaId }
}))
);
answer = MessageFactory.attachment(card);
}
await turnContext.sendActivity(answer);
} else {
await turnContext.sendActivity("I can't answer that");
}
}请注意,这确实有一些限制。因为它是通过从活动的value属性检索QnA ID来工作的,所以如果用户手动键入按钮的文本而不是单击按钮,它可能无法找到正确的QnA对。
如果要使显示文本独立工作,而不依赖于QnA ID,则可以保存自己的映射,以便机器人知道每个上下文中每个QnA ID对应的显示文本值。但是,您也可以考虑仅添加显示文本作为QnA对中问题的另一种表达方式。因此,“我如何为服务A付费”和“我如何为服务B付费”都可以用“我如何为它付费”作为问题的一种形式。因为现在在多个QnA对中有重复的短语,所以需要将调用中的上下文传递给generateAnswer,这样才能正常工作。
有关多轮对话的更多信息,请参阅this answer。
https://stackoverflow.com/questions/58203069
复制相似问题