Создание иерархического классификатора

Иерархический классификатор хорошо подходит для решения следующих задач:

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}")