Автоматизация ответов на часто задаваемые вопросы в навыке для «Алисы» с помощью библиотеки DeepPavlov

Лаборатория нейронных систем и глубокого обучения МФТИ вот уже больше года делает DeepPavlov — открытую библиотеку для создания диалоговых систем. Она содержит набор претренированных компонент для анализа языка, с помощью которых можно эффективно решать задачи бизнеса.

Например, организовать ответы на часто задаваемые вопросы клиентов. Сделать это через колл-центр, виджет на сайте или соцсети, наняв сотрудников — дело нехитрое. Актуальная задача — оптимизировать процесс, чтобы он осуществлялся автоматически, с минимальными погрешностями, и еще и в удобном пользовательском интерфейсе. Например, в голосовом помощнике «Алиса» от «Яндекса».

В этой статье мы хотим рассказать том, как эффективно решить задачу ответов на FAQ с помощью обработки естественного языка и как интегрировать решение в «Алису».

wlw6qxz0utzarpemqcd1ywnxhlq.jpeg
Классификация текстов и как ее делать
Создание вопрос-ответного навыка на основе библиотеки DeepPavlov
Установка библиотеки DeepPavlov
Запуск навыка на «Алисе»
Заключение

Классификация текстов и как ее делать


Проблему поиска близкого к заданному вопроса из готового сета пар «вопрос-ответ» решают алгоритмы определения семантической близости / текстовой классификации.

Чтобы решить эту проблему «на производстве», есть два пути: можно нанять NLP-специалиста в штат, а можно отдать решение на аутсорс.

Минусы обоих вариантов: 1) необходимость сбора данных, 2) бесконечные итерации тренировки моделей и измерения качества, 3) серьезные требования к квалификации разработчиков. Даже процесс интеграции готового решения обработки языка — непростая задача, не говоря уже о создании его с нуля. Зарубежные облачные решения (Google Assistant или Microsoft Cortana) предлагают комплексное решение проблемы классификации текста (DialogFlow, Azure Bot Service), но остаются вопросы с масштабированием, привязкой к платным API-сервисам и поддержкой русского языка.

Но ура — есть альтернатива: можно использовать открытую программную библиотеку, которая сильно упростит создание решения для ответа на FAQ на русском языке и интеграцию его в голосовой помощник.

Создание вопрос-ответного навыка на основе библиотеки DeepPavlov


DeepPavlov — как раз такая библиотека. Она содержит набор претренированных компонент для анализа языка, включая компоненты текстовой классификации. Подробнее о разных компонентах DeepPavlov можно почитать в справке.

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

Все инструкции по созданию навыка на основе базы знаний вы можете найти в этом туториале. Мы рекомендуем переписать код из туториала в отдельный скрипт и запускать навык именно из скрипта.

Установка библиотеки DeepPavlov


Для начала установите Python 3.6 и активируйте среду разработки. Затем установите DeepPavlov.

source activate py36
pip install -q deeppavlov


Разработка навыка


Навыком (skill) в DeepPavlov называется сущность, которая независимо от функционала (text classification, open-domain question answering и др.) имеет унифицированный формат ввода и вывода. Навыки созданы для того, чтобы их можно было скомпоновать в единый стек простой диалоговой системы, которая при получении запроса берет ответ из навыка с наивысшей уверенностью (confidence).

Создайте объект класса SimilarityMatchingSkill, который отвечает на запрос пользователя на основе списка часто задаваемых вопросов.

from deeppavlov.contrib.skills.similarity_matching_skill import SimilarityMatchingSkill
faq = SimilarityMatchingSkill(data_path = 'http://files.deeppavlov.ai/faq/dataset_ru.csv',
                              x_col_name = 'Question', 
                              y_col_name = 'Answer',
                              save_load_path = './model',
                              config_type = 'tfidf_autofaq',
                              edit_dict = {},
                              train = True)


У объекта класса SimilarityMatchingSkill — следующие параметры:

  • data_path — путь к csv файлу с данными (разделитель запятая)
  • x_col_name — имя колонки с вопросами в csv файле (Question, по умолчанию)
  • y_col_name — имя колонки с ответами в csv файле (Answer, по умолчанию)
  • config_type — название конфигурации, которую вы хотите использовать для классификации. Список всех конфигураций.
  • edit_dict — `dict` с параметрами, которые необходимо переписать в конфигурации определенной config_type
  • save_load_path — путь куда сохранить натренированную модель
  • train — тренировать ли модель


Чтобы начать использовать модель, после тренировки ее достаточно загрузить следующей командой:

faq = SimilarityMatchingSkill(load_path='./model')`. 


Класс SimilarityMatchingSkill упрощает доступ к компонентам классификации текста. Но если есть часть конфигурации, которую вы хотите изменить, можно сделать это, определив параметр edit_dict. Объект класса SimilarityMatchingSkill (как и любой навык) принимает на вход три параметра: список предложений для классификации, список истории запросов и список состояний (в случае SimilarityMatchingSkill два последних могут быть пустыми списками).

faq([‘где будет школа?’],[],[])


Типовая диалоговая система обычно содержит в своем составе несколько навыков. Для демонстрации работы с несколькими навыками мы создадим несколько навыков класса PatternMatchingSkill.

from deeppavlov.skills.pattern_matching_skill import PatternMatchingSkill
hello = PatternMatchingSkill(responses=['Привет', 'Приветствую'], patterns=['Привет', 'Здравствуйте'])
bye = PatternMatchingSkill(responses=['Пока', 'Всего доброго'], patterns=['Пока', 'До свидания'])
fallback = PatternMatchingSkill(responses=['Пожалуйста перефразируйте'], default_confidence = 0.3)


PatternMatchingSkill — это класс простого навыка, который вызывается, когда запрос пользователя совпадает с одним из элементов списка patterns и отвечает случайным элементам списка responses с уверенность default_confidence. Вы можете вручную настроить параметр default_confidence для того, чтобы приоритезировать ответы навыков.

Последний шаг — объединить навыки в агент и настроить параметр выбора навыка. Параметр `HighestConfidenceSelector` определяет, что будет вызван навык с наивысшей уверенностью (confidence).

from deeppavlov.agents.default_agent.default_agent import DefaultAgent
from deeppavlov.agents.processors.highest_confidence_selector import HighestConfidenceSelector
agent = DefaultAgent([hello, bye, faq, fallback], skills_selector=HighestConfidenceSelector())


Далее запустите сервер с указанием пути для запросов `endpoint='faq'` и порта подключения `port=5000`

from utils.alice import start_agent_server
start_agent_server(agent, host='0.0.0.0', port=5000, endpoint='/faq')


Обратите внимание, что «Яндекс.Диалоги» в качестве Webhook URL требует указывать сервер с внешним IP-адресом и доступом по протоколу https. Для быстрого прототипирования вы можете использовать Ngrok — он позволяет создавать туннель для доступа к вашему серверу с DeepPavlov в локальной сети. Для этого запустите

ngrok http 5000


на вашем сервере с DeepPavlov. В ответ на это будет создано два туннеля, по одному на протоколы http и https. Скопируйте адрес туннеля для https, добавьте к линку эндпоинт /faq, итоговый линк будет Webhook URL для нашего «Яндекс.Диалога».

Запуск навыка на «Алисе»


Чтобы протестировать взаимодействие с платформой «Яндекс.Диалоги», зайдите на dialogs.yandex.ru/developer и создайте новый диалог. Задайте уникальные название и активационное имя. В качестве Webhook URL укажите полученный ранее линк. Сохраните изменения. Для взаимодействия с навыком перейдите на вкладку «Тестирование».

Заключение


Ну вот, теперь вы знаете, как использовать модели классификации текста из библиотеки DeepPavlov для создания вопрос-ответного бота, как осуществлять быстрое прототипирование навыков с помощью DeepPavlov и подключать их к «Алисе».

Кстати, интерфейсы подключения к Amazon Alexa и Microsoft Bot Framework в нашей библиотеке тоже реализованы.

Будем рады обратной связи в комментариях. А любые вопросы по DeepPavlov вы можете оставлять на нашем форуме.

2xvdwd9bleek9bauhif3fzpnlvy.png

© Habrahabr.ru