Персонализация языковых моделей
Давайте сегодня поболтаем про персонализацию ответов языковых моделей, и не абы какую, а через формирование профиля пользователя в виде плотной матрицы. Постараюсь не грузить вас математикой.
Плотная матрица – это просто матрица, в которой мало нулей.
Итак, зачем персонализация? Во-первых, разным пользователям нужны разные ответы. Это вы и без меня знаете: разный уровень подготовки, разное представление о том, что важно, а что второстепенно и всё такое.
Во-вторых, этика и безопасность. Если мы умеем персонализировать модель под конкретного пользователя, мы можем персонализировать ее под некого «общего человека», который предпочитает, чтобы его ИИ-помощник не ругался матом, не призывал к искоренению какой-нибудь группы людей и не выдавал никому его персональные данные. И потом можно будет персонализировать ту же модель под работу в разных регионах мира, учитывая важные культурные особенности.
И статья, которой я хочу с вами поделиться, называется «LLMs + Persona-Plug = Personalized LLMs».
Как вообще работает персонализация обычно? Есть разные варианты, но вот основные:
- Дообучение модели на данных пользователя;
- Накопление данных о взаимодействии с пользователем в отдельной базе и обращение к ней для ответов на его запросы.
Первый вариант хорош, но дорог: надо собрать много данных, обработать их, а потом потратить много часов и электричества на сам процесс обучения. Если нет собственных процессоров, их надо купить или арендовать.
Второй вариант дешевле, но менее надежен. Во-первых, надо собирать и хранить историю взаимодействия пользователя с моделью, а это риск (справедливости ради, он и в первом варианте присутствует). Во-вторых, когда модель отвечает на вопрос и обращается к базе данных, она ищет там записи, которые по смыслу ближе к теме вопроса. При этом она не учитывает, например, предпочитаемый стиль взаимодействия с пользователем.
Для ясности приведу пример, который я целиком выдумала.
Допустим, у нас есть пользователь, и у него есть собака. Собака приболела, и пользователь делал запрос к ИИ-помощнику, чтобы быстро найти ближайшие ветеринарные клиники. На следующий день пользователь делает запрос: «Помоги спланировать отпуск в Италии.»
Я бы ожидала, что хорошо отлаженная модель ответила: «Вот план поездки с ценами на билеты через две недели. Как раз собака поправится,» – потому что у нее есть информация о собаке, и эта информация важна для плана поездки.
Кроме того, я бы ожидала, что модель будет отвечать кратко, если пользователь склонен общаться в стиле «запрос-факт» или развернуто, если он в своих запросах обычно подробно расписывает свою проблему. Вот это сделать не так просто.
Меня в общении с ChatGPT, например, очень раздражает то, что он на каждый запрос пишет план из десяти шагов. Да подожди ты, мы с тобой еще первый шаг полчаса будем править, пока он меня не устроит. Всё десять раз поменяется. Один раз ему скажешь: «Отвечай только на поставленный вопрос,» – нормально. А в следующем диалоге опять то же самое.
«Было бы круто, – подумали, вероятно, авторы статьи, – собрать все нюансы общения с конкретным пользователем и передать их модели. И чтоб недорого еще.» И придумали вот такую штуку:
- Трансформировать поведение пользователя в набор векторов;
- Добавлять полученные векторы к каждому запросу, чтобы модель использовала их для создания ответа.
Вопрос: как превратить в векторы поведение? На самом деле, они под поведением понимают предыдущие решения задач, с которыми пользователь работал – например, весь процесс работы над текстом. Чаще при персонализации с использованием баз данных используют не всю историю общения, а топ-сколько-то самых подходящих запросов. Здесь авторы решили собрать побольше информации.
Кроме того, всем результатам присваиваются динамические веса, которые отражают их важность относительно конкретного запроса (для делового письма одни предпочтения, для поста в личный блог – другие).
Вот эти векторы с весами – это «персона» пользователя, которая будет в дальнейшем использоваться. Эти векторы проецируют на векторное пространство, которое используется моделью для трансформации входов-выходов из текста в векторы и обратно. Но это уже так, детали. Чисто «приведение к общему знаменателю», чтобы, грубо говоря, персона была описана векторами того типа, с которыми модель обычно работает. Иначе получится бессмыслица.
Что важно, векторы плотные, то есть, содержат много данных, относящихся в том числе к особенностям стиля пользователя.
Дальше их используют для дообучения, но не модели целиком, а маленького кусочка, который отвечает за формирование итогового выхода.
Таким образом, смотрите, что получается:
- Берем немного инструментов из подхода, основанного на накоплении истории, но добавляем к ним больше информации и динамические коэффициенты важности;
- В базе данных хранятся только векторы, а не переписки пользователей с ИИ – данные в безопасности;
- Берем немного инструментов из подхода, основанного на дообучении, но тренируем заново не всю модель, а только ту часть, которая определяет формат выхода.
Пока читала, вспомнила помимо прямой оптимизации предпочтений статью про симуляцию человеческого поведения с использованием генеративных моделей. Там интересная была работа с памятью: весовые коэффициенты меняются с течением времени, какая-то информация уточняется, какая-то «забывается». Мне кажется, в работе с предпочтениями это было бы полезно, чтобы учитывать меняющиеся вкусы пользователя – и этические нормы тоже.