Не удается загрузить файл в базу знаний QnaMaker с помощью SDK - PullRequest
1 голос
/ 13 марта 2020

В настоящее время у меня есть функция Azure, для которой я хотел бы обновлять базу знаний QnaMaker каждый день или около того. В настоящее время все подключено и работает нормально, однако я могу отправлять только объекты Qna (пары qna), а не ссылки на файлы на моем веб-сайте. Таким образом, в приведенном ниже примере, хотя он должен заполнить КБ двумя вопросами и файлом из URL, он заполняет только вопросы.

В настоящее время это не дает мне никакой ошибки, на самом деле код ответа от моего обращения к КБ возвращается как 204. Так что он проходит, но все равно не добавляет файл в КБ, так как should.

ПРИМЕЧАНИЕ. Файл, импортируемый в этом примере (alice-I. html), является случайным для этой демонстрации (не мой, для безопасности), но проблема та же. Если я непосредственно добавлю этот файл в QnaMaker с самого сайта КБ, он будет работать нормально, но он не будет обновляться из Azure кода функции.

Любое понимание происходящего было бы замечательно.

Содержание, отправляемое в базу знаний

string replace_kb = @"{
  'qnaList': [
    {
      'id': 0,
      'answer': 'A-1',
      'source': 'Custom Editorial',
      'questions': [
        'Q-1'
      ],
      'metadata': []
    },
    {
      'id': 1,
      'answer': 'A-2',
      'source': 'Custom Editorial',
      'questions': [
        'Q-2'
      ],
      'metadata': [
        {
          'name': 'category',
          'value': 'api'
        }
      ]
    }
  ],
  'files': [
      {
        'fileName': 'alice-I.html',
        'fileUri': 'https://www.cs.cmu.edu/~rgs/alice-I.html'
      }
  ]
}";

Код Отправка содержимого в базу знаний

using (var clientF = new HttpClient())
            using (var requestF = new HttpRequestMessage())
            {
                requestF.Method = HttpMethod.Put;
                requestF.RequestUri = new Uri(<your-uri>);
                requestF.Content = new StringContent(replace_kb, Encoding.UTF8, "application/json");
                requestF.Headers.Add("Ocp-Apim-Subscription-Key", <your-key>);

                var responseF = await clientF.SendAsync(requestF);
                if (responseF.IsSuccessStatusCode)
                {
                    log.LogInformation("{'result' : 'Success.'}");
                     log.LogInformation($"------------>{responseF}");
                }
                else
                {
                    await responseF.Content.ReadAsStringAsync();
                    log.LogInformation($"------------>{responseF}");
                }
            }

1 Ответ

0 голосов
/ 13 марта 2020

Так что я до сих пор не знаю, как заставить вышеописанное работать, но я заставил его работать по-другому. В основном я использовал класс UpdateKbOperationDTO, перечисленный здесь: class

Это все еще не идеальное решение, но оно позволяет мне обновлять мои КБ файлами, используя код вместо интерфейса.

Ниже мой новый код:

QnAMakerClient qnaC = new QnAMakerClient(new ApiKeyServiceClientCredentials(<subscription-key>)) { Endpoint = "https://<your-custom-domain>.cognitiveservices.azure.com"};
log.LogInformation("Delete-->Start");
List<string> toDelete = new List<string>();
toDelete.Add("<my-file>");
var updateDelete = await qnaC.Knowledgebase.UpdateAsync(kbId, new UpdateKbOperationDTO
    {
        // Create JSON of changes ///
        Add = null, 
        Update = null, 
        Delete = new UpdateKbOperationDTODelete(null, toDelete)
    });
log.LogInformation("Delete-->Done"); 


log.LogInformation("Add-->Start");
List<FileDTO> toAdd = new List<FileDTO>();
toAdd.Add(new FileDTO("<my-file>", "<url-to-file>"));
var updateAdd = await qnaC.Knowledgebase.UpdateAsync(kbId, new UpdateKbOperationDTO
    {
        // Create JSON of changes ///
        Add = new UpdateKbOperationDTOAdd(null, null, toAdd),
        Update = null,
        Delete = null
    });
log.LogInformation("Add-->Done"); 
...