我正在尝试关闭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>
{
}
我试图重写start async方法,以便如果用户键入“ done”但QnA maker根本无法启动,那么它将使用context.done(0)退出对话框。
为什么为什么通过使用“ FAQ”调用luis intent,它也试图进入知识库,而无需用户再次输入?是否有可能解决该问题?
答案 0 :(得分:1)
我正在尝试关闭QnAMaker对话框,以便用户可以返回到Luis对话框并再次使用它。
您可以尝试覆盖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);
}
测试结果: