August 26

Персонализация языковых моделей

Давайте сегодня поболтаем про персонализацию ответов языковых моделей, и не абы какую, а через формирование профиля пользователя в виде плотной матрицы. Постараюсь не грузить вас математикой.

Плотная матрица – это просто матрица, в которой мало нулей.

Итак, зачем персонализация? Во-первых, разным пользователям нужны разные ответы. Это вы и без меня знаете: разный уровень подготовки, разное представление о том, что важно, а что второстепенно и всё такое.

Во-вторых, этика и безопасность. Если мы умеем персонализировать модель под конкретного пользователя, мы можем персонализировать ее под некого «общего человека», который предпочитает, чтобы его ИИ-помощник не ругался матом, не призывал к искоренению какой-нибудь группы людей и не выдавал никому его персональные данные. И потом можно будет персонализировать ту же модель под работу в разных регионах мира, учитывая важные культурные особенности.

Так что тема интересная.

И статья, которой я хочу с вами поделиться, называется «LLMs + Persona-Plug = Personalized LLMs».

Как вообще работает персонализация обычно? Есть разные варианты, но вот основные:

  • Дообучение модели на данных пользователя;
  • Накопление данных о взаимодействии с пользователем в отдельной базе и обращение к ней для ответов на его запросы.

Первый вариант хорош, но дорог: надо собрать много данных, обработать их, а потом потратить много часов и электричества на сам процесс обучения. Если нет собственных процессоров, их надо купить или арендовать.

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

Для ясности приведу пример, который я целиком выдумала.

Допустим, у нас есть пользователь, и у него есть собака. Собака приболела, и пользователь делал запрос к ИИ-помощнику, чтобы быстро найти ближайшие ветеринарные клиники. На следующий день пользователь делает запрос: «Помоги спланировать отпуск в Италии.»

Я бы ожидала, что хорошо отлаженная модель ответила: «Вот план поездки с ценами на билеты через две недели. Как раз собака поправится,» – потому что у нее есть информация о собаке, и эта информация важна для плана поездки.

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

Меня в общении с ChatGPT, например, очень раздражает то, что он на каждый запрос пишет план из десяти шагов. Да подожди ты, мы с тобой еще первый шаг полчаса будем править, пока он меня не устроит. Всё десять раз поменяется. Один раз ему скажешь: «Отвечай только на поставленный вопрос,» – нормально. А в следующем диалоге опять то же самое.

«Было бы круто, – подумали, вероятно, авторы статьи, – собрать все нюансы общения с конкретным пользователем и передать их модели. И чтоб недорого еще.» И придумали вот такую штуку:

  • Трансформировать поведение пользователя в набор векторов;
  • Добавлять полученные векторы к каждому запросу, чтобы модель использовала их для создания ответа.

Вопрос: как превратить в векторы поведение? На самом деле, они под поведением понимают предыдущие решения задач, с которыми пользователь работал – например, весь процесс работы над текстом. Чаще при персонализации с использованием баз данных используют не всю историю общения, а топ-сколько-то самых подходящих запросов. Здесь авторы решили собрать побольше информации.

Кроме того, всем результатам присваиваются динамические веса, которые отражают их важность относительно конкретного запроса (для делового письма одни предпочтения, для поста в личный блог – другие).

Вот эти векторы с весами – это «персона» пользователя, которая будет в дальнейшем использоваться. Эти векторы проецируют на векторное пространство, которое используется моделью для трансформации входов-выходов из текста в векторы и обратно. Но это уже так, детали. Чисто «приведение к общему знаменателю», чтобы, грубо говоря, персона была описана векторами того типа, с которыми модель обычно работает. Иначе получится бессмыслица.

Что важно, векторы плотные, то есть, содержат много данных, относящихся в том числе к особенностям стиля пользователя.

Дальше их используют для дообучения, но не модели целиком, а маленького кусочка, который отвечает за формирование итогового выхода.

Таким образом, смотрите, что получается:

  • Берем немного инструментов из подхода, основанного на накоплении истории, но добавляем к ним больше информации и динамические коэффициенты важности;
  • В базе данных хранятся только векторы, а не переписки пользователей с ИИ – данные в безопасности;
  • Берем немного инструментов из подхода, основанного на дообучении, но тренируем заново не всю модель, а только ту часть, которая определяет формат выхода.

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