使用C#在一个Bot中进行多个QnA服务

我有3个QnA服务。我希望它们可以同时在单个BOT中使用。如何使用C#来实现。我最初的想法是将KB ID和Sub Key放入数组中(如何实现该数组或数组是否起作用?)。我在Node.JS中看到了一些代码,但无法弄清楚如何在C#中转换代码。


public class QnaDialog : QnAMakerDialog

{

    public QnaDialog() : base(

        new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings["QnaSubscriptionKey1"],

        ConfigurationManager.AppSettings["QnaKnowledgebaseId1"], "Hmm, I wasn't able to find an article about that. Can you try asking in a different way?", 0.5)),


        new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings["QnaSubscriptionKey2"],

        ConfigurationManager.AppSettings["QnaKnowledgebaseId2"], "Hmm, I wasn't able to find an article about that. Can you try asking in a different way?", 0.5)),


        new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings["QnaSubscriptionKey3"],

        ConfigurationManager.AppSettings["QnaKnowledgebaseId4"], "Hmm, I wasn't able to find an article about that. Can you try asking in a different way?", 0.5))

        )

    {

    }

}


温温酱
浏览 103回答 1
1回答

慕桂英4014372

QnAMaker通过在属性中提供多种服务,您可以在单个bot中使用多种知识库。使用QnAMakerDialogNuget包的基本实现BotBuilder.CognitiveServices是:[Serializable][QnAMaker("QnaSubscriptionKey1", "QnaKnowledgebaseId1", "Hmm, I wasn't able to find an article about that. Can you try asking in a different way?", 0.50, 3)][QnAMaker("QnaSubscriptionKey2", "QnaKnowledgebaseId2", "Hmm, I wasn't able to find an article about that. Can you try asking in a different way?", 0.5, 3)][QnAMaker("QnaSubscriptionKey3", "QnaKnowledgebaseId3", "Hmm, I wasn't able to find an article about that. Can you try asking in a different way?", 0.5, 3)]public class RootDialog : QnAMakerDialog{}但是(是的,有一个“但是”)在某些情况下,您在处理消息时可能会遇到异常。正如QnAMakerDialog开源的一样(您可以在此处找到源代码),您可以轻松地发现问题出在服务调用返回的实现中MessageReceivedAsync:var sendDefaultMessageAndWait = true;qnaMakerResults = tasks.FirstOrDefault(x => x.Result.ServiceCfg != null)?.Result;if (tasks.Count(x => x.Result.Answers?.Count > 0) > 0){&nbsp; &nbsp; var maxValue = tasks.Max(x => x.Result.Answers[0].Score);&nbsp; &nbsp; qnaMakerResults = tasks.First(x => x.Result.Answers[0].Score == maxValue).Result;&nbsp; &nbsp; if (qnaMakerResults != null && qnaMakerResults.Answers != null && qnaMakerResults.Answers.Count > 0)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (this.IsConfidentAnswer(qnaMakerResults))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await this.RespondFromQnAMakerResultAsync(context, message, qnaMakerResults);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; feedbackRecord = new FeedbackRecord { UserId = message.From.Id, UserQuestion = message.Text };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await this.QnAFeedbackStepAsync(context, qnaMakerResults);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; sendDefaultMessageAndWait = false;&nbsp; &nbsp; }}if (sendDefaultMessageAndWait){&nbsp; &nbsp; await context.PostAsync(qnaMakerResults.ServiceCfg.DefaultMessage);&nbsp; &nbsp; await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults);}在此代码中,如果并非所有服务都对您的问题有答案(例如:如果您的QnAMaker KB至少有一个没有对您的问题的回答),则此行代码将中断。tasks.Max(x => x.Result.Answers[0].Score);解决方法:例如,您可以通过获取源代码并修复如下方法来实现自己的QnAMakerDialog:public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument){&nbsp; &nbsp; var message = await argument;&nbsp; &nbsp; if (message != null && !string.IsNullOrEmpty(message.Text))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var tasks = this.services.Select(s => s.QueryServiceAsync(message.Text)).ToArray();&nbsp; &nbsp; &nbsp; &nbsp; await Task.WhenAll(tasks);&nbsp; &nbsp; &nbsp; &nbsp; if (tasks.Any())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var sendDefaultMessageAndWait = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; qnaMakerResults = tasks.FirstOrDefault(x => x.Result.ServiceCfg != null)?.Result;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var qnaMakerFoundResults = tasks.Where(x => x.Result.Answers.Any()).ToList();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (qnaMakerFoundResults.Any())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var maxValue = qnaMakerFoundResults.Max(x => x.Result.Answers[0].Score);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; qnaMakerResults = qnaMakerFoundResults.First(x => x.Result.Answers[0].Score == maxValue).Result;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (qnaMakerResults?.Answers != null && qnaMakerResults.Answers.Count > 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (this.IsConfidentAnswer(qnaMakerResults))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await this.RespondFromQnAMakerResultAsync(context, message, qnaMakerResults);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; feedbackRecord = new FeedbackRecord { UserId = message.From.Id, UserQuestion = message.Text };&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await this.QnAFeedbackStepAsync(context, qnaMakerResults);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sendDefaultMessageAndWait = false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (sendDefaultMessageAndWait)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await context.PostAsync(qnaMakerResults.ServiceCfg.DefaultMessage);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP