Первый Русскоязычный Дистрибутив Чат-бота Dream

Dilyara Zharikova (Baymurzina)
DeepPavlov
Published in
5 min readJun 30, 2022

Платформа для создания диалоговых систем DeepPavlov Dream была создана на основе чат-бота Dream, принимавшего участие в двух международных конкурсах “Alexa Prize Challenge 3 & 4”, поэтому платформа содержала только англоязычные компоненты и дистрибутивы. До текущего момента.

Представляем первый русскоязычный дистрибутив на платформе DeepPavlov Dream. В основе русского дистрибутива лежит генеративная модель DialoGPT, обученная на цепочках комментариев из социальных сетей (~92% Pikabu, ~6% YouTube, ~2% VK) вести диалоги. Архитектура системы представлена на рисунке ниже:

Аннотаторы

Русский дистрибутив включает 10 аннотаторов реплики пользователя. Например, для предобработки реплики пользователя используются модели исправления опечаток и восстановления пунктуации. Spelling Preprocessing использует готовую модель исправления опечаток на основе расстояния Левенштейна из библиотеки DeepPavlov. Аннотатор Sentence-Segmentation восстанавливает пунктуацию в тексте, однако не учитывает запятые и расставляет только точки и вопросительные знаки. Модель на основе ruBERT обучена на приведенных к нижнему регистру данных датасета Russian Open Subtitles аналогично обучению NER (Named Entity Recognition) моделей. На 30 тысячах тестовых примеров модель достигает значений метрик “ner_f1”=74.1.

Spacy-Annotator — это компонента для добавления различных потокенных аннотаций, доступных для русского языка в библиотеке Spacy. На данный момент аннотатор разделяет текст на токены и добавляет следующую разметку для каждого токена:

{
“dep_”: “ROOT”, # тип зависимости
“ent_iob_”: “O”, # B-I-O тег сущности
“ent_type_”: “”, # типа именованной сущности
“lemma_”: “хотеть”, # лемма слова
“morph”: “Aspect=Imp|Mood=Ind|Number=Sing|Person=Third|Tense=Pres|VerbForm=Fin|Voice=Act”,
# морфологически признаки
“pos_”: “VERB”, # часть речи
“text”: “хочет”, # исходное слово
}

Badlisted-Words проверяет леммы слов в реплике, полученные с помощью pymorphy2 на совпадение со словарем матерных слов русского языка. В связи с богатством русской морфологии и несовершенством лемматизации данный аннотатор часто допускает ошибки. Однако позволить себе такое диалоговая система открытого домена не может, поэтому мы встроили также Toxic-Classification, классификатор токсичности от Сколтеха.

Извлечение именованных сущностей является важной задачей, поэтому мы добавили компоненту NER на основе разговорной версии ruBERT, которая обучена на приведенных к нижнему регистру текстах датасета CoNLL2003.

Важную роль играет аннотатор Intent-Catcher, который представляет собой multi-label классификатор для определения намерений пользователя. Представленная версия Intent-Catcher основана на разговорной версии ruBERT.

Для работы с базами знаний в русскоязычный дистрибутив добавлены три компоненты: Entity-Detection, Entity-Linking, Wiki-Parser. Для качественного понимания естественного языка требуется извлечение не только именованных сущностей, но и нарицательных. Аннотатор Entity-Detection извлекает из текста сущности и определяет их типы для русского языка в нижнем регистре, обучен на основе нейросетевой модели ruBERT на PyTorch. Аннотатор Entity-Linking решает задачу связывания сущностей, то есть определяет идентификатор сущности в базе данных Wikidata и имеет в основе дистиллированную модель ruBERT. Аннотатор Wiki-Parser извлечения триплетов из Wikidata для сущностей, извлеченных с помощью Entity-Detection.

Навыки

Русскоязычный чат-бот использует тот же Skill-Selector, основанный на правилах, что и для англоязычной версии. Skill-Selector всегда выбирает Dummy-Skill, который генерирует реплики-заглушки (fallbacks) и реплики-затравки (prompts), используемые для проявления инициативы системы. В случае, когда Intent-Catcher задетектировал приоритетное намерение пользователя, Skill-Selector выбирает DFF-Intent-Responder-Skill, чтобы ускорить процесс обработки запроса, требующего срочного реагирования. Так как русскоязычный чат-бот основан преимущественно на генеративной модели, то отсутствует выбор навыков на основе затрагиваемых тем. Все оставшиеся навыки включаются во всех случаях, кроме приоритетных намерений пользователя.

Чат-бот использует сразу несколько навыков для генерации реплик-кандидатов. Основным методом генерации ответов в русскоязычном боте Dream является навык DFF-Generative-Skill, использующий сервис с генеративной моделью DialoGPT, обученной на большом числе цепочек комментариев из социальных сетей. Сервис использует ресурсы на видеокарте. Пример генерации навыка представлен в таблице ниже. Реплики User-Bot-User составляют контекст. Навык генерирует 5 гипотез.

Важным элементом пайплайна является навык Dummy-Skill, возвращающий ответы-заглушки и ответы-затравки. Навык имплементирован в том же коде, что и для англоязычной версии, однако возвращает гипотезы в меньшем числе случаев. Ответы-затравки используются как отдельные реплики-кандидаты, а также могут быть присоединены к финальной реплике в Response-Selector для проявления инициативы системы в определенных случаях.

Для обработки части личной информации о пользователе используется Personal-Info-Skill, извлекающий и сохраняющий в состояние диалога имя, место рождения и проживания пользователя. Навык также имплементирован в рамках англоязычной компоненты с заданием гиперпараметра, обозначающего язык, в yml-конфиге.

DFF-Program-y-Skill представляет из себя пример навыка на основе языка разметки искусственного интеллекта AIML, имплементированного с помощью фреймворка DFF. Навык содержит небольшое число обобщенных паттернов и соответствующих ответных реплик. Также добавлен навык DFF-Friendship-Skill, сценарный навык для ведения приветственной части диалога с пользователем.

Для ответа на специальные запросы пользователя используется DFF-Intent-Responder-Skill, также принимающий параметр, определяющий язык. Навык отвечает специальными репликами при определенных задетектированных компонентой Intent-Catcher намерениях пользователя.

Выбор финальной реплики

Реплики-кандидаты аннотируются с помощью Spacy-Annotator, Badlisted-Words-Annotator, Toxic-Classification, Entity-Detection и DialogRPT. DialogRPT представляет собой сервис оценки вероятности реплики понравиться пользователю, который использует русскоязычную модель DialogRPT, обученную специально для Dream. Русскоязычная генеративная модель DialoGPT была дообучена для оценки реплик на комментариях с сайта “Пикабу” с помощью методологии, используемой в оригинальном репозитории DialogRPT. Данные для оценки реплик были получены с русскоязычного сайта “Пикабу”, код для скачивания выложен в открытый доступ. Всего было использовано 827 тысяч обучающих примеров и 95 тысяч валидационных примеров. Адаптированный для дообучения на русскоязычных данных код представлен в форке репозитория.

Финальная реплика для отправки пользователю формируется с помощью компоненты Response-Selector. В пайплайне используется компонента для англоязычной версии, которая также получает на вход параметр языка. В русскоязычной версии в связи с отсутствием сценарных тематических навыков с помощью гиперпараметров в yml-конфиге отключена приоритизация сценарных навыков, что позволяет строить диалог, в основе которого лежат реплики генеративной модели и специально заготовленные реплики-затравки для проявления инициативы системы.

Представленная диалоговая система на русском языке выложена в открытый доступ со всеми используемыми компонентами под лицензией Apache 2.0. В ближайшем будущем мы планируем добавить автоматически обучаемые компоненты для ответов на часто-задаваемые вопросы (FAQ) и быстро обучаемой few-shot классификации намерений для русского языка, которые помогут проще адаптировать диалоговую систему для выполнения задач пользователя при сохранении возможности поддерживать диалог в открытом домене.

Описание русскоязычного дистрибутива представлено в Readme. В ближайшее время мы добавим возможность пообщаться с нашим ботом на наш сайт — следите за новостями!

--

--

Dilyara Zharikova (Baymurzina)
DeepPavlov

PhD in Technical Sciences. Senior Researcher in DeepPavlov. DREAM Team Leader in Alexa Prize Challenge 4 (2020–2021).