Этот репозиторий посвящен созданию и дообучению (fine-tuning) больших языковых моделей (LLM) для курсового программного проекта Чат-бот эмоциональной поддержки студентов FEELIX.
Идея проекта возникла из потребности в аналогах современных закрытых LLM, таких как ChatGPT и YandexGPT, которые могли бы не просто генерировать текст, а эффективно справляться с задачей эмпатичного общения и эмоциональной поддержки. Главной целью было создать легковесную LLM, которая не уступала бы по качеству существующим моделям, но была бы специализирована именно на эмоциональной поддержке.
На момент начала работы не существовало ни одной русскоязычной LLM, способной качественно генерировать поддерживающие, эмпатичные диалоги, поэтому пришлось делать все с нуля:
-
Поиск оптимальной базовой LLM
- Необходима была open-source модель, которая хорошо работает с русским языком, имеет приемлемое качество генерации текста на русском языке и поддается эффективному дообучению (fine-tuning).
-
Поиск и подготовка датасетов
- На русском языке не существует ни одного датасета с примерами эмпатичных, поддерживающих диалогов, которые действительно могли бы улучшать психологическое и эмоциональное состояние собеседника.
- Из-за этого самым сложным этапом стало создание качественного обучающего набора данных, который позволял бы модели генерировать теплые, внимательные и поддерживающие ответы.
- Было проведено множество экспериментов, чтобы собрать и сформировать датасет, приближенный к качественному.
-
Дообучение моделей (fine-tuning) на суперкомпьютере
- Все эксперименты по обучению проводились на суперкомпьютере cHARISMa Высшей школы экономики.
- В процессе дообучения анализировались потери (loss), а также ответы LLM после fine-tuning на нескольких тестовых вопросах. Это помогало оценить качество генерации и выявить недостатки в датасетах.
- На основе полученных результатов корректировался датасет: удалялись нерелевантные данные или, в случае неудовлетворительных результатов, принималось решение о создании нового датасета.
Этот проект — учебный, и он является моим первым опытом в дообучении LLM. Я — студент 2 курса Прикладной математики и информатики на Факультете компьютерных наук НИУ ВШЭ (Москва). В университете я пока не изучал машинное и глубинное обучение, так что этот проект — мои первые самостоятельные шаги в этой области.
Все дообучения моделей (fine-tuning) в этом репозитории выполнены мной.
Марат Тактаров
Студент 2 курса, Прикладная математика и информатика
Факультет компьютерных наук, НИУ ВШЭ (Москва)
Email: [zeldrizzyt@gmail.com]
Telegram: [https://t.me/mrtaktarov]
Огромная благодарность НИУ ВШЭ за предоставленный доступ к суперкомпьютеру cHARISMa, благодаря которому стало возможным выполнение всех fine-tune.
-
Llama 3.2 1B Instruct RU
Дообученная Llama 3.2 1B Instruct на русскоязычном датасете командой Vikhr. -
Llama 3.1 8B Instruct RU
Дообученная Llama 3.1 8B Instruct на русскоязычном датасете командой Vikhr. -
T-lite-it-1.0
LLM семейства qwen2, 7.6b ~ 8b параметров, дообученная Т-банковцами для генерации текста на русском языке. -
T-pro-it-1.0
LLM семейства qwen2.5, 32.8b ~ 33b параметров, дообученная Т-банковцами для генерации текста на русском языке. -
Nemo 12B Instruct RU
Дообученная Nemo 12B на русскоязычном датасете командой Vikhr.
-
forum
Русскоязычный датасет, полученный самостоятельным парсингом психологических форумов (~2000 строк).
Формат:вопрос1 - ответ1
,вопрос1 - ответ2
,вопрос2 - ответ1
и т.д.
Обработка:- Удалены вопросы и ответы с низкой репутацией или короткой длиной.
- Удалены специфичные для форумов приписки к пользователям, например:
Елена ответил(а) Александру:
,Елена ответил(а) через 5 минут:
.
-
forum-gpt
Объединение датасетаforum
с самостоятельно сгенерированными вопросами и ответами GPT-4o психологического характера (~2500–3000 строк). -
STCD
Датасет с Kaggle: Synthetic Therapy Conversations Dataset.
Особенности:- Содержит диалоги человека с ChatGPT с фокусом на улучшение психологического состояния.
- Размер (~8000 строк).
- Обработка:
- Удалены имена.
- Перевод из json в текстовый формат с добавлением тегов и
- Переведен на русский язык с использованием
googletrans
(около 8 часов работы скрипта).
-
STCD-big-ver1
Расширенная версия STCD (>22,000 строк). -
STCD-GMPM
Объединение:- ~11,000 строк из
STCD-big-ver1
. - ~5000 строк из Grand Master Pro Max, инструктивного датасета, сгенерированного LLM. Выбирал именно те строки, у которых менее 1024 токенов в вопросах и ответах, и в которых встречаются ключевые слова "психология", "учеба", "университет", "стресс" и тд.
- ~11,000 строк из
-
STCD-GMPM_S
Объединение:- ~18,000 строк из
STCD-big-ver1
на train.- ~2,000 из
STCD-big-ver1
строк на valid - ~2,000 из
STCD-big-ver1
строк на test - train + test + valid - в сумме дают весь датасет STCD-big-ver1 и между собой не пересекаются.
- ~2,000 из
- ~2000 строк из Grand Master Pro Max, инструктивного датасета, сгенерированного LLM. Выбирал именно те строки, у которых менее 1024 токенов в вопросах и ответах, и в которых встречаются ключевые слова "психология", "учеба", "университет", "стресс" и тд.
- ~18,000 строк из
-
STCD-GMPM_T-PSYCH
Объединение:- ~18,000 строк из
STCD-big-ver1
на train.- ~2,000 из
STCD-big-ver1
строк на valid - ~2,000 из
STCD-big-ver1
строк на test - train + test + valid - в сумме дают весь датасет STCD-big-ver1 и между собой не пересекаются.
- ~2,000 из
- ~700 строк из Grand Master Pro Max, инструктивного датасета, сгенерированного LLM. Выбирал именно те строки, у которых менее 1024 токенов в вопросах и ответах, и в которых встречаются ключевые слова "психология", "учеба", "университет", "стресс" и тд.
- ~2400 строк было спарсено с психологического форума, где пользователи задавали вопросы под профилями опытных и практикующих психологов, а те им отвечали. Этот датасет схож с датасетом "forum": также использовался парсинг веб-страниц и проводилась аналогичная очистка данных. Имена были удалены с помощью natasha, но в отличие от "forum", ответы здесь давали не обычные участники форума, а профессиональные психологи.
- ~18,000 строк из
-
STCD-PSYCH
Объединение:- ~18,000 строк из
STCD-big-ver1
на train.- ~2,000 из
STCD-big-ver1
строк на valid - ~2,000 из
STCD-big-ver1
строк на test - train + test + valid - в сумме дают весь датасет STCD-big-ver1 и между собой не пересекаются.
- ~2,000 из
- ~2400 строк было спарсено с психологического форума, где пользователи задавали вопросы под профилями опытных и практикующих психологов, а те им отвечали. Этот датасет схож с датасетом "forum": также использовался парсинг веб-страниц и проводилась аналогичная очистка данных. Имена были удалены с помощью natasha, но в отличие от "forum", ответы здесь давали не обычные участники форума, а профессиональные психологи.
- ~18,000 строк из
-
STCD-PSYCH-COMBINED
Как это было:-
1 этап) взял STCD-big-ver1 (>22,000 строк) поделил его следующим образом: train 81% от STCD-big-ver1, test 10% от STCD-big-ver1 и valid 9% от STCD-big-ver1. Между собойб train, test и valid не пересекаются.
-
2 этап) точно такое же деление проделал с ответами психологов с одного психологического форума, где всего около 2400 строк.
-
3 этап) объединил train с STCD-big-ver1 и train c ответами психологов с одного психологического форума, тоже самое проделал с test и valid. В итоге train, valid, test присутсвуют как синтетические эмпатичные ответы, так и психологическая консультация/помощь от реальных людей психологов.
-
Собственно, LLM получается на полученном train, веса корректируются на полученной valid, и итоговая проверка на test.
-
-
STCD-PSYCH-COMBINED-length-filtered
В основе этого датасета лежит STCD-PSYCH-COMBINED, к которому были применены несколько фильтраций (к train, valid, test частям):
-
Ограничение максимальной длины
- Удалены строки, в которых хотя бы один из столбцов (
request
/response
) содержал текст длиннее 5000 символов. - Это позволило убрать слишком длинные запросы и ответы.
- Удалены строки, в которых хотя бы один из столбцов (
-
Равномерное распределение длин запросов
- Внутри столбца
request
выделены диапазоны длин:
[0-1000]
,[1000-2000]
,[2000-3000]
,[3000-4000]
,[4000-5000]
. - Из каждого диапазона случайным образом выбрано по 2000 строк.
- Итоговое распределение длин
request
получилось равномерным.
- Внутри столбца
-
Ограничение длины ответов
- Удалены строки, где
response
превышал 800 символов. - Это позволило добиться нормального распределения длин
response
.
- Удалены строки, где
Итоговый размер датасета: ~9000 строк.
Визуализация изменений:
-
-
HF-jkhedri-psychology-translated
Датасет с Hugging Face: jkhedri/psychology-dataset.
Особенности:- Содержит вопросы психологического характера и два типа ответов:
- Эмпатичный и поддерживающий ответ.
- Негативный и пессимистичный ответ.
- Для обучения использовались только вопросы и первый тип ответов.
- Размер (~9000 строк).
Обработка:
- Переведен на русский язык с использованием GPT-4o mini через API.
- Удалены:
- Имена.
- Ссылки.
- Английские и китайские символы.
- Датасет разделен на train (81%), valid (9%), test (10%).
- Содержит вопросы психологического характера и два типа ответов:
-
HF-jkhedri-psychology-translated-filtered
Отфильтрированная версияHF-jkhedri-psychology-translated
.Особенности:
- После fine-tune на
HF-jkhedri-psychology-translated
выявлены нежелательные элементы в ответах. - Модель начала рекомендовать терапию и медикаменты, что несет потенциальные риски.
- Размер (~7000 строк).
Обработка:
- Удалены слова "терапия", "медикамент" и их производные.
- Датасет разделен на train (81%), valid (9%), test (10%).
- После fine-tune на
-
HF-mental_health_data-translated
Датасет с Hugging Face: YvvonM/mental_health_data.
Особенности:- Содержит три столбца:
Instruction
— промпт для LLM.Input
— пользовательский запрос, связанный с психологическими или эмоциональными проблемами.Response
— эмпатичный и поддерживающий ответ.
- Размер (~1 760 000 строк).
Обработка:
- Переведен на русский язык с использованием GPT-4o mini через API (переведены первые 16 000 строк).
- Удалены:
- Имена.
- Ссылки.
- Английские и китайские символы.
- Слова "терапия", "медикамент" и их производные.
- Датасет разделен на train (81%), valid (9%), test (10%).
- Содержит три столбца:
-
HF-mental_health_data-translated-filtered
Отфильтрированная версияHF-mental_health_data-translated
.Особенности:
- После fine-tune модели на
HF-mental_health_data-translated
выявлена неоднозначность в формах обращения. - Модель могла использовать как "ты", так и "вы" в одном диалоге.
- Датасет был заново переведен, с закреплением единого обращения на "ты".
- Размер (~16 000 строк).
Обработка:
- Переведен на русский язык с использованием GPT-4o mini через API.
- Удалены:
- Имена.
- Ссылки.
- Английские, китайские, арабские и тайские символы.
- Слова "терапия", "медикамент" и их производные.
- Датасет разделен на train (81%), valid (9%), test (10%).
- После fine-tune модели на
-
STCD-GPT-Translated-Half
Исходник: датасетSTCD-big-ver1
. Особенности:
- Содержит диалоги человека с ChatGPT с фокусом на улучшение психологического состояния.
- Размер (~10000 строк).
- Обработка:
- Перевод из json в текстовый формат с добавлением тегов и
- Переведен на русский язык с использованием
gpt 4o-mini
. - Удалены:
- Имена.
- Ссылки.
- Буквы не из русского языка.
- Слова "терапия", "медикамент" и их производные.
- Датасет разделен на train (81%), valid (9%), test (10%).
Проект содержит файлы и папки, связанные с обучением и тестированием моделей, а также анализом данных.
-
test_base_models
- Тестовые ответы моделей до обучения (fine-tuning) на контрольных примерах.
-
datasets_preview
- Первые 25 случайных строк из используемых датасетов.
- Полные версии датасетов не размещены из-за ограничений GitHub на размер файлов.
-
final_test_evaluation/
Итоговые метрики (Test Loss, PPL) на независимых тестовых выборках.
Файлы:llama-3.1-8b-all-promissing-finetunes.txt
nemo-it-12b-all-promissing-finetunes.txt
Содержат наиболее перспективные модели по качеству генерации в задаче эмоциональной поддержке.
-
simple_coversation_simulations/
Симуляции примитивного диалога с наиболее перспективными fine-tuned моделями для задачи эмоциональной поддержки (llama-3.1-8b/
,nemo-it-12b/
).
Используются заранее подготовленные вопросы, на которые модели отвечают в стиле поддерживающего собеседника. -
simple_coversation_simulations/sample_code/
Код симуляции примитивных диалогов (simulate.py
,script.sh
).
Диалог не интерактивный — LLM отвечает на фиксированные фразы. -
llama-3.1-8b-finetunes
,llama-3.2-1b-finetunes
,t-lite-it-8b-finetunes
,t-pro-it-33b-finetunes
,nemo-it-12b-finetunes
- Папки с версиями моделей после обучения (fine-tuning).
- В каждой из них находятся папки с конкретными экспериментами
- Например: llama-3.2-1b-ep5-STCD
- llama-3.2-1b — версия и размер модели.
- ep5 — количество эпох обучения.
- STCD — название датасета.
Внутри каждой экспериментальной папки находятся следующие файлы:
main.py
— код для обучения модели (fine-tuning).script.sh
— shell-скрипт для запускаmain.py
на кластере (включает параметрыsbatch
, количество GPU, CPU, время обучения и т. д.).run_model.py
— тестовый запуск модели после fine-tuning, где модель отвечает на несколько вопросов для оценки качества.run_model_script.sh
— shell-скрипт для запускаrun_model.py
.responses.txt
— ответы модели после fine-tuning на вопросы изrun_model.py
.result_FT_images/
— папка с изображениями, показывающими динамику измененияtrain loss
,eval loss (valid)
,градиентов
иlearning rate
во время обучения.total_statistics.png
— объединенное изображение с графиками изresult_FT_images
в один файл.