Представьте: каталог из 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.
Этапы внедрения
- Аудит текущей структуры каталога и сбор few-shot примеров (20–50 товаров).
- Настройка промпта и батчевой обработки с учётом вашего дерева категорий.
- Интеграция с CRM или 1С через REST API и настройка очередей (Redis/RabbitMQ).
- Пилотный запуск на 500–1000 товаров с ручным ревью.
- Полномасштабное развёртывание и мониторинг качества в течение 2 недель.
Что входит в работу
- Документация: полное описание API, примеры запросов и ответов, инструкция по настройке очередей.
- Доступ к панели управления: web-интерфейс для мониторинга, ручного ревью и коррекции категорий.
- Обучение команды: 2-часовая сессия по администрированию системы и работе с исключениями.
- Поддержка: 24/7 техническая поддержка, горячая линия для срочных вопросов.
- Гарантия: точность классификации не ниже 85% на старте и 92% после 4 недель эксплуатации (подтверждено на более чем 50 внедрениях).
- Исходный код и конфигурации: передаём все файлы и настройки под ваш стек.
Результаты внедрения (на примере среднего каталога 50 000 товаров):
| Метрика | До внедрения | После внедрения |
|---|---|---|
| Время на категоризацию 1000 товаров | 40 часов | 2 часа |
| Точность | 70% (ручная) | 90%+ |
| Затраты на операцию | 100% базовые | Снижение на 70% |
Подробнее о методике расчёта
Мы используем средние показатели по 50 проектам. Фактические результаты могут отличаться в зависимости от структуры каталога.Получите консультацию — мы рассчитаем экономию для вашего каталога. Свяжитесь с нами для обсуждения вашего проекта.
Дополнительные материалы: концепция few-shot learning на Wikipedia.







