English translation is not available yet. Showing Russian content.
Как вы комбинируете текстовый и визуальный поиск (early fusion vs late fusion)?
Краткий тезис
Комбинирование текстового и визуального поиска в мультимодальном RAG необходимо для ответа на запросы, содержащие как текст, так и изображения. Существуют две основные стратегии: reranking|late fusion (fusion|позднее слияние) — отдельные индексы для текста и изображений с последующей агрегацией результатов, и early fusion (fusion|раннее слияние) — единый embedding|мультимодальный эмбеддинг для текста и изображений. reranking|Late fusion проще в реализации, масштабируемее и дешевле, но уступает fusion|early fusion по качеству поиска в сложных перекрёстных запросах.
1. Термины и контекст
- Мультимодальный RAG — расширение классического RAG, где в качестве источников информации выступают не только текстовые документы, но и изображения, таблицы, аудио, видео. Пользователь может задать вопрос по картинке (“Что изображено?”) или запросить информацию, комбинирующую текст и визуальный контент (“Найди продукты красного цвета с ценой ниже 500 рублей”).
- Текстовый поиск — retrieval по текстовой модальности: эмбеддинги текстовых чанков, поиск по косинусной близости с текстовым запросом.
- Визуальный поиск — retrieval по визуальной модальности: эмбеддинги изображений (обычно из image encoder как CLIP), поиск по запросу, который также может быть текстовым (text-to-image) или визуальным (image-to-image).
- Fusion (слияние) — процесс объединения результатов из разных модальностей в единый список релевантных документов. От того, на каком этапе происходит слияние, зависит архитектура системы.
2. Мотивация: зачем комбинировать текст и изображения
В реальных задачах пользователи часто предоставляют запросы, которые содержат и текст, и изображение:
- “Объясни эту диаграмму” (изображение + текст)
- “Найди похожие товары по фото и описанию” (оба модальности)
- “Какие документы содержат этот график и упоминают 2024 год?” (кросс-модальный запрос)
Без комбинации система может полагаться только на текстовый поиск, игнорируя визуальную информацию, или наоборот. В результате теряется релевантность. Комбинирование позволяет использовать сильные стороны каждой модальности.
3. Early Fusion (раннее слияние)
Принцип На этапе индексации и поиска используется единый мультимодальный эмбеддинг, который объединяет признаки текста и изображения в одном векторном пространстве. Запрос также проецируется в то же пространство. Для этого применяются модели, обученные на парах текст-изображение, например CLIP, ImageBind, BLIP-2.
Как работает
- Индексация Для каждого документа (состоящего из текста и изображения) вычисляется один мультимодальный эмбеддинг (например, с помощью CLIP: текст → text encoder, изображение → image encoder → общий эмбеддинг после проекции). Эмбеддинг сохраняется в векторной БД.
- Поиск Пользовательский запрос (может быть текстом, изображением или тем и другим) также преобразуется в тот же эмбеддинг. Векторная БД возвращает top-k ближайших документов по косинусной близости.
Пример (CLIP):
import clip
import torch
# Загрузка модели
model, preprocess = clip.load("ViT-B/32")
# Текстовый запрос
text = clip.tokenize(["Фото продукта красного цвета"]).to(device)
# Изображение запроса (если есть)
image = preprocess(Image.open("query.jpg")).unsqueeze(0).to(device)
# Общий эмбеддинг запроса (можно комбинировать)
with torch.no_grad():
text_features = model.encode_text(text)
image_features = model.encode_image(image)
# Early fusion: усреднение или конкатенация
query_embed = (text_features + image_features) / 2 # или torch.cat
# Поиск по БД по косинусной близости
Преимущества
- Высокое качество при кросс-модальных запросах (например, “найди изображение, похожее на эту картинку, но описанное текстом”).
- Ретривер обучается понимать семантические связи между модальностями.
- Ранжирование сразу учитывает обе модальности, без потерь при слиянии.
Недостатки
- Требует дорогого переобучения эмбеддинговой модели для новых модальностей или доменов (fine-tuning CLIP).
- Векторная БД должна поддерживать единое пространство — сложность масштабирования при добавлении новой модальности.
- Высокая ресурсоёмкость индексации: каждый документ требует обработки изображения через image encoder.
- Меньшая гибкость: трудно менять вес текста и изображения адаптивно под запрос.
4. Late Fusion (позднее слияние)
Принцип Текст и изображения индексируются отдельно, в разных векторных пространствах. Каждый модальность имеет собственный индекс. При поиске выполняются параллельные ретривы по каждому индексу, а затем результаты объединяются (слияние рейтингов) с помощью стратегии агрегации.
Как работает
- Индексация Текстовые чанки → текстовые эмбеддинги (например, all-MiniLM-L6-v2) → индекс A. Изображения → визуальные эмбеддинги (например, CLIP image encoder) → индекс B.
- Поиск Пользовательский запрос может быть текстовым, визуальным или смешанным. Для текстовой части — поиск по индексу A, для визуальной — по индексу B. Если запрос только текстовый, визуальный поиск может быть запущен с тем же текстом (text-to-image retrieval).
- Слияние результатов Берутся top-k из каждого индекса, объединяются, убираются дубликаты, и вычисляется финальный рейтинг. Стратегии слияния:
- Concatenation / Interleaving чередование результатов (1-й из A, 1-й из B, 2-й из A, …).
- Weighted sum пересчёт скора по формуле
score_final = w_text * score_text + w_image * score_image, где веса подбираются эмпирически. - Re-ranking сначала получаем кандидатов (например, до 200), затем используем кросс-энкодер или мультимодальную модель для переранжирования.
- Reciprocal Rank Fusion (RRF): стандартная мета-функция score = 1/(k + rank), суммируем по всем спискам.
Пример (Late Fusion + RRF):
def reciprocal_rank_fusion(results_text, results_image, k=60):
scores = {}
for rank, doc_id in enumerate(results_text):
scores[doc_id] = scores.get(doc_id, 0) + 1/(k + rank + 1)
for rank, doc_id in enumerate(results_image):
scores[doc_id] = scores.get(doc_id, 0) + 1/(k + rank + 1)
# Сортировка по убыванию
return sorted(scores.items(), key=lambda x: x[1], reverse=True)
Преимущества
- Простота: можно использовать готовые индексы для каждой модальности без переобучения.
- Масштабируемость: добавлять новые модальности — добавить индекс и новую стратегию слияния.
- Гибкость: настройка весов для разных типов запросов (текст-тяжелые vs. изображение-тяжелые).
- Низкие затраты на индексацию: image encoder запускается отдельно, но можно не пересчитывать модели для текста.
Недостатки
- Качество слияния ограничено: нет кросс-модального обучения, теряется семантическая синергия.
- Сложный выбор стратегии и весов для слияния.
- Возможны дубликаты и сложности с идентификацией одного документа, содержащего обе модальности.
5. Сравнение: Early vs. Late Fusion
| Критерий | Early Fusion | Late Fusion |
|---|---|---|
| Качество (кросс-модальные запросы) | Высокое | Среднее (зависит от слияния) |
| Сложность реализации | Высокая (нужна специальная модель) | Низкая (стандартные индексы) |
| Масштабируемость (новые модальности) | Тяжело (нужно переобучать модель) | Легко (добавить индекс) |
| Гибкость настроек (веса) | Низкая (эмбеддинг фиксирован) | Высокая (конфигурация слияния) |
| Затраты на индексацию | Высокие (один encoder на всё) | Средние (два encoder, но можно параллельно) |
| Затраты на поиск | Один запрос к БД | Два или более запросов + слияние |
| Поддержка текстовых запросов без изображений | Хорошая (текст проецируется) | Хорошая (можно игнорировать image index) |
| Требования к модели | Мультимодальная (CLIP, ImageBind) | Любые mono-модальные эмбеддинги |
6. Гибридные и продвинутые подходы
На практике часто используют гибриды:
- Раннее слияние на уровне фич + поздний реранкинг: получаем кандидаты через early fusion (один эмбеддинг), затем переранжируем с помощью мультимодального LLM (например, MiniGPT-v2), который учитывает и текст, и изображение в контексте.
- Множественные ранние представления: для каждого документа храним несколько эмбеддингов — отдельно текстовый, отдельно визуальный, но при обучении используем контрастивную потерю (CLIP). Поиск ведётся по всем эмбеддингам с последующей агрегацией (Late Fusion на уровне индексов, но эмбеддинги shared).
- Динамическое переключение: классификатор на входе решает, какой тип поиска запускать (текстовый, визуальный или оба), и выбирает стратегию слияния.
- Late Fusion с обученными весами: использование небольшой нейросети (например, 1-2 линейных слоя), которая по запросу предсказывает веса для каждого канала текста и изображения.
7. Практические соображения
Когда выбирать Early Fusion
- Запросы регулярно содержат как текст, так и изображения (например, “похожий дизайн, но с синим фоном”).
- Вы готовы потратить ресурсы на обучение/дообучение мультимодальной модели под ваш домен.
- Размер корпуса умеренный (< 1 млн документов).
Когда выбирать Late Fusion
- Большой разнородный корпус (миллионы документов).
- Частая смена или добавление типов контента (аудио, видео).
- Команда не имеет deep learning экспертизы для fine-tuning.
- Требуется быстрое прототипирование (MVP).
Инструменты
- Векторные БД Milvus, Qdrant, Weaviate, Pinecone — все поддерживают мультимодальные векторы и гибридный поиск.
- Эмбеддинги CLIP (ViT-B/32, ViT-L/14), OpenCLIP, SigLIP, ImageBind (6 модальностей), для текста — Sentence Transformers.
- Фреймворки LangChain (MultiVectorRetriever, EnsembleRetriever), LlamaIndex (MultiModalIndex, SimpleMultiModalIndex).
- Re-ranking Cohere rerank, Cross-Encoder, BLIP-2.
8. Оценка качества мультимодального поиска
Метрики аналогичны классическому retrieval, но с учётом модальности:
- Hit Rate / MRR / Recall@k — отдельно для текстового индекса, визуального и общего после слияния.
- NDCG — нормализованная дисконтированная кумулятивная выгода, важна для ранжирования.
- Faithfulness — проверка, что ответ LLM соответствует визуальной информации (метрика из RAGAS, но адаптированная).
- Мультимодальный recall — для запроса типа “найди документ с изображением и текстом” проверяем, попал ли нужный документ в top-k.
Важно Для late fusion необходимо аннотировать ground truth по каждой модальности отдельно.
Пет-проект для закрепления
Задача Построить мультимодальный RAG для каталога товаров онлайн-магазина (изображение + название + описание). Пользователь может загрузить фото товара и запросить “найди похожие модели с ценой до 3000 руб. и доставкой завтра”.
Инструменты Python, Streamlit (UI), LangChain, Chroma (векторная БД), CLIP (text+image encoder), Sentence Transformer (текстовый эмбеддинг).
Шаги:
- Собрать 500 товаров: изображение (jpg), название, описание, цена, срок доставки.
- Для каждого товара вычислить:
- Сохранить в Chroma два индекса:
text_indexиimage_index. - Написать ретривер-агрегатор:
- Если запрос содержит текст и изображение → запускаем оба поиска, применяем RRF.
- Если только текст → только text_index.
- Если только изображение → image_index (text-to-image).
- Добавить LLM (GPT-4o или локальный LLaVA) для генерации ответа: контекст — top-5 товаров.
- Оценить HR@5 и MRR на тестовых запросах (20 ручных кейсов).
Ожидаемый результат Рабочий прототип в Streamlit, который принимает фото и текст, возвращает рекомендации с объяснением. Вы сможете сравнить качество late fusion весов.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 5 | Метрики retrieval, применимы к мультимодальному случаю |
| 11 | Гибридный поиск (текстовый + семантический) — параллель с late fusion |
| 115 | Инфраструктура хранения изображений для визуального поиска |
| 117 | Предобработка и извлечение фич из изображений |
| 118 | Сравнение моделей для визуального эмбеддинга |
| 120 | Использование мультимодальных LLM для генерации ответов |
Навигация
- Предыдущий: 118
- Следующий: 120
- Индекс: 00. Индекс разборов