Как забэкапить друга в нейросеть
Есть у меня друг, агушагеймер-сычевод, пенсионер (владелец сараеподобного Volvo) и вообще прекрасный человек. Подумалось, дед старенький уже, четвертый десяток перешагнул, вдруг чего, забэкапить бы надо.
Году в 2017 перешли мы с ним в Telegram, и накопилось у нас с ним порядка 52000 сообщений в диалогах.
Выкачал я всё это добро, да и обучил нейронку:
Результат, очевидно, УГ, но местами в диалогах всплывают старые-добрые нотки родного деда, и на глазах умиление, а в сердце теплота. А еще все это можно улучшить, вопрос лишь времени.
Ну и как мне забэкапить своего другана?
Добро пожаловать, ребятки, в чудесный мир нейронных сетей.
Знать вам нужно две вещи - для этого не требуется программирование, и вам, ПК-боярам, это доступно прямо дома (так как видеокарта у вас точно есть, а лайфхак консолеводам будет дальше).
Тем не менее, умение следовать гайдам, открывать консоль и кидать ошибки в ChatGPT с вопросом "чего дальше делать" вам понадобится.
Схема проста. Берем диалог из телеги, выбираем LLM, дообучаем её на нашем диалоге, и общаемся с ней!
Краткое введение в матчасть нейросетей (скучно, но быстро)
Мы будем работать с LLM (Large Language Model).
Состоят они из двух частей:
- немного кода на каком-нибудь языке программирования;
- огромный файл с числами на много гигабайт (так называемые веса модели).
Схема работы LLM
- Когда мы пишем слово "Привет", она преобразует его в токены: "54745, 28089, 8341, 0".
- Токены подаются на вход нейросети и происходит inference - расчёт ответа. Наши числа, представляющие собою текущий контекст, миллионы раз подряд умножаются, делятся и возводятся в степень с числами из весов модели.
- Модель выдает ответ в токенах - "54745, 28089, 8341, 423, 11042, 0", которые переводится обратно в текст "Привет DTF!".
Как видим, никакого интеллекта (кроме интеллекта разработчиков нейросети) у LLM нет - это тупо гигабайты чисел и миллионы простых математических операций над ними.
Для любопытных крайне рекомендую лекцию Андрея Карпаты:
Тренируем нейродеда
Я буду тренировать модель на Mac (ввиду отсутствия боярского ПК) и большая часть следующих шагов применима только для него.
Гайды для ПК легко гуглятся по фразе "LoRA LLM tuning Nvidia", например:
Шаг 1 - История из Telegram
Выгружаем историю общения. Это можно сделать в Telegram Desktop на Windows, macOS и Linux. Открываем диалог и щелкаем Export chat history:
Шаг 2 - Выбираем LLM модель
Нам понадобится завести аккаунт на Hugging Face для загрузки моделей нейронных сетей:
После создания акаунта нужно выбрать, какую модель будем доучивать. Открываем модели, выбираем в языках Russian, а в задачах Text Generation:
Hugging Face сортирует модели по релевантности, и Phi-4 от Microsoft как раз хороший выбор.
Копируем ID модели: microsoft/Phi-4-mini-instruct
Шаг 3 - Качаем утилиту и готовим данные
Для обучения на Mac с Apple Silicon (M1 и выше) хорошо подходит Apple MLX, гайд:
Клонируем репозиторий:
Переходим в директорию /mlx-examples/llms/mlx_lm.
После прохождения гайдов готовим данные из телеги.
Telegram отдает историю в виде JSON в файле result.json, разделенного на сообщения:
В моём случае MLX LM требует формат вопрос-ответ:
Пишем в ChatGPT:
Созданный Python файл сохраянем и исполняем, получаем верный формат.
Модели требуется два файла - train.jsonl (датасет) и valid.jsonl (правила валидации датасета). Готовить правила валидации задача сложная, поэтому тупо делим наш диалог на 2/3 и 1/3. Первая идет в train.jsonl, вторая в valid.jsonl - то есть мы обучаем модель на 2/3 наших разговоров, а проверяем модель при обучении на 1/3 наших разговоров.
Шаг 4 - Запускаем обучение
Когда файлы train.jsonl и valid.jsonl готовы, кидаем их в директорию mlx-examples/llms/mlx_lm и переходим в неё.
Запускаем процесс обучения модели:
Долго ждём, в зависимости от количества сообщений в датасете (для 52000 сообщений заняло 4 часа):
Готово!
Шаг 5 - Говорим с нейродедом
Запускаем диалог:
Общаемся:
Это же чушь, а не диалог?
Да, чушь. Мусор на входе == мусор на выходе.
К сожалению, для полноценного обучения нам нужно МНОГО данных. 50000 сообщений это мало. И 500000 мало. Но можно развернуть ситуацию, и сделать генератор не друга, а себя самого, ввиду наличия гораздо большего количества сообщений. А потом попросить друга сделать то же самое. И дать модели друг другу. Можно много нового друг про друга узнать :)
Итоги
Ну, мы попытались. Важно показать сам принцип, как это делается. Большую часть данных мы имеем конкретно про себя. Можно натренировать модель по своим диалогам и оставить их своим внукам, как в лучших домах Чёрного Зеркала.
Это не совсем просто, может быть чудовищно долго (если диалогов много), но кроме пары часов на научиться работать с утилитами, да пары десятков-сотен часов на своем железе (или десятка часов на арендованном в облаке) ничего не требует.
Играйтесь, дамы и господа :)
И да пребудут с вами ваши деды)