Существует классическая проблема на любой торговой площадке, связанная с тем, как упорядочить и анализировать каталог. Особенно она усугубляется тем, что пользователи или сотрудники создают запутанные описания даже для самых простых продуктов. Например, обычная синяя футболка может быть описана как «небесно-голубая», «королевский синий» или даже «тёмно-сине-аквамариновая». Некоторые продавцы и поставщики умудряются запихнуть информацию о товаре прямо в само изображение, рисуя поверх плохо освещённого фото ярко-зелёными буквами: «Лучшая футболка в мире!». В итоге, два идентичных товара могут выглядеть так, будто они из разных вселенных.
В результате поиск, категоризация и анализ этих товаров превращаются в настоящую головную боль (и в гарантию занятости для специалистов по данным). Кроме того, в таких условиях трудно метчить товары с трендами, набирающими популярность, т.к. тренд это тоже по своей сути задача категоризации.
Разумеется, за прошедшие годы появились разные способы справляться с этим:
1. Матчер, специфичный для каждой категории. Это отдельная модель «сопоставления» или алгоритм для каждой категории товаров — для электроники, для одежды, для косметики и так далее вплоть до подкатегорий. Такой подход сильно специализирован и работает, но может превратиться в нормальный такой гемор, если у вас 100500 категорий. Тут много вариантов как реализовать, обычно зависит что за атрибут, например Named Entity Recognition для названий брендов, descision trees и даже огромный if-then-else скрипт.
2. Поиск кандидатов с помощью эмбеддингов. Эмбеддинги — это векторные представления данных (например, описаний или названий товаров), с помощью которых определяют их сходство. Используя методы обработки текста или изображений (например, word2vec, sentence-transformers), можно находить похожие товары на основе близости полученных эмбеддингов. Эмбеддинги могут генерироваться и с помощью LLM.
3. Извлечение атрибутов для каждого товара. Информация о товаре (такая как бренд, модель, цвет, размер и т.д.) извлекается из описаний, например через regex, чтобы на более глубоком уровне анализировать и сопоставлять товары.
4. Градиентный бустинг. Алгоритмы градиентного бустинга (CatBoost и тп.) применяются к задачам классификации, определяя, похожи ли товары. Эти модели обучаются на заранее размеченных данных и учитывают как текстовые, так и числовые атрибуты. Требуют размеченных данных.
Всё это действительно помогает до определённого момента, но люди поразительно изобретательны в описании вещей. Feature hell — реальность, когда существует 400 способов сказать «удобный», а внешне одинаковая одежда может быть названа абсолютно разными словами («Эко-футболка из конопли» vs. «100% экологичный топ на растительной основе»).
А в сфере одежды и подобных товаров, которые могут быть идентичными, но при этом описаны совершенно по-разному, сопоставление можно сделать только по фотографиям, исходя из цвета, формы и структуры ткани, т.е. основная информация все равно будет не в описании товара.
Новый подход заключается в том, чтобы использовать мультимодальные возможности LLM (моделей с искусственным интеллектом для обработки языка) и Vision-Language моделей (VLM) для решения этой задачи. Этот подход уже массово используется ведущими ретейлерами и площадками:
"We've used multiple large language models to accurately create or improve over 850 million pieces of data in a catalog.
Without the use of generative AI, this work would have required nearly 100 times the current headcount to complete in the same amount of time."
Doug McMillon, CEO of Walmart
Общая схема работы (примеры ниже):
-
Извлечение атрибутов для каждого товара с помощью LLM или VLM
LLM применяются для извлечения конкретных атрибутов (например, бренд, цвет, размер, материал) из текстовых описаний товаров и изображений.
К примеру, «Стильная ярко-красная хлопковая футболка для мужчин» разбивается на: color=красный, material=хлопок, targeted demographic=мужчины и т. д.Некоторые атрибуты могут быть синтетическими, т.е. не присутствовать напрямую в описании товара, например стиль предмета одежды или его части (например стиль выреза на свитере). VLM способны определять стиль с хорошей точностью.
VLM так же способны определить, хоть и примерно, состояние товара если он был в использовании, по фото.
-
Объединение атрибутов в категории с уникальными значениями
Атрибутов может быть слишком много, кроме того тренды обычно это набор определенных атрибутов, так что может иметь смысл их группировка.
-
Сопоставление товаров на основе извлечённых атрибутов с помощью 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
Пример промпта:
У меня есть карточка продукта из категории «Холодильники».
Мне нужно извлечь и форматировать атрибуты из неё.
extracted_attributes = {
"model": "Модель холодильника. Включи бренд или название компании, но исключи цвет и размер",
"capacity": "Общий объем холодильника, обычно измеряется в литрах (Л). Ищи термины, такие как 'Общая вместимость'. Если недоступно, установи значение в null",
"energy_efficiency": "Извлеки класс энергоэффективности, например, 'A++', 'A+' или 'B'. Ищите термины, такие как 'Класс энергоэффективности'. Если недоступно, установи значение в null",
...
"dimensions": "Включи высоту, ширину и глубину (например, '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.
Чтобы улучшить производительность, можно предпринять несколько шагов:
-
Использование меньшей модели, тренированной на вашем наборе данных. Размер модели зависит от задачи, и, скорее всего, вам придётся обучать несколько небольших моделей, так как каждая из них сможет обрабатывать лишь ограниченное количество категорий. В целом вам придется экспериментировать. Общие наблюдения таковы:
Для извлечения атрибутов из текста подходят модели с 7-12b параметров.
Модели меньше 7b могут подходить для ограниченного набора точно настроенных атрибутов, возможно получить такую модель через дистилляцию большой модели.
Это может увеличить пропускную способность в 10–20 раз. Однако следует учитывать, что меньшие модели не справляются с извлечением множества атрибутов за раз и могут испытывать трудности с обработкой сложных запросов, поэтому вам придётся тестировать их на вашей задаче.
Квантизация (Quantization). Квантизация может увеличить количество запросов в секунду на 20–50% без значительного снижения качества работы модели.
Сценарии с большими объёмами данных. В таких случаях не имеет смысла использовать что-либо, кроме модели с локальным размещением (self-hosted), так как затраты на использование OpenAI или Anthropic будут слишком высокими. Однако такие модели подходят для прототипирования и тестирования идей либо для обработки совсем сложных случаев. Они разбирают действительно сложные описания на уровне, сопоставимом с людьми.
Для self-hosting, я бы порекомендовал использовать последние версии моделей LLama или Qwen. Начинайте с 70b для тестирования, а затем оптимизируйте до меньших моделей до тех пор, пока производительность будет вас удовлетворять.
Вам, вероятно, придётся дополнительно сделать fine-tuning модели для определённых категорий. Например, в медицинской сфере часто встречаются сокращения, как и в строительной отрасли. Универсальная модель может плохо справляться с такими случаями, поэтому в таких ситуациях будет полезно использовать метод LORA (Low-Rank Adaptation).
Кроме того, учитывайте язык. Например, LLama хорошо работает с английским языком, но для китайского она, скорее всего, будет галлюцинировать. В этом случае модель Gwen, вероятно, будет лучшим выбором. В русском языке частенько окончания, а так же имена-фамилии и их склонения вызывают сбои, стоит обратить внимание на товары где это является одним из атрибутов: фильмы, музыка, книги.
Ценообразование
Вытащить цену из описания LLM может, а вот способны ли LLM помочь с анализом цен и ценообразованием. Я думаю пока нет, и проблема упирается в работу с цифрами. Последние модели типа от OpenAI уже неплохо считают, однако это обойдется слишком дорого при попытках анализировать большие объемы данных.
Для узких ниш с специфическим ценообразованием возможно построить такую систему на агентах. Большинство площадок и крупных ритейлеров же что называется "стоят в рынке", или проще говоря ориентируются на цены у конкурентов. Поэтому там используются либо самописные алгоритмы либо системы управления ценообразованием, подобные таким, как мы помогли создать команде Keeprise.
Пишите в комментариях свои вопросы.
Всем добра!