【问题标题】:QnA Maker - Unable to update Knowledge base programmaticallyQnA Maker - 无法以编程方式更新知识库
【发布时间】:2019-01-04 08:57:31
【问题描述】:

我正在使用 QnA Maker v4.0,我正在尝试使用 C# 以编程方式更新我的知识库,并遵循以下提供的文档:

https://westus.dev.cognitive.microsoft.com/docs/services/5a93fcf85b4ccd136866eb37/operations/5ac266295b4ccd1554da7600

我可以在我的知识库中添加新的问题和答案对,但是当我尝试删除其中一些时,我无法做到。我没有收到消息错误,只是如果我进入 QnAMaker 门户,我仍然可以看到我要删除的问题。

我试图删除一个完整的来源,而且效果很好,所以我有点迷失了如何只删除给定的一对问题和答案而不是整个来源。

到目前为止,我尝试遵循的文档如下:

在答案对中添加新问题

string json = "{\"add\":{\"qnaList\":[{\"id\":123456789,\"answer\":\"fooanswer\",\"source\":\"Editorial\",\"questions\":[\"fooquestion\"],\"metadata\":null},{\"id\":987654321,\"answer\":\"fooanswer2\",\"source\":\"Editorial\",\"questions\":[\"fooquestion2\"],\"metadata\":null}],\"urls\":null,\"files\":null},\"delete\":null,\"update\":null}"

public async void UpdateKnowledgeBase(string json)
    {
    var knowledgebaseid = "<my kb id>";
    var client = new HttpClient();
    var querystring = HttpUtility.ParseQueryString(string.Empty);
    // Request headers
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "QnA Subscription Key>");
    var uri = "https://westus.api.cognitive.microsoft.com/qnamaker/v4.0/knowledgebases/"+ this.KnowledgeBaseId + "?" + querystring; 

    // Request body
    byte[] byteData = Encoding.UTF8.GetBytes(json);
    using (var content = new ByteArrayContent(byteData))
        {
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            var method = new HttpMethod("PATCH");
            var request = new HttpRequestMessage(method, uri)
                {
                    Content = content
                };
                HttpResponseMessage response;
                response = await client.SendAsync(request);
        }
    }

这将在我的知识库中创建问答对:

删除问答对

但是,如果我现在尝试按照文档操作并删除 ID 为 123456789 的问答对,则不会发生任何事情。为此,我正在这样做:

json = "{\"add\":null,\"delete\":{\"ids\":[123456789],\"sources\":null},\"update\":null}"

并且,在使用此 json 调用 UpdateKnowledgeBase 方法后,我不会收到任何错误,但我的问答对仍然出现在 QnA Maker 门户中。如果我添加来源,它将删除所有编辑来源。没关系,但我也想只删除一对而不是全部。这可能吗?

更新现有的问答对

更新现有问答对时,我遇到了同样的问题,我没有遇到任何错误,但我在 QnA Maker 门户中看不到更改,是什么让我认为没有进行任何更改.

因此,我的问题是,如何在不删除所有来源的情况下更新和/或删除问题和答案对?

提前谢谢你!

【问题讨论】:

    标签: c# botframework microsoft-cognitive programmatically-created qnamaker


    【解决方案1】:

    删除问答对

    我使用相同的创建值和删除值测试了您的案例。

    您的问题是在添加项目时您在add 阶段提供的 id 值发生了更改:即使我输入了"id": 123456789创建的项目也有一个id 值是我的知识库中存在的当前 id 的增量。

    那么当我要删除的时候,如果我指定正确的id,删除操作就成功了。

    为确保您遇到同样的问题,请通过下载 KB 检查添加项目的 ID(GET 到 https://westus.api.cognitive.microsoft.com/qnamaker/v4.0/knowledgebases/:kbId/:environment/qna,其中:kbId 是您的知识库 ID,:environmentTest 或 @987654329 @)。


    更新现有的问答对

    我想这里也一样:您可能正在尝试更新一个实际上不是正确的 id。

    【讨论】:

    • 谢谢。我很困惑地认为在添加新对时我可以决定 id。这解决了我的问题。但是,我有一个新问题:如何获取刚刚添加的对的 id?因为如果我想删除它,我需要知道 id 才能做到这一点。我知道有一个函数可以为我提供我的 KB 中所有对的 id,但是有什么方法可以在我创建它后立即获取它?
    • 我找不到获取这些 id 的方法:您必须确保 Patch 操作成功(通过使用您在补丁响应中获得的 operationId 检查操作状态)调用),然后您必须下载 KB。顺便说一句,您可以使用一个 Nuget 包来代替直接调用 API:nuget.org/packages/…
    【解决方案2】:

    要删除所需的问题,您可以在知识库中添加问题时为每个问题答案对添加“源”和“元数据”。然后你必须调用 API 来下载知识库,一旦你得到响应,使用 source 和 key 的值(你在元数据中定义的)解析响应 json,在这种情况下你可以提取问题 id 并删除它.

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多