
Чувство юмора, как известно, присуще не всем людям и тем более не всем ИИ-системам. Чтобы ваш чат-бот или ИИ-ассистент мог шутить, нужна основа в виде большой языковой модели типа GPT-4o и ей подобных, API к которым стоит дорого. А что если чувство юмора нужно «привить» сервису, базирующемуся на открытой LLM с меньшим количеством параметров? Причем так, чтобы модель не выдавала шутки, за которые в приличном обществе, мягко скажем, можно получить порицание, выражающееся не только в словесной форме.
Способность открытых LLM шутить, причем по-доброму, могла бы расширить применение ИИ во многих сферах – образовании, терапии, обслуживании клиентов. Так что мы с коллегами из Лаборатории естественного языка НИУ ВШЭ задались этим вопросом и попытались разработать собственную методологию курирования (фильтрации и аннотирования) наборов данных для генерации доброго юмора на малых LM. По всем научным канонам мы ее описали и оценили в этом препринте. А здесь я постараюсь рассказать о ней чуть короче и менее научно.
Спойлер: мы были несовершенны на этапе аннотирования, что сыграло с нами злую шутку на этапе тестирования на английском, но в целом метод оказался рабочим.
Курирование данных
В доступной нам вселенной уже существует достаточно много датасетов для обучения ИИ юмору. Однако у всех них есть две проблемы.
Первая проблема – это токсичность: в них встречаются шутки расистского, сексистского и религиозно-дискриминирующего характера, которые ну никак не назовешь friendly. Если ваш чат-бот что-нибудь эдакое воспроизведет в общении с клиентом, можно получить от клиента не только негодование, но и иск.
Вторая проблема – избыточность. Это когда одна и та же шутка повторяется несколько раз – либо слово в слово, либо в вариациях. Использование датасетов с повторяющимися шутками – не есть хорошо: это приводит к переобучению моделей. То есть они будут хорошо воспроизводить шутки как в обучающей выборке, но отследить закономерности и сгенерировать что-то новое, отличающееся от того, что было в обучающих данных, и при этом смешное – не смогут.
Что мы сделали?
Слили все шутки из ряда доступных датасетов в две базы – одна на русском, а другая – на английском языке.
Почистили эти базы от повторяющихся слово в слово шуток, а также от эмодзи, ссылок и поврежденных шуток, в которых часть текста удалена.
Далее мы отфильтровали все шутки и оставили только короткие – длиной от 50 до 150 знаков. Почему мы это сделали? Потому что в длинных шутках много шума – повторов и не имеющих отношения к юмору фраз.
Оставшиеся шутки мы отфильтровали с помощью классификатора токсичности. Мы использовали инструмент Detoxify для английского языка и ruBERTConv Toxic Classifier для русского.
Затем мы с помощью предобученной модели Sentence-BERT all-mpnet-base-v2 отловили шутки, одинаковые по смыслу, но выраженные другими словами или предложениями с другой структурой.
Оставшийся набор шуток мы проверили вручную и увидели, что многие из них содержат так называемые метафорические оскорбления. Пришлось размечать шутки с помощью DeBERTa-v3-large-mnli-fever-anli-ling-wanli, используя такие метки, как «политика»,«нейтральный», «оскорбление», «алкоголь», «наркотики», «расизм», и затем удалять все шутки, помеченные как расистские, оскорбительные и политические.
Далее мы сгруппировали шутки по темам методом 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. Результаты оценки комичности и токсичности шуток моделей
Выводы
Наш подход в принципе работает — настройка моделей на очищенных датасетах снижает токсичность. Это показали эксперименты с генерацией на русском. Но важно качественно поработать на этапе аннотации, а то получится так же, как у нас с английской генерацией.
Закрытые модели, такие как GPT-4o, могут выиграть от более надежных и масштабных конвейеров выравнивания, которые наши легкие методы пока не могут полностью воспроизвести. Очень бы хотелось придумать, как это сделать…
Генерация добрых, но при этом смешных шуток ИИ – все еще проблема для открытых небольших моделей. Как ее решать? Советы принимаются в комментариях.
В статье упоминаются вариации опенсорс-модели LLaMA, которая разработана компанией Meta Platforms (признана экстремистской и запрещена в РФ).
Комментарии (6)
pavelsha
22.05.2025 13:07Лучше расскажите зачем учили модель "юмору"
Решили как и Тинькофф с помощником Олег : "по-доброму" троллить абонентов Т-Мобайл и людей, которые звонят абонентам.
daria-gal Автор
22.05.2025 13:07В продакшене этот метод нигде не используется. Делаем научные исследования, которые могут нас потенциально подвинуть ближе к пониманию того, как вообще модели обрабатывают язык, и делимся ими с коммьюнити.
avshkol
22.05.2025 13:07Статья - шутка 80 lvl: всё ждёшь примеры ИИ-шуток, уже и статья закончилась, а их всё нет!
sidristij
Вы шутите? И ни одной шутки в тексте? :)
Dasha_N
Для настроения можно тут шутки почитать: https://github.com/gorovuha/CleanComedy Это датасеты, о которых говорится в статье.