Представьте: каталог из 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.







