
Привет всем! Меня зовут Марина, я учусь на втором курсе магистратуры ВШЭ и МТС «Исследования и предпринимательство в искусственном интеллекте». Сегодня хочу рассказать о своем проекте, который начинался как прошлогодняя курсовая. Мне хотелось глубже разобраться в практическом применении больших языковых моделей и методов NLP, а поэзия показалась небанальным способом это сделать.
Казалось, все будет просто, но… нет. Да, тема генерации поэзии хорошо исследована. Большие модели умеют подбирать рифмы, соблюдать размер и даже копировать стиль известных авторов. Но если добавить несколько ограничений — не писать «с нуля», а превратить заданный абзац прозы в стихотворение с конкретным метром и рифмовой схемой, — задача становится намного сложнее.
Для русского языка таких работ почти нет: датасетов мало, а морфология и система ударений создают дополнительные трудности. Поэтому я решила проверить, получится ли у модели превратить прозу в настоящие рифмованные четверостишия.
Постепенно мой проект вырос в полноценное исследование. Я подготовила по нему статью, и она принята на конференцию «Нейроинформатика-2025». Если будет интересно — ссылку прикреплю после конференции, а пока хочу рассказать о своем проекте без формализма.
А в чем вообще сложность?

На первый взгляд задача звучит просто: берем абзац прозы, переписываем его в стихотворной форме. Но, во-первых, модели вообще не знают про ударения. Они обучены на текстах, где ударения не проставляются. Для русского это критично: от того, где ударение, зависит ритм стиха, а модель этого «чувства» не имеет.
Во-вторых, открытых параллельных корпусов «проза ↔ поэзия» для русского просто нет. Стихи как отдельный жанр собраны и доступны, но пары «проза → стих» никто раньше не делал, так что пришлось создавать их самостоятельно.
И наконец, с русским языком в генерации поэзии вообще все труднее. Работ мало, инструментов для вспомогательных задач вроде разметки рифмы или метра — единицы. Что-то уже есть, но выбор ограничен, и что-то приходится дорабатывать самой.
И тут возникает вопрос: зачем же тогда браться за русский, если это заведомо сложнее? Ответ простой: это наш родной язык, и его нужно развивать. Ну и потом, если модель научится скакать по всем этим ударениям и рифмам, английские сонеты покажутся ей детскими стишками.
Сбор данных
Чтобы модель не просто «писала стихи», а делала это с заданным ритмом и рифмой, я решила разметить корпус стихотворений по схемам рифмовки и метрам.
В качестве базы я использовала русскую часть корпуса Poetree, где собраны 45 563 стихотворения. Из них я извлекла только четверостишия и для каждого определила рифмовку и метр. В итоге получилось 182 903 размеченных четверостишия.
Как размечала:
Для рифмы применяла инструмент RhymeTagger, который определяет рифмовую схему (AABB, ABAB и т. д.). Использовала готовую предобученную версию.
Для метра брала реализацию из репозитория verslibre. Там есть модуль, который сначала расставляет ударения по словарю и правилам, а потом определяет метр — ямб, хорей и так далее.

Пары «проза → поэзия»
Чтобы натренировать модель именно на задачу «проза → поэзия», мне понадобились пары текстов.
Я сгенерировала 11 000 пар: взяла четверостишия и попросила модель GigaChat 2.0 Lite переписать их прозой. Но результаты были неровные: иногда в прозе оставались строки без изменений или сходство с оригиналом было слишком высоким. В таких случаях текст приходилось перегенерировать — для этого использовали Gemini 2.0 Flash.

Разметка, которая учит модель стихам
Главная идея моей работы в том, чтобы не просто кормить модель стихами, а явно подсказать ей, как стихи устроены. Для этого я сделала специальную разметку: добавила к текстам информацию о рифмах и ударениях. По сути это способ «объяснить» модели правила стихосложения, которых в исходных данных она никогда не видела.
Рифмовка
Перед каждой строкой я указывала, какой рифме она должна следовать. Для этого брала последние два слога и оборачивала их в специальные теги:
<rhymeA>зерна</rhymeA> Пока под снегом дремлют зерна,
<rhymeB>дней</rhymeB> Земля до первых вешних дней
<rhymeB>ней</rhymeB> Не знает, сколько силы в ней
<rhymeA>творна</rhymeA> И как та сила животворна.
Я пробовала и другой вариант — использовать последнее слово вместо двух слогов. Но оказалось, что вариант с двумя слогами дает более устойчивые и естественные рифмы.
Ударения
С ударениями все сложнее: модель сама по себе их «не чувствует», потому что в обычных текстах ударения не проставляются. Поэтому перед каждым словом я кодировала:
где падает ударение;
количество гласных.
Например:
<S2><count2> Пока <count1> под <S1><count2> снегом <S1><count2> дремлют <S1><count2> зерна,
Если слово безударное (например, предлог), то я оставляла только количество гласных. Такой прием должен был задавать ритмический каркас, не ломая токенизацию. Но на практике сама эта разметка заметно влияла на поведение модели: она становилась более «зацикленной» на форме и начинала терять синтаксис и связность текста.
Рифма + ударения
В финальной настройке я объединила оба подхода — добавила и разметку рифм, и подсказки с ударениями. Казалось бы, это должно было дать наилучший результат. Но забегая вперед: такой вариант часто ухудшал связность и логичность текста и смысл ускользал еще сильнее. Модель слишком концентрировалась на форме и теряла навыки содержательной генерации, которые демонстрировала в более простых настройках.
Как я учила модель
Для преобразования прозы в поэзию я использовала небольшую открытую языковую модель Qwen2.5-3B-Instruct, адаптированную для работы с текстовыми инструкциями. Такие модели заранее обучены лучше следовать промптам, поэтому я выбрала именно ее. Это позволяло проще задавать параметры стихотворения: количество строк, схема рифмовки, ритм.
Двухэтапный подход
Я решила обучать модель в два этапа — это удобно, когда данных для конкретной задачи мало:
Общий корпус стихов: сначала модель прошлась по примерно 170 тысячам стихотворений, чтобы понять ритм, рифму и строфическую структуру. Этот этап нужен, потому что размечать много примеров именно для «проза → стих» сложно, а просто на стихах модель учится «чувствовать поэзию».
Проза → стихи: после этого я дообучила модель на 10 тысячах пар «проза → стих». Здесь она училась превращать обычный текст в рифмованные строфы, используя знания, полученные на первом этапе. Так модель учится не только писать стих с определенными рифмовой схемой и метром, но и адаптировать его к содержанию исходного текста.
Работа с инструкциями
Для каждой пары данных я давала модели подробные инструкции. На первом этапе, когда она училась на обычных стихах, инструкции указывали метр и рифмовую схему, чтобы модель понимала, как строится поэзия. На втором этапе, при преобразовании прозы в стихотворение, к этим указаниям добавляли прозу, чтобы модель могла обучиться целевой задаче.
Такая схема дает возможность управлять генерацией: меняя их, можно задавать метр, рифмовую схему и даже влиять на смысл будущего стихотворения.
Результат на примерах
Начну с конкретных примеров. Ниже — два прозаических отрывка и разные варианты превращения их в стихи. Для каждого примера видно, как справляются разные подходы: где рифма есть, где ритм звучит ровно, а где результат больше похож на литературный пересказ.
Проза
Пример 1 |
Пример 2 |
Лицо его не выражало ни ненависти, ни отвращения: значит, он ничего не знает; Надежда Федоровна немного успокоилась и пошла в гостиную. (цель: AABB, хорей) |
Та же история повторилась с одной саксонской статуэткой, которую бабушка долго рассматривала и потом велела вынесть, неизвестно за что. (цель: AABB, хорей) |
Просто дообучение на стихах
Пример 1 |
Пример 2 |
И лицо его не говорило Ни ненавистью, ни презреньем: Значит, ничего он не знал; А надежда Федоровна |
Все то же случилось с саксонской фигуркой, Которую бабушка долго разглядывала И потом, неизвестно за что, вынула И навсегда унесла из дома с собой. |
Тексты получаются цельными и близкими к оригиналу. Но это больше поэтический пересказ: рифмы и заданного размера нет.
Модель с рифмой
Пример 1 |
Пример 2 |
<rhymeA>плечом</rhymeA> Лицо его не выражало ни плечом, |
<rhymeA>густых</rhymeA> Та же история с саксонскими густых |
Рифма выдержана, схема прослеживается, что уже заметный плюс. Но отдельные слова («расслаблена», «густых») звучат немного чужеродно и мешают цельности текста.
Модель с ударениями
Пример 1 |
Пример 2 |
<S1><count1> Ни <S2><count3> отвращенья <S1><count2> злобы <S1><count1> снег, |
<S1><count1> Та <S2><count3> саксонка <S1><count1> наш <S2><count3> попалась |
Ритм слышен, но текст читается тяжело: появляются повторы и странные слова вроде «разгадалась», да и смысл потерялся по дороге. Рифмы здесь нет, зато разметка в основном соответствует реальности.
Рифма + ударения
Пример 1 |
Пример 2 |
Здесь генерация не удалась — модель выдала повторяющуюся последовательность слов
|
Вот снова статуэт на чужом прихоти, Бабушка молилась, молилась трепетно волненья; Потом вынув, вынув, она и опять была Спокойно, спокойно, спокойно, но вела. |
Результаты на этой модели оказались неоднородными: иногда удается уловить ритм и рифмовку, но текст выходит повторяющимся и сырым; в других случаях генерация вовсе срывается в однообразные повторы. Тем не менее такие примеры ценны — они показывают границы текущих возможностей и подсказывают направления для улучшения.
Gemini
Пример 1 |
Пример 2 |
Лик спокоен, нет ни тени злобы, Он не знает ничего, выходит, И Надежда, сбросив сердца скованность, В гостиную направилась свободней. |
Вновь статуэтка пала в немилость, Взор бабушки долго на ней покоился. Не знаю, чем ей не угодила, Но вынести тотчас же попросила. |
Здесь результат звучит наиболее естественно: рифмы хоть и не всегда точные, но текст ровный и поэтичный, смысл сохраняется.
К чему я пришла
Эксперименты показали ожидаемую, но все же любопытную картину. Если добавить разметку рифмы, модель начинает куда увереннее держать рифмовку — это сразу заметно на примерах. Но за этот бонус приходится платить: текст временами теряет связность и в смысловом плане становится более рваным. Разметка ударений сработала иначе: ритм действительно улучшился, строки звучат ровнее, но опять же пострадала семантика: модель начинает путаться в логике и грамматике.
Если пробовать совмещать оба типа разметки, задача становится еще сложнее: в итоге страдают и рифма с ритмом, и передача смысла — текст выглядит более натянутым. Для сравнения, большие универсальные модели вроде Gemini ведут себя стабильнее: у них рифма звучит естественнее, ритм не так сбивается, а смысл сохраняется лучше.
В общем, можно сказать, что жесткие формальные ограничения почти всегда вносят дисбаланс — чем аккуратнее выстраивается форма, тем труднее удержать содержание. Пока «идеальной» схемы нет, но уже видно, что направление рабочее: рифма и ритм действительно поддаются управлению, а дальше остается вопрос, как научить модель не забывать про логику и грамматику.
Грабли и неожиданности
Исследования редко идут гладко, и этот проект не стал исключением. Расскажу про самые заметные грабли.
Токенизация
Буквально в последний месяц работы я наткнулась на несколько свежих статей, где подчеркивалось: качество генерации стихов сильно зависит от того, как именно модель токенизирует текст (символьная, субсловная и т. д.). Я использовала стандартную BPE-токенизацию, и именно из-за нее тонкие фонетические детали — ритм, слоги, ударения — учитывались не идеально. Переделывать все уже не хотелось, поэтому я сосредоточилась на разметке рифм и ударений. Но вывод я сделала: на будущее символьная токенизация может быть куда более подходящим выбором, а вопрос токенизации — это не техническая мелочь, а фундамент.
Метрики
Я ожидала, что автоматические метрики сильно помогут. Например, BERTScore должен был показывать, насколько хорошо стих сохраняет смысл прозы. На практике он действительно дает общее представление, но не улавливает тонких смысловых и логических сбоев, которые сразу заметны глазами.
Метрики для проверки рифмы и метра тоже не идеальны: иногда ошибаются и работают довольно медленно. В итоге они полезны как первичная проверка, но полагаться только на цифры нельзя — финальное слово все равно за человеком.
Разметка ударений
Изначально казалось, что разметка ударений поможет решить проблему с метром: если явно подсказать модели, где ставить акценты, стихи должны получаться более стройными. Но на практике все вышло иначе. Добавление ударений заметно влияло на работу модели — она начинала «забывать» синтаксис и логику. В итоге тексты действительно выглядели метрически правильнее, но при этом теряли связность и смысл.
Бесконечные четверостишия
Корпус у меня был только из четверостиший, и казалось, что модель легко должна научиться выдавать четыре строки. Но на деле она упорно продолжала писать дальше и дальше. Причина оказалась в том, что стандартный DataCollatorForLanguageModeling не маскировал токены после конца примера, и модель «не понимала», где останавливаться. Пришлось написать кастомный коллатор — и только тогда все встало на место. Кажется, просто — вот только чтобы найти проблему, я потратила довольно много времени.
Гонка моделей
Когда я начинала эксперименты, Gemini 1.5 Flash почти не умел превращать прозу в стихи — получалась по сути проза. Пока я делала проект, вышла версия Gemini 2.0 Flash, и она справлялась заметно лучше — и своей прошлой версии, и моей модели. В тот же период появилась новая статья по русской поэзии, и мне казалось, что там все получается «слишком хорошо». Честно, было немного грустно. Но теперь мою статью приняли в журнал, и я поеду рассказывать о ней на конференции. Так что иногда не стоит слишком переживать, даже если результаты кажутся нереальными.
Организационное
Это был мой первый исследовательский проект с такой степенью свободы: научный руководитель вмешивался мало, и мне самой приходилось решать, куда двигаться дальше. Наверное, из-за этого я где-то потратила слишком много времени на вспомогательные вещи (окружение, инструменты и т. д.) — на них ушла примерно половина всего времени. Но именно поэтому проект оказался особенно ценным опытом.
Ожидания vs реальность
Сейчас, оглядываясь назад, я понимаю: задача была слишком сложной для старта. Русский язык + преобразование прозы в поэзию + жесткие ограничения по рифме и метру — это сразу три уровня сложности. Итоговые модели все еще далеки от идеала, но теперь я точно знаю, что делать дальше (например, попробовать символьную токенизацию).
Что дальше
Мои эксперименты показали, что LLM умеют играть с рифмой и метром, но всегда приходится балансировать между формой и смыслом. Рифма получается лучше с явной разметкой, метр — с разметкой ударений, но идеального сочетания пока не достичь. Так что с этим делать дальше?
Мои эксперименты показали, что LLM умеют играть с рифмой и метром, но всегда приходится балансировать между формой и смыслом. Рифма получается лучше с явной разметкой, метр — с разметкой ударений, но идеального сочетания пока не достичь. Так что с этим делать дальше?
Возможные направления:
Попробовать char-level-модели. Модели на уровне символов могут лучше «чувствовать» ритм и рифму, особенно для сложных слов или необычных форм слов.
Расширить корпус данных. Больше примеров могут помочь модели одновременно соблюдать рифму, метр и смысл.
Использовать прозу с разметкой ударений — тексты, где явно указано, на какие слоги падает ударение. Это может помочь модели точнее переносить ритм из прозы в стих.
Как применять на практике
Что с этим можно сделать в реальной жизни?
Во-первых, генерировать стихи для игр или чат-ботов — чтобы NPC могли «рассказать» рифмованную историю или шутку. Во-вторых, это может помочь создавать песни: текст подгоняется под мелодию и ритм. Третье — подсобить авторам: модель может предложить варианты стихотворного текста или альтернативные рифмы, когда с идеями туго. И еще, что особенно приятно лично, — генерировать поздравления. Как было бы здорово написать стих для любимой бабушки или друга, даже если сами никогда не писали стихи!
Направлений для экспериментов и применения предостаточно, и есть куда двигаться дальше.
Из чего собирали конструктор
Для самых интересующихся — список инструментов для работы с русской поэзией, которые я пробовала в процессе. Они могут быть полезны тем, кто захочет повторить эксперимент или пойти дальше.
verslibre. Большой репозиторий от Koziev для генерации стихов. Я брала оттуда модуль для разметки метра и дорабатывала под себя. Запуск «из коробки» сложный: файлы модели спрятаны в образе, нужно вручную искать, чего не хватает, и собирать окружение. В моем репозитории все это уже собрано и немного подправлено.
Russian Poetry Scansion Tool (RPST). Более свежий инструмент того же автора. Умеет автоматически разметить стих по рифме и метру, добавить ударения и даже посчитать технический score для стиха. Но для моей задачи он не подошел: нельзя указать целевой размер и схему рифмовки, хотя сам score полезен для другой задачи — генерации поэзии. Поэтому я использовала RPST только для разметки ударений. Плюс в том, что запускается он без проблем.
RhymeTagger. Минималистичный инструмент для разметки рифмы. Работает хорошо не только для русского, но и для других языков. У меня завелся без особых сложностей.
rupo. Старый проект, который умеет и генерировать стихи, и анализировать их (определять рифму и размер). У меня, правда, его запустить не вышло.
Видно, что таких решений пока не очень много. Но, например, RPST появился совсем недавно, так что область постепенно развивается. Со временем, возможно, из деталей получится собирать уже не конструктор, а готовые наборы для работы с поэзией.
Moog_Prodigy
Тему вы подняли весьма интересную, нынешние нейросети со стихами справляются крайне плохо. Продолжайте в том же духе =)