为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
温温酱 2021-05-12 17:14:18
我有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))        )    {    }}
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

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)

{

    var maxValue = tasks.Max(x => x.Result.Answers[0].Score);

    qnaMakerResults = tasks.First(x => x.Result.Answers[0].Score == maxValue).Result;


    if (qnaMakerResults != null && qnaMakerResults.Answers != null && qnaMakerResults.Answers.Count > 0)

    {

        if (this.IsConfidentAnswer(qnaMakerResults))

        {

            await this.RespondFromQnAMakerResultAsync(context, message, qnaMakerResults);

            await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults);

        }

        else

        {

            feedbackRecord = new FeedbackRecord { UserId = message.From.Id, UserQuestion = message.Text };

            await this.QnAFeedbackStepAsync(context, qnaMakerResults);

        }


        sendDefaultMessageAndWait = false;

    }

}


if (sendDefaultMessageAndWait)

{

    await context.PostAsync(qnaMakerResults.ServiceCfg.DefaultMessage);

    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)

{

    var message = await argument;


    if (message != null && !string.IsNullOrEmpty(message.Text))

    {

        var tasks = this.services.Select(s => s.QueryServiceAsync(message.Text)).ToArray();

        await Task.WhenAll(tasks);


        if (tasks.Any())

        {

            var sendDefaultMessageAndWait = true;

            qnaMakerResults = tasks.FirstOrDefault(x => x.Result.ServiceCfg != null)?.Result;


            var qnaMakerFoundResults = tasks.Where(x => x.Result.Answers.Any()).ToList();

            if (qnaMakerFoundResults.Any())

            {

                var maxValue = 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))

                    {

                        await this.RespondFromQnAMakerResultAsync(context, message, qnaMakerResults);

                        await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults);

                    }

                    else

                    {

                        feedbackRecord = new FeedbackRecord { UserId = message.From.Id, UserQuestion = message.Text };

                        await this.QnAFeedbackStepAsync(context, qnaMakerResults);

                    }


                    sendDefaultMessageAndWait = false;

                }

            }


            if (sendDefaultMessageAndWait)

            {

                await context.PostAsync(qnaMakerResults.ServiceCfg.DefaultMessage);

                await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults);

            }

        }

    }

}


查看完整回答
反对 回复 2021-05-23
  • 1 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信