首页 > 解决方案 > 如何拥有多个相同问题但答案不同的常见问题解答(KB)?

问题描述

我无法保留聊天机器人对话的上下文(FAQ)。

我已经根据此文档成功集成了 LUIS+QnAmaker。 https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/tutorials/integrate-qnamaker-luis

我有大约 3 KB 包含相同的问题但不同的答案。聊天机器人应该能够过滤到所需的常见问题解答,并且以下答案应该来自用户选择的常见问题解答。目前,它只返回答案的第一个 KB,除非我以这种方式表达我的问题:我可以得到 FAQ1 的答案吗?或者我可以得到FAQ2的答案吗?

希望我能在这里得到社区的一些帮助。谢谢!

标签: azure-language-understandingqnamaker

解决方案


当您使用具有相同问题的多个 KB 时,您可以通过将不同的元数据添加到您的问题/答案集中来隔离答案。元数据只是名称/值对的集合。使用 QnAMakerDialog 时,您可以设置过滤或提升元数据,这将作为任何查询的一部分传递给 QnA Maker 服务。

您可以创建 QnA Maker 对话框并将单个名称/值元数据对添加到对话框上的 MetadataFilter 属性。这将导致对话框仅接收标记有相同名称/值元数据的答案。

消息控制器:

public class MessagesController : ApiController
{
    internal static IDialog<object> MakeRoot()
    {
        var qnaDialog = new Dialogs.MyQnADialog
        {
            MetadataFilter = new List<Metadata>()
            {
                new Metadata()
                {
                    Name = "knowledgeBase",
                    Value = "kb1"

                }
            }
        };

        return qnaDialog;
    }

    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type == ActivityTypes.Message)
        {
            await Conversation.SendAsync(activity, MakeRoot);
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

}

同样,如果要使用其他知识库,可以传递其他元数据名称/值对。例如,{ Name="knowledgeBase",Value="kb2" }

QnAMAker 对话框:

[QnAMakerService("https://xxxx.azurewebsites.net/qnamaker/", "{EndpointKey_here}", "{KnowledgeBaseId_here}",1)]
public class MyQnADialog : 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)
    {
        if (result.Answers.FirstOrDefault().Score > 80)
        {
            await context.PostAsync($"I found {result.Answers.Length} answer(s) that might help...{result.Answers.First().Answer}.");
        }
        else
        {
            await context.PostAsync($"Sorry, I couldn't find an answer for '{originalQueryText}'.");
        }

        context.Done(true);
    }
}

示例:元数据标记 在此处输入图像描述

当您对其进行测试时,结果将如下所示:

  • 有知识库:kb1

在此处输入图像描述

  • 有知识库:kb2

在此处输入图像描述

希望这可以帮助!!!


推荐阅读