Мы взяли размеченный корпус товаров из 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 обучает свою линейку в три стадии:

  1. Крупномасштабный weak-supervision pre-training (~150M пар): пары синтезируются самой Qwen3 с контролем языков, типов запросов и сложности.

  2. Супервайз-дообучение на качественных данных (≈19M пар): смесь больших созданных людьми датасетов + отфильтрованных синтетических пар.

  3. Слияние чекпойнтов (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-эмбеддинги + очень большой, доступный датасет — получаем производственную классификацию товаров с минимальными затратами и без лицензионных ограничений.

Полезные ссылки

Если вы делаете что-то похожее, напишите - давайте обменяемся опытом.

Комментарии (0)