Почему один промпт «сделай попап» не работает: как я собрала пайплайн из парсера и трёх вызовов Yandex GPT
Месяц назад я уже писала здесь, почему у сайтов с трафиком нет заявок: слабый оффер, попап про «мы», а не про посетителя, пять буллитов вместо двух. Тогда это были выводы «глазами разработчика». Сейчас — другая сторона: как я собирала инструмент, который по URL страницы выдаёт черновик такого попапа.
Сервис называется ИИ-conversion. Статья не про «купите», а про то, почему наивный подход с одним промптом разваливается — и какие костыли пришлось поставить, чтобы генерация стала предсказуемой.
Первая версия: «вот HTML, сделай попап»
Логика казалась очевидной: скачать страницу, скормить Yandex GPT, попросить JSON с заголовком, буллитами и кнопкой.
На выходе стабильно получалось три беды:
- Шум. В HTML летят меню, футер, cookie-баннер, тексты чужих виджетов. Модель цепляется за мусор.
- Две задачи сразу. «Пойми бизнес» и «напиши рекламу» в одном запросе — модель путается и уходит в общие фразы.
- Кривой формат. Вокруг JSON — markdown, пояснения, пропущенные кавычки. Парсер падает, пользователь видит ошибку.
Плюс классика: на сайте написано «500+ клиентов», а в попапе появляется «10 000 клиентов». Модель дорисовывает «убедительность».
Вывод был неприятный, но полезный: проблема не в «плохой нейросети», а в том, что я просила её сделать ETL одной кнопкой.
Как устроено сейчас
URL → парсер страницы → резюме под конверсию → аудитория и возражения → тексты попапа → картинка → один JS-файл для сайта.
Стек скучный и рабочий: FastAPI, парсинг через BeautifulSoup, для SPA — Playwright, тексты — Yandex GPT Pro, картинка — Yandex ART. Генерация синхронная для пользователя: в кабинете ждёшь примерно 30–90 секунд.
Ниже — что оказалось важным на каждом шаге.
Парсер: сначала просто, браузер — только если надо
Большинство лендингов на Tilda и WordPress отдаются нормальным HTML. Их хватает requests + чистка DOM: вырезаем script/style, грубо убираем header/footer, собираем заголовки, цены, телефоны, JSON-LD.
Playwright дороже по CPU и времени. Поэтому он не на каждый URL, а только когда после статики текста меньше порога. Если в итоге меньше ~100 символов — сразу ошибка: на пустоте GPT начинает фантазировать, и это хуже честного «не смогли разобрать страницу».
Отдельный сюрприз продакшена: CDN отдавал устаревшую версию лендинга. Добавили cache-buster в query — иначе владелец смотрит один сайт, а генератор разбирает другой.
Три вызова GPT вместо одного
Разбила работу модели на узкие шаги.
Шаг 1. Summary. Не пересказ сайта, а выжимка под конверсию: оффер, доказательства, CTA, боли. Строго текстом, без markdown.
Шаг 2. Audience. Сегменты ЦА, возражения, триггеры доверия. Шаг дорогой по токенам — результат кеширую по домену. Повторная генерация для того же сайта не гоняет эту часть заново. Ключ — нормализованный домен, без utm.
Шаг 3. Popup copy. На вход уже не сырой HTML, а сжатый пакет: summary + audience + структурированные факты. На выходе — жёсткий JSON: title, subtitle, два буллита, подписи полей, CTA, описание картинки.
К финальному шагу подмешиваю few-shot примеры по нишам. Именно они сильнее бьют по качеству, чем крутилки temperature. Сами примеры в открытый доступ не выкладываю — это отдельный актив продукта.
В промпте зафиксированы лимиты (короткий заголовок, короткие буллиты) и запрет выдумывать цифры, которых нет в summary. Температуру держу около 0.4: ниже — шаблоны, выше — больше галлюцинаций.
И всё равно JSON иногда приезжает в обёртке. Поэтому отдельный разбор ответа: срезать markdown, вытащить объект {...}, только потом json.loads. Если не вышло — человеку понятная ошибка, в лог — кусок сырого ответа. Без этого отладка прода — боль.
Картинка — бонус, не точка отказа
Из JSON берётся поле visual и уходит в Yandex ART почти как есть. Если ART лежит или тормозит — попап всё равно отдаём, просто без картинки. Для MVP это правильнее, чем валить всю генерацию из‑за иллюстрации.
Как это попадает на сайт клиента
После сохранения бэкенд отдаёт один файл: виджет.js. Скрипт сам грузит стили, показывает попап по правилам (задержка, exit-intent, страницы), шлёт клики и лиды, умеет webhook в CRM.
Для WordPress сделали тонкий плагин-коннектор: по сути подключение скрипта из настроек. Вся логика остаётся на стороне сервиса.
Живой пример виджета можно посмотреть на glm-dev.ru
Что ломалось после запуска
Выдуманные цифры. Лечится правилом «только факты из summary и структурированных данных» плюс отдельный блок соцдоказательств с источником на этапе резюме.
Попап про компанию. Лечится few-shot и формулировкой задачи: заголовок отвечает на «что я получу сейчас», не «почему мы крутые».
Таймауты на длинных страницах. В финальный промпт не тащим десятки килобайт сырого текста — после summary и audience достаточно сжатого контекста.
Двойной клик «Сгенерировать». Два параллельных запроса = двойной расход лимита и гонка записей. Нужны rate limit и нормальные ошибки квоты.
Юридический аспект. Парсим только публичный URL, который вводит сам владелец сайта. В оферте — ответственность за права на контент у клиента.
На какие цифры смотрю сама
Не «нравится ли текст глазами», а:
— доля генераций без ошибки JSON — стабильность контракта с моделью;
— время end-to-end (особенно p95) — сколько реально ждёт человек в кабинете;
— доля попапов, которые дошли до установки скрипта — онбординг, не качество копирайта;
— CTR после установки — уже бизнес, сравнение с обычной формой на сайте.
Что бы повторила на следующем ИИ-продукте:
1. Дробить задачу модели на шаги с узким форматом ответа.
2. Держать простой парсер и запасной браузерный путь для SPA.
3. Не верить, что LLM «всегда вернёт валидный JSON» — парсер ответа обязателен.
4. Кешировать дорогие промежуточные шаги.
ИИ здесь не полностью заменяет маркетолога. Он убирает чистый лист. Черновик с учётом страницы правится за минуты — финальное слово всё равно за человеком, который знает продукт.
Если интересно — могу отдельно разобрать, как устроены few-shot по нишам и A/B двух заголовков на одном embed без второго скрипта.
А вы уже пробовали генерировать тексты для сайта «одним промптом»? Что сломалось первым — формат, выдуманные факты или просто вода? Напишите в комментариях — разберу типичные кейсы.