【发布时间】:2017-12-10 06:14:29
【问题描述】:
我打算使用 QnA maker,但它在后台使用 LUIS 吗? 如果问题的提问方式与受过 QnA 制作者培训的方式不同,它会回应吗?
【问题讨论】:
标签: botframework azure-language-understanding qnamaker
我打算使用 QnA maker,但它在后台使用 LUIS 吗? 如果问题的提问方式与受过 QnA 制作者培训的方式不同,它会回应吗?
【问题讨论】:
标签: botframework azure-language-understanding qnamaker
它在后台使用 LUIS 吗?
不,但你可以Combining Search, QnA Maker, and/or LUIS。
根据文档,建议采用以下三种方式来实现 QnA 与 LUIS。
同时调用 QnA Maker 和 LUIS,并使用第一个返回特定阈值分数的信息来响应用户。
首先调用 LUIS,如果没有意图满足特定阈值分数,即触发“无”意图,则调用 QnA Maker。或者,为 QnA Maker 创建一个 LUIS 意图,为您的 LUIS 模型提供映射到“QnAIntent”的示例 QnA 问题。
首先致电 QnA Maker,如果没有答案达到特定阈值分数,则致电 LUIS。
在这里,我发布了一个代码示例,仅适用于用 C# 编写的第三种方法。
在MessagesController 中首先调用 QnA Maker:
if (activity.Type == ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new Dialogs.MyQnADialog());
}
在MyQnADialog中,查看是否有匹配的答案,如果没有,调用LUIS:
[QnAMakerAttribute("QnASubscriptionKey", "QnAKnowledgebaseId", "No Answer in Knowledgebase, seraching in Luis...", 0.5)]
[Serializable]
public class MyQnADialog : QnAMakerDialog
{
protected override async Task DefaultWaitNextMessageAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)
{
if (result.Answers.Count == 0)
{
await context.Forward(new MyLuisDialog(), this.ResumeAfterNewOrderDialog, message, CancellationToken.None);
}
context.Wait(this.MessageReceivedAsync);
//return base.DefaultWaitNextMessageAsync(context, message, result);
}
private async Task ResumeAfterNewOrderDialog(IDialogContext context, IAwaitable<object> result)
{
var resultfromnewdialog = await result;
context.Wait(this.MessageReceivedAsync);
}
}
【讨论】:
QnA 不使用 LUIS 或意图识别,而是使用 n-gram 来检测相似性,就像文档中用来说明的那样。
自 MS Build 2018 起,您可以使用 LUIS 调度应用。它允许您将多个 LUIS 应用程序和 QnA 知识库合并到一个调度应用程序中。这意味着将用户输入发送到 LUIS 和 QnA,或者根据置信度分数以特定顺序发送应该成为过去。
您拨打的第一个电话是针对 LUIS 调度应用的。结果将告诉您是否需要联系儿童 luis 应用程序,或者更确切地说是 QnA 知识库。它可以执行此操作,因为 LUIS 调度应用程序的话语充满了来自 QnA 知识库的话语。您可以向此调度添加多个 LUIS 应用和/或 QnA 知识库。
我建议查看 Bot Builder 调度工具 (CLI)。
【讨论】: