C#学习教程:使用C#在一个机器人中使用多个QnA服务我希望它们能够同时用于单个机器人。如何使用C#实现此目的。我最初的想法是将KBID和SubKey放入一个数组中(如何实现或数组是否有效?)..我在Node.JS中看到了一些代码,但我无法弄清楚如何将代码转换为C#。publicclassQnaDialog:QnAMakerDialog{publicQnaDialog():base(newQnAMakerService(newQnAMakerAttribute(ConfigurationManager.AppSettings["QnaSubscriptionKey1"],ConfigurationManager.AppSettings["QnaKnowledgebaseId1"],"嗯,我找不到关于那。你能尝试用不同的方式提问吗?”,0.5)),newQnAMakerService(newQnAMakerAttribute(ConfigurationManager.AppSettings["QnaSubscriptionKey2"],ConfigurationManager.AppSettings["QnaKnowledgebaseId2"],"嗯,我无法找到一篇关于它的文章。你能尝试用不同的方式提问吗?”,0.5)),newQnAMakerService(newQnAMakerAttribute(ConfigurationManager.AppSettings["QnaSubscriptionKey3"],ConfigurationManager.AppSettings["QnaKnowledgebaseId4"],"嗯,我是找不到关于它的文章。您可以尝试用不同的方式提问吗?",0.5))){}}通过在属性中提供多种服务,您可以在单个机器人中使用多个QnAMaker知识库。使用QnAMakerDialog包BotBuilder.CognitiveServices的基本实现是:[Serializable][QnAMaker("QnaSubscriptionKey1","QnaKnowledgebaseId1","Hmm,Icouldn'tbeabletofindanarticleaboutthat.你能尝试用不同的方式提问吗",0.50,3)][QnAMaker("QnaSubscriptionKey2","QnaKnowledgebaseId2","嗯,我没能找到关于它的文章。你能尝试用不同的方式提问吗?",0.5,3)][QnAMaker("QnaSubscriptionKey3","QnaKnowledgebaseId3","嗯,我没能找到关于它的文章。你能尝试用不同的方式提问吗?",0.5,3)]publicclassRootDialog:QnAMakerDialog{}但是(是的,有一个“但是”)在某些情况下,您可能会在处理消息时遇到异常。由于QnAMakerDialog是开源的(源代码在这里),你可以很容易地找到MessageReceivedAsync中的问题来实现服务调用的返回:varsendDefaultMessageAndWait=true;qnaMakerResults=tasks.FirstOrDefault(x=>x.Result.ServiceCfg!=null)?。结果;如果(tasks.Count(x=>x.Result.Answers?.Count>0)>0){varmaxValue=tasks.Max(x=>x.Result.Answers[0].Score);qnaMakerResults=tasks.First(x=>x.Result.Answers[0].Score==maxValue).Result;如果(qnaMakerResults!=null&&qnaMakerResults.Answers!=null&&qnaMakerResults.Answers.Count>0){if(this.IsConfidentAnswer(qnaMakerResults)){awaitthis.RespondFromQnAMakerResultAsync(context,message,qnaMakerResults);等待this.DefaultWaitNextMessageAsync(上下文、消息、qnaMakerResults);消息.文本};等待this.QnAFeedbackStepAsync(上下文,qnaMakerResults);}sendDefaultMessageAndWait=false;}}if(sendDefaultMessageAndWait){awaitcontext.Post异步(qnaMakerResults.ServiceCfg.DefaultMessage);等待this.DefaultWaitNextMessageAsync(上下文、消息、qnaMakerResults);在此代码中,如果您的任何服务都无法回答您的问题,则这行代码将会中断(即:如果您的至少一个QnAMaker知识库没有针对您的问题的答案)tasks.Max(x=>x.Result.Answers[0].Score);解决方法:你可以通过获取源码来修复方法实现你自己的QnAMakerDialog,例如:以上是C#学习教程:使用C#在一个Bot中共享多个QnA服务的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—publicasyncTaskMessageReceivedAsync(IDialogContextcontext,IAwaitableargument){varmessage=awaitargument;if(message!=null&&!string.IsNullOrEmpty(message.Text)){vartasks=this.services.Select(s=>s.QueryServiceAsync(message.Text)).ToArray();等待Task.WhenAll(任务);如果(tasks.Any()){varsendDefaultMessageAndWait=true;qnaMakerResults=tasks.FirstOrDefault(x=>x.Result.ServiceCfg!=null)?.Result;varqnaMakerFoundResults=tasks.Where(x=>x.Result.Answers.Any()).ToList();如果(qnaMakerFoundResults.Any()){varmaxValue=qnaMakerFoundResults.Max(x=>x.Result.Answers[0].Score);qnaMakerResults=qnaMakerFoundResults.First(x=>x.Result.Answers[0].Score==maxValue).Result;if(qnaMakerResults?.Answers!=null&&qnaMakerResults.Answers.Count>0){if(this.IsConfidentAnswer(qnaMakerResults)){awaitthis.RespondFromQnAMakerResultAsync(context,message,qnaMakerResults);}等待this.DefaultWaitNextMessageAsync(上下文、消息、qnaMakerResults);FeedbackRecord{UserId=message.From.Id,UserQuestion=message.Text};等待this.QnAFeedbackStepAsync(上下文,qnaMakerResults);}sendDefaultMessageAndWait=false;}}if(sendDefaultMessageAndWait){awaitcontext.PostServiceAsync(qnaMakerResultsg);等待this.DefaultWaitNextMessageAsync(上下文、消息、qnaMakerResults);}}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
