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

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

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

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



    Классификация текстов и как ее делать
    Создание вопрос-ответного навыка на основе библиотеки 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(save_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 deeppavlov.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 вы можете оставлять на нашем форуме.

    Московский физико-технический институт (МФТИ)
    127,92
    Компания
    Поделиться публикацией

    Комментарии 9

      0
      А есть ли реализация DeepPavlov для js?
        0
        Нет, к сожалению
        0
        Добрый день.
        Не удается выполнить данную команду: faq = SimilarityMatchingSkill(load_path='./model')
        Требуется определенная версия библиотеки?
          0
          Добрый день! Да, надо скачать последнюю версию библиотеки pip install deeppavlov
            0
            В самой послежней версии библиотеки у этого метода нет параметра load_path. Насколько я понял, вместо него используется save_load_path. Вот то, что написано в документации
            save_load_path: Path, where the model will be saved or loaded from ('./similarity_matching' by default).
              0

              Если речь идёт об использовании уже обученной модели, то стоит добавить аргумент train=False, иначе модель будет заново обучена на игрушечных данных.

                0
                Спасибо за ответ, не могли бы вы еще досказать насчет вот этого
                image
                Каждый запуск скрипта сопровождается загрузкой вот этих бинарников. При этом они уже были скачаны в предыдущие запуски. Это как-то «лечится» или так и должно быть? Если всё в порядке, тогда для чего они подгружаются?
                  0

                  Это лечится добавление аргумента train=False.
                  Суть в том, что если тренировка включена, то для модели предварительно закачиваются сопроводительные файлы, и для конфигурации по-умолчанию это файлы предобученной модели. При этом модель обучается заново, файлы меняются, хеши перестают совпадать, поэтому файлы при следующей попытке обучения закачиваются заново.

                    0
                    Благодарю, теперь действительно всё исправно работает.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое