Задача
Клиент — интернет-магазин товаров для дома и ремонта, около 15 000 SKU в ассортименте. Каталог собирается из фидов от 40+ поставщиков: один поставщик присылает красивые описания, другой — только название и артикул, третий — технические характеристики таблицей. На выходе у магазина был зоопарк: часть карточек — с полноценным описанием, часть — с копипастой «от производителя», часть — вообще без текста.
Проблема была видна невооружённым глазом:
- Магазин не ранжировался в Яндексе по низкочастотным коммерческим запросам — тем самым, где лежит вся маржа.
- Одна и та же модель товара у магазина и у трёх конкурентов ранжировалась по одному и тому же фиду — Яндекс считал карточки дубликатами.
- Контент-менеджер писал описания руками, успевал ~30 карточек в день. При 15 000 SKU и регулярных новинках это значило, что догнать ассортимент было невозможно.
Задача — за две недели выпустить все 15 000 карточек с уникальным описанием, SEO-мета-тегами и размеченными характеристиками для фильтрации.
Что уникально в e-commerce SEO
В блоговом SEO ставка на длинную информационную статью — ты пишешь одну глубокую статью на запрос и надеешься удержать ТОП. В e-commerce ставка противоположная: короткие описания в огромных количествах, каждое точно под SKU, каждое уникально и уникально именно «по тем же параметрам, по которым ищут».
Это меняет всё: генерация описаний — не копирайтерская, а шаблонная. Идеальное описание строительного шурупа состоит не из литературного текста, а из:
- Коротких тезисов про применение (3–4 пункта)
- Технической таблицы характеристик
- Одного параграфа про совместимость / отличия от аналогов
- SEO-хвоста с LSI-словами по интенту запроса
Попробовать генерировать такое «свободным промптом» — получить 15 000 разных по структуре карточек, каждая со своими отклонениями. Мы пошли другим путём — жёсткие шаблоны под каждую категорию товаров.

Архитектура пайплайна
Фид поставщика (CSV / XML / Excel / JSON)
│
▼
Нормализатор
(маппинг в единую схему)
│
▼
Классификатор категории
(AI: товар → категория магазина)
│
▼
Выбор шаблона (per-category)
│
▼
Enricher
— сверка с базой характеристик
— чтение спецификаций с сайта производителя
│
▼
LLM: генерация описания по шаблону
│
▼
Валидатор
— проверка обязательных полей
— дедуп с существующими карточками
— SEO-проверка (длина title, description)
│
▼
Draft в БД магазина (на ручной QA)
│
▼
Публикация в CMS через API
Ключевые решения, которые повлияли на результат
Шаблоны per-category — и это много шаблонов
Первая версия пайплайна пыталась обойтись одним универсальным промптом «сгенерируй описание товара по характеристикам». На выходе получали корректные, но одинаковые по ритму тексты — Яндекс их склеивал в группы. Пришлось признать: каждая категория товара — своя задача генерации.
В итоге у магазина получилось 37 категорий товаров и 37 шаблонов-промптов. Каждый шаблон описывает структуру, обязательные поля, тон, типовые фразы, запрещённые конструкции. Для примера, шаблон «лакокрасочные материалы» требует отдельного блока про совместимость с поверхностью и условия хранения; шаблон «ручной инструмент» — блок про материалы рукоятки и вес.
Звучит как много работы — и это была работа примерно на три дня. Но дальше все 15 000 SKU проходят по этим шаблонам автоматически.
Классификатор категории — самый важный компонент
Фиды от разных поставщиков маркируют категории по-разному. «Шуруп» может прийти в категории «Крепёж», «Метизы», «Шурупы саморезы», или вообще без категории — в названии товара. Отправить «Шуруп оцинкованный 4×30 мм» в шаблон «пиломатериалы» — значит получить бессмысленный текст.
Мы сделали отдельный AI-классификатор первым шагом пайплайна: модель смотрит на полные данные о товаре (название, артикул, производитель, группы фида, исходное описание) и выбирает одну из 37 категорий магазина. Точность классификатора — 97,4% на размеченной выборке из 500 случаев. Остальные 2,6% уходят в ручной QA.
Enricher: сверка с реальными данными
Генерация «из головы модели» по техническим характеристикам — путь к галлюцинациям. Модель пишет: «идеально подходит для работы с древесиной твёрдых пород» — а на самом деле производитель заявляет только мягкие породы. Это мелочь, которая убивает доверие клиента (а он-то потом оставит отзыв «не подошло, продавец обманул»).
Решение — Enricher: отдельный шаг, где мы сверяем характеристики из фида с тем, что лежит на сайте производителя. Enricher парсит страницу производителя (если публичная), извлекает таблицу характеристик, сравнивает с фидом, помечает расхождения. В промпт генерации уходит только то, что подтверждено с двух источников.
На 15 000 SKU Enricher нашёл ~1 400 расхождений — часть фида была банально устаревшей. Это стало побочным продуктом: магазин получил ревизию своего же каталога.
Дедупликация: 15 000 описаний должны быть уникальными между собой
Шаблон генерирует тексты с похожей структурой. Внутри одного SKU это нормально — даже хорошо. Но если у магазина 200 видов шурупов, то 200 описаний «по шаблону метизов» могут иметь 60–70% совпадающего текста между собой, что Яндекс тоже не любит.
Лечение — per-SKU randomization: в шаблон встроены вариативные слоты («применяется для [крепления / установки / монтажа]», «подходит для работы с [материалом-X / материалом-Y]»), и для каждой карточки AI выбирает комбинацию из этих слотов на основе конкретных характеристик товара. Плюс финальная проверка: попарная similarity по n-gram'ам между карточками одного поставщика, и всё, что выше 0.85 — отправляется на повторную генерацию с усиленной вариативностью.
Производительность: как уложились в 2 дня
15 000 SKU × несколько LLM-вызовов на карточку (классификатор → enricher → генерация → валидация) — это объёмный батч. Мы его гнали на 16 параллельных воркеров с очередью задач. Узкие места:
- Ограничение по RPM у провайдера LLM — около 500 запросов в минуту на тарифе.
- Парсинг сайта производителя в Enricher — некоторые сайты отдают 429 при нагрузке, пришлось ставить троттлинг по домену.
- Валидатор дедупликации — при 15 000 карточек попарное сравнение квадратично по памяти, пришлось разбивать на поставщиков и сравнивать внутри группы.
Итоговая статистика батча:
| Этап | Время (суммарно) | Итог |
|---|---|---|
| Классификация всех SKU | 3 ч | 14 603 ок, 397 на ручной QA |
| Enricher | 11 ч | 13 847 с подтверждёнными характеристиками |
| Генерация описаний | 18 ч | 15 000 карточек |
| Валидация и дедуп | 6 ч | 247 карточек на переработку |
| Повторная генерация | 2 ч | 247 новых вариантов |
| Ручной QA контент-менеджера | 8 ч (1 день) | 68 карточек с правками |
| Публикация в CMS | 1 ч | 15 000 карточек live |
Итого — 49 часов машинного времени и 8 часов ручного QA, уложились в два календарных дня.
SEO-мета-теги: отдельный маленький пайплайн
Описания — это только часть задачи. Второй, не менее важный блок — SEO-мета-теги:
- Title: «Шуруп оцинкованный 4×30 мм — купить в [магазин] по цене от XX ₽»
- Description: короткое, с ключевыми словами из запроса, с призывом.
- H1: уникальный, не равный title.
Каждое поле имеет ограничения по длине и обязательные элементы (название товара, бренд магазина, цена, слово «купить» в title). Генератор мета-тегов — отдельный мини-промпт, который бежит после генерации описания, берёт финальные данные карточки и формирует три поля одновременно с проверкой длины.
Если title получился длиннее 70 символов — автоматическая перегенерация с требованием ужать. Та же логика на description (ограничение 160).
Фильтры: не генерация, а извлечение
Третий блок, про который часто забывают — фильтры каталога. Хороший e-commerce фильтр закрывает 50–70% навигационных запросов: «шурупы по дереву 50 мм», «краска алкидная матовая белая», «дрель аккумуляторная с реверсом».
Для фильтрации нужны структурированные характеристики: не «описание шурупа», а type=по_дереву, length=50, coating=оцинкованный. У магазина эти поля были в зоопарке: часть заполнена, часть пустая, часть в свободном тексте внутри описания.
Мы добавили к пайплайну шаг extraction: LLM вытаскивает из описания, фида и спецификации производителя структурированные пары «характеристика–значение», приводит к нормализованным значениям (миллиметры → целое число, цвет → из фиксированного списка) и записывает в отдельную таблицу характеристик. Эти данные подцепляются фильтром каталога на фронте.
Эффект — +1 246 новых URL-ов фильтрации, которые сразу пошли в индекс Яндекса как полноценные страницы.

Результаты
Главная метрика для магазина — органический трафик и выручка с органики. Замеры через 2 месяца после полного деплоя:
| Метрика | До | После (2 мес) |
|---|---|---|
| Страниц карточек в индексе | 6 200 (часть с дубликатами) | 14 800 |
| Страниц фильтров в индексе | 140 | 1 386 |
| Уникальных ключей в ТОП-10 Яндекса | 2 100 | 9 400 |
| Органический трафик / мес | 38 000 | 121 000 |
| Выручка с органики / мес | базовый | ×2,8 |
| Время контент-менеджера / 100 новых SKU | 25 часов | 1,5 часа (только QA) |
Особенно приятный эффект — длинный хвост. До внедрения магазин ранжировался по «общим» коммерческим запросам («купить шуруп»), где битва дорогая и маржа маленькая. После — начал собирать огромное количество точных низкочастотных запросов («шуруп оцинкованный 4×30 мм цена»), у которых конкуренция низкая, а конверсия в покупку существенно выше.
Вывод
Если у вас большой каталог и копирайтер не успевает — AI-пайплайн окупается ровно тогда, когда вы перестаёте мечтать про «одну универсальную формулу для всего» и начинаете делать шаблон под каждую категорию. 37 шаблонов — это три дня работы, и дальше всё крутится само.
Второе важное — не полагайтесь только на модель. Генерация из головы LLM — это галлюцинации. Генерация по нормализованным данным, подтверждённым вторым источником, — это надёжный контент. Разница между двумя подходами становится видна не сразу — но ровно тогда, когда первый отзыв «купил — не подошло по характеристике» превращается в возврат и минус в рейтинге магазина.



