QnA Maker-无法以编程方式更新知识库

时间:2019-01-04 08:57:31

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

我正在使用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);
        }
    }

这将在我的知识库中创建问答对: Question and answers pair created programmatically in the KB

删除问题和答案对

但是,如果我现在尝试遵循文档并删除ID为123456789的问答对,将不会发生任何事情。为此,我正在做:

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

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

更新现有的问答对

更新现有的问答对时,我遇到了同样的问题,没有遇到任何错误,但是我看不到QnA Maker门户中的更改,这使我认为没有任何更改。

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

提前谢谢!

2 个答案:

答案 0 :(得分:3)

删除问题和答案对

我用相同的值测试了您的情况,然后删除。

您遇到的问题是,在添加项目时,您在add阶段提供的ID值会发生变化:即使我放了"id": 123456789创建的项目也有一个{ {1}}值,是我知识库中当前ID的增量。

然后,当我要删除时,如果指定正确的ID,则删除操作成功。

为确保您遇到相同的问题,请下载KB(获取到https://westus.api.cognitive.microsoft.com/qnamaker/v4.0/knowledgebases/:kbId/:environment/qna,其中id是您的知识库ID,:kbId:environmentTest)。


更新现有的问答对

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

答案 1 :(得分:0)

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