Привет! Я Сергей Кляхандлер, senior DS-инженер в команде LLM Авито.
В статье рассказываю, как мы разработали ML-модель, которая автоматически генерирует описания для объявлений из категории Одежда и Обувь. Поделюсь, откуда мы брали данные для обучения, какую архитектуру использовали и как тренировали модель. А в конце расскажу про важную часть работы — фейлы.
Статья будет полезна DS-инженерам, которые работают с мультимодальными LLM-моделями.

Что внутри статьи:
Контекст: почему решили создать модель
Про процесс:
Стали искать данные для обучения модели
Выбрали архитектуру, собрали данные и начали обучать модель
Запустили автоматическую генерацию описаний
Нашли несколько багов после запуска
И результат:
Повысили удовлетворённость продавцов и вырастили процент заказов с доставкой
Контекст: почему решили создать модель
Когда продавцы создают объявления на Авито, им нужно заполнять параметры товара, а затем придумывать описание. Многие пользователи не знают, что рассказать про свою одежду, поэтому оставляют это поле пустым или пишут что-то неинформативное.
Подумайте, на что вы обычно обращаете внимание, когда покупаете джинсы. Скорее всего, хотите узнать материал, длину изделия в талии или до низа. А теперь сравните с тем, что указывают некоторые продавцы в своих товарах:


Проблемы для покупателей:
Из такого описания они не могли выудить нужную информацию. Не понимали, подходят им понравившиеся изделия или нет.
Приходилось делать лишний шаг — связываться с продавцом в личных сообщениях и уточнять параметры товара. Это дополнительное действие, которое усложняет путь пользователя.
Проблемы для продавцов:
Ликвидность объявлений снижалась, и пользователи дольше продавали товары или вовсе не могли продать их.
Мы решили создать модель, которая будет подсказывать продавцам, как сделать описание содержательнее и полезнее для покупателей. И, как следствие, быстрее продавать вещи.
Важно оговориться, что эта модель будет работать только для частных, а не для профессиональных продавцов. Работа с профи сложнее: они публикуют сотни или даже тысячи объявлений и хорошо ориентируются в нужных параметрах товаров.
Частные продавцы же заходят на платформу ситуативно, когда нужно что-то продать. Для них это редкая задача, и тратить много времени на публикацию товара они не хотят. Поэтому фича с автоматической генерацией описания может прийтись кстати.
Стали искать данные для обучения модели
Первые трудности возникли, когда наша команда стала продумывать, как именно будет работать ML-модель. У нас было две задачи:
Нужно было придумать, как сделать ёмкое описание. У товаров в категории Одежда и Обувь есть текстовые данные, которые отражают: вид одежды, размер, цвет, материал. А ещё — картинка, на которой покупатель может увидеть фасон изделия или прикинуть, в каком состоянии продаётся товар.
Чтобы сгенерировать содержательное описание, нужно учитывать все характеристики. Но так случилось, что мультимодальные задачи не очень популярны — в сети мало опенсорсных моделей, которые умеют с этим работать, а ещё меньше моделей на русском языке. Поэтому на старте было непонятно, как решать поставленную задачу.
А ещё — найти, откуда брать данные для обучения модели. Мы рассматривали два подхода:
Выбрать открытые датасеты, например: Fashion-gen, fashion 200k, DeepFashion, OpenFashionCLIP, где есть фотографии и описания товаров.
Но тут было несколько проблем: описания товаров на английском языке, а представленные в датасетах фотографии сделаны в студийных условиях. Первая загвоздка решалась с помощью хороших переводчиков. А вот со второй сложнее.
Студийные фотографии имеют мало общего с подходом наших продавцов: перед публикацией товара обычно никто не выставляет свет и не ищет однотонный фон, чтобы сделать фотографию в высоком разрешении. Всё проходит куда проще: продавец достаёт футболку из шкафа, фотографирует её с помощью телефона и загружает в профиль.
Взять существующие объявления на Авито в качестве альтернативного источника данных. Сложность здесь заключалась в том, что, как мы видели на примерах выше, есть огромное количество объявлений без содержательного описания.
Мы понимали, что такая выборка будет неидеальной, но всё равно остановились на этом варианте решения задачи.

Выбрали архитектуру, собрали данные и начали обучать модель
Нашей главной целью было — найти простое, понятное и быстро воспроизводимое решение. Если коротко, решили задачу так: разобрались с мультимодальностью и данными, наметили пайплайн и приступили к обучению модели.
Чтобы разобраться с мультимодальностью, нашли в опенсорсе архитектуру-трансформер. На входе её энкодерная часть принимает картинку, которая затем кодируется, а в декодер подаётся промпт, чтобы сгенерировать описание. В виде схемы это выглядит следующим образом:

Пример промпта: Вид одежды: Мужская одежда, Вид объявления: Продаю своё, Состояние: Отличное, Цвет: Бежевый, Бренд одежды: Другой, Размер. Мужская одежда: 48 (M), Предмет одежды: Джинсы и шорты, заголовок: Шорты Lime бежевые
Это ключевые параметры и значения, которые мы брали из текста. Из важных лимитов — на вход можно было подать только одну заглавную картинку. Но несмотря на то что в объявлениях на Авито продавцы обычно прикрепляют больше фотографий, мы были готовы идти на такое ограничение.
Заглавная картинка, как правило, отличается хорошим качеством, на ней отчётливо виден товар. Значит — можно получить основную информацию.
Самое приятное в этом решении — подобная архитектура есть в опенсорсе — трансформер. Она обучена на датасете COCO, переведена на русский язык и довольно неплохо работает. Поэтому в качестве базовой модели мы взяли именно её.
Чтобы решить проблему с данными, взяли объявления с качественными описаниями. Мы изучили объявления, которые есть в нашей базе данных и бэклоге, и выбрали из них содержательные. Вот несколько примеров:


В этих объявлениях указаны размеры, состав и другие полезные характеристики одежды. Когда покупатели видят всю важную информацию о товаре, им легче решиться на покупку. Это увеличивает ликвидность товаров продавца и повышает количество сделок.
Стали делать пайплайн. Он состоял из пяти этапов:
Собрали признаки хороших и плохих описаний.
Сделали выборку.
Обучили модель (image-to-text).
Провалидировали модель с продуктом.
Стали исправлять ошибки.
Расскажу подробнее про некоторые этапы.
Собрали описания товаров. Мы обратились к коллегам и попросили собрать признаки хороших и плохих описаний. При выборе опирались на те ориентиры, которые я обозначил ранее.
Если в объявлении был размер, состав и другие характеристики — это хороший пример. Если ничего из этого не было — плохой.
Ещё в объявлениях часто встречаются фразы вроде: «Доставку не отправляю» или «не звонить, только писать». Их мы не брали, так как не хотели, чтобы модель обучалась на них и использовала в дальнейшем.
К тому же мы не знали конкретные предпочтения пользователя и не хотели вставлять лишний текст. Поэтому оставили продавцам возможность дописывать дополнительную информацию самостоятельно.
Собрали выборку и начали обучать модель. Далее шло два промежуточных этапа. Наша команда собрала выборку на основе эвристик и начала обучать модель.
Провалидировали модель с продуктом. Нам нужно было проверить, способна ли модель генерировать что-то правдоподобное, содержательное и осмысленное. Для этого мы мы сделали для наших проджект-менеджеров простой интерфейс с кнопкой: «Сгенерировать описание», подставляли в него ID объявлений, после чего модель выводила параметры объявления и несколько описаний.
Коллеги из вертикали Товаров отсматривали, какие описания получались, и приносили нам ошибки, неточности и другие пожелания, как можно улучшить генерацию.
Провели работу над ошибками. Процесс стал цикличным: мы получали информацию про ошибки, потом исправляли их, обучали модель заново и проверяли.

После нескольких итераций у нас получилась модель, которая полностью соответствовала требованиям команды Авито Товаров.

Запустили автоматическую генерацию описаний
Рассмотрим, как работает генерация с точки зрения бэкенда и обычного пользователя.
С точки зрения бэкенда сервис состоит из трёх шагов: префильтрация, генерация и постфильтрация.

Aqueduct — опенсорсная библиотека, которую сделали в Авито. Подробнее о том, что это и зачем нужно, читайте в другой нашей статье на Хабре: «Aqueduct: Как мы экономим железо для МЛ-вычислений».
Префильтрация нужна для случаев, когда мы заранее можем сказать, что не будем делать генерацию на заданные параметры.
Например, пользователь добавляет мешок товаров. По фотографиям и описанию непонятно, что именно он продаёт. Если использовать такие данные, то модель выдаст бессмысленный текст.
Когда мы убедились, что данные можно использовать, начался процесс генерации.
Затем на этапе постфильтрации система проверяет, соответствуют ли готовые описания требованиям бизнеса и модерационным, чтобы в выдачу не попадал мусор.
Например, модель может сгенерировать описание со множеством плейсхолдеров или слишком длинный текст, который тяжело проверять. Таких условий несколько, эти два самые популярные. Если описания не соответствуют требованиям, то модель ничего не выдаёт.
Вот так выглядела архитектура продакшена. Можно сравнить количество успешных генераций с неудачными и оценить нагрузку:

Нагрузка: 1 запрос/сек. Ответ: 2.5–4.5 сек. За неделю: 182 тыс. успешных генераций и 14 тысяч отказов по разным причинам
Причины отказов генерации
item_did_not_pass… — объявление отсеяно по префильтру.
description_did_n… — сгенерированное описание отсеяно во время постфильтрации.
attrs_parsing_error — внутрення ошибка, не смогли получить параметры из объявления.
Для пользователей фича выглядит следующим образом:
1. Продавец загружает картинку, пишет название и заполняет основные характеристики товара.

Процесс подачи объявления в интерфейсе Авито
2. Далее сервис генерирует описание, пользователь добавляет числовые параметры товара и повторяет генерацию при необходимости.

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

Хотя указание размера при создании объявления было и остаётся обязательным требованием, модель иногда упускала этот момент. После генерации она оставляла это поле пустым и просила ввести значение снова:

Кроме того, остаётся небольшой процент ошибок, когда модель неправильно считывает информацию с картинки и выдаёт галлюцинацию вместо верного описания.
Мы продолжаем улучшать модель.
Результат — повысили удовлетворённость продавцов и вырастили процент заказов с доставкой
Мы провели A/B-тест, в рамках которого спрашивали у частных продавцов, понравилось ли им сгенерированное описание после того, как они воспользовались фичей. В результате удачные описания помогли продавать товары лучше.
60% продавцов отметили, что им понравились сгенерированные тексты.
На 1.7% выросло количество заказов товаров с доставкой после внедрения нашей модели.
Первые итоги показали, что наша команда движется в верном направлении. Но останавливаться на достигнутых результатах не планируем, целимся в 99%!
Продолжаем работу над моделью: уже усовершенствовали архитектуру и доработали процесс — он стал лучше и удобнее.

Вся история с ML-моделью для автоматической генерации кратко
Обнаружили возможность помочь продавцам товаров повысить ликвидность. Многие продавцы не знают, как описать свои вещи, оставляют поле пустым или заполняют чем-то вроде: «куртка нормальная». Покупателям не хватает информации: материал, размеры, состояние товара. В итоге — сделки совершаются дольше или не совершаются совсем.
Мы решили создать модель, которая поможет писать информативные описания.
Прошли три основных этапа:
Собрали данные. За основу взяли существующие объявления на Авито с качественными описаниями.
Выбрали архитектуру. Остановились на модели-трансформере, которая принимает на входе картинку и затем кодирует её. А в декодер подаётся промпт, чтобы сгенерировать описание.
Обучили и протестировали модель. Создали пайплайн из нескольких этапов, протестировали алгоритм на реальных примерах и исправили ошибки и неточности.
Внедрили модель в интерфейс Авито. Продавец загружает фото товара и заполняет базовые характеристики, а модель фильтрует неудачные описания и предлагает доработку.
Спасибо за уделенное статье время! Надеюсь, этот текст стал для вас интересным и полезным. На вопросы готов ответить в комментариях.
Подробнее о том, какие задачи решают инженеры Авито и с помощью каких инструментов они это делают — на нашем сайте и в телеграм-канале AvitoTech. А в TG-канале «Доска AI-объявлений» можно узнать больше именно о работе наших AI-технологий. Свежие вакансии в нашу команду — вот здесь.