只要意图为“无”,就需要从“主对话框”中调用QnA机器人, 我们可以这样做还是可以通过调度程序完成?
在MainDialog中: 我添加了像: AddDialog(新的QnABot(userState)); ---像这样,我叫其他对话框。
并以“无”意图调用,例如: 等待stepContext.BeginDialogAsync(nameof(QnABot),CancellationToken);
我们可以从MainDialog调用QnA bot还是使用Dispatcher是更好的选择?
答案 0 :(得分:0)
调度的目的是处理到多个LUIS或QnA模型的路由。例如,如果您有2个QnA模型(其中一个用于模拟“您好吗?”和“您是人类吗?”之类的聊天工具,另一个用于诸如“我如何预约”之类的常见问题解答)和1个LUIS模型,那么您会派遣所有这一切。从深处看,调度只是一种幻想的LUIS模型。它返回一个简单的模型名称,而不是实际的答复,然后使用该答复来调用QnA。
在我的机器人逻辑中,所有以“无”意图结束的事情都将返回“无”。这是从Dispatch获取意图的方法:
// Check dispatch result
var dispatchResult = await cognitiveModels.DispatchService.RecognizeAsync<DispatchLuis>(dc.Context, CancellationToken.None);
var intent = dispatchResult.TopIntent().intent;
这是我用它来调用QnA的方法(使用“无”意图):
else if (intent == DispatchLuis.Intent.None)
{
cognitiveModels.QnAServices.TryGetValue("faq", out var qnaService);
if (qnaService == null)
{
throw new Exception("The specified QnA Maker Service could not be found in your Bot Services configuration.");
}
else
{
var answers = await qnaService.GetAnswersAsync(dc.Context, null, null);
if (answers != null && answers.Count() > 0)
{
await dc.Context.SendActivityAsync(answers[0].Answer, speak: answers[0].Answer);
}
else
{
await _responder.ReplyWith(dc.Context, MainResponses.ResponseIds.Confused);
}
}
}
这些示例都是从Botframework-Solution's Virtual Assistant Bot中提取的。我还将看看this doc中有关语言理解的工作原理。
顺便说一句,我建议不要将对话框命名为“ --bot”,因为从长远来看,您将使自己感到困惑。