Реализация автоматической категоризации товаров (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, примеры запросов и ответов, инструкция по настройке очередей.
  • Доступ к панели управления: web-интерфейс для мониторинга, ручного ревью и коррекции категорий.
  • Обучение команды: 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 с системным промптом. Без доступа к реальным данным компании. Пользователь спрашивает «сколько стоит тариф Премиум» — бот галлюцинирует цену из воздуха. Спрашивает «когда придёт заказ» — получает вежливое «напишите в поддержку». Это не интеграция — это имитация. Мы за 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 из игрушки в инструмент, который приносит прибыль.