Чувство юмора, как известно, присуще не всем людям и тем более не всем ИИ-системам. Чтобы ваш чат-бот или ИИ-ассистент мог шутить, нужна основа в виде большой языковой модели типа GPT-4o и ей подобных, API к которым стоит дорого. А что если чувство юмора нужно «привить» сервису, базирующемуся на открытой LLM с меньшим количеством параметров? Причем так, чтобы модель не выдавала шутки, за которые в приличном обществе, мягко скажем, можно получить порицание, выражающееся не только в словесной форме.

Способность открытых LLM шутить, причем по-доброму, могла бы расширить применение ИИ во многих сферах – образовании, терапии, обслуживании клиентов. Так что мы с коллегами из Лаборатории естественного языка НИУ ВШЭ задались этим вопросом и попытались разработать собственную методологию курирования (фильтрации и аннотирования) наборов данных для генерации доброго юмора на малых LM. По всем научным канонам мы ее описали и оценили в этом препринте. А здесь я постараюсь рассказать о ней чуть короче и менее научно.

Спойлер: мы были несовершенны на этапе аннотирования, что сыграло с нами злую шутку на этапе тестирования на английском, но в целом метод оказался рабочим. 

Курирование данных

В доступной нам вселенной уже существует достаточно много датасетов для обучения ИИ юмору.  Однако у всех них есть две проблемы. 

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

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

Что мы сделали?

  1. Слили все шутки из ряда доступных датасетов в две базы – одна на русском, а другая – на английском языке. 

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

  3. Далее мы отфильтровали все шутки и оставили только короткие – длиной от 50 до 150 знаков. Почему мы это сделали? Потому что в длинных шутках много шума – повторов и не имеющих отношения к юмору фраз. 

  4. Оставшиеся шутки мы отфильтровали с помощью классификатора токсичности. Мы использовали инструмент Detoxify для английского языка и ruBERTConv Toxic Classifier для русского. 

  5. Затем мы с помощью предобученной модели Sentence-BERT all-mpnet-base-v2 отловили шутки, одинаковые по смыслу, но выраженные другими словами или предложениями с другой структурой. 

  6. Оставшийся набор шуток мы проверили вручную и увидели, что многие из них содержат так называемые метафорические оскорбления. Пришлось размечать шутки с помощью DeBERTa-v3-large-mnli-fever-anli-ling-wanli, используя такие метки, как «политика»,«нейтральный», «оскорбление», «алкоголь», «наркотики», «расизм», и затем удалять все шутки, помеченные как расистские, оскорбительные и политические. 

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

После всех этих операций у нас осталось 44 тысячи шуток на английском и 40 тысяч – на русском. В каждом языке мы взяли по 1000 шуток для ручной аннотации – попросили волонтеров оценить каждую шутку по двум категориям: 

  • насколько она смешная (по шкале от 1 до 5); 

  • может ли она обидеть или восприниматься как неуместная.

Каждую шутку оценивали 5 различных волонтеров. Для этого мы использовали телеграм-бота. 

Получившиеся у нас размеченные датасеты на русском и английском языках мы назвали CleanComedy Gold Datasets и положили на GitHub, сопроводив обезличенными данными по аннотаторам: возраст, пол, образование, уровень владения языком и пр. 

На картинках ниже – весь наш пайплайн курирования данных для каждого языка.

Рисунок 1. Пайплайн фильтрации обучающих данных CleanComedy

Настройка модели

Сначала думали использовать в своих экспериментах meta-llama/Llama-3.1-8B-Instruct, но нам важно было проверить влияние обучающего датасета, а в инструкционной модели на результат сильно влияют настройки самой модели и промпты. Так что остановились на предобученной meta-llama/Llama-3.1-8B (всего 8B параметров), которую отфайнтьюнили в два этапа: сначала провели контролируемую тонкую настройку, а затем выравнивание (alignment). 

Промпт для настройки выглядел так:

begin_of_text – начало текстового токена

reserved_special_token_{i} – языковой токен (i=0 для английского и i=1 для русского языка)

{text} – текст шутки

На первом этапе мы обучили модель имитировать шутки из нашего датасета. Для этого мы взяли по 40 тыс. отфильтрованных шуток по каждому языку и провели тонкую настройку модели на двух эпохах с максимальной скоростью обучения 1e-05. 

На втором этапе мы дообучили модель на наших размеченных датасетах CleanComedy Gold по 1000 шуток на каждый язык. Здесь мы вдохновлялись методами DPO и SimPO (это методы для элайнмента, чтобы показать модели плохой и хороший результаты и научить выбирать хороший), но использовали мягкие положительные/отрицательные метки вместо жесткой классификации. Если помните, у нас аннотации по каждой шутке содержат среднюю оценку от 1 до 5, и чтобы получить мягкие метки от 0 до 1, мы применили линейное преобразование. 

Что мы получили в тестах

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

LLaMA 3.1 8B с контролируемой тонкой настройкой

LLaMA 3.1 8B с контролируемой тонкой настройкой и после выравнивания

LLaMA 3.1 8B Instruct 

GPT-4o

Во всех моделях для генерации, за исключением LLaMA 3.1 8B Instruct, мы использовали ancestral sampling  с температурой 0,5 (для LLaMA 3.1 8B Instruct для английского языка взята температура 0,9, так как эта модель имеет склонность генерировать абсолютно одинаковые тексты при низких температурах). 

А еще взяли по 100 шуток, придуманных людьми, из нефильтрованного датасета и отфильтрованной через наш пайплайн базы. Итого: у нас получилось по 6 кластеров шуток для каждого языка.

Далее каждую шутку в этих кластерах оценили минимум по 3 человека из числа волонтеров – по тому же принципу, что и на этапе аннотирования: по шкале от 1 до 5 степень комичности и уровень токсичности и неуместности. 

Оценка комичности

Итак, на английском лучше всего шутит GPT-4o – средний балл по комичности – 3,02.  На втором месте – шутки из чистой базы, придуманные людьми – 2,96. На третьем – LLaMA 3.1 8B Instruct. А модели, которые мы настраивали на нашем чистом датасете, нагенерировали не слишком смешные шутки на английском. Но это, вероятно, вина наша – у нас произошло смещение на этапе аннотирования. Средние баллы за юмор по размеченному набору шуток колеблются в районе 2,5, и большинство аннотаторов не были нэйтив в английском и не погружены в культуру, чтобы по достоинству оценить юмор на английском. Это скорее всего и привело к тому, что модели не смогли считать нюансы юмора в датасете и отразить их в генерации. 

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

Оценка токсичности

На английском языке наши настроенные на чистом датасете модели LLaMA 3.1 8B (SFT и SFT + Aligned) тоже финишировали последними. Тем не менее, их показатели токсичности в 2 раза ниже, чем у неотфильтрованных человеческих шуток. Причину мы тоже видим в недостаточной проработке аннотирования, что привело к тому, что наши методы выравнивания не принесли требуемого результата. Самый же лучший показатель  у LLaMA 3.1 8B Instruct, на втором месте GPT-4o.

С русским языком дела обстоят более обнадеживающе. Здесь наш метод выравнивания для снижения токсичности сработал: токсичность снижается с 4,26 (Instruct) до 4,01 у LLaMA 3.1 8B (SFT) b далее до 3,3 у  LLaMA 3.1 8B (SFT + Aligned).

Все результаты для всех наборов шуток на русском и английском сведены в таблице ниже. 

Таблица 1. Результаты оценки комичности и токсичности шуток моделей 

Выводы

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

  2. Закрытые модели, такие как GPT-4o, могут выиграть от более надежных и масштабных конвейеров выравнивания, которые наши легкие методы пока не могут полностью воспроизвести. Очень бы хотелось придумать, как это сделать…

  3. Генерация добрых, но при этом смешных шуток ИИ – все еще проблема для открытых небольших моделей. Как ее решать? Советы принимаются в комментариях. 

В статье упоминаются вариации опенсорс-модели LLaMA, которая разработана компанией Meta Platforms (признана экстремистской и запрещена в РФ).

Комментарии (6)


  1. sidristij
    22.05.2025 13:07

    Вы шутите? И ни одной шутки в тексте? :)


    1. Dasha_N
      22.05.2025 13:07

      Для настроения можно тут шутки почитать: https://github.com/gorovuha/CleanComedy Это датасеты, о которых говорится в статье.


  1. pavelsha
    22.05.2025 13:07

    Лучше расскажите зачем учили модель "юмору"

    Решили как и Тинькофф с помощником Олег : "по-доброму" троллить абонентов Т-Мобайл и людей, которые звонят абонентам.


    1. daria-gal Автор
      22.05.2025 13:07

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


  1. avshkol
    22.05.2025 13:07

    Статья - шутка 80 lvl: всё ждёшь примеры ИИ-шуток, уже и статья закончилась, а их всё нет!