Лаборатория нейронных систем и глубокого обучения МФТИ вот уже больше года делает DeepPavlov — открытую библиотеку для создания диалоговых систем. Она содержит набор претренированных компонент для анализа языка, с помощью которых можно эффективно решать задачи бизнеса.
Например, организовать ответы на часто задаваемые вопросы клиентов. Сделать это через колл-центр, виджет на сайте или соцсети, наняв сотрудников — дело нехитрое. Актуальная задача — оптимизировать процесс, чтобы он осуществлялся автоматически, с минимальными погрешностями, и еще и в удобном пользовательском интерфейсе. Например, в голосовом помощнике «Алиса» от «Яндекса».
В этой статье мы хотим рассказать, как эффективно решить задачу ответов на FAQ с помощью обработки естественного языка и как интегрировать решение в «Алису».
Классификация текстов и как ее делать
Создание вопрос-ответного навыка на основе библиотеки DeepPavlov
Установка библиотеки DeepPavlov
Запуск навыка на «Алисе»
Заключение
Проблему поиска близкого к заданному вопроса из готового сета пар «вопрос-ответ» решают алгоритмы определения семантической близости / текстовой классификации.
Чтобы решить эту проблему «на производстве», есть два пути: можно нанять NLP-специалиста в штат, а можно отдать решение на аутсорс.
Минусы обоих вариантов: 1) необходимость сбора данных, 2) бесконечные итерации тренировки моделей и измерения качества, 3) серьезные требования к квалификации разработчиков. Даже процесс интеграции готового решения обработки языка — непростая задача, не говоря уже о создании его с нуля. Зарубежные облачные решения (Google Assistant или Microsoft Cortana) предлагают комплексное решение проблемы классификации текста (DialogFlow, Azure Bot Service), но остаются вопросы с масштабированием, привязкой к платным API-сервисам и поддержкой русского языка.
Но ура — есть альтернатива: можно использовать открытую программную библиотеку, которая сильно упростит создание решения для ответа на FAQ на русском языке и интеграцию его в голосовой помощник.
DeepPavlov — как раз такая библиотека. Она содержит набор претренированных компонент для анализа языка, включая компоненты текстовой классификации. Подробнее о разных компонентах DeepPavlov можно почитать в справке.
Работа с DeepPavlov не требует от разработчика специальных навыков, библиотека бесплатна и дает широкие возможности для тонкой настройки.
Все инструкции по созданию навыка на основе базы знаний вы можете найти в этом туториале. Мы рекомендуем переписать код из туториала в отдельный скрипт и запускать навык именно из скрипта.
Для начала установите Python 3.6 и активируйте среду разработки. Затем установите DeepPavlov.
Навыком (skill) в DeepPavlov называется сущность, которая независимо от функционала (text classification, open-domain question answering и др.) имеет унифицированный формат ввода и вывода. Навыки созданы для того, чтобы их можно было скомпоновать в единый стек простой диалоговой системы, которая при получении запроса берет ответ из навыка с наивысшей уверенностью (confidence).
Создайте объект класса SimilarityMatchingSkill, который отвечает на запрос пользователя на основе списка часто задаваемых вопросов.
У объекта класса SimilarityMatchingSkill — следующие параметры:
Чтобы начать использовать модель, после тренировки ее достаточно загрузить следующей командой:
Класс SimilarityMatchingSkill упрощает доступ к компонентам классификации текста. Но если есть часть конфигурации, которую вы хотите изменить, можно сделать это, определив параметр edit_dict. Объект класса SimilarityMatchingSkill (как и любой навык) принимает на вход три параметра: список предложений для классификации, список истории запросов и список состояний (в случае SimilarityMatchingSkill два последних могут быть пустыми списками).
Типовая диалоговая система обычно содержит в своем составе несколько навыков. Для демонстрации работы с несколькими навыками мы создадим несколько навыков класса PatternMatchingSkill.
PatternMatchingSkill — это класс простого навыка, который вызывается, когда запрос пользователя совпадает с одним из элементов списка patterns и отвечает случайным элементам списка responses с уверенность default_confidence. Вы можете вручную настроить параметр default_confidence для того, чтобы приоритезировать ответы навыков.
Последний шаг — объединить навыки в агент и настроить параметр выбора навыка. Параметр `HighestConfidenceSelector` определяет, что будет вызван навык с наивысшей уверенностью (confidence).
Далее запустите сервер с указанием пути для запросов `endpoint='faq'` и порта подключения `port=5000`
Обратите внимание, что «Яндекс.Диалоги» в качестве Webhook URL требует указывать сервер с внешним IP-адресом и доступом по протоколу https. Для быстрого прототипирования вы можете использовать Ngrok — он позволяет создавать туннель для доступа к вашему серверу с DeepPavlov в локальной сети. Для этого запустите
на вашем сервере с DeepPavlov. В ответ на это будет создано два туннеля, по одному на протоколы http и https. Скопируйте адрес туннеля для https, добавьте к линку эндпоинт /faq, итоговый линк будет Webhook URL для нашего «Яндекс.Диалога».
Чтобы протестировать взаимодействие с платформой «Яндекс.Диалоги», зайдите на dialogs.yandex.ru/developer и создайте новый диалог. Задайте уникальные название и активационное имя. В качестве Webhook URL укажите полученный ранее линк. Сохраните изменения. Для взаимодействия с навыком перейдите на вкладку «Тестирование».
Ну вот, теперь вы знаете, как использовать модели классификации текста из библиотеки DeepPavlov для создания вопрос-ответного бота, как осуществлять быстрое прототипирование навыков с помощью DeepPavlov и подключать их к «Алисе».
Кстати, интерфейсы подключения к Amazon Alexa и Microsoft Bot Framework в нашей библиотеке тоже реализованы.
Будем рады обратной связи в комментариях. А любые вопросы по 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 вы можете оставлять на нашем форуме.