Сегодня мы расскажем о библиотеке для Питона под названием rupersonaagent. Это небольшой пакет с функциями и классами для разработки русскоязычного персонифицированного диалогового агента с динамической долговременной памятью. Каждый алгоритм, представленный в библиотеке, может быть переиспользован отдельно для других задач — например, представленные в ней методы оптимизации можно применить для различных генеративных и ранжирующих моделей.
Диалоговые агенты и чат‑боты — это одни из самых ярких примеров приложений искусственного интеллекта на данный момент. За счет сочетания методов машинного обучения и формальных правил такие системы позволяют взаимодействовать с человеком с помощью диалога. Диалоговые агенты можно встретить во многих отраслях — от маркетинга до здравоохранения.
Среди существующих диалоговых агентов можно выделить отдельную группу, с которой человеку чаще всего приятнее общаться — это так называемые персонифицированные диалоговые агенты. Они способны уделять внимание характеристикам собеседника, упомянутым в диалоге, отсылать к ним в последующих сообщениях и генерировать собственные ответы, опираясь на конкретного пользователя — все это дает человеку индивидуальный опыт общения. Персонификация диалоговых агентов включает в себя использование информации о пользователе: его имя, возраст, интересы, предпочтения, история покупок и другие данные. Эти данные используются для создания уникального профиля пользователя, который применяется для персонализации ответов и формирования опыта взаимодействия с диалоговым агентом.
Теперь, когда мы немного разобрались с тем, что такое диалоговый агент и персонификация, возникает вопрос — а зачем ему динамическая долговременная память? Для улучшения качества диалогов — долговременная память позволяет:
хранить информацию о собеседниках;
использовать информацию, которую получили в начале диалога, даже через длительное время;
хранить любую иную информацию, которую невозможно получить из сети Интернет.
Общие сведения
Библиотека работает на 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
В чем принцип работы данного модуля? На основе обучающих данных профессии составляется свойственный для нее профиль характеристик речи. После этого каждая из интересующих реплик может быть оценена по уровню схожести с профессией на основе профилей характеристик речи профессии и самой реплики. В качестве критерия для оценки схожести используется статистический критерий Манна-Уитни.
Для получения профиля характеристик речи для профессии в целом необходимо для целевого датасета с профессией использовать функцию 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,
)
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
)
Данный модуль позволяет получать знания для генерации ответов как из Интернета, так и из долговременной памяти.
Заключение
Мы рассмотрели некоторые возможности библиотеки rupersonaagent. Это всего лишь наша первая попытка обобщить опыт разработки персонифицированного диалогового агента в библиотеку с полезными методами. В будущем планируется расширять библиотеку и продолжать исследования по персонификации диалоговых агентов.