如何关闭 QnAMaker 对话框?

how to close a QnAMaker dialog?

我正在尝试关闭 QnAMaker 对话框,以便用户可以返回到 Luis 对话框并再次使用它。

这是我使用的代码 在 luisdialog.cs:

    [LuisIntent("FAQ")]
    public async Task FAQ(IDialogContext context, LuisResult result)
    {
        await context.PostAsync("FAQ");
        var userQuestion = (context.Activity as Activity).Text;
        await context.Forward(new QnADialog(), ResumeAfterQnA, context.Activity, CancellationToken.None);

        //await Task.Run(() => context.Call(new QnADialog(), Callback));
    }
    private async Task ResumeAfterQnA(IDialogContext context, IAwaitable<object> result)
    {
        context.Done<object>(null);
    }

这里是 QnA 对话框:

[Serializable]
[QnAMakerService("endpoint", "knowledge base id", "subscription key")]
public class QnADialog : QnAMakerDialog<object>
{

}

我试图覆盖启动异步方法,以便在用户键入 "done" 时使用 context.done(0) 退出对话框,但 QnA maker 根本没有启动令人困惑。

另外,为什么通过使用 "FAQ" 调用 luis 意图,它还试图在用户不再次输入的情况下进入知识库,是否可以解决这个问题?

I am trying to closing a QnAMaker dialog so that user can go back to the Luis dialog and use it again.

您可以尝试覆盖 DefaultMatchHandler 并调用 context.Done 以关闭 QnAMaker 对话框并将控制权交还给父对话框。以下修改后的代码片段对我有用,请参考。

在 LuisDialog 中:

[LuisIntent("FAQ")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
    await context.PostAsync("FAQ");
    await context.Forward(new QnADialog(), ResumeAfterQnA, context.Activity, CancellationToken.None);
}

private async Task ResumeAfterQnA(IDialogContext context, IAwaitable<object> result)
{
    //context.Done<object>(null);
    context.Wait(MessageReceived);
}

在 QnADialog 中:

public override async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
{
    await context.PostAsync($"I found {result.Answers.Length} answer(s) that might help...{result.Answers.First().Answer}.");
    context.Done(true);
}

测试结果: