Привет, коллеги!

Сегодня я расскажу о библиотеке для Питона под названием 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

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

Комментарии (0)