-1

如何将 Single ChatBot 与不同的 QnA 数据集(JSON)进行通信。

例如:QnA1(JSON 文件)QnA2(JSON 文件)

和 Single Bot 应用程序。

当我使用 site1 启动时,Bot 将与 QnA1 数据通信。当我使用 site2 启动时,Bot 将与 QnA2 数据通信。

在这里,我只有一个 Bot。

请让我知道如何将 KNOWLEDGE_BASE_ID 传递给 Bot。

4

1 回答 1

1

当我使用 site1 启动时,Bot 将与 QnA1 数据通信。当我使用 site2 启动时,Bot 将与 QnA2 数据通信。

BotFramework 的 UI 是基于 的Dialog,所以我只能猜测你的site 1site 2意味着两个对话框,每个对话框都是基于 QnA 构建的。

请让我知道如何将 KNOWLEDGE_BASE_ID 传递给 Bot。

然后将 KNOWLEDGE_BASE_ID 传递给您的机器人,您可以将QnAMakerAttribute其用于您的对话框。例如在 .Net SDK 中:

[QnAMakerAttribute("Your-subscription-key", "Your-Qna-KnowledgeBase-ID", "No Answer in Knowledgebase.", 0.5)]
[Serializable]
public class QnADialog1 : QnAMakerDialog
{

}

如果您使用 node.js SDK 进行开发,您可以像这样传递 id:

var recognizer = new builder_cognitiveservices.QnAMakerRecognizer({
    knowledgeBaseId: 'Your-Qna-KnowledgeBase-ID', // process.env.QnAKnowledgebaseId, 
    subscriptionKey: 'Your-Qna-KnowledgeBase-Password'}); //process.env.QnASubscriptionKey});

更多信息,你可以参考博客示例,有 C# 和 node.js 版本的演示。

如果您仍然想问如何在一个机器人中使用两个知识库,请发表评论并告诉我您使用哪个 sdk 进行开发,.net 还是 node.js?我会回来更新我的答案。

更新:

例如,您可以像这样编写代码:

[Serializable]
public class RootDialog : IDialog<object>
{
    private string currentKB;
    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;

        if (activity.Text == "reset") //handle reset
            currentKB = null;
        else if (activity.Text == "qna1" || currentKB == "qna1")
        {
            currentKB = "qna1";
            if (activity.Text == "qna1")
                await context.PostAsync("this is qna 1");
            else
                await context.Forward(new Dialogs.QnADialog1(), this.QnAReceivedAsync, activity, CancellationToken.None);
        }
        else if (activity.Text == "qna2" || currentKB == "qna2")
        {
            currentKB = "qna2";
            if (activity.Text == "qna2")
                await context.PostAsync("this is qna 2");
            else
                await context.Forward(new Dialogs.QnADialog2(), this.QnAReceivedAsync, activity, CancellationToken.None);
        }
        else
        {
            var reply = activity.CreateReply("Please choose a knowledge base...");

            var heroCard = new HeroCard
            {
                Title = "Knowledge bases",
                Text = "Which one do you want to choose?",
                Buttons = new List<CardAction>
                    {
                        new CardAction(ActionTypes.ImBack, "QnA base 1", value:"qna1"),
                        new CardAction(ActionTypes.ImBack, "QnA base 2", value:"qna2")
                    }
            };
            Attachment attachment = heroCard.ToAttachment();
            reply.Attachments.Add(attachment);

            await context.PostAsync(reply);
            context.Wait(MessageReceivedAsync);

        }

    }

    public async Task QnAReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        context.Wait(MessageReceivedAsync);
    }

}

并在MessagesControllermakeRootDialog作为对话框堆栈的根:

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

最后通过QnADialog1and QnADialog2,我只在那里传递了知识库 ID 和密钥。

于 2018-02-15T04:10:07.567 回答