集成 QnAMaker 和 Luis - 异常堆栈为空

Integrating QnAMaker and Luis - Exception Stack is empty

如果意图是 none,则使用 Luis 对话框,我想转发到 QnAMakerDialog 以匹配 QnAPair。

如果找到对,return 答案和 return 到 luis 堆栈。如果一对未发送消息 "Sorry I don't know that" 和 return 到 luis 堆栈等待另一条消息。

我已成功收到 await context.Forward(qnaDialog, AfterQnADialog, messageToForward, CancellationToken.None) 的回复。在响应 returned 之后,模拟器抛出 Exception Stack is empty [File Type 'text/plain']

我认为错误在 AfterQnADialog 中,但不确定如何修复它。预先感谢您的帮助。

消息控制器*

if (activity.Type == ActivityTypes.Message)
    {
       await Conversation.SendAsync(activity, () => new Dialogs.RootLuisDialog());
    }

Luis Dialog Class

[LuisIntent("")]
[LuisIntent("None")]    
public async Task None(IDialogContext context, IAwaitable<IMessageActivity> message ,LuisResult result)
    {

        var qnaDialog = new QnADialog();
        var messageToForward = await message;
        await context.Forward(qnaDialog, AfterQnADialog, messageToForward, CancellationToken.None);

    }

...

private async Task AfterQnADialog(IDialogContext context, IAwaitable<object> result)
   {
        var messageHandled = await result;

        if (messageHandled == null)
        {
            await context.PostAsync("I’m not sure what you want.");
        }

        context.Wait(this.MessageReceived);
    }

QnAMakerDialog Class

    [QnAMaker("<QnAMakerAppID", "QnAMakerApiKey", "I don't understand this right now! Try another query!", 0.10, 1)]
    public class QnADialog : QnAMakerDialog
    { 

    }
}

我用下面的示例代码进行了测试,如果没有匹配的意图,我会从 LUIS 对话框将消息转发到 QnAMakerDialog,这对我有用,你可以参考它。

在 LUIS 对话框中:

[LuisIntent("None")]
public async Task NoneIntent(IDialogContext context, LuisResult result)
{

    await context.Forward(new QnADialog(), AfterQnADialog, context.Activity, CancellationToken.None);
}

QnAMakerDialog:

using Microsoft.Bot.Builder.Dialogs;
using QnAMakerDialog;
using QnAMakerDialog.Models;
using System;
using System.Linq;
using System.Threading.Tasks;


namespace HalChatBot.Dialogs
{

    [Serializable]
    [QnAMakerService("{subscriptionKey_here}", "{ knowledgeBaseId_here}")]
    public class QnADialog : QnAMakerDialog<object>
    {
        public override async Task NoMatchHandler(IDialogContext context, string originalQueryText)
        {
            await context.PostAsync($"Sorry, I couldn't find an answer for '{originalQueryText}'.");
            context.Done(false);
        }

        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);
        }
    }

注意:我收到相同的异常消息:"Stack is empty" 如果我不覆盖 NoMatchHandler 并调用 context.Done 将控制传递回父对话框。

更新:

您似乎正在使用 Microsoft.Bot.Builder.CognitiveServices.QnAMaker in your project. If that is the case, you do not need to install QnAMakerDialog。为避免 "Stack is empty" 错误,您可以覆盖 RespondFromQnAMakerResultAsync 并调用 context.Done 将控制权交还给父对话框。

[Serializable]
[QnAMaker("{subscriptionKey_here}", "{knowledgeBaseId_here}")]
public class BaiscQnaDialog : Microsoft.Bot.Builder.CognitiveServices.QnAMaker.QnAMakerDialog
{
    protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)
    {
        await context.PostAsync($"I found {result.Answers.Count} answer(s) that might help...{result.Answers.First().Answer}.");
        context.Done(true);
    }
}

测试结果: