Мы взяли размеченный корпус товаров из Web Data Commons, дообучили Qwen3 Embedding с помощью LoRA и получили лёгкий чекпойнт на ~615M параметров, который сопоставляет «сырые» названия товаров с 6 верхнеуровневыми категориями с результатом macro-F1 = 0.836, может работать в реальном времени на одной видеокарте. Код доступен в гитхабе так же английская версия этого поста.
Почему именно Web Data Commons и зачем это e-commerce
Большая часть веб-страниц с товарами уже богата разметкой (title, brand, GTIN, price, category), потому что поисковики поощряют структурированные данные. Проект Web Data Commons извлекает такие страницы из Common Crawl и публикует как Large-Scale Product Corpus — фактически, гигантскую «таблицу товаров» с метаданными. Нам это идеально подошло: корпус приходит почти полностью размеченными данными благодаря уже проставленным категориям. Мы используем их как таргет для обучения.
Для этой работы мы сфокусировались на шести самых представленных классах:
Automotive
Baby
Books
Clothing
Jewelry
Shoes
Подготовку данных автоматизирует скрипт build_lspc_dataset.py, который работает с архивом lspcV2020.zip из WDC. Для первичного знакомства есть скрипт с различными статистиками по этим данным. Подробности по датасету можно найти на странице корпуса.
Модель: Qwen3 Embedding и почему она «зашла»
Мы используем семейство Qwen3 Embedding — специализированные модели для извлечения эмбеддингов и reranking. Согласно техническому отчёту, Qwen3-Embedding построены на LLM-бэкбоне Qwen3 (0.6B / 4B / 8B), проходят многостадийное обучение и занимают верхние строчки на лидборде MTEB (масштабный бенчмарк эмбеддингов).
Почему это важно для e-commerce: эмбеддинги Qwen3 «знают» бренды, синонимы и отраслевой жаргон. Даже короткие и неоднозначные названия («air max 270 black 42») транслируются в вектор, где близость отражает смысл, а не совпадение слов. Это делает простую линейную «шапку» поверх эмбеддингов удивительно точной.
Как работают эмбеддинги в классификации
Мы подаём название товара, добавляем в конец специальный токен [EOS] и забираем скрытое состояние последнего слоя в позиции этого токена — это и есть эмбеддинг. При желании можно конкатенировать краткую инструкцию и сам запрос, чтобы направить модель под конкретную задачу (инструкционные эмбеддинги). Размеры в семействе — 0.6B, 4B и 8B, выбираются по балансу «скорость/качество». Детали подхода — в отчёте Qwen3-Embedding.
Как Qwen3 был обучен
Команда Qwen3 обучает свою линейку в три стадии:
Крупномасштабный weak-supervision pre-training (~150M пар): пары синтезируются самой Qwen3 с контролем языков, типов запросов и сложности.
Супервайз-дообучение на качественных данных (≈19M пар): смесь больших созданных людьми датасетов + отфильтрованных синтетических пар.
Слияние чекпойнтов (slerp): даёт устойчивый прирост и лучшую переносимость знаний.
Наши эксперименты на товарах
Задача: 6-классовая классификация названий товаров.
Результаты:
Macro-F1: 0.8360
Accuracy: 0.8791
Что помогло:
LoRA-тонкая настройка: r=16, alpha=32 — минимальные затраты памяти/веса, без перепрошивки всего бэкбона.
Оптимизатор и LR: adamw_torch, 5e-5, 1 эпоха — оказалось лучшим среди протестированных сетапов.
Зависимости: рекомендуем Poetry для воспроизводимых окружений и сборок.
Практическая производительность (CUDA)
Бенчмарк measure_lora_latency.py на одной NVIDIA RTX 5090 (32 GB, FP16) после 5 прогревочных батчей и на 100 000 новых заголовков показал:
Задержка: 3.3–3.9 мс/заголовок при размере матчей: 16/32/64/128
Лучший трэд-офф: bs=32 — ~299 заголовков/с при latency < 4 мс
Масштабирование: при bs=128 задержка всё равно < 4 мс
На практике это означает: один «доступный» GPU тянет и офлайн-чистку каталога, и онлайн-инференс в реальном времени.
Как повторить у себя
Данные: скачайте LSPC V2020 с сайта Web Data Commons и запустите build_lspc_dataset.py.
Модель: возьмите подходящий размер Qwen3-Embedding (0.6B достаточно для старта).
Тонкая настройка: примените LoRA с конфигом r=16, alpha=32, оптимизатор AdamW; для начала достаточно 1 эпохи.
Управление зависимостями: Poetry для чистых окружений и фиксируемых версий.
Валидация: метрики macro-F1 и accuracy по валидационной выборке из тех же шести классов.
Что в итоге
Огромная отдача от дообучения: десятки миллионов товарных заголовков из LSPC «перестроили» Qwen3-Embedding в доменно-осведомлённый векторизатор с 0.836 macro-F1 — без переписывания полных весов.
Реальное время на одной карте: 615M-LoRA-чекпойнт даёт ~300 заголовков/с при 3–4 мс на RTX 5090 — хватает и на бэк-процессинг, и на стриминг.
Plug-and-play для команд: чекпойнты, скрипты обучения и бенчмаркинга — публичны; можно менять категории, языки и фиды без сборки модели «с нуля».
В двух словах: берём открытые LLM-эмбеддинги + очень большой, доступный датасет — получаем производственную классификацию товаров с минимальными затратами и без лицензионных ограничений.
Полезные ссылки
WDC Large-Scale Product Corpus (V2020): описание и загрузка.
Qwen3 Embedding (arXiv) + техрепорт PDF: архитектура, пайплайн, slerp-мерджинг.
Блог релиза Qwen3-Embedding: обзор моделей, размеры, задачи.
MTEB Leaderboard: актуальные позиции эмбеддинг-моделей.
LoRA (оригинальная статья): базовая техника лёгкой адаптации.
Poetry (официальная документация): воспроизводимые окружения и зависимости.
Если вы делаете что-то похожее, напишите - давайте обменяемся опытом.