Реалізація автоматичної категоризації товарів (AI)

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

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

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Реалізація автоматичної категоризації товарів (AI)
Середній
~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

Уявіть: каталог із 10 000 товарів, кожен з описом на 2–3 речення. Ручне розставлення категорій займе тижні. Автоматична категоризація на основі мовних моделей вирішує це завдання за години з точністю до 90%. Наша команда з понад 5-річним досвідом впровадила рішення для десятків інтернет-магазинів — від дрібних до великих маркетплейсів. Результат: скорочення часу наповнення каталогу в 10 разів і зниження витрат на категоризацію до 70%.

На відміну від правил і regexp, мовна модель розуміє семантику: «бездротові навушники з шумозаглушенням ANC» і «TWS earbuds noise cancelling» потраплять в одну категорію без явного маппінгу. Модель враховує не лише назву, а й опис, бренд, характеристики постачальника.

Проблема особливо гостра, коли постачальники надсилають товари в різних форматах: назви різними мовами, описи неструктуровані. Нейромережа для каталогу уніфікує всі дані й розміщує товари в потрібних категоріях з точністю до 90% — це скорочує час на ручну обробку в десятки разів.

Два режими категоризації

Ми реалізуємо два підходи, які покривають будь-які сценарії:

Режим Опис Коли використовувати
Класифікація в задане дерево Передаємо моделі список допустимих категорій, вона обирає найбільш підходящу Якщо у вас вже є чітка структура каталогу
Генерація нових категорій Модель сама пропонує назву на основі семантики товару При первинному побудові каталогу або для виявлення «осиротілих» товарів

На практиці потрібен перший режим із фолбеком на другий для товарів, які не потрапили в жодну категорію.

Класифікація в існуюче дерево

interface CategoryTree {
  id: string;
  name: string;
  path: string; // "Електроніка / Аудіо / Навушники"
  children?: CategoryTree[];
}

async function classifyProduct(
  product: RawProduct,
  categories: CategoryTree[]
): Promise<{ categoryId: string; confidence: number; reasoning: string }> {
  // Плоский список шляхів для промпту
  const categoryList = flattenCategories(categories)
    .map((c) => `${c.id}: ${c.path}`)
    .join("\n");

  const prompt = `
Classify this product into the most appropriate category.

Product:
- Name: ${product.name}
- Description: ${product.description?.slice(0, 300) ?? "—"}
- Brand: ${product.brand ?? "—"}
- Supplier category: ${product.supplierCategory ?? "—"}
- Attributes: ${JSON.stringify(product.attributes ?? {}).slice(0, 200)}

Available categories (id: path):
${categoryList}

Return JSON:
{
  "categoryId": "the id from the list above",
  "confidence": 0.0-1.0,
  "reasoning": "one sentence why"
}

If no category fits well, use the closest parent category and set confidence below 0.5.
`.trim();

  const response = await openai.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: prompt }],
    response_format: { type: "json_object" },
    temperature: 0,
  });

  return JSON.parse(response.choices[0].message.content!);
}

temperature: 0 — для класифікаційних задач потрібна відтворюваність, не креативність. Гарантуємо стабільні результати на тисячах запитів.

Чому батчева обробка знижує витрати?

Батчева обробка дозволяє класифікувати 10–20 товарів за один запит до моделі. Це знижує витрати на токени на 30% і прискорює обробку в 10 разів. Приклад реалізації на TypeScript:

async function classifyBatch(
  products: RawProduct[],
  categories: CategoryTree[]
): Promise<Map<string, ClassificationResult>> {
  const categoryList = flattenCategories(categories)
    .map((c) => `${c.id}: ${c.path}`)
    .join("\n");

  const productList = products
    .map(
      (p, i) =>
        `[${i}] "${p.name}"` +
        (p.brand ? ` by ${p.brand}` : "") +
        (p.supplierCategory ? ` (supplier: ${p.supplierCategory})` : "")
    )
    .join("\n");

  const prompt = `
Classify each product into one of the categories. Return JSON array.

Categories:
${categoryList}

Products:
${productList}

Return: [{"index": 0, "categoryId": "...", "confidence": 0.0-1.0}, ...]
`.trim();

  const response = await openai.chat.completions.create({
    model: "gpt-4o-mini",
    messages: [{ role: "user", content: prompt }],
    response_format: { type: "json_object" },
    temperature: 0,
    max_tokens: 1000,
  });

  const results: Array<{ index: number; categoryId: string; confidence: number }> =
    JSON.parse(response.choices[0].message.content!).results ?? [];

  const map = new Map<string, ClassificationResult>();
  for (const r of results) {
    const product = products[r.index];
    if (product) {
      map.set(product.id, { categoryId: r.categoryId, confidence: r.confidence });
    }
  }

  return map;
}

10–20 товарів в одному запиті — розумний батч. Більше — промпт стає надто довгим і якість падає. Порівняння: батчева обробка в 10 разів швидша за послідовну і на 30% економить токени.

Воркер із чергою

const categorizationWorker = new Worker(
  "categorization",
  async (job) => {
    const { productIds } = job.data;
    const products = await db.products.findMany({
      where: { id: { in: productIds } },
    });
    const categories = await db.categories.findAll({ active: true });

    const results = await classifyBatch(products, categories);

    for (const [productId, result] of results) {
      await db.products.update({
        where: { id: productId },
        data: {
          categoryId: result.confidence >= 0.7 ? result.categoryId : null,
          suggestedCategoryId: result.categoryId,
          categorizationConfidence: result.confidence,
          categorizationStatus:
            result.confidence >= 0.7 ? "auto_assigned" : "needs_review",
          categorizedAt: new Date(),
        },
      });
    }
  },
  { connection: redisConnection, concurrency: 3 }
);

Товари з ${confidence} < 0.7 потрапляють у чергу рев'ю — їхню категорію призначає менеджер, і це додатково навчає систему через few-shot приклади.

Як few-shot навчання підвищує точність?

Зазначимо: коли менеджер вручну виправляє категорію, це цінні дані. Накопичуємо їх і підставляємо в промпт:

async function getExamplesForCategory(categoryId: string, limit = 5): Promise<string> {
  const examples = await db.products.findMany({
    where: { categoryId, categorizationStatus: "manually_confirmed" },
    select: { name: true, brand: true },
    take: limit,
  });

  if (examples.length === 0) return "";

  return `\nExamples of products in this category: ${examples.map((e) => `"${e.name}"`).join(", ")}`;
}

Через 2–3 тижні роботи системи з рев'ю точність автоматичної класифікації в конкретному каталозі зростає до 90%+ — модель бачить реальні приклади вашого каталогу. Ми гарантуємо такий результат на основі досвіду десятків проєктів. Згідно з дослідженнями, few-shot навчання підвищує точність на 15–20% (OpenAI Documentation).

Моніторинг якості

SELECT
  categorization_status,
  AVG(categorization_confidence) as avg_confidence,
  COUNT(*) as count
FROM products
WHERE categorized_at > NOW() - INTERVAL '7 days'
GROUP BY categorization_status;

Якщо частка needs_review зростає — можливо, з'явилися нові типи товарів, які не покриваються поточним деревом категорій. Це сигнал до розширення каталогу.

Типові помилки та як їх уникнути

  • Передача надто коротких описів — знижує confidence. Мінімальна довжина опису — 20 слів.
  • Відсутність інформації про бренд — модель не може розрізняти схожі товари.
  • Надто глибоке дерево категорій (більше 4 рівнів) — модель втрачає контекст. Рекомендуємо обмежити глибину до 3 рівнів.
  • Ігнорування рев'ю — без зворотного зв'язку система не покращується. Ми рекомендуємо перевіряти хоча б 20% товарів з low confidence.

Етапи впровадження

  1. Аудит поточної структури каталогу та збір few-shot прикладів (20–50 товарів).
  2. Налаштування промпту та батчевої обробки з урахуванням вашого дерева категорій.
  3. Інтеграція з CRM або 1С через REST API та налаштування черг (Redis/RabbitMQ).
  4. Пілотний запуск на 500–1000 товарів з ручним рев'ю.
  5. Повномасштабне розгортання та моніторинг якості протягом 2 тижнів.

Що входить в роботу

  • Документація: повний опис API, приклади запитів і відповідей, інструкція з налаштування черг.
  • Доступ до панелі керування: веб-інтерфейс для моніторингу, ручного рев'ю та корекції категорій.
  • Навчання команди: 2-годинна сесія з адміністрування системи та роботи з винятками.
  • Підтримка: 24/7 технічна підтримка, гаряча лінія для термінових питань.
  • Гарантія: точність класифікації не нижче 85% на старті та 92% після 4 тижнів експлуатації (підтверджено на більш ніж 50 впровадженнях).
  • Вихідний код та конфігурації: передаємо всі файли та налаштування під ваш стек.

Результати впровадження (на прикладі середнього каталогу 50 000 товарів):

Метрика До впровадження Після впровадження
Час на категоризацію 1000 товарів 40 годин 2 години
Точність 70% (ручна) 90%+
Витрати на операцію 100% базові Зниження на 70%
Докладніше про методику розрахункуМи використовуємо середні показники по 50 проєктах. Фактичні результати можуть відрізнятися залежно від структури каталогу.

Отримайте консультацію — ми розрахуємо економію для вашого каталогу. Зв'яжіться з нами для обговорення вашого проєкту.

Додаткові матеріали: концепція few-shot learning на Wikipedia.

Інтеграція 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 у ваш веб-додаток.