1

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

如果找到对,则返回答案并返回 luis 堆栈。如果一对未发送消息“对不起,我不知道”并返回 luis 堆栈等待另一条消息。

我成功地得到了回复await context.Forward(qnaDialog, AfterQnADialog, messageToForward, CancellationToken.None)。返回响应后,模拟器抛出Exception Stack is empty [File Type 'text/plain']

我认为错误出现在AfterQnADialog中,但不知道如何修复它。在此先感谢您的帮助。

消息控制器*

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

路易斯对话类

[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 类

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

    }
}
4

1 回答 1

1

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

在 LUIS 对话框中:

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

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

QnAMaker 对话框:

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

注意:如果我不覆盖NoMatchHandler并调用context.Done以将控制权传递回父对话框,我会收到相同的异常消息:“堆栈为空”。

更新:

您似乎在项目中使用Microsoft.Bot.Builder.CognitiveServices.QnAMaker。如果是这种情况,您不需要安装QnAMakerDialog。为避免“堆栈为空”错误,您可以覆盖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);
    }
}

测试结果:

在此处输入图像描述

于 2018-04-04T06:04:50.977 回答