Skip to content

Русскоязычный Чат бот Dream (Russian Dream Chatbot)

dilyararimovna edited this page Sep 19, 2022 · 10 revisions

Русскоязычный Чат-бот Dream (Russian Dream Chatbot)

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

Аннотаторы (Annotators)

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

Навыки (Skills)

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

Спикер Пример 1 Пример 2
User Привет, как день прошел? Привет, как день прошел?
Bot Хорошо, а у тебя как? Хорошо, а у тебя как?
User Нормально, посоветуй фильм посмотреть. Нормально, вот только фильм посмотрела.
Гипотезы
от DialoGPT
- Какое настроение?
- Вроде "Братья из Гримсби".
- Я не смотрел
- Как вариант - "Плакса", он не такой мрачный, но тоже неплохой
- Игру престолов, например
- А что за фильм?
- Ну это нормально, поздравляю)
- Ну что, как фильм?
- Это хорошо.
- Я тоже, но не стал его смотреть

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

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

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

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

Аннотаторы реплик-кандидатов (Response Candidate Annotators)

Реплики-кандидаты аннотируются с помощью Spacy-Annotator, Badlisted-Words-Annotator, Toxic-Classification, Entity-Detection и DialogRPT.

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

Выбор финальной реплики (Response Selector)

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