Автоматична генерація 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-текстів карток товарів

Ми автоматизуємо генерацію 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 з системним промптом. Без доступу до реальних даних компанії. Користувач питає «скільки коштує тариф Преміум» — бот галюцинує ціну з повітря. Питає «коли прийде замовлення» — отримує ввічливе «напишіть у підтримку». Це не інтеграція AI у веб-додатки — це імітація. Ми за 5 років впровадили RAG-рішення в 30+ проектах: від інтернет-магазинів до медичних порталів. Гарантуємо: корисна AI-допомога починається там, де модель читає ваші документи, а не загальні відповіді. Закажіть консультацію, щоб отримати план інтеграції для вашого проекту.

Побудова RAG-систем: чанкінг, ембедінги, векторна БД

Retrieval-Augmented Generation — стандартна архітектура: запит → пошук релевантних фрагментів у векторній БД → вставка знайденого в контекст → відповідь моделі. Але диявол у деталях реалізації.

Чанкінг. Різати документ на шматки по 500 токенів без огляду на структуру — гарантія втрати сенсу. Якщо розріз припав на середину абзацу, контекст розривається. Рішення — рекурсивний RecursiveCharacterTextSplitter з overlap 10–15% для документації. Для контрактів та інструкцій використовуємо семантичний спліттер: виділяємо заголовки, списки, блоки коду — кожен розділ стає незалежним чанком. Результат: на медичному проекті precision зріс з 0.55 до 0.84 лише завдяки правильному нарізанню, скорочення витрат на підтримку на 40% заощадило 80 000 грн на місяць.

Модель ембедингів. Для україномовних текстів intfloat/multilingual-e5-large дає помітний приріст точності проти застарілої text-embedding-ada-002. Наші виміри: NDCG@10 на 12% вищий. text-embedding-3-large хороший для англомовного контенту, але для української рекомендуємо BAAI/bge-m3.

Векторна БД. Якщо вже стоїть PostgreSQL — pgvector заощаджує ресурси. Ставимо розширення CREATE EXTENSION vector, додаємо колонку vector(1024), створюємо HNSW-індекс. На проекті з 80 000 статей p95 пошуку — 12 мс. Для каталогів з мільйонами одиниць — Qdrant або Weaviate: нативний гібридний пошук і шардування «з коробки».

Технічна реалізація pgvector Індекс будується за 3 хвилини на 100 000 позицій, займає ~400 МБ (1536-вимірні вектори). Пошук cosine distance з HNSW-індексом — 20 мс.

Кроки реалізації RAG:

  1. Збір та структурування даних (очищення, метадані).
  2. Вибір моделі ембедингів (multilingual-e5-large або bge-m3).
  3. Створення чанків (семантичний спліт із 10–15% overlap).
  4. Індексація в pgvector (або Qdrant).
  5. Інтеграція пошуку (гібрид BM25 + векторний через RRF) та реранкінг.

Що дає гібридний пошук?

Лише векторний пошук сліпий до точних збігів: артикули «ABC-123», власні назви, абревіатури губляться. Лише повнотекстовий не вловлює синоніми та перефразування. Комбінація через RRF (Reciprocal Rank Fusion) дає краще з двох світів: BM25 + векторний пошук, результати змішуються. На практиці recall@20 зростає з 0.65 до 0.92 — на 30% вищий за чисто векторний. Реранкінг через cross-encoder cross-encoder/ms-marco-MiniLM-L-6-v2 додає 50–100 мс до відповіді, але relevance піднімає ще на 5–10%.

Як реалізувати семантичний пошук у веб-додатку?

Пошук «зручні шкіряні крісла» має знаходити товари з описом «м'які стільці з натуральної шкіри» — звичайний LIKE-пошук не здатний. Архітектура: при додаванні товару/посту автоматично генеруємо ембединг через multilingual-e5-large, зберігаємо в pgvector. На запиті — ембедимо його тією ж моделлю, шукаємо найближчих сусідів через cosine distance з HNSW-індексом. Середній час пошуку — 20 мс.

Рекомендаційні системи: коли потрібна гібридна модель?

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

Стрімінг відповідей через SSE

Користувач не зобов'язаний чекати, поки модель згенерує весь текст — це вбиває 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 дозволяє додати інтеграцію в 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 з іграшки на інструмент, що приносить прибуток. Закажіть консультацію, щоб дізнатись, як інтегрувати AI у ваш веб-додаток.