我们可以从主对话框中调用QnA机器人(用于空意图)还是需要使用调度程序?

时间:2019-07-19 16:43:06

标签: c# botframework

只要意图为“无”,就需要从“主对话框”中调用QnA机器人, 我们可以这样做还是可以通过调度程序完成?

在MainDialog中: 我添加了像: AddDialog(新的QnABot(userState)); ---像这样,我叫其他对话框。

并以“无”意图调用,例如: 等待stepContext.BeginDialogAsync(nameof(QnABot),CancellationToken);

我们可以从MainDialog调用QnA bot还是使用Dispatcher是更好的选择?

1 个答案:

答案 0 :(得分:0)

调度的目的是处理到多个LUIS或QnA模型的路由。例如,如果您有2个QnA模型(其中一个用于模拟“您好吗?”和“您是人类吗?”之类的聊天工具,另一个用于诸如“我如何预约”之类的常见问题解答)和1个LUIS模型,那么您会派遣所有这一切。从深处看,调度只是一种幻想的LUIS模型。它返回一个简单的模型名称,而不是实际的答复,然后使用该答复来调用QnA。

对于您的示例,我将使用调度,是的。 picture of dispatch model

在我的机器人逻辑中,所有以“无”意图结束的事情都将返回“无”。这是从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”,因为从长远来看,您将使自己感到困惑。