Господин Говорунъ: как я научил крошечную модель говорить на дореформенном русском и зачем это нужно
Немного контекста
Последние месяцы мы развиваем Manuscript OCR — открытую библиотеку, учущую нейросети распознавать рукописные документы XIX века. Материал упрямый: дореформенная орфография, нестабильные ручные почерки, кляксы, выцветание, маргиналии. Погружаясь в эту среду, неизбежно начинаешь думать не только о том, как прочесть строку, но и как объяснить её смысл, дать комментарий в духе эпохи, показать демо, где текст не просто распознан, а «оживает» голосом того времени. Отсюда родилась идея: обучить небольшую языковую модель говорить спокойным, обстоятельным языком образованного россиянина середины XIX века.
Практический смысл у затеи вполне приземлённый:
- показать работу OCR на живых примерах;
- сопровождать распознанные фрагменты краткими пояснениями;
- собрать компактный чат-бот, который отвечает «по-старинному», поддерживая атмосферу исторического интерфейса;
- и при этом всё запускать локально, без API и тяжёлых железок, чтобы любой мог воспроизвести пайплайн.
Где взять диалоги XIX века
Первая преграда — данных нет. Источники эпохи сохранились, но почти все — монологические: письма, мемуары, записки, газетные публикации, ученые трактаты. А нам нужна пара «вопрос–ответ». Ручная стилизация десятков тысяч примеров — бессмысленно дорого. Поэтому я пошёл от обратного: взял современный корпус коротких инструкций с ответами и перевёл его целиком «в прошлое» синтетически.
Базовый корпус
В качестве основы использован открытый набор примерно на 50 тысяч пар «instruction–response» на современном русском. Это лаконичные задания вида «Назовите столицу…», «Объясните шаги…», «Приведите примеры…». Формат идеален: чистые пары, легко приводимые к единой схеме обучения.
Синтетика вместо архивов
Далее вступает в игру крупная LLM: для каждого современного вопроса она переформулирует запрос так, как мог бы сформулировать образованный человек XIX века, и даёт ответ в дореформенной орфографии. На выходе — стилизованные пары из того же содержания, но с лексикой, пунктуацией и графикой эпохи: «ѣ», «і», «ѳ», твёрдый знак на конце, размеренная интонация, умеренная книжность, уважительная манера. Примеры получаются вроде:
- «Пошагово объясните процесс приготовления сырной кесадильи» превращается в «Извольте разъяснить, какимъ образомъ приготовляютъ сие яствo…», где ответ осторожно признаёт новизну предмета и рассуждает в рамках доступного опыта.
- «Назовите двух современников Галилея» — ответ: «Иоаннъ Кеплеръ и Исаакъ Бекманъ — мужи учёныя».
- «Разработайте алгоритм сортировки списка» — краткая процедура «от меньшаго к большему» с назидательной подачей.
Почему маленькая модель
Для задач чистой стилизации гиганты на десятки миллиардов параметров избыточны. Требовалось:
- запуск на бытовом GPU;
- быстрое обучение и дешёвые эксперименты;
- возможность встроить результат в демо Manuscript OCR;
- воспроизводимость пайплайна.
Поэтому выбран крошечный Qwen2.5 на 0.5B параметров. По меркам индустрии это «малыш», но он:
- бодро обучается;
- скромен в ресурсах;
- охотно поддаётся дообучению;
- уверенно тянет «стилевой» файнтюн.
Среда и общий процесс
Обучение шло в типичной облачной среде с одним доступным GPU. Код структурирован так, чтобы можно было повторить шаги без сложной настройки. Общая схема:
1) загрузка базовой модели и токенизатора;
2) подготовка и валидация стилизованного датасета;
3) конфигурация обучения (включая LoRA/QLoRA);
4) запуск тренировки и периодическая оценка на валидации;
5) сохранение адаптеров и сборка итоговой версии для инференса.
Загрузка модели и токенизатора
Ключевой нюанс — корректная работа с редкими символами (ѣ, ѳ, ѵ, і, ять и финальные твёрдые знаки). Современные токенизаторы их распознают, но могут дробить на байтовые подпоследовательности. Это не критично для генерации, однако полезно проверить, чтобы последовательности не разламывались чрезмерно, а частоты уникальных токенов не уходили в крайности.
Подготовка датасета
Стилизованные пары проходят фильтрацию:
- отбрасываются слишком длинные ответы (чтобы малышу не приходилось держать в памяти чрезмерный контекст);
- убираются явные артефакты синтетики (сбрасы «…», маркеры ролей, лишние кавычки);
- выравнивается пунктуация и пробелы перед твёрдым знаком;
- проверяется частотность дореформенных букв — чтобы не выродиться в «карикатуру» c переизбытком «ѣ» там, где её быть не должно.
Конфигурация обучения
Практически всё решают три вещи: контекст, регуляризация и температура при генерации.
- контекстная длина: 1024–2048 токенов;
- метод: LoRA/QLoRA для экономии памяти;
- lr: в районе 2e-4 — 5e-4 для адаптеров;
- эффективный батч через накопление градиентов;
- 2–3 эпохи достаточно, дальше модель начинает «переактерствовать» и повторять штампы;
- смешанная точность, градиентный клиппинг и ранняя остановка по валидации.
Обучение
На практике тренировка занимает считанные часы. Маленькая модель стремительно впитывает правила стилизации: устойчивую интонацию, финальные твёрдые знаки, дореформенную пунктуацию, вежливые вводные («полагаю», «видится», «почитаю должным»). Важнее не «перекормить» её синтетикой до состояния, когда смысл начинает уступать форме.
Сохранение модели
Сохраняются адаптеры и итоговая сборка для инференса. Для встроенного применения удобно держать два профиля: полноразмерный FP16 для качественных ответов и 4-битную квантизированную версию для быстрых демо на слабом железе.
Результаты: что получилось
На тестах «господин говорунъ» демонстрирует устойчивую стилизацию, вежливую манеру изложения и соблюдение дореформенной графики. Он прилично справляется с короткими пояснениями, списками и простыми рассуждениями. На бытовых вопросах держит форму, избегая современного сленга и цифровых реалий, аккуратно признаёт незнание о «новинках» — и это, кстати, добавляет правдоподобия.
Что получилось хорошо
- Том и ритм речи: неспешно, уважительно, без резких конструкций.
- Орфографические маркеры эпохи: финальные «ъ», уместные вставки «ѣ», «і».
- Краткие объяснения процедур и определений с классической логикой «от частного к общему».
- Умение перефразировать современный вопрос в «старинную» формулу и затем отвечать в том же регистре.
Что ожидаемо слабее
- Фактические знания ограничены: 0.5B — не справочник. Модель может путать детали биографий, даты, технические тонкости.
- На длинных запросах растёт вероятность повторов и нестрогой логики.
- Орфография не всегда безупречна: дореформенные буквы в некоторых случаях употребляются механически, без сложной исторической точности.
Почему так
Мы сознательно оптимизировали под стиль, а не под энциклопедичность. Маленький размер — это скорость и доступность, но и естественное ограничение в «глубине мира». Кроме того, синтетический корпус хоть и большой, но всё же «учебный», он задаёт форму, а не расширяет фактическую базу.
Практические советы по инференсу
- Давайте модели «персону» в системном сообщении: «говорит образованным человеком середины XIX века, вежливо, с дореформенной орфографией».
- Держите температуры в районе 0.7–0.9, чтобы не застревала, но и не расплывалась.
- Ограничивайте длину ответа: 150–250 токенов часто достаточно для правдоподобия.
- Если нужна повышенная орфографическая строгость, поверх ответа можно прогонять лёгкий постпроцессор с правилами замены и словарной проверкой дореформенной графики.
Как собирался синтетический корпус
- Для каждого современного вопроса формировалась переформулировка «как сказал бы человек 1850–1870-х».
- Ответ генерировался в том же регистре с указанием «соблюдать дореформенную орфографию».
- Пары с явными анахронизмами или современной лексикой («смартфон», «интернет») оставлялись, но подталкивались к осторожным оговоркам: «предмет мне неведом, однако, судя по описанию…».
- Итоговые пары приводились к унифицированному шаблону для обучения.
Проверка качества без метрик BLEU
Стиль сложно оценивать автоматикой. Использовалась смесь:
- ручной сэмплинг;
- подсчёт частот маркеров дореформенной графики;
- проверка на «срыв» в современную лексику;
- лёгкие стресс-тесты: списки, простые рассуждения, словарные объяснения.
Интеграция с Manuscript OCR
В демо модель делает три вещи:
- объясняет смысл распознанного фрагмента «своими словами»;
- вежливо отвечает на уточняющие вопросы пользователя;
- при необходимости предлагает краткую «поправку к чтению», не претендуя на истину, но указывая варианты.
Ограничения и безопасные рамки
- Модель не историк-эксперт: фактические утверждения лучше перепроверять.
- Нельзя поручать ей транскрибировать редкие или спорные формы как «единственно правильные».
- Для научных задач разумно использовать подсказку, что ответ — стилизованная реконструкция.
Как улучшить дальше
- Добавить поиск по внешним источникам (RAG) с дореволюционными энциклопедиями и словарями, чтобы факты становились точнее.
- Дотренировать на небольших «ручных» наборах реальных писем и заметок, чтобы речь стала менее «гладкой» и более человеческой.
- Ввести регуляризатор по орфографическим правилам (например, штрафить несовместимые сочетания) — можно даже простым постфильтром.
- Настроить многоходовые диалоги: сохранять контекст и поддерживать фигуру говорящего.
- Применить лёгкий RLHF с предпочтениями аннотаторов по «естественности» речи.
Технические нюансы токенизации
- Проверить, как токенизатор разбивает редкие буквы: чрезмерная фрагментация ухудшает обучение.
- Усилить словарь через подготовительный «прогрев» на наборе дореформенных текстов (несколько тысяч коротких строк), чтобы уменьшить удивление модели.
- Рассмотреть byte-level режим как страховку: он терпим к редким символам, хотя и увеличивает длину последовательности.
Деплой и производительность
- На ноутбуке с одной потребительской видеокартой модель выдаёт ответы за доли секунды.
- 4-битная квантизация почти не портит стилизацию, но ускоряет отклик и снижает память.
- Для веб-демо достаточно держать буфер из 1–2 последних реплик и ограничивать максимальную длину вывода.
Этика стилизации
Важно честно доносить, что речь — стилизованная, а не «аутентичная запись» из архива. Модель — инструмент для погружения и иллюстрации, а не автомат исторической достоверности. В интерфейсе полезны подсказки и оговорки, чтобы пользователь понимал границы.
Итоги
Мы собрали компактную LLM, говорящую на дореформенном русском, и сделали это с упором на доступность: небольшой размер, быстрый тренинг, локальный запуск, воспроизводимый процесс. Синтетический корпус из ~50 тысяч пар дал модели уверенную стилизацию: речь вежливая, книжная, с узнаваемой орфографией. При этом, как и ожидалось, «малыш» не претендует на энциклопедичность и иногда ошибается в фактах и тонких исторических правилах письма. Для наших целей — демонстрация OCR и «голос» интерфейса — этого более чем достаточно. Дальнейшие шаги очевидны: подключить поиск по источникам, слегка усилить орфографическую строгость, научить держать длинные диалоги и аккуратно шлифовать голос «господина говоруна» так, чтобы он звучал ещё убедительнее и человечнее.


