Привет, коллеги!
Сегодня я расскажу о библиотеке для Питона под названием 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
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. Это всего лишь наша первая попытка обобщить опыт разработки персонифицированного диалогового агента в библиотеку с полезными методами.