代码之家  ›  专栏  ›  技术社区  ›  Souvik Ghosh

基于Qnamaker输入的排名结果

  •  3
  • Souvik Ghosh  · 技术社区  · 8 年前

    使用bot framework sdk v-3,我能够得到基于关键字的匹配问题列表,如建议的操作/卡片- qnamaker dialog中的建议操作卡

    现在,我使用的是预发布版本的sdk v-4,它使用了中间软件的概念。所以我在startup.cs中做了类似的事情。-

    services.addbot<qnabot>(选项=>
    {
    options.credentialProvider=新配置CredentialProvider(配置);
    
    var端点=新的Qnamakerendpoint
    {
    knowledgeBaseID=kbid,
    //从https://www.qnamaker.ai的http请求示例获取主机
    //对于GA服务:https://<service name>.azurewebsites.net/qnamaker
    //预览服务:https://westus.api.cognitive.microsoft.com/qnamaker/v2.0
    主机=主机URL,
    endpointkey=终点键
    };
    var qnaoptions=new qnamakermiddlewareOptions();
    qNaOptions.Top=5;
    options.middleware.add(新建qnamakermiddleware(endpoint,qnaoptions));
    (});
    < /代码> 
    
    

    我只得到第一个匹配问题的答案作为聊天窗口中的输出,而没有得到匹配问题作为建议的操作卡供用户选择。我曾经有一个独立的对话框继承自sdk v-3中的qnamakerdialog,以及一个被重写的函数来管理我的会话流。我不知道现在如何在中间软件中管理它,因为我从文档中得到的只是这个-qnamaker与bot framework sdk v-4 有什么帮助吗?Suggested actions cards in QnAMaker Dialog

    image

    现在,我使用的是预发布版本的sdk v-4,它使用了中间软件的概念。所以我在startup.cs中做了类似的事情。-

    services.AddBot<QnABot>(options =>
                {
                    options.CredentialProvider = new ConfigurationCredentialProvider(Configuration);
    
                    var endpoint = new QnAMakerEndpoint
                    {
                        KnowledgeBaseId = kbId,
                        // Get the Host from the HTTP request example at https://www.qnamaker.ai
                        // For GA services: https://<Service-Name>.azurewebsites.net/qnamaker
                        // For Preview services: https://westus.api.cognitive.microsoft.com/qnamaker/v2.0           
                        Host = hostURL,
                        EndpointKey = endpointKey
                    };
                    var qnaOptions = new QnAMakerMiddlewareOptions();
                    qnaOptions.Top = 5;
                options.Middleware.Add(new QnAMakerMiddleware(endpoint, qnaOptions));
                });
    

    我只得到第一个匹配问题的答案作为聊天窗口中的输出,而没有得到匹配问题作为建议的操作卡供用户选择。我曾经有一个独立的对话框继承自sdk v-3中的qnamakerdialog,以及一个被重写的函数来管理我的会话流。我不知道如何在中间软件中管理它,因为我从文档中得到的只是-QnAMaker with bot framework SDK v-4 有什么帮助吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Fei Han    8 年前

    我发现在这个Github问题中报告了同样的问题: “Capability to get ranged results based on the input does not work” ,and as jonathanfingold suggested,we can use qna maker service in bot code,and then send different response activity to user根据QNA制造商服务返回的匹配问题数量。

    此外,如果您想进行Bot Framework SDK v3中显示的几种选择,您可以动态生成一张英雄卡来显示建议的选项。您可以参考以下示例代码,使用Hero卡显示建议的选项。

    var results=await qna.getanswers(text);
    
    开关(结果长度)
    {
    案例0:
    wait context.sendActivity($我在“文本”的常见问题解答中没有主题);
    等待context.sendActivity(“问我一个问题”);
    断裂;
    案例1:
    等待context.sendActivity(结果[0].答案);
    断裂;
    违约:
    
    //var选项=messageFactory.suggestedActions(
    //results.select(r=>r.questions[0]).tolist(),“您的意思是:”);
    //options.suggestedActions.actions.add(无);
    
    
    //使用herocard显示选项
    var options=results.select(r=>r.questions[0]).tolist();
    
    var herocard=新herocard();
    herocard.text=“您的意思是:”;
    
    list<cardaction>buttons=新列表<cardaction>();
    
    foreach(选项中的var项)
    {
    buttons.add(新的万向节())
    {
    类型=actiontypes.imback,
    title=item.toString(),
    值=item.toString()
    (});
    }
    
    buttons.add(新的万向节())
    {
    类型=actiontypes.imback,
    title=“以上都不是。”,
    value=“以上都不是。”
    (});
    
    herocard.buttons=按钮;
    
    var response=context.activity.createReply();
    response.attachments=新列表<attachment>()herocard.toattachment()
    wait context.sendActivity(响应);
    断裂;
    }
    < /代码> 
    
    

    测试结果:

    如jonathanfingold所建议的,我们可以在bot代码中使用qna maker服务,然后根据qna maker服务返回的匹配问题数量向用户发送不同的响应活动。

    此外,如果您想进行Bot Framework SDK v3中显示的几种选择,您可以动态生成一张英雄卡来显示建议的选项。您可以参考以下示例代码,使用Hero卡显示建议的选项。

    var results = await QnA.GetAnswers(text);
    
    switch (results.Length)
    {
        case 0:
            await context.SendActivity($"I have no topics in the FAQ for '{text}'.");
            await context.SendActivity("Ask me a question.");
            break;
        case 1:
            await context.SendActivity(results[0].Answer);
            break;
    default:
    
            //var options = MessageFactory.SuggestedActions(
            //    results.Select(r => r.Questions[0]).ToList(), "Did you mean:");
            //options.SuggestedActions.Actions.Add(None);
    
    
            //show options using HeroCard
            var options = results.Select(r => r.Questions[0]).ToList();
    
            var herocard = new HeroCard();
            herocard.Text = "Did you mean:";
    
            List<CardAction> buttons = new List<CardAction>();
    
            foreach (var item in options)
            {
                buttons.Add(new CardAction()
                {
                    Type = ActionTypes.ImBack,
                    Title = item.ToString(),
                    Value = item.ToString()
                });
            }
    
            buttons.Add(new CardAction()
            {
                Type = ActionTypes.ImBack,
                Title = "None of the above.",
                Value = "None of the above."
            });
    
            herocard.Buttons = buttons;
    
            var response = context.Activity.CreateReply();
            response.Attachments = new List<Attachment>() { herocard.ToAttachment() };
            await context.SendActivity(response);
            break;
    }
    

    测试结果:

    enter image description here