C# 将bot框架Luis与QnA集成为意图,然后在到达QnA后重新询问用户
我正在尝试做一个FAQ意图,作为一个QnA对话框,在进入意图后应该重新询问用户 下面是我集成luis和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
[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;
}
}
测试结果: