C# 在虚拟助手上启用QnA后续提示
我目前在QnA对上有后续提示,但在本地运行bot或使用webchat时,这些提示不会显示。是否有办法使用虚拟助手模板启用此功能 后续提示在使用QnA机器人时有效,但在虚拟助手上无效。Steven Kanberg发布的C#NET核心示例是一个很好的资源。如果您喜欢教程样式指南,此指南可能会有所帮助: 其中概述的步骤包括: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 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
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);
}