Создание иерархического классификатора
Иерархический классификатор хорошо подходит для решения следующих задач:
1. Клиентский сервис
У вас есть база знаний со 100 культурными объектами, например, Кремль, Большой театр и пр. Пользователи спрашивают “Как проехать в Кремль” или “Кремль”. Назовем это “Закрытый вопрос”.
На вопрос “Как проехать в Кремль” система не выдает уровень уверенности в ответе выше 80%, если не добавлять формулировку “Как проехать в Кремль” к конкретной статье в базе знаний. Т.к. объектов 100, то не хотелось бы добавлять по подобной формулировке к каждой статье в базе знаний с Закрытыми вопросами.
А если, кроме “Как проехать в …” возникают дополнительные “Открытые вопросы”: “Какой график работы …”, “Сколько стоит билет в …”, то задача создания и поддержки баз знаний становится еще более трудоемкой.
В этом случае, рекомендуется создание 2х баз знаний:
- “Закрытые вопросы” или “Информация об объектах” - с конкретной информацией об объектах
Режим поиска в этой базе знаний необходимо поставить “По полному тексту вопроса”
- “Открытые вопросы” - с набором сценариев (пример сценария ниже), которые будут обращаться к базе знаний “Закрытые вопросы” и получать точный ответ с достаточным уровнем уверенности.
Режим поиска в этой базе знаний необходимо поставить “По части текста вопроса”
2. Техническая поддержка (классификатор)
У вас есть 2 уровня для классификации обращений в техническую поддержку:
- 1ый уровень: Услуга
- 2ой уровень: Влияние на бизнес процесс
Конкретные виды услуг связаны с конкретными бизнес процессами.
Если посылать текстовый запрос для классификации отдельно к базе знаний “Услуги” и отдельно к базе знаний “Влияние на бизнес процесс”, то качество классификации будет ниже, чем если послать запрос сначала к “Услуги”, а затем, послать запрос к базе знаний с бизнес процессами, связанными только с конкретной услугой.
В этом случае, требуется разделение базы знаний “Влияние на бизнес процесс” на несколько баз знаний, согласно количеству “Услуг”, чтобы повысить качество классификации. А в базе знаний “Услуги” в статьях необходима реализация сценариев для дополнительной классификации по базам знаний “Влияние на бизнес процесс” (пример сценария ниже).
В данном случае, для обеих баз рекомендуемый режим поиска “По полному тексту вопроса”
Пример сценария:
// Токен для чтения баз знаний, брать из АФ в разделе Настройки - Общие - Параметры прямого подключения к базам знаний через API
установитьПеременную("autorizationToken", "XXX")+
// ID и токен базы знаний - классфикатора
установитьПеременную("kb_id", "XX")+
установитьПеременную("kb_token", "XXX")+
// Адрес API баз знаний - получить у администратора системы, ниже примеры:
установитьПеременную("kb_qna_enpoint", "https://xxx.autofaq.ai/q/api/v1/query")+
// Требуемы минимальный уровень уверенности при классификации
установитьПеременную("serviceOtherScore", "0.2") +
вызвать.внешнийСервис("{kb_qna_enpoint}","POST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8"),("AUTOFAQ-User-Token", "{autorizationToken}")).сТеломСообщения("{\"service_token\":\"{kb_token}\",\"service_id\":\"{kb_id}\",\"query\":\"{platformInMessageQuery}\"}").сохранитьРезультатКакСтроку("answer")+
// если запрос в базы знаний неудачный
если("{http_code} != 200").то(
// добавление комментария в диалог и завершение сценария
комментарий("При запросе на классификацию возникла ошибка {http_code}, текст ошибки {answer}")+
комментарий("Обратитесь к администратору системы")+
завершить
)+
комментарий("Запрос в классификатор прошел успешно.")+
// Разбор ответа на запрос классификации
выполнитьJs("""
var answerParsed = JSON.parse(answer);
var resultsLength = answerParsed.results.length;
var className = '';
var classAnswer = '';
var classIdFromClissifier = '';
var classScore = 0.0;
if (resultsLength > 0) {
className = answerParsed.results[0]['name'];
classIdFromClissifier = answerParsed.results[0]['document_id'].toString();
classScore = answerParsed.results[0]['score'];
classAnswer = answerParsed.results[0]['answer'];
}
var classScoreToPrint = Math.floor(classScore * 100).toString() + '%';
var exit = {'className':className, 'classIdFromClissifier':classIdFromClissifier, 'classScore':classScore, 'classAnswer':classAnswer, 'classScoreToPrint':classScoreToPrint};
exit;
""") +
комментарий("Результаты классификации: определен документ {className} с уверенностью {classScore} при установленном пороге уверенности {serviceOtherScore}")