StyleExtractor для MAX-канала: как AI автоматически копирует стиль ваших постов

StyleExtractor для MAX-канала: как AI автоматически копирует стиль ваших постов

Кидаешь 3+ эталонных постов — система сама вытаскивает эмодзи, маркеры, длину, тон. Анализ 1 раз стоит около $0.0005. Без ручного промпт-инжиниринга.

Когда мы сделали первую версию AI-генерации в Content Pilot, я был уверен что мы решили большую проблему. Любой автор может теперь — раз — и пост готов. Я постил эти посты в свой канал. Через две недели в комментариях написал старый подписчик: «Слушай, ты как-то странно писать стал».

Я тогда подумал что подписчик придирается. Перечитал последние десять моих постов. Подписчик не придирался. Я писал как нейросеть. Гладко, структурированно, без матерка, без личных вставок, без «короче говоря» в конце абзаца. Текст был хороший. Просто это был не я.

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

Потом понял в чём дело. Промпт «пиши неформально» — это пустая инструкция. У всех людей разная неформальность. У меня в текстах часто двоеточие в середине предложения вместо тире. У меня каждый второй абзац начинается с глагола. У меня всегда конкретный набор любимых эмодзи, и не все. Это микро-привычки которых я сам не замечал.

Никакой промпт-инжиниринг это не передаст. Потому что я сам не знаю как я пишу. Большинство людей не знают.

Что сработало

Идея простая — пусть система сама прочитает мои тексты и вытащит как я пишу. В нашей реализации это работает так. Юзер кидает три или больше эталонных постов в настройках проекта. Файл llm-services/app/services/style/extractor.py запускается — сначала stats.py делает regex-based количественный анализ (быстро, детерминированно): сколько эмодзи, какие топ-эмодзи, есть ли в заголовке, какие маркеры списков (▪️ / • / 👉), хештеги, длина в символах. Потом LLM (у нас сейчас openai/gpt-oss-120b) на основе stats формирует профиль через structured outputs.

Профиль — плоский JSON. Конкретные поля:

  • stats: emoji_top, emoji_recommended_range (как строка вроде «1-2», не tuple), hashtags_avg_per_post, list_primary_marker, length_chars_avg
  • tone_description — словесное описание тона
  • voice_quirks — список индивидуальных особенностей
  • forbidden_patterns — что не делать («не использовать слово "контент"», условно)
  • audience_hint — кто читатель
  • image_style_hint — рекомендация для пресета картинок
  • fields_missing — чего не хватило в эталонах
  • metadata — когда анализ, какая модель, токены, стоимость, hash исходных текстов

Этот профиль попадает в системный промпт каждой генерации через style_injector.py — функция build_style_block(auto_profile) превращает профиль в жёсткие правила. Дальше при генерации работает validator.py — проверяет сгенерированный текст против профиля, и если нашёл hard issues (например, эмодзи слишком много или неправильный маркер) — делает 1 retry.

Сколько стоит

Анализ 5 эталонов на dev по логам стоил $0.0005, занял 4.6 секунды. На rescan через сервис на тех же 5 эталонах — $0.000612 за 1494 токена.

В рублях — копейки. Это разовая операция. Дальше профиль работает бесплатно при каждой генерации. Если эталоны обновляются, через SHA256-хеш определяется stale-state и запускается re-analyze. Юзер не делает ничего вручную.

Реальный пример что выходит

Когда мы тестировали на dev в апреле — взяли 5 эталонов в стиле AI-новостей. На вход дали обычный текст про iPhone 17. На выходе Claude Sonnet 4.5 с применённым auto_profile выдал:

🚀 Apple представила iPhone 17 Pro
▪️ Процессор A19 Bionic (3нм)
▪️ Дисплей 120Гц
...
#Apple #iPhone17Pro

Validator проверил — все правила соблюдены. Эмодзи в начале, маркер ▪️, хештеги в конце, длина ок.

До auto_profile тот же Sonnet написал бы стандартный нейтральный пост без характерного маркера, с другими эмодзи, без хештегов. И это был бы «AI-пост» в плохом смысле.

Что не работает

StyleExtractor не идеальная штука. Пределы есть.

Если у вас канал на 5 постов в истории — извлечь профиль почти невозможно. Слишком мало материала. Минимум 3, оптимум 5-10. Меньше — плохо.

Если ваш стиль за полгода сильно изменился — старые посты дадут устаревший профиль. Поэтому есть rescan по SHA256-хешу: меняем эталоны → пересчитываем. Это не автомат раз в N дней (этого пока нет), но юзер вручную может перезапустить.

Если вы пишете на сложные технические темы — AI может скопировать ваш стиль, но факты не поймёт. StyleExtractor про как, не про что. Фактологию вы дописываете сами либо подаёте через RAG.

Если у вас несколько личностей в канале — например, пишете и сам автор, и его жена, и иногда гостевые посты — профиль усреднится в кашу. Решение: разделить эталоны по авторам, делать отдельные проекты для каждого.

Кому это надо

Авторам с собственным голосом — однозначно. Если канал держится на личности, без StyleExtractor AI-генерация бесполезна. Подписчики унюхают подмену через две публикации.

Корпоративным каналам — спорно. Если канал «нейтральный голос компании», AI и без профиля пишет в этом регистре. Нужен только если у компании выраженный tone of voice (юмор, провокации, особый словарь).

Агентствам — обязательно. Каждый клиент со своим стилем. Без индивидуальных профилей все клиенты звучат одним голосом, через месяц аудитория уходит.

Канал-агрегаторам без авторского голоса — не нужно. Если канал просто публикует RSS и сводки нейтрально — никакого стиля у него нет, профиль ничего не даст.

Дальше — визуальная часть в едином стиле и контент-план через AI. Вместе с StyleExtractor закрывают тему «узнаваемого канала».