QnA Maker - Невозможно обновить базу знаний программно

Я использую 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);
        }
    }

Это создаст пару вопросов и ответов в моей базе знаний:  Пара вопросов и ответов, созданная программно в базе знаний

Удаление пары вопросов и ответов

Однако, если я сейчас попытаюсь следовать документации и удалю пару вопросов и ответов с идентификатором 123456789, ничего не произойдет. Для этого я делаю:

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

И после вызова метода UpdateKnowledgeBase с этим json я не получу ошибки, но моя пара вопросов и ответов по-прежнему отображается на портале QnA Maker. Если я добавлю источник, он удалит все редакционные источники. Это нормально, но я также хочу удалить только одну пару, а не все. Это возможно?

Обновление существующей пары вопросов и ответов

При обновлении существующей пары вопросов и ответов у меня такая же проблема, я не получаю никаких ошибок, но я не вижу изменений на портале QnA Maker, что заставляет меня думать, что никаких изменений не делается.

Поэтому мой вопрос: как я могу обновить и / или удалить пары вопросов и ответов, не удаляя весь источник?

Заранее спасибо!


person Marisa    schedule 04.01.2019    source источник


Ответы (2)


Удаление пары вопросов и ответов

Я проверил ваш случай с теми же значениями для создания и удаления.

Проблема в вашем случае заключается в том, что значение идентификатора, которое вы указали во время фазы add, изменяется при добавлении элемента: даже если я поставил "id": 123456789, созданный элемент имеет значение id, которое является приращением текущего идентификатора, существующего в моя база знаний.

Затем, когда я хочу удалить, если я укажу правильный идентификатор, операция удаления будет успешной.

Чтобы убедиться, что у вас такая же проблема, проверьте идентификатор добавленного элемента, загрузив базу знаний (ПОЛУЧИТЕ на https://westus.api.cognitive.microsoft.com/qnamaker/v4.0/knowledgebases/:kbId/:environment/qna, где :kbId - это идентификатор вашей базы знаний, а :environment - Test или Prod).


Обновление существующей пары вопросов и ответов

Я предполагаю, что здесь то же самое: возможно, вы пытаетесь обновить идентификатор, который на самом деле не правильный.

person Nicolas R    schedule 04.01.2019
comment
Спасибо. Я был сбит с толку, думая, что при добавлении новой пары я могу выбрать идентификатор. Это устранило мою проблему. Однако у меня возник новый вопрос: как я могу получить идентификатор только что добавленной пары? Потому что, если я захочу удалить его, мне нужно будет знать идентификатор, чтобы это сделать. Я знаю, что есть функция, которая дает мне идентификаторы всех пар в моей базе знаний, но есть ли способ получить ее, как только я ее создам? - person Marisa; 04.01.2019
comment
Я не могу найти способ получить этот идентификатор: вы должны убедиться, что операция исправления прошла успешно (проверив статус операции с помощью идентификатора операции, который вы получили в ответе на вызов исправления), затем вам нужно загрузить КБ. Кстати, есть пакет Nuget, который можно использовать вместо прямого вызова API: nuget.org/packages/ - person Nicolas R; 04.01.2019

Чтобы удалить требуемый вопрос, вы можете добавить «источник» и «метаданные» к каждой паре ответов на вопросы при добавлении вопроса в базу знаний. Затем вам нужно будет выполнить вызов API для загрузки базы знаний, как только вы получите ответ, проанализируйте ответ json, используя значение источника и ключа (которые вы определили в метаданных), в этом случае вы можете извлечь идентификатор вопроса и удалить его. .

person Muhammad Murad Haider    schedule 07.10.2019