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.

Как работает

  1. Индексация Для каждого документа (состоящего из текста и изображения) вычисляется один мультимодальный эмбеддинг (например, с помощью CLIP: текст → text encoder, изображение → image encoder → общий эмбеддинг после проекции). Эмбеддинг сохраняется в векторной БД.
  2. Поиск Пользовательский запрос (может быть текстом, изображением или тем и другим) также преобразуется в тот же эмбеддинг. Векторная БД возвращает 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 (позднее слияние)

Принцип Текст и изображения индексируются отдельно, в разных векторных пространствах. Каждый модальность имеет собственный индекс. При поиске выполняются параллельные ретривы по каждому индексу, а затем результаты объединяются (слияние рейтингов) с помощью стратегии агрегации.

Как работает

  1. Индексация Текстовые чанки → текстовые эмбеддинги (например, all-MiniLM-L6-v2) → индекс A. Изображения → визуальные эмбеддинги (например, CLIP image encoder) → индекс B.
  2. Поиск Пользовательский запрос может быть текстовым, визуальным или смешанным. Для текстовой части — поиск по индексу A, для визуальной — по индексу B. Если запрос только текстовый, визуальный поиск может быть запущен с тем же текстом (text-to-image retrieval).
  3. Слияние результатов Берутся 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 FusionLate 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).

Инструменты


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 (текстовый эмбеддинг).

Шаги:

  1. Собрать 500 товаров: изображение (jpg), название, описание, цена, срок доставки.
  2. Для каждого товара вычислить:
    • текстовый эмбеддинг (all-MiniLM-L6-v2) для текста (название + описание)
    • визуальный эмбеддинг (CLIP image encoder) для изображения
  3. Сохранить в Chroma два индекса: text_index и image_index.
  4. Написать ретривер-агрегатор:
    • Если запрос содержит текст и изображение → запускаем оба поиска, применяем RRF.
    • Если только текст → только text_index.
    • Если только изображение → image_index (text-to-image).
  5. Добавить LLM (GPT-4o или локальный LLaVA) для генерации ответа: контекст — top-5 товаров.
  6. Оценить HR@5 и MRR на тестовых запросах (20 ручных кейсов).

Ожидаемый результат Рабочий прототип в Streamlit, который принимает фото и текст, возвращает рекомендации с объяснением. Вы сможете сравнить качество late fusion весов.


Связь с другими вопросами

ВопросТема
5Метрики retrieval, применимы к мультимодальному случаю
11Гибридный поиск (текстовый + семантический) — параллель с late fusion
115Инфраструктура хранения изображений для визуального поиска
117Предобработка и извлечение фич из изображений
118Сравнение моделей для визуального эмбеддинга
120Использование мультимодальных LLM для генерации ответов

Навигация