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_avgtone_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 закрывают тему «узнаваемого канала».