Как вы делаете image captioning для RAG (извлечение описания изображения)?

Краткий тезис

Image captioning для RAG — это процесс преобразования изображений в текстовые описания с помощью Vision-Language моделей (VL-LLM), таких как BLIP-2 или LLaVA. Полученные caption индексируются как обычные текстовые документы, что позволяет искать изображения по текстовым запросам. Для повышения качества retrieval caption комбинируют с CLIP embedding (гибридный подход), чтобы использовать как семантику текста, так и визуальные признаки.


1. Термин: Image captioning и его роль в RAG

Image captioning — задача автоматического генерирования текстового описания содержимого изображения. В контексте RAG это ключевой этап мультимодальной индексации: изображения, которые не могут быть напрямую обработаны текстовым поиском, превращаются в текст.

RAG (Retrieval-Augmented Generation) обычно работает с текстовыми чанками. Если в базе знаний есть изображения (схемы, фотографии, графики), их нужно «перевести» в текстовую форму, чтобы retrieval (поиск) мог найти их по запросу пользователя. Caption служит мостом между визуальной и текстовой модальностями.


2. Зачем нужен image captioning в RAG (проблема мультимодальности)

Без captioning изображения остаются «немыми»: их нельзя проиндексировать в векторной БД, работающей с текстовыми эмбеддингами. Основные проблемы:

  • Неоднородность данных: документы могут содержать картинки, диаграммы, скриншоты — их содержание не выражается словами.
  • Потеря информации: если просто игнорировать изображения, RAG теряет значимый контекст.
  • Запросы пользователя: пользователь может спросить «Покажи график продаж за 2023 год» — без caption retrieval не сможет найти нужное изображение.

Captioning решает эти проблемы, создавая текстовое представление, которое можно индексировать и искать стандартными методами (BM25, поиск|векторный поиск).


3. Основные модели: BLIP-2 и LLaVA

Для captioning в RAG используются Vision-Language модели (VL-LLM) — нейросети, обученные понимать связь изображений и текста.

МодельАрхитектураПреимуществаНедостатки
BLIP-2Q-Former + замороженный LLM (например, FlanT5)Быстрая, эффективная, хороша для коротких описанийМожет упускать детали, требует тонкой настройки под домен
LLaVACLIP vision encoder + LLaMA (или Vicuna)Детализированные описания, понимание сложных сценТребует больше ресурсов, медленнее
GIT (Generative Image-to-Text Transformer)Единый трансформер для изображения и текстаПростота, хорош для стандартных датасетовУступает BLIP-2/LLaVA по качеству
GPT-4V / GeminiПроприетарные мультимодальные LLMВысочайшее качество, понимание контекстаВысокая стоимость, задержка, зависимость от API

Рекомендация: для production используйте BLIP-2 (баланс скорость/качество) или LLaVA (если нужны длинные описания). Для экспериментов — открытые модели из Hugging Face.


4. Пайплайн: изображение → VL-LLM → текст описания

Типовой пайплайн captioning для RAG:

  1. Загрузка изображения (из документа, базы данных, URL).
  2. Предобработка: изменение размера (обычно 224x224 или 336x336), нормализация.
  3. Прогон через VL-LLM:
  4. Постобработка: обрезка до максимальной длины (например, 128 токенов), удаление артефактов.
  5. Сохранение caption как текстового поля в метаданных документа.

Пример кода на Python с BLIP-2:

from transformers import Blip2Processor, Blip2ForConditionalGeneration
from PIL import Image

processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b")

def generate_caption(image_path: str) -> str:
    image = Image.open(image_path).convert("RGB")
    inputs = processor(images=image, return_tensors="pt")
    out = model.generate(**inputs, max_length=50)
    caption = processor.decode(out[0], skip_special_tokens=True)
    return caption

5. Индексация caption: как сохранять и искать

Caption сохраняется как часть документа (например, в поле text или metadata.caption). Далее возможны два подхода:

  • Текстовый поиск (BM25): caption индексируется как обычный текст, поиск по ключевым словам.
  • Векторный поиск: caption эмбеддируется (например, через text-embedding-ada-002 или all-MiniLM-L6-v2) и сохраняется в векторной БД (FAISS, Pinecone, Qdrant).

Рекомендация: используйте векторный поиск — он лучше улавливает семантику описания. Если caption короткий (2-5 слов), BM25 может быть достаточным.

Пример сохранения в метаданных (JSON):

{
  "id": "img_001",
  "source": "report_2023.pdf",
  "caption": "График выручки по кварталам 2023 года, столбчатая диаграмма",
  "embedding": [0.123, -0.456, ...]
}

6. Комбинация с CLIP embedding: dual-encoder подход

CLIP (Contrastive Language-Image Pre-training) — модель, которая учит общее эмбеддинг-пространство для текста и изображений. CLIP embedding можно использовать параллельно с caption.

Почему комбинировать

  • Caption может быть неточным или пропускать детали (например, цвета, расположение объектов).
  • CLIP embedding напрямую кодирует визуальную информацию, не теряя её.

Гибридная стратегия:

  • Для каждого изображения храним два вектора: CLIP embedding (визуальный) и caption embedding (текстовый).
  • При поиске вычисляем сходство запроса с обоими векторами и объединяем результаты (например, взвешенная сумма или реранжинг).

Пример гибридного retrieval:

import numpy as np
from sentence_transformers import SentenceTransformer
import clip

# Загрузка моделей
clip_model, preprocess = clip.load("ViT-B/32")
text_encoder = SentenceTransformer("all-MiniLM-L6-v2")

def hybrid_search(query, image_clip_emb, caption_emb, alpha=0.5):
    query_clip_emb = clip_model.encode_text(clip.tokenize([query]))
    query_text_emb = text_encoder.encode([query])
    
    clip_score = np.dot(query_clip_emb, image_clip_emb.T)
    text_score = np.dot(query_text_emb, caption_emb.T)
    
    combined = alpha * clip_score + (1 - alpha) * text_score
    return combined

Параметр alpha подбирается экспериментально (обычно 0.3–0.7). Если caption качественный, можно увеличить вес текстовой части.


7. Retrieval стратегии: только caption, только CLIP, гибрид

СтратегияПлюсыМинусыКогда использовать
Только captionПростота, низкая стоимостьПотеря визуальной информацииCaption очень точный (например, ручные аннотации)
Только CLIPПрямое сравнение изображенийНе учитывает семантику запроса (например, «график продаж» может не совпасть с визуальным паттерном)Поиск по визуальному сходству (например, «найди похожие изображения»)
Гибрид (caption + CLIP)Лучшее качество, робастностьДва эмбеддинга, больше вычисленийProduction-системы с высокими требованиями к точности

Рекомендация: начинайте с гибридного подхода, затем упрощайте, если качество caption высокое.


8. Обработка многоязычности (русский/английский)

Если база знаний содержит изображения с текстом на русском, caption должен быть на том же языке, что и запросы пользователей. Варианты:

  • Использовать мультиязычную VL-LLM (например, LLaVA-NeXT поддерживает русский).
  • Генерировать caption на английском, затем переводить через машинный перевод (например, Helsinki-NLP/opus-mt-en-ru).
  • Обучить/дообучить модель на русскоязычных данных (если есть ресурсы).

Практический совет: для русского языка проще всего использовать BLIP-2 с английским caption + перевод. Это дешевле и быстрее, чем искать специализированную модель.


9. Проблемы и ограничения

  • Галлюцинации: VL-LLM может «додумывать» детали, которых нет на изображении (например, написать «человек в шляпе», хотя шляпы нет).
  • Детализация: короткие caption (5-10 слов) могут упускать важные элементы (цифры на графике, мелкие объекты).
  • Стоимость: вызов VL-LLM для каждого изображения дороже, чем просто CLIP.
  • Задержка: captioning добавляет latency при индексации (но не при retrieval, если caption уже сохранён).
  • Домен: модель, обученная на общих данных (COCO), может плохо описывать медицинские снимки или технические схемы.

Решение: для специфических доменов дообучайте модель (fine-tuning) на своих данных. Например, BLIP-2 можно дообучить на датасете изображений с экспертными описаниями.


10. Оценка качества captioning (метрики)

Для оценки caption используются автоматические метрики и человеческая оценка:

МетрикаЧто измеряетПример
BLEUСовпадение n-грамм с эталонным captionBLEU-4 = 0.35
METEORУчитывает синонимы и стеммингMETEOR = 0.28
CIDErВзвешенная TF-IDF, лучше для разнообразных описанийCIDEr = 1.2
SPICEСемантическое соответствие (объекты, отношения)SPICE = 0.45
Human evaluationОценка человеком по шкале (1-5)Средняя оценка 4.2

Для RAG важнее не абсолютное качество caption, а его полезность для retrieval. Поэтому дополнительно можно оценивать retrieval recall с caption vs без него.


11. Альтернативы: использование мультимодальных LLM напрямую

Вместо отдельного captioning можно использовать мультимодальные LLM (GPT-4V, Gemini, Claude 3) для генерации ответа на основе изображения без предварительной индексации. Но это не RAG в классическом смысле — модель «видит» изображение только в момент запроса.

Когда это лучше

  • Малое количество изображений (до 100).
  • Высокие требования к точности (например, юридические документы).
  • Возможность платить за каждый запрос.

Когда captioning необходим

  • Большая база изображений (тысячи+).
  • Нужен быстрый retrieval (latency < 1 сек).
  • Ограниченный бюджет на LLM-вызовы.

Пет-проект для закрепления

Задача: Создать RAG-систему для поиска изображений по текстовому запросу (например, «найди фотографию заката на пляже»).

Инструменты:

Шаги:

  1. Соберите 100-200 изображений (из открытых датасетов или личных).
  2. Для каждого изображения сгенерируйте caption через BLIP-2.
  3. Вычислите CLIP embedding для изображения и text embedding для caption.
  4. Сохраните всё в FAISS индекс (два индекса или один комбинированный).
  5. Реализуйте гибридный поиск: при запросе пользователя найдите top-5 изображений.
  6. Выведите изображения с caption и оценкой релевантности.

Ожидаемый результат: Работающее веб-приложение, которое по запросу «солнечный пляж» находит соответствующие фото. Вы сможете сравнить качество поиска только по caption, только по CLIP и гибридного.


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

ВопросТема
550Как построить мультимодальный RAG (текст + изображения)?
551Как обрабатывать изображения в документах для RAG?
553Что такое CLIP и как его использовать в RAG?
554Как реализовать гибридный поиск (BM25 + векторный)?
555Как ранжировать результаты retrieval с учётом изображений?
556Как оценивать качество мультимодального RAG?

Навигация