在本文档中,它显示了QnA Maker服务执行Rest调用和反序列化Json响应 - 步骤3 * How to link Luis with Qna
我认为我正在寻找的模块字符串的特定部分:
/* START - QnA Maker Response Class */
public class Metadata
{
public string name { get; set; }
public string value { get; set; }
}
public class Answer
{
public IList<string> questions { get; set; }
public string answer { get; set; }
public double score { get; set; }
public int id { get; set; }
public string source { get; set; }
public IList<object> keywords { get; set; }
public IList<Metadata> metadata { get; set; }
}
public class QnAAnswer
{
public IList<Answer> answers { get; set; }
}
/* END - QnA Maker Response Class */
我不会猜测那部分会有什么答案,但是QNA应该简单地回复一个带有文件名的问题,然后需要连接代替@〜\ folder \ folder \ filename.json这样一个正确的存储自适应卡显示为响应。
我提供了更多不必要的背景信息,因为我确信还有其他人想要一个简单的方法来显示卡片,当一个问题需要时。
您可以使用适当的术语编辑或修改。
谢谢
QNA应该简单地回复一个带有文件名的问题,然后需要将其连接起来代替@~ \ folder \ folder \ filename.json,这样一个正确存储的自适应卡就会显示为响应。
您似乎希望根据QnA Maker服务返回的结果从json文件动态呈现自适应卡。要达到此要求,可以参考以下示例代码。
[LuisIntent("Help")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
var replymes = context.MakeMessage();
var answer = GetAnswer(result.Query);
var cardjson = await GetCardText($"{answer}");
var results = AdaptiveCard.FromJson(cardjson);
var card = results.Card;
replymes.Attachments.Add(new Attachment()
{
Content = card,
ContentType = AdaptiveCard.ContentType,
Name = "Card"
});
await context.PostAsync(replymes);
context.Wait(MessageReceived);
}
GetCardText方法:
public async Task<string> GetCardText(string cardName)
{
var path = System.Web.HttpContext.Current.Server.MapPath($"~/AdaptiveCards/{cardName}.json");
if (!File.Exists(path))
return string.Empty;
using (var f = File.OpenText(path))
{
return await f.ReadToEndAsync();
}
}
测试结果:
注意:
1)在我的上述测试中,我的QnA Maker服务将直接返回文件名作为答案,因此我将返回的答案作为文件名传递
2)我在我的bot应用程序中使用AdaptiveCards -Version 1.0.3来构建自适应卡对象
如果我的问题得到了解答,那么您正在寻找机器人的答案。如果是这样,答案将显示在这样显示的HTTP响应的正文中
{
"answers": [
{
"questions": [
"What is the closing time?"
],
"answer": "10.30 PM",
"score": 100,
"id": 1,
"source": "Editorial",
"metadata": [
{
"name": "restaurant",
"value": "paradise"
},
{
"name": "location",
"value": "secunderabad"
}
]
}
]
}
所以理论上它将在Answer.answer中
编辑:
您需要先添加此方法:
public string GetAnswer(string query)
{
var client = new RestClient( qnaServiceHostName + "/qnamaker/knowledgebases/" + knowledgeBaseId + "/generateAnswer");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "EndpointKey " + endpointKey);
request.AddHeader("content-type", "application/json");
request.AddParameter("application/json", "{\"question\": \"" + query + "\"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
// Deserialize the response JSON
QnAAnswer answer = JsonConvert.DeserializeObject<QnAAnswer>(response.Content);
// Return the answer if present
if (answer.answers.Count > 0)
return answer.answers[0].answer;
else
return "No good match found.";
}
}
然后你可以打电话:
Console.WriteLine ("the answer to how is the weather today is : " + GetAswers ("how's the weather today") + "... end of answer");
然后你去