Существует классическая проблема на любой электронной торговой площадке или маркетплейсе, связанная с тем, как упорядочить и понять карточки товаров. Особенно она усугубляется тем, что пользователи создают запутанные описания даже для самых простых продуктов. Например, обычная синяя футболка может быть описана как «небесно-голубая», «королевский синий» или даже «тёмно-сине-аквамариновая». Некоторые продавцы умудряются запихнуть информацию о товаре прямо в само изображение, рисуя поверх плохо освещённого фото ярко-зелёными буквами: «Лучшая футболка в мире!». В итоге, два идентичных товара могут выглядеть так, будто они из разных вселенных.
В результате поиск, категоризация и анализ этих товаров превращаются в настоящую головную боль (и в гарантию занятости для специалистов по данным).
Разумеется, за прошедшие годы появились разные способы справляться с этим:
1. Матчер, специфичный для каждой категории
Создать отдельную модель «сопоставления» или алгоритм для каждой категории товаров — для электроники, для одежды, для косметики и так далее вплоть до подкатегорий. Такой подход сильно специализирован и работает, но может превратиться в нормальный такой гемор, если у вас 100500 категорий.
2. Поиск кандидатов с помощью эмбеддингов
Эмбеддинги — это векторные представления данных (например, описаний или названий товаров), с помощью которых определяют их сходство. Используя методы обработки текста или изображений (например, word2vec, sentence-transformers), можно находить похожие товары на основе близости полученных эмбеддингов.
3. Извлечение атрибутов для каждого товара
Информация о товаре (такая как бренд, модель, цвет, размер и т.д.) извлекается из описаний, например через regex, чтобы на более глубоком уровне анализировать и сопоставлять товары.
4. Градиентный бустинг
Алгоритмы градиентного бустинга (CatBoost и тп.) применяются к задачам классификации, определяя, похожи ли товары. Эти модели обучаются на заранее размеченных данных и учитывают как текстовые, так и числовые атрибуты.
Всё это действительно помогает до определённого момента, но люди поразительно изобретательны в описании вещей. Feature hell — реальность, когда существует 400 способов сказать «удобный», а внешне одинаковая одежда может быть названа абсолютно разными словами («Эко-футболка из конопли» vs. «100% экологичный топ на растительной основе»).
А в сфере одежды и подобных товаров, которые могут быть идентичными, но при этом описаны совершенно по-разному, сопоставление можно сделать только по фотографиям, исходя из цвета, формы и структуры ткани, т.е. основная информация все равно будет не в описании товара.
Новый подход заключается в том, чтобы использовать мультимодальные возможности LLM (моделей с искусственным интеллектом для обработки языка) и Vision-Language моделей (VLM) для решения этой задачи. Вот общая схема:
Поиск кандидатов с помощью эмбеддингов
По сути, первый шаг остаётся таким же, как и раньше. Эмбеддинги, сгенерированные продвинутыми LLM (такими как модели OpenAI или Sentence-Transformers), могут быть использованы для нахождения потенциальных совпадений путём сравнения векторов описаний или атрибутов товаров.Извлечение атрибутов для каждого товара с помощью LLM
LLM применяются для извлечения конкретных атрибутов (например, бренд, цвет, размер, материал) из текстовых описаний товаров.
К примеру, «Стильная ярко-красная хлопковая футболка для мужчин» разбивается на: color=красный, material=хлопок, targeted demographic=мужчины и т. д.
(Смотрите примеры ниже.)Сопоставление двух товаров на основе извлечённых атрибутов с помощью LLM
После того как атрибуты извлечены, LLM используют их для сравнения двух товаров и определения, совпадают ли они.
Модели могут учитывать как явные сходства (например, один бренд и размер), так и неявные (к примеру, «eco-friendly» и «sustainable»).
Например, сопоставление «Мужские кроссовки Nike Air Max» с «Nike Air Max shoes for men» путём распознавания, что это один и тот же товар.
(Смотрите примеры ниже.)Сопоставление на основе изображений с использованием VLM (Vision-Language Models)
Некоторые атрибуты, такие как цвет, дизайн или уникальный рисунок, лучше анализировать визуально, а не текстуально. VLM объединяют визуальные и текстовые данные для более точного сопоставления товаров. Эти модели анализируют изображения продуктов вместе с их описаниями, чтобы лучше понять продукт. Например: сопоставление изображения черной кожаной сумки с другой похожей сумкой путем идентификации визуальных характеристик (форма, текстура и т.д.) и их сочетания с текстовыми данными.
Преимущества LLM
Более точное сопоставление. Меньше ложных несовпадений (например, когда вы получили «бирюзовую» футболку вместо «темно-зелёной»).
Точность в диапазоне 90-99%, особенно с тонко настроенными моделями (как prescision так и recall).
Обработка разнообразных данных. Текст, изображения, случайные эмодзи — всё, что угодно.
Улучшенное понимание описаний продуктов и визуальных характеристик.
Не требуется специализированное обучение: больше не нужно создавать и поддерживать 50 различных специализированных алгоритмов-сопоставителей.
Недостатки
Требует гораздо больше вычислительной мощности и стоит дороже
Latency не очень. Работает хорошо для пакетной обработки, но не для реального времени.
В целом, для некоторых категорий нет смысла использовать LLM, если можно обойтись и без этого. Если категория простая и стандартные алгоритмы справляются - это будет сильно дешевле. LLM подходит для обработки средних и сложных категорий. Тоесть, лучше использовать LLM в комбинации с стандартными методами, доя оптимизации стоимости, скорости и качества.
Извлечение атрибутов с помощью LLM
Пример промпта:
У меня есть карточка продукта из категории «Холодильники» на торговой площадке. Мне нужно извлечь и форматировать атрибуты из неё.
key_attributes_list = [
{
"name": "model",
"attribute_comment": "Модель холодильника. Включите бренд или название компании, но исключите цвет и размер."
},
{
"name": "capacity",
"attribute_comment": "Общий объем холодильника, обычно измеряется в литрах (Л). Ищите термины, такие как 'Общая вместимость'. Если недоступно, установите значение в null."
},
{
"name": "energy_efficiency",
"attribute_comment": "Извлеките класс энергоэффективности, например, 'A++', 'A+' или 'B'. Ищите термины, такие как 'Класс энергоэффективности'. Если недоступно, установите значение в null."
},
{
"name": "number_of_doors",
"attribute_comment": "Количество дверей, например, '1', '2' или 'Боковое расположение'. Ищите термины, такие как 'Двери', 'Количество дверей'. Если отсутствует, установите значение в null."
},
{
"name": "freezer_position",
"attribute_comment": "Расположение морозильника, например, 'Верх', 'Низ' или 'Сбоку'. Извлеките из терминов, таких как 'Расположение морозильника'. Если не указано, установите значение в null."
},
{
"name": "defrost_system",
"attribute_comment": "Тип системы разморозки, например, 'No Frost' или 'Ручная разморозка'. Ищите термины, такие как 'Система разморозки'. Если не упомянуто, установите значение в null."
},
{
"name": "dimensions",
"attribute_comment": "Включите высоту, ширину и глубину в сантиметрах (например, '180x70x60'). Ищите термины, такие как 'Габариты'. Если недоступно, установите значение в null."
}
]
Результат:
extracted_attributes = {
"model": "Upstreman UF70",
"capacity": "7.0 кубических футов",
"energy_efficiency": "Сертифицировано ENERGY STAR",
"number_of_doors": "1",
"freezer_position": "Конвертируемый",
"defrost_system": "Дизайн с низким образованием инея",
"dimensions": "56.1x21.3x22.76 дюймов",
}
Сопоставление с использованием LLM
Пример сравнения цветов
Промпт:
Есть две карточки продуктов из категории "Морозильники" на торговой площадке. Сравни атрибут "цвет". Ответ должен включать:
is_match: Булево значение, указывающее, совпадают ли значения.
reason: Подробное объяснение результата сравнения. Формат ответа в JSON.
Карточка продукта 1: |
Карточка продукта 2: |
Модель: Upstreman UF70 Цвет: Белый |
Модель: Midea WHS-109FSS1 Цвет: Нержавеющая сталь |
Результат:
{
"is_match": false,
"reason": "Цветовые атрибуты не совпадают. У продукта 1 цвет 'Белый', а у продукта 2 — 'Нержавеющая сталь'."
}
Сопоставление нескольких атрибутов
Промпт:
Есть две карточки продуктов из категории "Морозильники" на торговой площадке. Сравни их атрибуты, чтобы определить, являются ли два продукта достаточно похожими, чтобы считаться одной моделью. Атрибуты для сравнения:
Название модели: Удали пробелы для сравнения.
Вместимость: Совпадает, если разница составляет менее или равна 0.2 кубических футов.
Энергоэффективность: Совпадает, если оба имеют сертификацию ENERGY STAR или идентичные рейтинги эффективности.
Габариты: Совпадают, если разница в высоте, ширине и глубине составляет не более 1 дюйма.
Цвет: Совпадает только если цвет идентичный.
Ответ должен включать:
is_match: Булево значение, указывающее, считаются ли два продукта одной моделью.
reason: Подробное объяснение результата сравнения. Формат ответа в JSON.
Карточка продукта 1: |
Карточка продукта 2: |
Модель: Upstreman UF70 Вместимость: 7.0 кубических футов Энергоэффективность: Сертифицировано ENERGY STAR Габариты: 56.1x21.3x22.8 дюймов (В x Ш x Г) Цвет: Перламутрово-белый |
Модель: Upstreman UF70 Вместимость: 6.9 кубических футов Энергоэффективность: Сертифицировано ENERGY STAR Габариты: 56x21.2x22.9 дюймов (В x Ш x Г) Цвет: Белый |
Вывод:
{
"is_match": true,
"reason": "Два морозильника считаются одной моделью на основе следующих сравнений:
1. Название модели совпадает после нормализации ('UpstremanUF70').
2. Вместимость схожа (7.0 против 6.9 кубических футов, разница составляет 0.1 кубических футов, что находится в допустимом диапазоне 0.2 кубических футов).
3. Оба имеют сертификацию ENERGY STAR, что указывает на идентичную энергоэффективность.
4. Габариты почти идентичны (разница: высота 0.1 дюйма, ширина 0.1 дюйма, глубина 0.1 дюйма, все в пределах допустимой погрешности в 1 дюйм).
5. Оба продукта имеют схожий цвет: 'Белый' и 'Перламутрово-белый'."
}
Работа с фотографиями и изображениями
Извлечение атрибутов
Допустим, у нас есть такое изображение. Мы будем использовать тот же запрос, что и для текстового извлечения:
Есть карточка продукта из категории «Холодильники» на торговой площадке.
Нужно извлечь и форматировать атрибуты из неё.
key_attributes_list = [
# ...
{
"name": "dimensions",
"attribute_comment": "Включите высоту, ширину и глубину в сантиметрах (например, '180x70x60'). Ищите термины, такие как 'Габариты'. Если недоступно, установите значение в null."
}
]
Результат:
{
"dimensions": "56.10x21.30x22.76 дюймов"
}
Еще один:
Вывод:
{
"category": "Наушники",
"brand": "KVIDIO",
"color": "Чёрный",
"features": [
"Дизайн с полноразмерными чашками",
"Беспроводные",
"Подключение через Bluetooth",
"Мягкие амбушюры"
]
}
Сопоставление предметов одежды
Промпт:
Как эксперт в моде, ты должен сравнить две фотографии женских топов. Анализ должен фокусироваться исключительно на самих топах, игнорируя:
Любые другие видимые предметы одежды, даже если они являются частью наряда или подходят по стилю.
Различия в позах, движениях тела или том, как надеты топы.
Цель: определить, являются ли топы идентичными или абсолютно одинаковыми. Дать чёткий ответ «Идентичны» или «Различны», сопровождая его одной краткой фразой с объяснением. Ответ должен быть в формате JSON.
Результат:
LLM смогла обнаружить небольшое различие в вырезе, которое, будучи мужчиной, я до сих пор не уверен что вижу.
{
"result": "Различны",
"reason": "Топы имеют разные вырезы: первый с круглым вырезом, а второй — с вырезом лодочкой."
}
Вот ещё один пример:
{
"result": "Идентичны",
"reasoning": "Оба топа имеют одинаковый цвет, дизайн и характеристики ткани, включая длинные рукава, облегающий крой и светлый аква-оттенок."
}
Perfecto!
Модели и пропускная способность
Пропускная способность крайне важна для торговой площадки, так как ежедневно обрабатываются тысячи товаров, и новые добавляются каждый день. Пропускная способность зависит от двух факторов:
Вашего оборудования
Размера и типа модели
Если вы используете модель размером 70b, такую как LLama или Qwen, она будет работать хорошо, но медленно. Без суперкомпьютера вы столкнётесь с пропускной способностью 0–5 запросов в секунду для крупных моделей на коммерчески доступных GPU.
Чтобы улучшить производительность, можно предпринять несколько шагов:
-
Использование меньшей модели, тренированной на вашем наборе данных.
Размер модели зависит от задачи, и, скорее всего, вам придётся обучать несколько небольших моделей, так как каждая из них сможет обрабатывать лишь ограниченное количество категорий.Модели 7b обычно хорошо подходят для извлечения текста.
Модели 1b могут подходить для ограниченного набора точно настроенных атрибутов, возможно получить такую модель через дистиляцию большой модели.
Это может увеличить пропускную способность в 10–20 раз. Однако следует учитывать, что меньшие модели не справляются с извлечением множества атрибутов за раз и могут испытывать трудности с обработкой сложных запросов, поэтому вам придётся тестировать их на вашей задаче.
Квантизация (Quantization)
Квантизация может увеличить количество запросов в секунду (RPS) на 20–50% без значительного снижения качества работы модели.Сценарии с большими объёмами данных
В таких случаях не имеет смысла использовать что-либо, кроме модели с локальным размещением (self-hosted), так как затраты на использование OpenAI или Anthropic будут слишком высокими. Однако такие сервисы подходят для прототипирования и тестирования идей.
Для self-hosting, на основе нашего опыта в Рафт, я бы порекомендовал использовать последние версии моделей LLama или Qwen, так как они показали наилучшие результаты в наших тестах. Начинайте с 70b для тестирования, а затем оптимизируйте до меньших моделей до тех пор, пока производительность будет вас удовлетворять.
Вам, вероятно, придётся дополнительно сделать fine-tuning модели для определённых категорий. Например, в медицинской сфере часто встречаются сокращения, как и в строительной отрасли. Универсальная модель может плохо справляться с такими случаями, поэтому в таких ситуациях будет полезно использовать метод LORA (Low-Rank Adaptation).
Кроме того, учитывайте язык. Например, LLama хорошо работает с английским языком, но для китайского она, скорее всего, будет галлюцинировать. В этом случае модель Gwen, вероятно, будет лучшим выбором. В руссском языке частенько окончания, а так же имена-фамилии и их склонения вызывают сбои, стоит обратить внимание на товары где это является одним из аттрибуов: фильмы, музыка, книги.
Пишите в комментариях свои вопросы.
Всем добра!
artmaro
У Виталия Кулиева был отличный доклад "Современные подходы к матчингу товаров с использованием LLM" на хайлоад https://youtu.be/0t19us8Bm8k