C# 在虚拟助手上启用QnA后续提示

C# 在虚拟助手上启用QnA后续提示,c#,botframework,azure-language-understanding,qnamaker,C#,Botframework,Azure Language Understanding,Qnamaker,我目前在QnA对上有后续提示,但在本地运行bot或使用webchat时,这些提示不会显示。是否有办法使用虚拟助手模板启用此功能 后续提示在使用QnA机器人时有效,但在虚拟助手上无效。Steven Kanberg发布的C#NET核心示例是一个很好的资源。如果您喜欢教程样式指南,此指南可能会有所帮助: 其中概述的步骤包括: 编辑您的机器人\YourBotName.cs,添加以下名称空间,我们将使用这些名称空间来支持后续提示: 添加以下类以匹配JSON响应形状: qnaMaker.GetAnswers

我目前在QnA对上有后续提示,但在本地运行bot或使用webchat时,这些提示不会显示。是否有办法使用虚拟助手模板启用此功能

后续提示在使用QnA机器人时有效,但在虚拟助手上无效。Steven Kanberg发布的C#NET核心示例是一个很好的资源。如果您喜欢教程样式指南,此指南可能会有所帮助:

其中概述的步骤包括:

  • 编辑您的机器人\YourBotName.cs,添加以下名称空间,我们将使用这些名称空间来支持后续提示:
  • 添加以下类以匹配JSON响应形状:
  • qnaMaker.GetAnswersAsync成功且有有效答案后,执行额外的HTTP查询以检查后续提示:
  • //对QnA Maker服务的实际调用。
    var response=wait qnaMaker.GetAnswersAsync(turnContext);
    if(response!=null&&response.Length>0)
    {
    //创建http客户端以执行qna查询
    var followUpCheckHttpClient=新HttpClient();
    //将QnAAuthKey添加到授权标头
    followCheckHttpClient.DefaultRequestHeaders.Add(“授权”,_配置[“QnAAuthKey]”);
    //构造qna查询url
    var url=$“{GetHostname()}/knowledgebase/{{u配置[“QnAKnowledgebaseId”]}/generateAnswer”;
    //查询后
    var checkFollowUpJsonResponse=wait followUpCheckHttpClient.PostAsync(url,新StringContent(“{\”问题\“:\”+turnContext.Activity.Text+“\”}),Encoding.UTF8,“application/json”)。Result.Content.ReadAsStringAsync();
    //解析结果
    var followUpCheckResult=JsonConvert.DeserializeObject(checkFollowUpJsonResponse);
    //初始化包含默认答案的回复消息
    var reply=MessageFactory.Text(响应[0]。应答);
    if(followUpCheckResult.Answers.Length>0&&followUpCheckResult.Answers[0].Context.Prompts.Length>0)
    {
    //如果后续检查包含有效答案和至少一个提示,请使用CardAction逐个向SuggestedActions添加提示文本
    reply.SuggestedActions=新的SuggestedActions();
    reply.SuggestedActions.Actions=新列表();
    对于(int i=0;i
  • 在botframeworkemulator中测试它,它现在应该按照预期显示后续提示 注:

    确保创建
    IConfiguration\u configuration
    属性,将IConfiguration配置传递到构造函数中,并使用适当的QnAKnowledgebaseId和QnAAuthKey更新appsettings.json

    如果使用其中一个Bot示例作为起点,请注意appsettings.json中的
    QnAAuthKey
    可能会被命名为
    QnAEndpointKey


    您还需要一个GetHostName()函数,或者将其替换为bot的qna主机名的url

    此问题缺少某些内容-您能修复此问题吗?@DFBerry您能更明确地说明新SO用户缺少的内容吗?@samueljohnpaul任何示例中的QnA代码都应该能够提取并在其他机器人中使用。你能显示出你的代码不工作吗?你可以参考这个C#.NET内核,它演示了如何接收QnA Maker后续(又称多圈)提示。这可能有助于确定您的VA代码中是否有错误。非常感谢!工作得很好!这是一个很好的解决方案,但是如果使用MS团队作为您的频道,提示将不起作用,因为团队不支持SuggestedActions,建议使用卡片代替提示。
    using Newtonsoft.Json;
    using System.Collections.Generic;
    using System.Text;
    
    class FollowUpCheckResult
     {
         [JsonProperty("answers")]
         public FollowUpCheckQnAAnswer[] Answers
         {
             get;
             set;
         }
     }
    
     class FollowUpCheckQnAAnswer
     {
         [JsonProperty("context")]
         public FollowUpCheckContext Context
         {
             get;
             set;
         }
     }
    
     class FollowUpCheckContext
     {
         [JsonProperty("prompts")]
         public FollowUpCheckPrompt[] Prompts
         {
             get;
             set;
         }
     }
    
     class FollowUpCheckPrompt
     {
         [JsonProperty("displayText")]
         public string DisplayText
         {
             get;
             set;
         }
     }
    
    // The actual call to the QnA Maker service.
     var response = await qnaMaker.GetAnswersAsync(turnContext);
     if (response != null && response.Length > 0)
     {
         // create http client to perform qna query
         var followUpCheckHttpClient = new HttpClient();
    
         // add QnAAuthKey to Authorization header
         followUpCheckHttpClient.DefaultRequestHeaders.Add("Authorization", _configuration["QnAAuthKey"]);
    
         // construct the qna query url
         var url = $"{GetHostname()}/knowledgebases/{_configuration["QnAKnowledgebaseId"]}/generateAnswer"; 
    
         // post query
         var checkFollowUpJsonResponse = await followUpCheckHttpClient.PostAsync(url, new StringContent("{\"question\":\"" + turnContext.Activity.Text + "\"}", Encoding.UTF8, "application/json")).Result.Content.ReadAsStringAsync();
    
         // parse result
         var followUpCheckResult = JsonConvert.DeserializeObject<FollowUpCheckResult>(checkFollowUpJsonResponse);
    
         // initialize reply message containing the default answer
         var reply = MessageFactory.Text(response[0].Answer);
    
         if (followUpCheckResult.Answers.Length > 0 && followUpCheckResult.Answers[0].Context.Prompts.Length > 0)
         {
             // if follow-up check contains valid answer and at least one prompt, add prompt text to SuggestedActions using CardAction one by one
             reply.SuggestedActions = new SuggestedActions();
             reply.SuggestedActions.Actions = new List<CardAction>();
             for (int i = 0; i < followUpCheckResult.Answers[0].Context.Prompts.Length; i++)
             {
                 var promptText = followUpCheckResult.Answers[0].Context.Prompts[i].DisplayText;
                 reply.SuggestedActions.Actions.Add(new CardAction() { Title = promptText, Type = ActionTypes.ImBack, Value = promptText });
             }
         }
         await turnContext.SendActivityAsync(reply, cancellationToken);
     }
     else
     {
         await turnContext.SendActivityAsync(MessageFactory.Text("No QnA Maker answers were found."), cancellationToken);
     }