Проблема «немых» индексов
Традиционный полнотекстовый поиск Авито сталкивался с ограничениями: если пользователь искал «кресло виды Лондона», а в объявлении было только «кресло-мешок», система не находила релевантный результат. Задача состояла в том, чтобы извлекать смысловые связи из изображений, когда текстовое описание отсутствует или неполно. Масштаб задачи огромен: более 230 млн активных объявлений и 20 млн событий в сутки.
Архитектура решения: от шины данных до Sphnix
Система построена на асинхронной обработке через шину данных (data-bus). Ключевые компоненты:
- Worker create/update: первичная фильтрация событий (создание/изменение фото или заголовка).
- QaaS (Queue as a Service): изолированная очередь для GPU-инференса, защищающая основной поиск от пиковых нагрузок.
- Worker LLM: генерация текстовых описаний для изображений, запись в Redis с TTL и отправка результата обратно в индекс Sphnix.
Для надежности внедрен cron-джоб, раз в сутки сканирующий базу на наличие объявлений без LLM-описаний.
Модель A-Vision и оптимизация токенизации
В основе лежит открытая модель Qwen2.5-VL-7B-Instruct. Ключевым улучшением стала переобученная кириллическая токенизация. Стандартные англоязычные токенизаторы дробят русские слова на 4–6 токенов, что замедляет декодирование. Оптимизация сократила время генерации описания в два раза при сохранении семантического качества.
Почему выбрали LoRA вместо Full Fine-Tuning
Для адаптации модели под разные категории товаров (мебель, одежда и т.д.) команда отказалась от полного дообучения (Full Fine-Tuning) и трансферного обучения из-за высоких вычислительных затрат. Вместо этого применена техника Low-Rank Adaptation (LoRA).
| Метод адаптации | Объем изменяемых параметров | Затраты ресурсов | Решение Avito |
|---|---|---|---|
| Retrain all parameters | 100% (миллиарды) | Очень высокие | Отказано |
| Transfer learning | Значительная часть слоев | Высокие | Отказано |
| LoRA (Parameter Efficient) | 0,1–1% | Минимальные | Выбрано |
Инференс через vLLM
Для эффективного распределения нагрузки на GPU-кластере используется фреймворк vLLM. Он обеспечивает:
- Эффективное управление памятью (PagedAttention).
- Параллельный инференс на нескольких GPU.
- Оптимизацию батчинга запросов.
Такой стек позволяет обрабатывать миллионы обновлений в сутки, обеспечивая мгновенное обогащение поисковой выдачи мультимодальными описаниями.
Источник: Habr ↗
