Содержание ↓
Зачем проверять ролик до эфира
Обычно претест ролика — отдельная закупка у исследовательского агентства, со своим сроком и бюджетом. Поэтому его делают для флагманских роликов, а короткие версии для соцсетей уходят в эфир на вкусе команды. Хотя у коротких версий всё решают первые три секунды.
Замены исследованию я не ждал. Мне был нужен черновой разбор: где зритель пролистнёт, что непонятно без звука, какие возражения поднимет ролик. С таким списком потом идут к живым людям.
Как устроено: от файла до отчёта
Загрузка
Ролик до 3 минут и 200 МБ браузер отправляет прямо в хранилище, минуя сервер. Тело серверного запроса ограничено 20 МБ, и поднимать лимит опасно: файл целиком лёг бы в память процесса, а падение приложения по памяти мы на этом сервере уже видели. Размер и длительность проверяются три раза — в браузере до отправки, по объекту в хранилище и утилитой ffprobe перед разбором. Первые байты код сверяет с сигнатурой контейнера: под расширением .mp4 может лежать плейлист со ссылками, и ffmpeg честно пойдёт по ним в сеть.
Протокол
Разбор идёт в шесть стадий, и интерфейс так и пишет: «шаг 3 из 6 (нарезка на отрезки)». ffprobe отдаёт паспорт файла: длительность, частоту кадров, наличие звука. ffmpeg находит монтажные склейки и режет ролик на отрезки не длиннее двух секунд. Видеомодель Gemini получает файл и описывает каждый отрезок: что в кадре, какие титры, что звучит. Первые три секунды разбираются отдельным проходом с частотой 8 кадров в секунду: окно короткое, и проход стоит копейки.
Гейт и панель
Панель не запускается, если расчётная уверенность протокола ниже 0,7 или если человек не открыл разбор и не подтвердил, что это описание его ролика. Пересобрал протокол — подтверждай заново.
Дальше 12 персон читают протокол и отвечают на анкету. Каждая собрана из записей корпуса трёх родов: письменные отзывы, рассказы о себе из публичных видео, глубинные интервью. Состав панели задаётся seed протокола, поэтому повторный прогон соберёт тех же людей, и расхождение двух отчётов остаётся списать только на модель. Первый вопрос у всех один, про ленту: пролистнул бы или задержался, и что на это повлияло. Остальные вопросы у каждой персоны идут в своём порядке.
Кодирование и отчёт
Отдельный вызов с температурой 0 раскладывает реплики по словарю из 73 кодов в 11 группах. Подходящего кода нет — ставится «вне словаря», и дыра в словаре видна сразу. В отчёте пять блоков: что панель сделала в ленте, какие возражения поднялись, что сработало, с какими признаками ролика панель связывает возражения и что поправить.
Почему столько работы у кода
Персона читает протокол, самого ролика она не видит. Допустим, модель приняла студийную съёмку за репортаж. Тогда панель уверенно обсудит ролик, которого не существует, и ни один следующий шаг этого не заметит. Поэтому всё, что можно измерить, я отдал коду.
Границы склеек ищет ffmpeg. Видеомодель ошибается по времени на полсекунды и больше, а допуск у меня 0,3 секунды. Её оценка числа склеек идёт только в расчёт уверенности.
Уверенность протокола считает формула из пяти сигналов. Больше всех весит покрытие (0,30) — доля отрезков, у которых есть описание. Дальше обоснованность оценки постановочности (0,25), доля сцен, прошедших проверку схемы (0,20), совпадение числа склеек (0,15) и расшифровка речи при живой звуковой дорожке (0,10). Спрашивать модель, насколько она уверена, бессмысленно: гладкий текст получает высокую самооценку, даже когда он полностью ложный.
Метрики ролика — секунду появления бренда, плотность титров, темп склеек — тоже считает код. Два прогона одного ролика обязаны давать одни и те же числа.
Персона не знает, что смотрит рекламу. В её промпт попадают только те поля протокола, которые названы в коде поимённо, и перед отправкой код проверяет готовый промпт на запрещённые слова: название бренда, «реклама», «креатив», «заказчик». Утечка роняет прогон целиком. Имя файла тоже вырезано: «ролик_бренд_финал.mp4» сразу раскрыл бы, что это реклама. Персона, которая знает, что бренд появился на 26-й секунде, начинает рассуждать как медиапланер, а живой зритель не поймёт, чей это ролик.
До записи в базу отчёт проходит валидатор. Процентов по панели в нём не бывает, только счётчики вида «5 из 12». Внешнюю статистику валидатор пропускает, если рядом с числом стоят источник и объём выборки, прогнозы не пропускает совсем. Каждую цитату он ищет дословно в репликах персон. Нарушено хоть одно правило — отчёт не публикуется.
Что получает маркетолог
Маркетолог видит протокол по секундам с плеером и таймлайном и ответы персон, сгруппированные по вопросам. Ответы дословные, с пометками, что человека зацепило и почему, если он это назвал. Дальше идут карта возражений и от трёх до пяти правок. На одной панели можно сравнить от 2 до 5 роликов: они стоят в том порядке, в каком их выбрали, и инструмент показывает различия, не назначая победителя. HTML-выгрузка открывается офлайн и хранит в шапке модель, seed и версию корпуса — без них через месяц отчёт не воспроизвести.
Грабли
Один кадр в секунду. На эталонном ролике титры вспыхивали на 0,16 секунды. При настройке по умолчанию — один кадр в секунду — модель вернула протокол, который прошёл проверку схемы, читался гладко и был выдуман от начала до конца: вместо титров — «тёмный однотонный фон». На этом ролике при четырёх кадрах в секунду титры прочитались слово в слово. Ниже четырёх теперь ставить нельзя.
Уверенность 1,00 за пустоту. На всех сценах модель ответила «не определить», пустой знаменатель превратился в единицу, и самый бесполезный протокол получил максимальный балл. Теперь сигнал без измерения стоит 0,5 и порождает предупреждение.
Кириллица и регулярные выражения. В JavaScript \b и \w кириллицу не видят. Из-за этого правила валидатора отчёта какое-то время не работали вовсе. Поймали это наши же тесты, и границы слов теперь задаются явно.
Бренд, записанный на слух. Проверка промпта ловила название бренда в одном написании. В расшифровках интервью люди произносили его как придётся, и три варианта проходили насквозь прямо в цитатах. Теперь буквы нормализуются перед проверкой, а тест изоляции гоняется на живых файлах корпуса.
Панель из одного голоса. Ранние прогоны звучали как одна вежливая персона, размноженная на всю панель. Разброс вернули через содержание: профили просмотра (со звуком, без звука, отвлёкся, бросил на середине), анкета блоками по четыре вопроса, после вопроса про ленту — свой порядок у каждого, собственные цитаты человека в промпте и блок «чего ты о себе не знаешь». Похожесть ответов разных персон на один вопрос упала примерно вдвое.
Корпус раньше промптов
Из инструментов нужны видеомодель, которая принимает файл целиком, и ffmpeg. Из данных — словарь возражений и корпус реальных текстов вашей аудитории: отзывы, интервью, обращения в поддержку. С корпуса я бы и начал. Без него персоны говорят голосом модели, и настройка промптов этого не исправит. Какие тексты аудитории у вас уже есть и хватит ли их на панель, удобно разобрать на консультации. Про то, как такие разделы входят в работу отдела, — страница внедрение ИИ в маркетинг.
Чего пока нет, скажу прямо. Веса уверенности не откалиброваны на эталонной выборке, и пилота с живыми людьми для сверки ещё не было. Декодер однажды потерял вторую строку мелкого текста, хотя уверенность стояла 0,97, поэтому ручную сверку гейт не отменяет. А словарь возражений описывает претензии к продукту и почти ничего не говорит о том, как прочитан сам ролик.
- Next.js
- Supabase
- ffmpeg
- Gemini
- OpenAI
- zod
