Автоматическая генерация SEO-текстов карточек товаров

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Автоматическая генерация SEO-текстов карточек товаров
Средний
~3-5 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Мы автоматизируем генерацию SEO-описаний для интернет-магазинов, где каталог насчитывает тысячи позиций. Ручное написание уникальных текстов под каждый товар займёт месяцы и миллионы — наша система справляется за часы. Но просто вызвать API нейросети недостаточно: нужна продуманная архитектура из подготовки данных, промпт-инжиниринга, пакетной обработки, валидации и интерфейса ревью. Имея опыт более 10 лет в разработке высоконагруженных систем, мы гарантируем стабильность и качество генерации.

Почему это работает?

Современные языковые модели — такие как ChatGPT (GPT-4o) и Claude — генерируют осмысленные тексты, если дать им структурированные данные: название, категорию, характеристики. Согласно документации OpenAI, контекстное обучение позволяет адаптировать вывод под задачу. Промпт-инжиниринг задаёт тон, длину, структуру и требования к ключевым словам, чтобы результат был релевантным и SEO-оптимизированным. Пример для кроссовок Nike Air Max 270:

{
  "id": "SKU-4821",
  "name": "Кроссовки Nike Air Max 270",
  "category": "Мужская обувь / Кроссовки",
  "brand": "Nike",
  "attributes": { "material": "mesh + synthetic", "sole": "Air Max unit", "colors": ["black/white", "navy/grey"], "sizes": "40–46", "weight": "310g" },
  "tags": ["беговые", "повседневные", "амортизация"],
  "targetKeywords": ["nike air max 270 купить", "кроссовки найк аир макс 270"]
}

Как гарантируется уникальность текстов?

Модель с температурой >0 всегда выдаёт разный результат. Дополнительно мы проверяем каждую генерацию на дубли через Elasticsearch — если текст совпадает с уже существующим, запускаем повторную генерацию с новым seed. Это исключает появление копий в каталоге. Такой подход позволяет сохранять уникальность даже при массовой генерации.

Как мы проектируем промпты для товарных текстов?

Промпт — это не «напиши описание товара». Хороший промпт задаёт структуру, тон, длину, требования к ключевым словам и запреты. Пример на TypeScript:

function buildProductSeoPrompt(product: Product, keywords: string[]): string {
  return `
Write a product description for an e-commerce catalog in Russian.

Product: ${product.name}
Category: ${product.category}
Brand: ${product.brand}
Key attributes: ${JSON.stringify(product.attributes)}
Tags: ${product.tags.join(", ")}

Requirements:
- Length: 200–400 words
- Include these keywords naturally: ${keywords.join(", ")}
- Structure: opening benefit statement → key features (3–5 points) → use cases → closing
- Tone: informative, no hype, no superlatives like "лучший" or "уникальный"
- Do NOT use: "данный товар", "представляем вашему вниманию", bullet points
- Do NOT start with the product name
- Write for a person who is comparing options

Output: plain text, no markdown, no headings.
`.trim();
}

Почему важна пакетная обработка с очередями?

Генерировать тексты синхронно нельзя — запрос к LLM занимает 3–10 секунд, а позиций могут быть тысячи. Мы используем очередь задач на BullMQ с параллелизмом и повторными попытками.

import { Queue, Worker } from "bullmq";
import { openai } from "../lib/openai";
import { db } from "../lib/db";

const seoQueue = new Queue("seo-generation", {
  connection: { host: "localhost", port: 6379 },
});

export async function queueProductsForGeneration(productIds: string[]) {
  const jobs = productIds.map((id) => ({
    name: "generate",
    data: { productId: id },
    opts: { attempts: 3, backoff: { type: "exponential", delay: 5000 }, removeOnComplete: 100 },
  }));
  await seoQueue.addBulk(jobs);
}

const worker = new Worker("seo-generation", async (job) => {
  const product = await db.products.findById(job.data.productId);
  if (!product) return;
  const keywords = await getTargetKeywords(product);
  const prompt = buildProductSeoPrompt(product, keywords);
  const completion = await openai.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: prompt }],
    temperature: 0.7,
    max_tokens: 600,
  });
  const text = completion.choices[0].message.content?.trim();
  if (!text) throw new Error("Empty response");
  await db.productSeoTexts.upsert({
    productId: product.id,
    text,
    status: "draft",
    model: "gpt-4o-mini",
    generatedAt: new Date(),
  });
}, { connection: { host: "localhost", port: 6379 }, concurrency: 5 });

Как обрабатываются ошибки при генерации?

При сбое запроса или пустом ответе задача автоматически переставляется в очередь с экспоненциальной задержкой (backoff). После трёх неудачных попыток товар помечается как failed и отправляется на ручную проверку. Это обеспечивает отказоустойчивость и минимизирует потери данных.

Контроль качества через валидацию

Сгенерированный текст автоматически проверяется: длина, наличие всех ключевых слов, отсутствие стоп-фраз, плотность вхождений. Если проверка не пройдена — товар помечается флагом needs_review и отправляется на повторную генерацию с уточнённым промптом.

interface ValidationResult { passed: boolean; issues: string[] }
function validateSeoText(text: string, product: Product): ValidationResult {
  const issues: string[] = [];
  if (text.length < 500) issues.push(`Too short: ${text.length} chars`);
  const missingKeywords = product.targetKeywords.filter(kw => !text.toLowerCase().includes(kw.toLowerCase()));
  if (missingKeywords.length > 0) issues.push(`Missing keywords: ${missingKeywords.join(", ")}`);
  const stopPhrases = ["данный товар", "представляем вашему вниманию", "уникальный", "лучший в своём классе"];
  for (const phrase of stopPhrases) {
    if (text.toLowerCase().includes(phrase)) issues.push(`Contains stop phrase: "${phrase}"`);
  }
  const wordCount = text.split(/\s+/).length;
  for (const kw of product.targetKeywords) {
    const kwCount = (text.toLowerCase().match(new RegExp(kw.toLowerCase(), "g")) || []).length;
    if (kwCount / wordCount > 0.03) issues.push(`Keyword density too high for "${kw}": ${(kwCount / wordCount * 100).toFixed(1)}%`);
  }
  return { passed: issues.length === 0, issues };
}

Интерфейс ревью

Редактор видит список черновиков с кнопками «Опубликовать», «Регенерировать», «Редактировать». Регенерация учитывает причину предыдущего отклонения — воркер добавляет её в промпт. Все черновики хранятся в статусе draft, публикация происходит только после подтверждения.

Сравнение: ручная генерация vs AI

Параметр Ручной копирайтинг AI-генерация
Скорость на 1 текст 15–30 минут 5–15 секунд
Стоимость на 10 000 текстов высокая (зависит от авторов) значительно ниже
Масштабируемость линейно растёт с числом авторов параллельная очередь
Контроль качества зависит от исполнителя автоматическая валидация
Актуальность обновлять вручную триггер по изменению данных

Пример: для крупного клиента из сегмента одежды мы сгенерировали 12 000 описаний за 4 часа. Промпты учитывали сезонность, пол, размерную сетку. После первичной генерации 8% текстов попали в needs_review из-за высокой плотности ключевых слов — после корректировки промпта процент снизился до 2%. Финальный запуск занял один день.

Этапы внедрения

Этап Описание Срок
Анализ Сбор структуры данных, тестирование промптов на выборке 1 неделя
Разработка Интеграция LLM, очередь, валидаторы, интерфейс ревью 2–3 недели
Тестирование Прогон на 500 товарах, итеративная правка промптов 1 неделя
Запуск Генерация всего каталога, обучение команды 1 неделя

Что входит в реализацию?

  • Интеграция с LLM (OpenAI, Claude) через API
  • Система очередей на BullMQ с повторными попытками и backoff
  • Промпт-инжиниринг под вашу специфику (категории, тональность, ключи)
  • Интерфейс для ревью и модерации (React + TypeScript)
  • Валидаторы: длина, ключевые слова, стоп-слова, плотность
  • Документация и обучение команды
  • Поддержка в течение месяца после запуска

Сроки и стоимость

Срок реализации — от 2 до 6 недель в зависимости от объёма каталога и сложности интеграции. Стоимость рассчитывается индивидуально — чем больше товаров, тем дешевле каждый отдельный текст. Оценим ваш проект? Свяжитесь с нами — расскажем, как снизить бюджет на SEO-контент в разы.

Закажите консультацию — мы проанализируем ваш каталог и подберём оптимальную модель генерации. Получите прототип на ваших данных и оцените эффект.

Интеграция AI: чат-боты, RAG, семантический поиск, рекомендации

В 8 из 10 проектов «AI-чат-бот» оказывается дорогой обёрткой над GPT-4o с системным промптом. Без доступа к реальным данным компании. Пользователь спрашивает «сколько стоит тариф Премиум» — бот галлюцинирует цену из воздуха. Спрашивает «когда придёт заказ» — получает вежливое «напишите в поддержку». Это не интеграция — это имитация. Мы за 5 лет внедрили RAG-решения в 30+ проектах: от интернет-магазинов до медицинских порталов. Гарантируем: полезная AI-помощь начинается там, где модель читает ваши документы, а не общие ответы.

Как мы строим RAG-системы?

Retrieval-Augmented Generation — стандартная архитектура: запрос → поиск релевантных фрагментов в векторной БД → вставка найденного в контекст → ответ модели. Но дьявол в деталях реализации. Разберём ключевые узлы, которые определяют качество.

Chunking. Резать документ на куски по 500 токенов без оглядки на структуру — гарантия потери смысла. Если разрез пришёлся на середину абзаца, контекст разрывается. Решение — рекурсивный RecursiveCharacterTextSplitter с overlap 10–15% для документации. Для контрактов и инструкций используем семантический сплиттер: выделяем заголовки, списки, блоки кода — каждый раздел становится независимым чанком. Разница в качестве поиска: на одном медицинском проекте precision вырос с 0.55 до 0.84 только за счёт правильной нарезки.

Модель эмбеддингов. Для русскоязычных текстов intfloat/multilingual-e5-large даёт заметный прирост точности против устаревшей text-embedding-ada-002. По нашим замерам, NDCG@10 на тестовой выборке из 10 000 пар «запрос-документ» на 12% выше. OpenAI text-embedding-3-large — хороший вариант для англоязычного контента, но для русского рекомендуем BAAI/bge-m3 или упомянутую e5-large.

Векторная БД. Если у вас уже стоит PostgreSQL — pgvector экономит ресурсы. Ставим расширение CREATE EXTENSION vector, добавляем колонку vector(1024), создаём HNSW-индекс. На проекте с 80 000 статей поддержки p95 поиска — 12 мс. Этого хватает. Для каталогов с миллионами единиц — Qdrant или Weaviate: нативный гибридный поиск и шардирование «из коробки».

Что даёт гибридный поиск?

Только векторный поиск слеп к точным совпадениям: артикулы «ABC-123», имена собственные, аббревиатуры теряются. Только полнотекстовый поиск не улавливает синонимы и перефразирования. Комбинация через RRF (Reciprocal Rank Fusion) даёт лучшее из двух миров: BM25 + векторный поиск, результаты смешиваются. На практике recall@20 растёт с 0.65 до 0.92 — разница заметна пользователю.

Reranking — финальный фильтр: top-20 кандидатов из гибридного поиска прогоняем через cross-encoder cross-encoder/ms-marco-MiniLM-L-6-v2. Он добавляет 50–100 мс к ответу, но relevance поднимает ещё на 5–10%. Без reranking чат-бот может показывать нерелевантные документы.

Семантический поиск на сайте

Поиск «удобные кожаные кресла» должен находить товары с описанием «мягкие стулья из натуральной кожи» — обычный LIKE-поиск не способен. Наша архитектура: при добавлении товара/поста автоматически генерируем эмбеддинг через multilingual-e5-large, сохраняем в pgvector. На запросе — эмбеддим его той же моделью, ищем ближайших соседей через cosine distance с HNSW-индексом. Для каталога из 100 000 позиций индекс строится 3 минуты, в памяти ~400 Мбайт (1536-мерные векторы). Cреднее время поиска — 20 мс.

Рекомендательные системы

Коллаборативная фильтрация («пользователи, похожие на вас, покупали X») требует истории — минимум 2–3 месяца данных с 1000+ активных пользователей. Для стартапов или малых проектов используем content-based: эмбеддинг текущего товара → поиск ближайших соседей по косинусной близости. Когда накапливается статистика (обычно 15–20 взаимодействий на пользователя), переключаемся на гибридную модель LightFM. Она объединяет и поведение, и признаки товаров. У нас в e-commerce проекте с 50 000 SKU гибридная модель повысила конверсию в рекомендательный блок на 18% (A/B-тест длился 2 недели).

Стриминг ответов

Пользователь не обязан ждать, пока модель сгенерирует весь текст — это убивает UX. Server-Sent Events (SSE) — протокол для стриминга токенов. OpenAI SDK поддерживает stream: true, возвращая AsyncIterator. На фронтенде — Vercel AI SDK (useChat) или самописный EventSource. Типичная ошибка: использовать WebSocket для однонаправленного стрима — SSE проще (меньше кода, встроенный реконнект). Стек: Node.js + SSE + React.

Оркестрация агентов

Простой чат-бот отвечает. Агент — выполняет действия: создаёт тикет в Jira, проверяет статус заказа в CRM, бронирует слот в календаре. Для оркестрации используем LangGraph: граф состояний, где каждый узел — вызов модели или инструмента. Vercel AI SDK useChat + tools для Next.js позволяет добавить интеграцию в 10 строк кода. Главная сложность — надёжность: модель иногда вызывает не тот инструмент или передаёт кривые параметры. Защита — Zod-схемы на каждый инструмент и structured outputs для гарантии JSON.

Что входит в работу

Этап Результат Срок
Аудит данных и бизнес-логики Карта источников, формат документов, оценка качества 1–2 дня
Прототип RAG или рекомендательной системы Демонстрация с метриками (recall, precision, latency) 1–2 недели
Интеграция в существующее веб-приложение API-эндпоинты, интерфейс для чат-бота/поиска 1–2 недели
A/B-тестирование и оптимизация Отчёт по метрикам (CTR, конверсия, hallucination rate) 1 неделя
Документация и обучение команды Руководство по эксплуатации, код-ревью 2–3 дня

Дополнительно: мы передаём исходный код векторизатора, дашборды мониторинга (Langfuse), доступ к админке для обновления базы знаний. Постпродакшн-поддержка — 1 месяц бесплатно.

Сроки

Задача Ориентировочный срок
RAG-чат-бот на базе существующей базы знаний 3–6 недель
Семантический поиск по каталогу 2–4 недели
Рекомендательная система с A/B-тестированием 6–10 недель
Мультиагентная система с интеграциями от 8 недель

Стоимость рассчитывается индивидуально после знакомства с проектом. Оценим ваш проект за 1 день. Свяжитесь с нами — расскажем, как превратить AI из игрушки в инструмент, который приносит прибыль.