Python библиотека RuPersonaAgent для создания русскоязычного персонифицированного диалогового агента

от автора

Сегодня мы расскажем о библиотеке для Питона под названием rupersonaagent. Это небольшой пакет с функциями и классами для разработки русскоязычного персонифицированного диалогового агента с динамической долговременной памятью. Каждый алгоритм, представленный в библиотеке, может быть переиспользован отдельно для других задач — например, представленные в ней методы оптимизации можно применить для различных генеративных и ранжирующих моделей.

Диалоговые агенты и чат‑боты — это одни из самых ярких примеров приложений искусственного интеллекта на данный момент. За счет сочетания методов машинного обучения и формальных правил такие системы позволяют взаимодействовать с человеком с помощью диалога. Диалоговые агенты можно встретить во многих отраслях — от маркетинга до здравоохранения.

Среди существующих диалоговых агентов можно выделить отдельную группу, с которой человеку чаще всего приятнее общаться — это так называемые персонифицированные диалоговые агенты. Они способны уделять внимание характеристикам собеседника, упомянутым в диалоге, отсылать к ним в последующих сообщениях и генерировать собственные ответы, опираясь на конкретного пользователя — все это дает человеку индивидуальный опыт общения. Персонификация диалоговых агентов включает в себя использование информации о пользователе: его имя, возраст, интересы, предпочтения, история покупок и другие данные. Эти данные используются для создания уникального профиля пользователя, который применяется для персонализации ответов и формирования опыта взаимодействия с диалоговым агентом.

Рисунок 1 – Пример диалога с персонифицированным диалоговым агентом

Рисунок 1 – Пример диалога с персонифицированным диалоговым агентом

Теперь, когда мы немного разобрались с тем, что такое диалоговый агент и персонификация, возникает вопрос — а зачем ему динамическая долговременная память? Для улучшения качества диалогов — долговременная память позволяет:

  • хранить информацию о собеседниках;

  • использовать информацию, которую получили в начале диалога, даже через длительное время;

  • хранить любую иную информацию, которую невозможно получить из сети Интернет.

Общие сведения

Библиотека работает на Mac OS, Linux и Windows. Конкретная работа библиотеки обеспечивается на версиях 3.8.6. Если же возникнут трудности с другими версиями, дайте знать. 

Библиотека ставится либо через гитаб, либо стандартным образом через pip:

pip install rupersonaagent
gitlab clone https://gitlab.com/Iolly/rupersonaagent.git cd rupersonaagent python setup.py install

Все основные классы разнесены по отдельным папкам:

generative_model speech_extraction personification knowledge_distillation inference_optimization rule_based_information_extraction internet_memory_model datasets tests
  • generativemodel – включает в себя генеративные модели, методы для предобработки, а также встроенный автоматический метод извлечения информации о персоне из диалоговых данных;

  • speechextraction – модуль выявления особенностей письменной речи человека в зависимости от профессии;

  • personification – модуль с персонифицированными BERT моделями;

  • knowledge_distillation – методы дистилляции моделей;

  • inference_optimization – методы оптимизации моделей;

  • rulebasedinformation_extraction – метод извлечения информации о персоне из диалоговых данных, основанный на лингвистических правилах;

  • internet_memory_model – модуль предназначен для обучения и использования модели, которая может получать информацию из сети Интернет и долговременной памяти.

  • datasets – содержит в себе собранные датасеты с профессиями, которые использовались как один из источников знаний для динамической долговременной памяти;

  • tests – содержит в себе юнит тесты.

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

Модули

Generative_model

Один из основных модулей в библиотеке — generative_model, с помощью которого можно использовать предобученные генеративные модели, либо обучить свои.

Сформировать модуль данных для тестирования и обучения модели можно следующим образом:

datamodule=TolokaDataModule(      data_dir=path_to_dir,     datasets=['current_gk', 'next_answer'], #'next_answer', 'current_gk', 'next_gk'     tokenizer=tokenizer,      spec_tokens=spec_tokens,      train_batch_size=128,      val_batch_size=256,      test_batch_size=256,  )

А для того, чтобы задать саму модель, просто используем объект T5MultiTask.

model = T5MultiTask(      model=t5,      datamodule=datamodule,      lr=5e-5,      num_warmup_steps=1000,      pooling="mean",      distance="cosine",      scale=20,      train_batch_size=train_batch_size,      val_batch_size=256,      test_batch_size=256,  )

Speech_extraction

В чем принцип работы данного модуля? На основе обучающих данных профессии составляется свойственный для нее профиль характеристик речи. После этого каждая из интересующих реплик может быть оценена по уровню схожести с профессией на основе профилей характеристик речи профессии и самой реплики. В качестве критерия для оценки схожести используется статистический критерий Манна-Уитни.

Рисунок 2 – Схема работы модуля Speech_extraction

Рисунок 2 – Схема работы модуля Speech_extraction

Для получения профиля характеристик речи для профессии в целом необходимо для целевого датасета с профессией использовать функцию get_info_from_dataset.

profession_profile = get_info_from_dataset(     dataset_name: dataset_name,      path: path_to_dataset,      column_name: replica_column_name,      delimiter: delimeter_for_columns )

Для получения профиля характеристик реплики следует использовать функцию get_info_from_sentence.

replica_profile=get_info_from_sentence(     sentence: sententce,      phrase_name: phrase_name )

Сравнить профили характеристик можно с помощью функции compare_characteristics.

compare_characteristics(     first_characteristic: SpeechCharacteristic,     second_characteristic: SpeechCharacteristic, )
Рисунок 3 – Пример профилей характеристик

Рисунок 3 – Пример профилей характеристик

Internet_memory_model

Модуль internet_memory_model предназначен для обучения и использования модели, которая может получать информацию из сети Интернет и долговременной памяти:

  •  fid.py — реализация метода Fusion-in-Decoder внутри архитектуры модели T5;

  • in_dataset.py — предобработка датасетов и токенизация текста;

  • in_model.py — архитектура основной модели;

  • inference.py — реализация чата с обученной моделью;

  • train_internet_model.py — обучение модели;

  • test_internet_model.py — тестирование модели;

  • utils.py — подсчет метрик, обработка текста, полученного через интернет-поиск.

В папке retriever содержится код для обучения и тестирования ранжирующей модели:

  • dataset.py — файл для предобработки корпусов;

  • model.py — файл с архитектурой модели;

  • train.py — файл для обучения модели;

  • test.py — файл для тестирования модели.

Данную модель можно использовать как с помощью файлов, так и использовать методы напрямую.

Обучение основной модели:

python train_internet_model.py

Тестирование основной модели:

python test_internet_model.py

Чат с основной моделью — для ведения диалога с основной моделью необходима обученная ранжирующая модель:

cd retriever/ python train.py

То же самое можно реализовать с помощью методов. 

Сформировать датасет для обучения:

test = in_dataset.InternetDataset(     path,     is_toloka,     skip_tasks,      passage_count, )

Задать параметры модели:

model = in_model.InternetModel(     model_dir,     model_name,     save_name,     labels_max_length )

Данный модуль позволяет получать знания для генерации ответов как из Интернета, так и из долговременной памяти.

Рисунок 4 – Пример диалога с моделью с модулем поиска в сети Интернет

Рисунок 4 – Пример диалога с моделью с модулем поиска в сети Интернет
Рисунок 5 – Пример диалога с моделью с модулем долговременной памяти

Рисунок 5 – Пример диалога с моделью с модулем долговременной памяти

Заключение

Мы рассмотрели некоторые возможности библиотеки rupersonaagent. Это всего лишь наша первая попытка обобщить опыт разработки персонифицированного диалогового агента в библиотеку с полезными методами. В будущем планируется расширять библиотеку и продолжать исследования по персонификации диалоговых агентов.

 


ссылка на оригинал статьи https://habr.com/ru/articles/755514/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *