如何连接反序列化的QnAResponse字符串代替{filename}?

问题描述 投票:0回答:2

在本文档中,它显示了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这样一个正确的存储自适应卡显示为响应。

我提供了更多不必要的背景信息,因为我确信还有其他人想要一个简单的方法来显示卡片,当一个问题需要时。

您可以使用适当的术语编辑或修改。

谢谢

c# json botframework qnamaker
2个回答
1
投票

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();
    }
}

测试结果:

enter image description here

注意:

1)在我的上述测试中,我的QnA Maker服务将直接返回文件名作为答案,因此我将返回的答案作为文件名传递

2)我在我的bot应用程序中使用AdaptiveCards -Version 1.0.3来构建自适应卡对象


1
投票

如果我的问题得到了解答,那么您正在寻找机器人的答案。如果是这样,答案将显示在这样显示的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");

然后你去

© www.soinside.com 2019 - 2024. All rights reserved.