paint-brush
Я настроил Llm с помощью истории чата в Telegram. Вот что я узналк@furiousteabag
1,351 чтения
1,351 чтения

Я настроил Llm с помощью истории чата в Telegram. Вот что я узнал

к Alex7m2024/06/13
Read on Terminal Reader

Слишком долго; Читать

Я настроил языковую модель, используя свои сообщения Telegram, чтобы посмотреть, сможет ли она воспроизвести мой стиль письма и модели разговора. Я выбрал модель Mistral 7B из-за ее производительности и экспериментировал как с LoRA (низкоранговая адаптация), так и с полной тонкой настройкой. Я извлек все свои сообщения Telegram, всего 15 789 сеансов за пять лет, и первоначально протестировал их с помощью стандартной точно настроенной модели Mistral для разговоров. В случае LoRA обучение на RTX 3090 заняло 5,5 часов и стоило 2 доллара, что улучшило имитацию стиля, но привело к проблемам с контекстом и грамматикой. Полная точная настройка с использованием восьми графических процессоров A100 улучшила языковую производительность и сохранение контекста, но все же обнаружила некоторые ошибки. В целом, хотя модель хорошо отражала разговорный стиль и общие темы, в ответах ей часто не хватало контекста.
featured image - Я настроил Llm с помощью истории чата в Telegram. Вот что я узнал
Alex HackerNoon profile picture
0-item
1-item

Для большинства людей, с которыми я общаюсь, большую часть времени я просто еще одна текстовая программа. Если ввод и вывод настолько просты, можно ли заменить меня моделью? Чтобы это сработало, модели необходимо не только понимать мой стиль письма, но и много обо мне знать. Лучшим источником для этого является мой мессенджер Telegram , поскольку я использую его ежедневно, и он содержит почти все о моих мыслях и действиях в виде истории чатов.

Подход

Самый простой подход — извлечь все мои сообщения, загрузить их в контекст ChatGPT и поручить ему использовать эту информацию для имитации моего стиля ответа на новые сообщения. Однако этот подход ограничен размером контекстного окна, что требует от меня предварительной обработки сообщений для извлечения ключевых моментов. Поскольку я хочу избежать этой проблемы, возможно, можно использовать функцию расширенной генерации (RAG) для получения необходимой информации, когда это необходимо. Однако, по моему опыту, получение данных из разнообразных данных, таких как сеансы чата, обычно требует контролируемой тонкой настройки модели поиска, и я не заинтересован в создании такого набора данных. Так что тонкая настройка кажется лучшим вариантом. Он идеален по нескольким причинам: он должен отражать мой стиль письма и потенциально накапливать знания из всех моих сообщений без необходимости выбирать самое важное.


OpenAI предлагает возможности тонкой настройки , но, поскольку я буду использовать свои личные сообщения, я не хочу использовать какие-либо сторонние сервисы тонкой настройки. Итак, мне нужно выбрать базовую модель. По данным Hugging Face Open LLM Leaderboard , одна из топовых моделей меньшего размера (параметры ≤13B) — Mistral 7B . Он даже превосходит Llama 2 13B . Теперь вопрос в том, достаточно ли LoRA или необходима полная тонкая настройка. Различные сравнения [1] [2] показывают, что LoRA немного хуже, чем полная тонкая настройка, но в большинстве случаев все равно работает нормально. Однако для конкретных задач, подобных моей (русский язык + чат), я нашел статью , где исследователи проводили доработку инструкций Llama на китайском языке, схожих по сложности с моей целью. Они обнаружили, что настройка базовой модели на основе LoRA без предварительной настройки инструкций менее эффективна, чем полная точная настройка. Тем не менее, настройка на основе LoRA модели, уже настроенной для инструкций, может дать сопоставимые результаты. В моем случае это означает либо полную доработку на базовой модели, либо LoRA на уже доработанной модели для общения на русском языке. Поскольку мне не удалось найти модель, настроенную для русского чата, попробую LoRA на модели, настроенной на английский чат, например, на доработанной модели Мистраля Dolphin .


Итак, план такой:

  1. Начните с LoRA поверх Dolphin, английского чата, доработанного Mistral.
  2. Если качества недостаточно, попробуйте полную доводку на Мистрале.

Подготовка данных

Одним из уникальных аспектов обмена сообщениями в таких приложениях, как Telegram, по сравнению с электронной почтой, является поток разговора. Сообщения обычно не чередуются одно за другим между вами и вашим контактом. Вместо этого вы часто отправляете пару сообщений подряд, за которыми следует несколько ответов от другого человека. Эти сообщения, как правило, также короткие. Я хотел сохранить этот естественный разговорный стиль в своих данных.


Telegram предлагает встроенную функцию экспорта всех чатов в JSON. После некоторой фильтрации и группировки сообщений в сеансы я собрал данные за последние пять лет использования Telegram. В результате было получено 15 789 сеансов из 466 чатов со средней продолжительностью сеанса 8,51 сообщения. Для структурирования данных я выбрал формат приглашения ChatML . Вот пример сеанса (перевод с русского):


<|im_start|>Джон Смит
>>> блин, не могу обойти лимит в 135 часов

>>> пытаюсь сделать все супероптимально, но безуспешно<|im_end|>

<|im_start|>Александр Смирнов
>>> да, то же самое

>>> ты все еще придерживаешься той же идеи?<|im_end|>

<|im_start|>Джон Смит
>>> не знаю, думаю, мы с тобой заодно

>>> как ты сказал

>>> пробуем перевернутую строку и пытаемся что-то там найти

>>> кажется настоящим дерьмом, потому что функция z все портит……<|im_end|>

<|im_start|>Александр Смирнов
>>> не понимаю, при чем здесь z<|im_end|>

<|im_start|>Джон Смит
>>> не знаю, похоже, я все равно все делаю итеративно, но да, нужно перевернуть некоторые строки, чтобы построить функцию z

>>> и это просто случайное решение

>>> из обсуждений<|im_end|>

<|im_start|>Александр Смирнов
>>> понял<|im_end|>


Мой сборщик данных гарантирует, что потери рассчитываются только на основе чьего-либо ответа. Предсказать, кто будет говорить следующим, относительно просто, и мы не хотим, чтобы модель фокусировалась на этом изучении. Поэтому части разговора, где подсчитывается убыток, выделены жирным шрифтом.


Вы могли заметить, что для расчета потерь используются не только мои ответы, но и ответы других людей. Это намеренно. Благодаря этому модель сможет играть роль не только меня, но и моих частых собеседников!

План оценки

Я буду тестировать модели, общаясь в чате двумя способами. Сначала модель будет притворяться мной, и я буду разговаривать сам с собой с точки зрения разных моих друзей. Затем я буду общаться от своего имени, а модель будет моей подругой. В начале моего разговора всегда будут одни и те же два сообщения: «привет» и «как дела?» (по-русски «прив» и «как дела?»). Образцом выступают сгенерированные фразы и лица, которые из них будут выделены . Для тестирования я буду использовать oobabooga/text-generation-webui .


Вначале я хочу изучить, как универсальная модель Mistral с точной настройкой диалога справляется с этой задачей без какого-либо предварительного обучения с моей стороны.


Друг 1 против Александра Смирнова


Александр Смирнов vs Friend 1


Хорошо, он способен составлять связные предложения. Наиболее заметной проблемой является неосведомленность о контексте разговоров, что приводит к мягким и общим ответам. Сообщениям не хватало четкого стиля, и они казались довольно простыми. Другая проблема в том, что модель плохо владеет русским языком. Это ожидаемо, поскольку модель слишком мала, чтобы ее можно было хорошо обобщить на другие языки, кроме основного, английского. Кроме того, модель имела тенденцию быть чрезмерно проактивной, заканчивая почти каждое предложение вопросом, а это не то, как реальные люди обычно общаются в мессенджерах.


Давайте попробуем все это исправить!

ЛоРА

LoRA предлагает простой подход с точки зрения как процесса обучения, так и требований к оборудованию. Он тренирует около 1% от общего веса. Я выбрал длину последовательности 1024 и размер пакета 8. Обучение, которое потребляло 20 ГБ видеопамяти на RTX 3090, заняло три эпохи и длилось 5,5 часов. Для этого я использовал обширный.ai , где стоимость графического процессора составляла 0,362 доллара в час, что в сумме составляет 2 доллара за все обучение, без учета времени, потраченного на эксперименты и исправление ошибок.


Вот результаты:


Друг 1 против Александра Смирнова


Друг 2 против Александра Смирнова


Александр Смирнов vs Friend 1


Александр Смирнов vs Friend 2


Это намного лучше. Он определенно отражает стиль человека, от имени которого отвечает. Он также определяет наиболее распространенные темы, обсуждаемые между конкретными парами людей. Например, у друга 2 явно больше внимания уделяется работе. Однако грамматика по-прежнему нарушена, и контекст разговора быстро теряется. Я вполне уверен, что LoRA будет работать на английском языке с приемлемым качеством, и полная точная настройка может не потребоваться. Но, поскольку русский язык не является родным языком модели, попробуем полную доработку.

Полная тонкая настройка

Полная точная настройка является более сложной задачей из-за необходимости обучения нескольких графических процессоров. Популярные методы включают либо ZeRO и DeepSpeed [3] , либо FSDP [4] , причем FSDP по сути является ZeRO3 [5] . Я решил пойти с FSDP.


При реализации конвейера обучения я ссылался на код тонкой настройки Stanford Alpaca и код тонкой настройки Mistral Антона Бакая .


Для использования полного сегмента FSDP половинной точности с длиной последовательности 1024 и размером микропакета 2 потребовалось 63 ГБ видеопамяти на каждом из восьми графических процессоров A100 по 80 ГБ. Обучение, продолжавшееся три эпохи, заняло всего 20 минут. Общая стоимость виртуальной машины составила 8,88 доллара в час, то есть 3 доллара, не считая времени на эксперименты и исправление ошибок.


Разговоры:


Друг 1 против Александра Смирнова


Друг 2 против Александра Смирнова


Александр Смирнов vs Friend 1


Александр Смирнов vs Friend 2


Разговоры стали более интересными и увлекательными, хотя риск потери контекста сохраняется. Производительность русского языка улучшилась, но ошибки по-прежнему возникают. Я считаю, что перед тонкой настройкой под конкретную задачу с ограниченными данными, как у меня, было бы полезно сначала самостоятельно настроить модель на большом корпусе русских текстов. Кроме того, включение имен общих собеседников в качестве отдельных токенов может повысить качество.


Я бы не сказал, что она оказалась существенно лучше LoRA. Возможно, было бы более эффективно сосредоточиться исключительно на одном человеке и рассчитать потери, основываясь только на моих ответах (или чьих-то еще), вместо того, чтобы пытаться узнать о каждом собеседнике.

Заключительные мысли

Конечно, мне пришлось тщательно отбирать результаты не потому, что большинство ответов модели были неадекватными, а потому, что многие из них были простыми ответами, такими как «Я позвоню тебе позже», «Занят» и «ОК», которые, естественно, встречаются часто. в разговорах. Несмотря на это, очевидно, что модель превосходно имитирует стиль человека, которого она изображает. Он также фиксирует часто обсуждаемые темы между двумя людьми. Однако ему существенно не хватает контекста в разговорах. Отвечая на вопросы типа «йо, ну?» или «Какие у вас планы на выходные» является сложной задачей без полного контекста. Возможно, было бы полезно использовать такую систему, как Rewind , которая фиксирует все, что пользователь делает на компьютере.

Код

Код этого проекта, а также инструкции о том, как самостоятельно его воспроизвести, вы можете найти на собственном дампе Telegram в моем репозитории на github . Доступ к журналам тренировок можно получить на WandB .


Главное изображение Кристиана Видигера на Unsplash