C# 将bot框架Luis与QnA集成为意图,然后在到达QnA后重新询问用户

C# 将bot框架Luis与QnA集成为意图,然后在到达QnA后重新询问用户,c#,botframework,azure-language-understanding,qnamaker,C#,Botframework,Azure Language Understanding,Qnamaker,我正在尝试做一个FAQ意图,作为一个QnA对话框,在进入意图后应该重新询问用户 下面是我集成luis和QnA的代码: [LuisIntent("FAQ")] public async Task FAQ(IDialogContext context, LuisResult result) { await context.PostAsync("FAQ"); await context.Forward(new QnADialog(), ResumeAf

我正在尝试做一个FAQ意图,作为一个QnA对话框,在进入意图后应该重新询问用户

下面是我集成luis和QnA的代码:

 [LuisIntent("FAQ")]
    public async Task FAQ(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)
    {
        await context.PostAsync("Back to Intent");
        context.Wait(MessageReceived);

    }
[LuisIntent(“常见问题”)]
公共异步任务常见问题解答(IDialogContext上下文、LuisResult结果)
{
等待上下文。PostAsync(“常见问题”);
wait context.Forward(new QnADialog(),ResumeAfterQnA,context.Activity,CancellationToken.None);
}
专用异步任务ResumeAfterQnA(IDialogContext上下文,IAwaitable结果)
{
等待上下文。PostAsync(“返回意图”);
Wait(MessageReceived);
}
在QnA对话框中:

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

    public override async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
    {


        if (result.Answers.Length > 0 && result.Answers.FirstOrDefault().Score > 0.75 && flag)
        {
            await context.PostAsync(result.Answers.FirstOrDefault().Answer);
            await context.PostAsync("To continue using the FAQ please type another question, if not type no");
        }
        else if (originalQueryText.Contains("no"))
        {
            context.Done(true);
        }
        else
        {
            await base.DefaultMatchHandler(context, originalQueryText,result);
            flag = true;
        }
    }

}
[可序列化]
[QnAMakerService(“端点”、“知识库id”、“订阅密钥”)]
公共类QnADialog:QnAMakerDialog
{
公共布尔标志=假;
公共重写异步任务DefaultMatchHandler(IDialogContext上下文、字符串originalQueryText、QnAMakerResult结果)
{
if(result.Answers.Length>0&&result.Answers.FirstOrDefault().Score>0.75&&flag)
{
wait context.PostAsync(result.Answers.FirstOrDefault().Answer);
wait context.PostAsync(“要继续使用FAQ,请键入其他问题,如果不是,请键入否”);
}
else if(originalQueryText.Contains(“no”))
{
上下文。完成(true);
}
其他的
{
wait base.DefaultMatchHandler(上下文、originalQueryText、结果);
flag=true;
}
}
}
试验结果如下: 我希望“KB中找不到好匹配”在欢迎访问FAQ后不显示,但我很难做到这一点,我已经查看了文档示例,但没有任何与我的问题类似的示例

任何帮助都将不胜感激

我希望“在KB中找不到好匹配”在欢迎访问FAQ之后不显示

根据您的代码和要求,我修改了
DefaultMatchHandler
方法中的代码,该方法对我有效,您可以参考它

public override async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
{
    if (result.Answers.Length > 0 && result.Answers.FirstOrDefault().Score > 0.75 && flag)
    {
        await context.PostAsync(result.Answers.FirstOrDefault().Answer);
        await context.PostAsync("To continue using the FAQ please type another question, if not type no");
    }
    else if (originalQueryText.Contains("no"))
    {
        context.Done(true);
    }
    else
    {
        //detect if originalQueryText contains "faq"
        if (!originalQueryText.ToLower().Contains("faq"))
        {
            await base.DefaultMatchHandler(context, originalQueryText, result);
        }
        flag = true;
    }
}
测试结果: