Принятие рекомендуемых вопросов активного обучения в базе знаний
Примечание.
Поддержка службы QnA Maker будет прекращена 31 марта 2025 г. Новая версия вопроса и возможности ответа теперь доступна как часть языка искусственного интеллекта Azure. Сведения о возможностях ответов на вопросы в службе Языка см. в статье с ответами на вопросы. С 1 октября 2022 г. вы не сможете создавать ресурсы QnA Maker. Сведения о переносе существующих баз знаний QnA Maker в функцию вопросов и ответов см. в руководстве по миграции.
Активное обучение изменяет базу знаний или Службу поиска после утверждения предложения, а затем сохраняет и обучает ее. Если утвердить предложение, оно будет добавлено в качестве альтернативного вопроса.
Включение активного обучения
Чтобы увидеть рекомендуемые вопросы, необходимо включить активное обучение для ресурса QnA Maker.
Просмотр рекомендуемых вопросов
Чтобы просмотреть рекомендуемые вопросы, на странице Редактирование базы знаний выберите Параметры просмотра, а затем выберите Показать предложения активного обучения. Этот параметр будет отключен, если отсутствуют предложения для любой пары вопросов и ответов.
Отфильтруйте базу знаний по парам вопросов и ответов, чтобы отображались только предложения. Для этого щелкните Фильтр по предложениям.
В каждой паре "вопрос-ответ" предлагаются новые вопросы с флажками
✔
иx
для принятия и отклонения предложений соответственно. Установите флажок, чтобы добавить вопрос.Можно добавить или удалить все предложения, выбрав Добавить все или Отклонить все на панели инструментов в контекстном меню.
Выберите Save and Train (Сохранить и обучить), чтобы сохранить изменения в базе знаний.
Выберите Опубликовать, чтобы разрешить доступ к изменениям из API GenerateAnswer.
Когда создаются группы из 5 и более похожих запросов, QnA Maker каждые 30 минут предлагает альтернативные варианты вопросов, чтобы утвердить или отклонить их.
Предложения активного обучения сохраняются в экспортированной базе знаний
Если в приложении включено активное обучение и вы экспортируете приложение, в столбце SuggestedQuestions
в TSV-файле будут сохранены данные активного обучения.
Столбец SuggestedQuestions
представляет собой объект JSON сведений о неявных (autosuggested
) и явных (usersuggested
) отзывах. Пример этого объекта JSON для одного отправленного пользователем вопроса help
:
[
{
"clusterHead": "help",
"totalAutoSuggestedCount": 1,
"totalUserSuggestedCount": 0,
"alternateQuestionList": [
{
"question": "help",
"autoSuggestedCount": 1,
"userSuggestedCount": 0
}
]
}
]
При повторном импорте этого приложения активное обучение продолжит собор сведений и рекомендации для базы знаний.
Архитектурный процесс для использования GenerateAnswer и API обучения от бота
Для использования активного обучения в боте или другом клиентском приложении следует использовать следующий архитектурный процесс:
Бот получает ответ из базы знаний с помощью API GenerateAnswer, используя свойство
top
для получения ряда ответов.Бот определяет явный отзыв:
- Используя собственную настраиваемую бизнес-логику, отфильтруйте низкие оценки.
- В боте или клиентском приложении отобразится список возможных ответов для пользователя, из которых он сможет выбрать подходящий.
Бот отправляет выбранный ответ обратно в QnA Maker с помощью API обучения.
Использование свойства top в запросе GenerateAnswer для получения нескольких соответствующих ответов
При отправке вопроса в QnA Maker для ответа свойство top
текста JSON задает число возвращаемых ответов.
{
"question": "wi-fi",
"isTest": false,
"top": 3
}
Использование свойства score вместе с бизнес-логикой для получения списка ответов для отображения пользователя
Если клиентское приложение (например, чат-бот) получает ответ, возвращаются три лучших вопроса: Используйте свойство score
, чтобы проанализировать сходство между оценками. Этот диапазон сходства определяется собственной бизнес-логикой.
{
"answers": [
{
"questions": [
"Wi-Fi Direct Status Indicator"
],
"answer": "**Wi-Fi Direct Status Indicator**\n\nStatus bar icons indicate your current Wi-Fi Direct connection status: \n\nWhen your device is connected to another device using Wi-Fi Direct, '$ \n\n+ *+ ' Wi-Fi Direct is displayed in the Status bar.",
"score": 74.21,
"id": 607,
"source": "Bugbash KB.pdf",
"metadata": []
},
{
"questions": [
"Wi-Fi - Connections"
],
"answer": "**Wi-Fi**\n\nWi-Fi is a term used for certain types of Wireless Local Area Networks (WLAN). Wi-Fi communication requires access to a wireless Access Point (AP).",
"score": 74.15,
"id": 599,
"source": "Bugbash KB.pdf",
"metadata": []
},
{
"questions": [
"Turn Wi-Fi On or Off"
],
"answer": "**Turn Wi-Fi On or Off**\n\nTurning Wi-Fi on makes your device able to discover and connect to compatible in-range wireless APs. \n\n1. From a Home screen, tap ::: Apps > e Settings .\n2. Tap Connections > Wi-Fi , and then tap On/Off to turn Wi-Fi on or off.",
"score": 69.99,
"id": 600,
"source": "Bugbash KB.pdf",
"metadata": []
}
]
}
Дальнейшие действия клиентского приложения, когда у нескольких вопросов сходные оценки
Клиентское приложение отображает вопросы с возможностью выбора одного вопроса, который наиболее соответствует намерению.
Когда пользователь выбирает один из существующих вопросов, клиентское приложение отправляет выбор пользователя в качестве отзыва с помощью API обучения QnA Maker. Этот отзыв завершает цикл обратной связи активного обучения.
API обучения
Отзыв активного обучения отправляется в QnA Maker с запросом POST API обучения. Сигнатура API:
POST https://<QnA-Maker-resource-name>.azurewebsites.net/qnamaker/knowledgebases/<knowledge-base-ID>/train
Authorization: EndpointKey <endpoint-key>
Content-Type: application/json
{"feedbackRecords": [{"userId": "1","userQuestion": "<question-text>","qnaId": 1}]}
Свойство HTTP-запроса | Имя. | Тип | Цель |
---|---|---|---|
Параметр URL-маршрута | Идентификатор базы знаний | строка | Идентификатор GUID для базы знаний. |
Личный поддомен | Имя ресурса QnAMaker | строка | Имя ресурса используется в качестве личного поддомена для QnA Maker. Его можно найти на странице параметров после публикации базы знаний. Оно указано как host . |
Верхний колонтитул | Тип контента | строка | Тип носителя текста, отправляемого в API. Значение по умолчанию: application/json . |
Верхний колонтитул | Авторизация | строка | Ключ конечной точки (EndpointKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). |
Текст запроса POST | Объект JSON | JSON | Отзыв по обучению |
Текст JSON имеет несколько параметров:
Свойство текста JSON | Тип | Цель |
---|---|---|
feedbackRecords |
array | Список отзывов. |
userId |
строка | Идентификатор пользователя, который принимает предлагаемые вопросы. Формат идентификатора пользователя вы можете указать самостоятельно. Например, в качестве идентификатора пользователя в вашей архитектуре можно использовать адрес электронной почты. Необязательно. |
userQuestion |
строка | Точный текст запроса пользователя. Обязательный. |
qnaID |
number | Идентификатор вопроса, найденный в ответе GenerateAnswer. |
Пример текста JSON выглядит следующим образом:
{
"feedbackRecords": [
{
"userId": "1",
"userQuestion": "<question-text>",
"qnaId": 1
}
]
}
Успешный ответ возвращает состояние 204 и не имеет текста ответа JSON.
Пакетная обработка большого количества записей отзывов в одном вызове
В клиентском приложении, таком как бот, можно сохранить данные, а затем отправить большое количество записей в одном тексте JSON в массиве feedbackRecords
.
Пример текста JSON выглядит следующим образом:
{
"feedbackRecords": [
{
"userId": "1",
"userQuestion": "How do I ...",
"qnaId": 1
},
{
"userId": "2",
"userQuestion": "Where is ...",
"qnaId": 40
},
{
"userId": "3",
"userQuestion": "When do I ...",
"qnaId": 33
}
]
}
Пример кода Bot Framework
Код Bot Framework должен вызывать API обучения, если запрос пользователя должен использоваться для активного обучения. Написание кода состоит из двух частей:
- Определение необходимости использования запроса для активного обучения
- Отправка запроса обратно в API обучения QnA Maker для активного обучения
В примере Azure Bot запрограммированы оба действия.
Пример кода C# для API обучения с помощью Bot Framework 4.x
В следующем примере кода показано, как отправить сведения обратно в QnA Maker с помощью API обучения.
public class FeedbackRecords
{
// <summary>
/// List of feedback records
/// </summary>
[JsonProperty("feedbackRecords")]
public FeedbackRecord[] Records { get; set; }
}
/// <summary>
/// Active learning feedback record
/// </summary>
public class FeedbackRecord
{
/// <summary>
/// User id
/// </summary>
public string UserId { get; set; }
/// <summary>
/// User question
/// </summary>
public string UserQuestion { get; set; }
/// <summary>
/// QnA Id
/// </summary>
public int QnaId { get; set; }
}
/// <summary>
/// Method to call REST-based QnAMaker Train API for Active Learning
/// </summary>
/// <param name="endpoint">Endpoint URI of the runtime</param>
/// <param name="FeedbackRecords">Feedback records train API</param>
/// <param name="kbId">Knowledgebase Id</param>
/// <param name="key">Endpoint key</param>
/// <param name="cancellationToken"> Cancellation token</param>
public async static void CallTrain(string endpoint, FeedbackRecords feedbackRecords, string kbId, string key, CancellationToken cancellationToken)
{
var uri = endpoint + "/knowledgebases/" + kbId + "/train/";
using (var client = new HttpClient())
{
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(uri);
request.Content = new StringContent(JsonConvert.SerializeObject(feedbackRecords), Encoding.UTF8, "application/json");
request.Headers.Add("Authorization", "EndpointKey " + key);
var response = await client.SendAsync(request, cancellationToken);
await response.Content.ReadAsStringAsync();
}
}
}
Пример кода Node.js для API обучения с помощью Bot Framework 4.x
В следующем примере кода показано, как отправить сведения обратно в QnA Maker с помощью API обучения.
async callTrain(stepContext){
var trainResponses = stepContext.values[this.qnaData];
var currentQuery = stepContext.values[this.currentQuery];
if(trainResponses.length > 1){
var reply = stepContext.context.activity.text;
var qnaResults = trainResponses.filter(r => r.questions[0] == reply);
if(qnaResults.length > 0){
stepContext.values[this.qnaData] = qnaResults;
var feedbackRecords = {
FeedbackRecords:[
{
UserId:stepContext.context.activity.id,
UserQuestion: currentQuery,
QnaId: qnaResults[0].id
}
]
};
// Call Active Learning Train API
this.activeLearningHelper.callTrain(this.qnaMaker.endpoint.host, feedbackRecords, this.qnaMaker.endpoint.knowledgeBaseId, this.qnaMaker.endpoint.endpointKey);
return await stepContext.next(qnaResults);
}
else{
return await stepContext.endDialog();
}
}
return await stepContext.next(stepContext.result);
}
Рекомендации
Рекомендации по использованию активного обучения см. в статье Рекомендации по использованию базы знаний QnA Maker.