Привет, Хабр! На связи команда продуктового матчинга ecom.tech. Наша команда решает задачи поиска, группировки и сопоставления товаров с помощью алгоритмов машинного обучения. Все это необходимо для развития и улучшения бизнес-процессов в компании, а именно быстрого заведения карточек товаров, мониторинга цен на товары и развития ML. В этой статье мы расскажем про доматчинг – сравнение сложных пар товаров, которые отобрали на предыдущем этапе пайплайна с помощью LLM. Поехали!

Наш пайплайн матчинга и его боли

Результатом работы нашего пайплайна матчинга является топ-1 кандидат — то есть найденная пара-матч. Что такое пара-матч и как мы матчим в ecom.tech – рассказывали в предыдущих статьях, прочитать которые можно по ссылкам: зачем маркетплейсу матчинг, как под капотом работают алгоритмы и как мы используем графовые алгоритмы для  матчинга. Итак, ключевой этап пайплайна — картиночная модель для отбора кандидатов. В ее основе лежит сравнение векторных представлений изображений с помощью скалярного произведения (inner product) для определения их схожести.

Очевидно, что два изображения одного платья, но разной длины (например, “ миди” и “макси”), получат очень высокий inner product. Это означает, что подход не идеален, однако в большинстве случаев он эффективно отсекает совершенно непохожие товары по визуальным признакам. Давайте попробуем взять кандидатов на матч с inner product  выше 0.9. Это сильные претенденты на совпадение по картинке. И именно среди них мы будем искать итоговый матч с помощью LLM!

Итак, у нас есть пары с похожими изображениями (inner product > 0.9). Однако существуют проблемы, связанные именно с текстовыми описаниями товаров. Речь идет о сложных случаях: например, разница в одну диоптрию у линз или незначительные различия в размере одежды/обуви (картинка платья размера S визуально идентична платью размера M). Наша трансформерная текстовая модель не всегда корректно обрабатывает подобные нюансы. Хотя LLM отлично подходят для разрешения таких сложных кейсов, использовать их для обработки всех пар невозможно — наша база содержит миллионы товаров. Пропустить весь этот поток кандидатов на матчинг через LLM нереально. Но вот небольшую часть — именно тех кандидатов, что отобраны по порогу inner product картиночной модели — проверить с помощью LLM мы вполне способны.

Гипотеза: LLM как судья сложных случаев

Какими же ключевыми свойствами должна обладать выбранная текстовая LLM?

  1. Способность рассуждать на русском языке. 
    Нам необходимо понимать логику принятия решения моделью. Поэтому мы разработали подробные правила (смотри пример ниже) для каждой товарной категории и хотим, чтобы модель явно использовала их в процессе рассуждения перед выдачей финального вердикта. Это подразумевает генерацию промежуточных шагов (дополнительных токенов), а не просто краткий ответ «матч/не матч».

2. Скорость инференса.
Мы нацелены на обработку за разумное время на одной GPU A100.

3. Использование открытой модели. 
Это обязательное условие, позволяющее дообучать модель на собственных данных. Крупные проприетарные модели нам не подходят. Но, к счастью, есть быстрые, открытые и качественные русскоязычные модели. Они относительно небольшого размера, адаптивны, а также могут генерировать цепочки рассуждений. Такие модели, дообученные на нашей качественно размеченной выборке, позволяют эффективно обрабатывать требуемые объемы данных.

Архитектурный выбор: небольшие мономодальные LLM vs мультимодальные гиганты

В результате экспериментов мы приняли решение использовать мономодальную текстовую LLM размерности ~8B параметров, отказавшись от крупных мультимодальных решений. Это обусловлено дву��я ключевыми ограничениями:

  1. Скорость и время инференса. Даже после отсечения кандидатов по высокому порогу inner product от картиночной модели на предыдущем этапе пайплайна у нас остаются сотни тысяч пар - кандидатов на доматчинг. Мы хотим производить доматчинг за разумное время.

  2. Сложность SFT-дообучения. Нам необходимо было провести достаточно большое количество экспериментов с разными моделями и попробовать для них различные параметры, а тонкая настройка больших моделей требует значительных ресурсов. 

При этом критически важным остаётся качество генерации на русском языке: модель должна точно воспроизводить наши правила через цепочки рассуждений перед финальным вердиктом.

Zero-shot тест

Для начала нам нужно выбрать модели и проверить, как они работ��ют из коробки, может быть нам и не нужно ничего обучать. При выборе моделей необходимо учитывать ограничения в ресурсах - одна карта А100, соответственно нам нужны как можно более легкие модели до 15 млрд параметров, чем меньше и легче модель, тем лучше и быстрее. 

Для экспериментов были отобраны следующие open-sourceмодели:

mister Y-8B (название изменено)
mister Y-8Bin (название изменено)
Phi-4-mini-instruct
saiga_yandexgpt_8b
saiga_llama3_8b
saiga_nemo_12b
Qwen2.5-7B-Instruct
Qwen2.5-3B-Instruct
Mistral-Nemo-Instruct-2407

Для тестирования отобраны 9 open-source LLM размерностью 3B-12B параметров, с фокусом на русскоязычные решения.

Модель 

Размер

mister Y-8B

8B

mister Y-8Bin

8B

Mistral-Nemo-Instruct-2407

8B

saiga_nemo_12b

12B

saiga_yandexgpt_8b

8B

saiga_llama3_8b

8B

Qwen2.5-3B-Instruct 

3B

Qwen2.5-7B-Instruct   

7B

Phi-4-mini-instruct

4B

Результаты тестирования из “коробки" оказались неудовлетворительными — дообучение под наш домен стало необходимостью.

Класс

F1 (из коробки)

Точно матч

0.52

Скорей всего матч

0.14

Скорей всего не матч

0.20

Точно не матч

0.49

Матч или не матч? Теперь с градациями!

Ключевая особенность нашей задачи — 4-классовая классификация вместо бинарной:

  1. Точно матч (100% уверенность)

  2. Скорее всего матч (высокая вероятность)

  3. Скорее всего не матч (низкая вероятность)

  4. Точно не матч 

Зачем такая градация? Она дает гибкость под разные задачи:

  • Для матчинга (ориентир на recall) → объединяем классы 1 (точно матч) и 2 (скорей всего матч)

  • Для группировки (критична precision) → используем только класс 1 (точно матч)

Это позволяет динамически калибровать точность в зависимости от требований: когда атрибуты неполные или противоречивые (например, продавец не указал размер), мы ужесточаем или ослабляем критерии. Дальше возникает логичный вопрос: на чем мы будем обучать?

Разметка: Методички, атрибуты и 4200 пар

Товарный каталог охватывает свыше 20 категорий, причём многие из них включают подкатегории.

Например: 

Категория Супермаркет - Подкатегории: Напитки, Бытовая химия, Готовая еда.     

Категория Аксессуары - Подкатегории: Шарфы, Ремни, Головные уборы и тд. 

Критерии матчинга сильно зависят от категории и даже подкатегории. Для каждой из них мы разработали детальные методички с иерархией атрибутов: важные атрибуты и менее важные атрибуты. Пример для подкатегории "Шарфы". Важные  атрибуты (бренд, артикул, цвет) должны быть указаны у обоих товаров. Менее важные атрибуты (состав ткани) – могут быть не указаны. 

Мы собрали датасет размером 4200 пар (по 200 пар на каждую категорию) – этого достаточно, чтобы успешно произвести sft (supervised fine-tuning) обучение.

Изначально мы хотели привлечь асессоров для разметки (для написания промптов в стиле chain of thoughts - инструкций). И ожидали получить такой результат:

### Пример рассуждения для разметчиков

Товар 1

Товар 2

title: брюки tiro24 trpnt  

бренд: название бренда” 

размер: l  

расшифровка размера: 52-54  

цвет товара: черный  

состав: полиэтилентерефталат 100%  

цвет: черный  

пол: мужской  

страна производства: вьетнам

</td>

<td width="50%">

title: спортивные брюки мужские adidas 1001232541 черные xl  

размер ru: 52  

размер производителя: xl  

вид застежки: без застежки  

бренд: adidas  

цвет: черный  

состав ткани: 100% полиэстер  

вид принта: без принта  

артикул производителя: brg1001232541  

тип: спортивные брюки  

пол: мужской  

цвет производителя: черный  

материал: полиэстер  

серия: 113  

модель: 1001232541  

сезон: демисезон

</td>

</tr>

</table>

Анализ Товара 1

Анализ Товара 2

бренд: adidas 

бренд: adidas 

расшифровка размера: 52-54

размер ru: 52

цвет: черный

цвет: черный

Мы даже написали шаблоны, в которые асессоры должны были вписать рассуждения. Но оказалось, что для написания высококачественных CoT примеров необходимо большее количество ресурсов, нежели имеющееся у нас в распоряжении, поэтому было принято решение попробовать разметить датасет с помощью ИИ. Мы составили для каждой категории пропмт с инструкцией на вход в нейросеть. Размечали и обучались мы исключительно на текстовых данных.

Эффективное SFT-дообучение с применением LoRA

Имея датасет и моделей-кандидатов, мы приступили к Supervised Fine-Tuning (SFT). Для эффективного обучения использовали LoRA-адаптеры (обучали через trl/torchtune): сначала без точной настройки параметров файнтюна адаптера, далее были выбраны модели с самыми большими метриками и для них уже подбирали гиперпараметры (lora_alpha, r, target_modules, weight_decay и др.)

Нам было важно проводить доматчинг пар, как можно быстрее. Для инференса были проведены эксперименты с запуском через vllm и sglang - скорость mister Y-8Bin (название изменено) при запуске через vllm: 200 пар за 15,5 мин, через sglang 11 мин. Как мы можем ускорить этот процесс? Нам на помощь приходит квантизация.

Bottleneck: 11 минут на 200 пар – как ускорить?

Мы попробовали QAT и GPTQ квантизации в 4 и 8 бит с различным значением групп квантизации (32, 64 и 128). Самые высокие метрики получились при GPTQ квантизации в 8 бит и 32 группы квантизации. Нам удалось ускорить инференс почти в полтора раза. Кроме того применение GPTQ квантизации помогло нам получить более высокое качество по сравнению с не квантизованной моделью. 

Итак, у нас есть наша лучшая модель русскоязычная LLM модель на 8B параметров квантизованная GPTQ в 8 бит с 32 группами квантизации с метриками на тест сете:

Класс

F1 (из коробки)

F1 (SFT + LoRA + GPTQ)

 Δ

 11111

0.52

0.71

↑0.19

22222

0.14

0.55

↑0.41

33333

0.20

0.67

↑0.47

44444

0.49

0.75

↑0.26

Интерпретация классов:
11111 = Точно матч
22222 = Скорее матч
33333 = Скорее не матч
44444 = Точно не матч

Мы столкнулись с проблемой, что для некоторых категорий мы изначально недооценили важные атрибуты (например, количество в упаковке для продуктов). Решение: добавим в промпт уточняющие правила — без переобучения модели! Анализ рассуждений LLM позволяет точечно корректировать логику через промпт-инжиниринг. Так мы можем постепенно улучшать качество, проанализировав рассуждения модели и исправив необходимым образом входные промпты для нашей текстовой LLM и при этом нам не нужно переобучать с нуля наш адаптер.

Двухэтапная верификация: Текстовая и мультимодальная LLM
Несмотря на высокий inner product векторов изображений (≥0.9) после прохождения пар через картиночную кандидатную модель нашего пайплайна, критичные визуальные различия остаются незамеченными: разная фурнитура (пуговицы, молнии), орнамент, немного другой оттенок, надписи на товаре и тд. До этого момента мы рассматривали только текстовую часть для обработки с помощью LLM. Но нам не хотелось матчить товары, которые имеют небольшие различия на изображениях, что делает эти товары не одинаковыми. Поэтому мы решили прогнать найденный пары-матчи через легкую мультимодальную vLLM, которая поможет нам отсеять сложные пары. 

Финальный шаг доматчинга
Кандидаты от текстовой LLM пропускаем через мультимодальную InterVL-8B (без дообучения), фильтруем сложные пары изображений, используя максимально простой промпт: “Посмотри внимательно на форму товара. В точности ли одинаковый товар на картинках?” Таким образом нам удалось улучшить качество доматчинга еще на ~8% по сравнению с только текстовой LLM.

InterVL: на первый взгляд, товары на обеих картинках похожи, но есть несколько отличий:

1. Структура и дизайн: 
 - В первой картинке камин имеет более сложный дизайн с декоративными элементами на каминной полке и более выразительными узорами на боковых частях.
- Во второй картинке камин имеет более простой дизайн с менее выраженной отделкой на боковых частях и более гладкими элементами на каминной полке.

2. Цветовая гамма:
- Цвета в первой картинке более светлые и контрастные, особенно на каминной полке.
 - Во второй картинке цветовая гамма более однородная и менее контрастная.

3. Длина и форма:
- В первой картинке камин кажется немного длиннее и шире.
- Во второй картинке камин имеет более традиционную форму с более четкими линиями.

Эти различия могут указывать на то, что это разные модели или версии каминов.

InterVL : На обеих картинках изображены пакеты с кофе, но у них есть некоторые различия:

1. На первой картинке пакет помечен как "Сливочная помадка", а на второй как "Бразилия Рамос".

2. На первой картинке указано "кофе молотый • эспрессо", и на второй "кофе молотый • эспрессо" без дополнительных указаний.

3. Цвет и дизайн пакетов одинаковый, но текст и некоторые детали разные.

Таким образом, товары не идентичны из-за различий в текстовых описаниях.

Примеры разных товаров с высоким inner product и с рассуждением InterVL и вердиктом: не матч.

Итак, наш LLM - доматчинг выглядит следующим образом: сначала берем небольшую дообученную текстовую LLM, которая умеет по написанным нами текстовым правилам выдавать матчи, а затем полученные матчи отправляем в небольшую мультимодальную LLM, для того, чтобы более внимательно посмотреть на картинки и отсеять сложные пары, в которых есть более не очевидные различия в картинках (разные детали, текст с указанием вкуса, принт на одежде, разные пуговицы у платьев, немного другой оттенок и тд).

Продакшн-результаты

Далее нам нужно встроить наши модели в наш пайплайн матчинга товаров – после прогона всего пайплайна взять кандидатов на матчинг, у которых inner product от нашей картиночной модели из основного пайплайна больше выбранного порога (в зависимости от порога и наличия вычислительных ресурсов можно отправлять больше или меньше данных на дополнительную "LLM + VLLM проверку-верификацию") и проверить качество на реальных данных. Нам удалось увеличить охваты на 8% при точности 83% в задаче матчинга товаров.

Наш пайплайн используется не только в задаче матчинга, но и в задаче группировки товаров (в создании групп похожих товаров. Такой подход с LLM позволил увеличить охваты на 14.7% при точности 97.4% в задаче группировки товаров.

Три принципа эффективного LLM-матчинга

  1. Предварительная фильтрация пар-кандидатов на матчинг
    Порог inner product (0.8–0.95) сокращает пространство поиска, отсекая заведомо нерелевантные пары до дорогостоящей LLM-обработки. 

  2. Разделение ответственности модальностей
    Текстовая 8B-модель с SFT-адаптерами анализирует атрибуты по доменным правилам. Мультимодальная InterVL-8B докапывается до визуальных нюансов. Так мы ловим ошибки, невидимых в одномодальных решениях.

  3. Квантизация. GPTQ в 8-bit не просто ускорила инференс в 1.5 раза: модель стала устойчивее к шуму в данных - за счет квантизации удалось улучшить качество модели.

Вот и подошло к концу наше увлекательное путешествие в мир LLM, рады выслушать пожелания, предложения и конструктивную критику, а также с радостью ответим на возникшие вопросы!