Подготовка к собеседованию по мультимодальному ML

Вопросы для собеседования инженера по мультимодальному машинному обучению

15 отобранных вопросов для собеседования по мультимодальному машинному обучению, сгруппированных по уровню seniority. Используйте их для повторения основ, практических компромиссов и рассуждений старших специалистов о производственных аспектах.

Начать AI-собеседование по мультимодальному MLКредитная карта не требуется. Доступна 1 бесплатная сессия.
Практика технических собеседований на английскомРежим, в котором не носители языка могут потренироваться проходить интервью.

Вопросы для Junior

1Объясните основную идею контрастивного обучения для выравнивания представлений изображений и текста, и почему общее пространство эмбеддингов полезно.

Основная идея контрастивного обучения для представлений изображений и текста состоит в том, чтобы проецировать входные изображения и текст в общее латентное векторное пространство таким образом, чтобы семантически соответствующие (положительные) пары приближались друг к другу, а несоответствующие (отрицательные) пары отталкивались друг от друга. Обучая отдельные кодировщики изображений и текста с использованием метрик сходства (например, косинусного сходства), модель выравнивает семантику непрерывных визуальных пикселей с дискретными текстовыми токенами. Общее пространство эмбеддингов полезно, потому что оно позволяет решать мультимодальные задачи непосредственно путём поиска по сходству векторов. В этом едином пространстве кросс-модальный поиск (нахождение изображений по текстовым запросам и наоборот) и классификация с нулевым обучением (zero-shot) (оценка эмбеддинга изображения по эмбеддингам запросов, таких как 'фотография собаки') становятся простыми и высокоэффективными операциями поиска ближайшего соседа или поиска по скалярному произведению, не требуя специфичных для задачи классификационных голов.

import torch
import torch.nn.functional as F

# image_features: [B, D], text_features: [B, D]
image_norm = F.normalize(image_features, dim=-1)
text_norm = F.normalize(text_features, dim=-1)

# Pairwise cosine similarity matrix: [B, B]
sim_matrix = image_norm @ text_norm.T
# Positive pairs lie on the diagonal; off-diagonals are negatives
Попробовать ответить на вопрос AI-тренеру

2Объясните архитектуру двухканального кодировщика (dual-encoder) в стиле CLIP и предположения, которые она делает относительно взаимодействия изображения и текста.

Архитектура двухканального кодировщика (dual-encoder) в стиле CLIP состоит из двух отдельных, несвязанных нейронных сетей: визуального кодировщика (например, Vision Transformer или ResNet), который обрабатывает изображения в векторы визуальных признаков, и текстового кодировщика (например, Transformer), который обрабатывает текст в векторы текстовых признаков. Оба представления проецируются в общее пространство вложений (embedding dimension), где выравнивание измеряется с использованием простой метрики сходства (например, нормализованное косинусное сходство или скалярное произведение). Фундаментальное архитектурное предположение — это позднее слияние (late fusion) (или факторизованное кросс-модальное взаимодействие): модальности изображения и текста не взаимодействуют на промежуточных слоях через кросс-внимание (cross-attention) или взаимодействия на уровне токенов. Вместо этого предполагается, что полная семантика каждой модальности может быть сжата в единое плотное векторное представление, а кросс-модальное взаимодействие считается полностью разложимым на скалярное произведение. Этот компромисс отдает приоритет исключительной эффективности поиска (позволяя оффлайн предварительную обработку вложений изображений для поиска векторов в миллиардном масштабе) в ущерб детальному кросс-модальному рассуждению (например, привязке токена к региону (token-to-region grounding) или сложным композиционным пространственным отношениям).

import torch
import torch.nn as nn
import torch.nn.functional as F

class CLIPDualEncoder(nn.Module):
    def __init__(self, visual_encoder, text_encoder, img_dim, txt_dim, embed_dim):
        super().__init__()
        self.visual_encoder = visual_encoder
        self.text_encoder = text_encoder
        self.img_proj = nn.Linear(img_dim, embed_dim, bias=False)
        self.txt_proj = nn.Linear(txt_dim, embed_dim, bias=False)
        self.logit_scale = nn.Parameter(torch.ones([]) * 2.659)

    def forward(self, images, text_tokens):
        # Independent uncoupled encoding
        v_feat = self.img_proj(self.visual_encoder(images))
        t_feat = self.txt_proj(self.text_encoder(text_tokens))
        # L2 normalize
        v_norm = F.normalize(v_feat, p=2, dim=-1)
        t_norm = F.normalize(t_feat, p=2, dim=-1)
        # Late interaction via dot product
        return torch.matmul(v_norm, t_norm.T) * self.logit_scale.exp()
Попробовать ответить на вопрос AI-тренеру

3Опишите суть проецирования признаков изображений и текста в общее нормализованное пространство и оптимизации косинусного сходства.

Проецирование признаков изображений и текста в общее нормализованное пространство (обычно на единичную гиперсферу с помощью `L2 normalization`) и оптимизация косинусного сходства отделяет семантическое направление эмбеддинга от его величины вектора. Без нормализации несвязанное скалярное произведение позволяет модели минимизировать потери при обучении путём тривиального увеличения норм признаков для простых или часто встречающихся образцов, а не путём выравнивания их семантических направлений. Нормализация векторов на единичную гиперсферу ограничивает значения сходства строго в диапазоне `[-1, 1]`, гарантируя, что расстояние соответствует исключительно угловому разделению. Это стабилизирует градиенты оптимизации, предотвращает взрыв или коллапс представлений и обеспечивает равноценный вклад каждого образца в пакете в функцию потерь, независимо от различий в масштабах, специфичных для модальностей. В сочетании с обучаемым параметром температуры это контролирует резкость распределения вероятностей по гиперсфере, чтобы сбалансировать выравнивание истинных пар с равномерным распределением отрицательных пар.

import torch
import torch.nn.functional as F

# Unnormalized embeddings with extreme norm differences
v = torch.tensor([[10.0, 0.0], [0.1, 0.0]])
t = torch.tensor([[5.0, 0.0], [0.1, 0.0]])

# Raw dot products: heavily distorted by magnitude (50.0 vs 0.01)
raw_dot = v @ t.T

# L2 Normalized:
v_norm = F.normalize(v, p=2, dim=-1)
t_norm = F.normalize(t, p=2, dim=-1)
cosine_sim = v_norm @ t_norm.T
print('Cosine similarity matrix:\n', cosine_sim)
Попробовать ответить на вопрос AI-тренеру

4Объясните визуальное заземление (visual grounding) и понимание референциальных выражений (Referring Expression Comprehension, REC) как локализацию, обусловленную языком, и чем они отличаются от сходства на уровне изображения (image-level similarity).

Визуальное заземление (часто реализуемое как Понимание референциальных выражений, или REC) — это задача локализации определенной визуальной области, ограничивающей рамки (bounding box) или маски сегментации в изображении на основе референциального выражения на естественном языке (например, «человек в синей куртке рядом с лампой»). Оно рассматривает локализацию как обусловленную языком, требуя от модели разрешения лингвистических пространственных отношений, атрибутов и идентичностей объектов вплоть до пиксельных или пространственных координат. Это фундаментально отличается от сходства на уровне изображения, которое вычисляет единый целостный показатель семантического сходства между всем изображением и текстовой строкой (например, определение того, соответствует ли изображение подписи «мужчина в парке»). Сходство на уровне изображения не производит пространственные координаты, может сопоставлять изображения, где упоминаемый объект не уникально локализован, и часто не справляется с разрешением тонкой референциальной неоднозначности между несколькими похожими объектами в одной и той же сцене.

# Image-level similarity:
# Input: Image I, Text T ("black dog sitting on the left")
# Output: scalar score s in [0, 1] or dot product
similarity_score = image_text_model(image, text)

# Referring Expression Comprehension (Visual Grounding):
# Input: Image I, Text T ("black dog sitting on the left")
# Output: Bounding box coordinates [x_min, y_min, x_max, y_max]
bbox = grounding_model.predict_box(image, text)
Попробовать ответить на вопрос AI-тренеру

5Объясните кросс-внимание как механизм слияния визуальных токенов и текстовых токенов в мультимодальных трансформерах.

В мультимодальных трансформерах кросс-внимание (cross-attention) действует как асимметричный механизм слияния, где одна модальность направляет запросы (Q) для внимания к ключам (K) и значениям (V), извлеченным из другой модальности. Например, когда визуальные токены выступают в роли запросов, а текстовые токены — в роли ключей и значений, каждый визуальный токен вычисляет взвешенную по вниманию сумму текстовых представлений, динамически обусловливая визуальные признаки текстовым контекстом (и наоборот, когда текстовые токены запрашивают визуальные токены). Математически, для заданной визуальной последовательности X_v и текстовой последовательности X_t кросс-внимание вычисляет: ``` CrossAttention(Q_v, K_t, V_t) = softmax((Q_v * K_t^T) / sqrt(d)) * V_t ``` где Q_v = X_v * W_Q, K_t = X_t * W_K, и V_t = X_t * W_V. Этот механизм позволяет модели выполнять детальное семантическое выравнивание токен-к-токен между модальностями независимо от различий в длинах последовательностей или исходных пространствах признаков. Двунаправленное слияние может быть достигнуто с использованием двух симметричных слоев кросс-внимания (например, от изображения к языку и от языка к изображению) или путем чередования блоков кросс-внимания.

import torch
import torch.nn as nn

class MultimodalCrossAttention(nn.Module):
    def __init__(self, d_model, n_heads):
        super().__init__()
        self.mha = nn.MultiheadAttention(embed_dim=d_model, num_heads=n_heads, batch_first=True)
        self.norm = nn.LayerNorm(d_model)

    def forward(self, visual_query_tokens, text_kv_tokens):
        # visual_query_tokens: [B, N_v, D], text_kv_tokens: [B, N_t, D]
        attn_out, _ = self.mha(
            query=visual_query_tokens, 
            key=text_kv_tokens, 
            value=text_kv_tokens
        )
        # Residual connection and normalization
        output = self.norm(visual_query_tokens + attn_out)
        return output
Попробовать ответить на вопрос AI-тренеру

6Объясните, как аугментации изображений, такие как обрезка (cropping), изменение цветовых параметров (color jitter) и сжатие, могут помочь или навредить контрастному выравниванию изображение-текст.

В мультимодальном контрастном обучении (например, CLIP) аугментации изображений служат иной цели, чем в унимодальном самообучении без учителя (например, SimCLR). Поскольку изображения сопоставляются с парными текстовыми подписями, а не с другим аугментированным представлением того же изображения, аугментации могут как приносить пользу, так и искажать обучение представлений. Как аугментации помогают: 1. Предотвращение обучения ярлыкам (shortcut learning): Мягкие аугментации (такие как случайная обрезка, незначительные горизонтальные отражения и умеренное изменение цветовых параметров) не позволяют визуальному энкодеру полагаться на тривиальные низкоуровневые визуальные артефакты (например, распределения цвета фона, угловые водяные знаки или смещения пространственного положения). 2. Инвариантность к точке обзора и масштабу: Умеренное масштабирование и обрезка побуждают модель идентифицировать семантические объекты при различных фокусных расстояниях и перспективах, обеспечивая надежную обобщающую способность с нулевым количеством примеров (zero-shot). Как аугментации могут навредить (семантическое несоответствие): 1. Агрессивная случайная обрезка: Если подпись описывает конкретный объект ('птица, сидящая на ветке'), а агрессивная обрезка полностью удаляет птицу, оставшаяся часть (только листья/небо) все равно вынуждена выравниваться с подписью о птице. Это вносит ложный обучающий шум и снижает точность поиска. 2. Сильное изменение цветовых параметров / инверсия оттенка: Многие подписи явно описывают цветовые атрибуты ('желтое такси', 'красное яблоко'). Сильные сдвиги цвета меняют такси на синее или яблоко на зеленое, вызывая прямое семантическое противоречие между визуальным входом и текстовой подписью. 3. Сильное размытие и сжатие: Агрессивная пространственная дискретизация (downsampling), сжатие JPEG или размытие по Гауссу уничтожают мелкозернистые текстовые признаки (текст OCR на вывесках, логотипах, мелких текстурах), которые явно описаны в парных подписях. Практическое правило: Мультимодальное контрастное обучение требует значительно более консервативных аугментаций (например, Random Resized Crop с диапазоном масштаба [0.5, 1.0] и мягким отражением), чем унимодальное самообучение без учителя.

from torchvision import transforms

# Multimodal contrastive transform: conservative to preserve caption semantics
clip_transforms = transforms.Compose([
    transforms.RandomResizedCrop(224, scale=(0.5, 1.0)),  # Conservative crop avoids dropping described entities
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.481, 0.457, 0.408], std=[0.268, 0.261, 0.275])
])

# Unimodal self-supervised transform: aggressive, risks breaking image-text alignment
simclr_heavy_transforms = transforms.Compose([
    transforms.RandomResizedCrop(224, scale=(0.08, 1.0)), # Extreme crop can remove captioned subjects
    transforms.RandomApply([transforms.ColorJitter(0.8, 0.8, 0.8, 0.2)], p=0.8), # Alters color adjectives
    transforms.RandomGrayscale(p=0.2),
    transforms.GaussianBlur(kernel_size=23, sigma=(0.1, 2.0)), # Destroys fine OCR/textures
    transforms.ToTensor()
])
Попробовать ответить на вопрос AI-тренеру

7Объясните, что такое поиск изображений по тексту и текста по изображениям как задача, и в чём разница между сопоставлением в замкнутом наборе (closed-set matching) и поиском в открытом мире (open-world retrieval) по большим корпусам данных.

Поиск изображений по тексту и текста по изображениям — это задача нахождения соответствующих данных между различными модальностями, когда запрос задан в одной модальности (текст к изображению или изображение к тексту). Обычно это достигается путём отображения как изображений, так и текстов в общее пространство представлений, где сходство коррелирует с релевантностью. Сопоставление в замкнутом наборе (closed-set matching) предполагает фиксированный, заранее определённый набор кандидатов с известными эталонными парами (например, стандартные бенчмарки Flickr30k или MS-COCO), что позволяет выполнять исчерпывающий попарный расчёт сходства или перекрёстное внимание «все ко всем». Поиск в открытом мире (open-world retrieval) работает с массивными, динамическими, некурируемыми корпусами данных (например, от миллионов до миллиардов веб- или каталожных элементов), где наборы кандидатов не ограничены, преобладают дистракторы и ложноотрицательные результаты, и требуются масштабируемые индексы приближённого поиска ближайших соседей (ANN — Approximate Nearest Neighbor) (например, Faiss, HNSW), поскольку исчерпывающее перекрёстное внимание по всем парам является вычислительно неосуществимым.

import torch
import torch.nn.functional as F

# Closed-set matching: full pairwise similarity matrix over fixed evaluation set
image_embeds = F.normalize(torch.randn(1000, 512), dim=-1)
text_embeds = F.normalize(torch.randn(1000, 512), dim=-1)
sim_matrix = torch.matmul(text_embeds, image_embeds.T)  # (1000, 1000)

# Open-world retrieval: query vector queried against an indexed corpus using ANN
# index = faiss.IndexHNSWFlat(512, 32)
# distances, indices = index.search(query_embed, k=10)
Попробовать ответить на вопрос AI-тренеру

Вопросы для Middle

8Сравните InfoNCE-стилевые контрастивные потери softmax с попарными сигмоидными потерями для обучения эмбеддингов изображение-текст.

InfoNCE-стилевые контрастивные потери (например, в CLIP) рассматривают сопоставление как задачу категориальной многоклассовой классификации. Для каждого примера они вычисляют softmax-распределение по всем кандидатам на отрицательные пары в батче, нормализуя сходства по всему пулу батча. В отличие от этого, попарные сигмоидные контрастивные потери (например, в SigLIP) рассматривают каждую запись в матрице сходства изображение-текст как независимую задачу бинарной классификации, применяя сигмоидную функцию и бинарную кросс-энтропийную функцию потерь для каждой пары (положительные пары стремятся к +1, отрицательные пары стремятся к -1). Ключевые различия заключаются в следующем: 1. **Связанность против независимости:** InfoNCE связывает все отрицательные примеры через знаменатель глобального softmax-разделения, вызывая конкуренцию, где самые сложные отрицательные примеры доминируют в градиентах. SigLIP делает все пары независимыми, оценивая каждую отдельно. 2. **Распределённая масштабируемость и эффективность:** InfoNCE требует сбора матриц сходства через GPU (графический процессор) для глобальной нормализации (узкое место коммуникации типа all-gather). Независимые попарные потери SigLIP могут быть вычислены локально без глобальной кросс-GPU softmax-нормализации, что улучшает эффективность масштабирования и обеспечивает стабильность как для малых, так и для очень больших размеров батчей.

import torch
import torch.nn.functional as F

def siglip_loss(sim_matrix, temperature, bias):
    # sim_matrix: [B, B] dot product of normalized embeddings
    # targets: 1 on diagonal (positive), -1 on off-diagonals (negative)
    B = sim_matrix.size(0)
    targets = 2 * torch.eye(B, device=sim_matrix.device) - 1.0
    logits = sim_matrix * temperature + bias
    # Pairwise binary cross entropy with log-sigmoid
    return -torch.mean(F.logsigmoid(targets * logits))
Попробовать ответить на вопрос AI-тренеру

9Объясните, как трудные отрицательные примеры (hard negatives) и ложноотрицательные примеры (false negatives) влияют на контрастивное обучение изображений и текста.

Трудные отрицательные примеры (hard negatives) и ложноотрицательные примеры (false negatives) оказывают противоположное влияние на контрастивное обучение изображений и текста: 1. **Трудные отрицательные примеры** — это несоответствующие пары, которые семантически или визуально очень близки к якорю (например, изображение сибирского хаски, сопряженное с подписью «аляскинский маламут»). Трудные отрицательные примеры обеспечивают мощные, информативные градиентные сигналы. Они заставляют модель выходить за рамки грубых категориальных признаков и изучать детализированные визуально-лингвистические особенности и четкие границы принятия решений. 2. **Ложноотрицательные примеры** возникают, когда случайно выбранные «отрицательные» пары в батче на самом деле являются действительными семантическими совпадениями (например, две разные фотографии золотистых ретриверов, одна из которых ошибочно представлена как отрицательная по отношению к «милому золотистому ретриверу в парке»). Ложноотрицательные примеры наказывают правильные семантические выравнивания, заставляя модель раздвигать соответствующие представления. Это искажает градиенты, ухудшает качество представлений и подавляет законную синонимию и визуальную вариативность. Стратегии смягчения для ложноотрицательных примеров включают контрастивные цели с мягким сглаживанием меток, непредвзятое контрастивное обучение, дедупликацию набора данных и сопоставление с несколькими положительными примерами.

import torch
import torch.nn.functional as F

# Image 0 and Image 1 both depict 'a red sports car'
# Text 0: 'a red sports car', Text 1: 'a fast red car'
# In standard InfoNCE, Text 1 is treated as a negative for Image 0.
sim = torch.tensor([[0.95, 0.90],   # Image 0 similarities
                    [0.88, 0.94]])  # Image 1 similarities

loss_img0 = -F.log_softmax(sim / 0.07, dim=-1)[0, 0]
print(f'InfoNCE loss for Image 0: {loss_img0.item():.4f}')
# High similarity to false negative Text 1 (0.90) heavily penalizes the model
Попробовать ответить на вопрос AI-тренеру

10Сравните глобальное выравнивание изображение-текст с целями выравнивания на уровне региона-слова или токена.

Глобальное выравнивание изображение-текст отображает целое изображение и целую текстовую последовательность в единые целостные векторы встраивания (embedding) (например, через пулированные признаки в CLIP) и выравнивает их с помощью контрастивной цели, такой как InfoNCE. Это обеспечивает отличные свойства масштабируемости, быстрые индексируемые представления для поиска и сильную семантическую кластеризацию. Однако оно страдает от грубой пространственной гранулярности, плохо справляется с детальными визуальными особенностями, композиционностью, подсчетом и пространственными отношениями, а также часто демонстрирует проблемы связывания атрибутов. В отличие от этого, выравнивание на уровне региона-слова или токена работает с детальной гранулярностью на уровне под-изображений (например, токены-патчи, признаки ограничивающих рамок объектов) и под-предложений (например, токены слов или подслов). Методы, такие как FILIP, GLIP или VinVL, выравнивают токены с помощью детальных контрастивных потерь (например, потоковая максимальная схожесть или схожесть Чемфера) или оптимального транспорта/выравнивания с кросс-вниманием. Это явно сохраняет пространственные и лингвистические композиционные детали, что позволяет обнаруживать объекты, осуществлять визуальное заземление и точное связывание атрибутов, но ценой более высокой вычислительной и оперативной сложности, более высокой задержки вывода и более зашумленных сигналов выравнивания.

import torch
import torch.nn.functional as F

# visual_tokens: [B, N_v, D], text_tokens: [B, N_t, D]
def token_level_maxsim_similarity(visual_tokens, text_tokens):
    v_norm = F.normalize(visual_tokens, dim=-1)
    t_norm = F.normalize(text_tokens, dim=-1)
    # Compute similarity matrix between all visual and text tokens: [B, N_t, N_v]
    sim_matrix = torch.bmm(t_norm, v_norm.transpose(1, 2))
    # Text-to-image: For each word token, find maximum visual token similarity and average
    t2i_sim = sim_matrix.max(dim=-1).values.mean(dim=-1) # [B]
    return t2i_sim
Попробовать ответить на вопрос AI-тренеру

11Сравните раннее слияние (early fusion), позднее слияние (late fusion), промежуточное слияние (intermediate fusion), слияние с перекрестным вниманием (cross-attention fusion), вентилируемое слияние (gated fusion) и конкатенацию (concatenation) для мультимодальных моделей.

Стратегии мультимодального слияния (fusion) объединяют визуальные и языковые сигналы на различных уровнях глубины и структурных конфигураций: 1. **Раннее слияние (Early Fusion):** Сырые или низкоуровневые признаки (например, вложения фрагментов изображений и вложения токенов слов) объединяются на входном этапе и подаются в единую общую магистральную сеть. Это обеспечивает глубокие межмодальные взаимодействия с нулевого слоя, но является вычислительно затратным и затрудняет повторное использование мономодального предварительного обучения. 2. **Позднее слияние (Late Fusion):** Модальности обрабатываются независимо глубокими мономодальными магистральными сетями в глобальные векторы представления, которые объединяются только в самом конце с помощью простой агрегации (например, скалярного произведения, косинусного сходства или неглубокого многослойного перцептрона (MLP)). Это чрезвычайно эффективно и идеально подходит для индексируемого поиска, но не может улавливать мелкозернистые межмодальные взаимодействия. 3. **Промежуточное слияние (Intermediate Fusion):** Мономодальные магистральные сети обрабатывают входные данные в течение нескольких слоев, и слияние происходит на промежуточных этапах через общие слои или боковые связи, обеспечивая баланс между мономодальной специализацией и мультимодальным взаимодействием. 4. **Слияние с перекрестным вниманием (Cross-Attention Fusion):** Использует механизм многоголовочного внимания (multi-head attention), где одна модальность предоставляет запросы (queries), а другая — ключи (keys)/значения (values). Оно предлагает высокую репрезентативную способность с кондиционированием токен-к-токену, приспосабливаясь к гетерогенным длинам последовательностей. 5. **Вентилируемое слияние (Gated Fusion):** Использует обучаемые механизмы вентилей (например, сигмоидные или тангенциальные вентили) для динамического взвешивания вклада каждой модальности или слоя слияния на основе контекстуальной уверенности, предотвращая доминирование одной модальности или искажение предварительно обученных весов. 6. **Конкатенация (Concatenation):** Объединяет векторы признаков или последовательности токенов вдоль размерности признаков (конкатенация признаков) или размерности длины последовательности (конкатенация токенов перед унифицированным трансформером). Это простой и непараметрический метод, но конкатенация признаков требует выровненных пространственно-временных размерностей, в то время как конкатенация токенов масштабируется квадратично с общей длиной последовательности в механизме самовнимания (self-attention).

import torch
import torch.nn as nn
import torch.nn.functional as F

# 1. Concatenation along feature dimension
z_concat = torch.cat([img_feat, txt_feat], dim=-1) # [B, D_img + D_txt]

# 2. Gated Fusion
gate = torch.sigmoid(gate_layer(z_concat)) # [B, D]
z_gated = gate * img_proj + (1 - gate) * txt_proj

# 3. Late Fusion (Score level)
similarity = torch.sum(F.normalize(img_feat, dim=-1) * F.normalize(txt_feat, dim=-1), dim=-1)
Попробовать ответить на вопрос AI-тренеру

12Сравните модели извлечения на основе двух кодировщиков с кросс-кодировщиками для переранжирования для сопоставления изображений и текста с точки зрения способности к взаимодействию, точности и задержки.

Модели извлечения на основе двух кодировщиков (dual-encoder или би-кодировщики) и кросс-кодировщики для переранжирования представляют собой две различные парадигмы для сопоставления изображений и текста, демонстрируя фундаментальные компромиссы между способностью к взаимодействию, точностью и задержкой: 1. **Способность к взаимодействию:** - **Двухкодировщики (например, CLIP):** Обрабатывают изображение и текст через раздельные, независимые бэкбоны. Мультимодальное взаимодействие является строго поздним и поверхностным, ограниченным единственным скалярным произведением или косинусным сходством между глобально агрегированными векторами. Они не имеют межмодальных взаимодействий на уровне токенов. - **Кросс-кодировщики (например, UNITER, ViLT, мультимодальная ветвь ALBEF):** Конкатенируют визуальные и текстовые токены в общий трансформер или используют слои кросс-внимания. Каждый визуальный токен может взаимодействовать с каждым текстовым токеном на нескольких уровнях, обеспечивая глубокие межмодальные рассуждения. 2. **Точность:** - Двухкодировщики достигают более низкой точности при сложных композиционных запросах, пространственных отношениях, отрицании и сопоставлении детальных атрибутов из-за узкого места одно-векторных представлений. - Кросс-кодировщики достигают значительно более высокой точности в сложных, детальных и композиционных задачах сопоставления изображений и текста. 3. **Задержка и масштабируемость:** - Двухкодировщики позволяют предварительно вычислять и индексировать встраивания изображений в автономном режиме в векторной базе данных (например, Milvus, FAISS). Во время инференса кодируется только текстовый запрос, и поиск по миллионам кандидатов требует лишь легких приближенных скалярных произведений ближайшего соседа (ANN) (задержка менее миллисекунды). - Кросс-кодировщики требуют запуска полной совместной нейронной сети для каждой пары (изображение, текст) кандидатов во время запроса (O(N) прямых проходов для N кандидатов), что приводит к задержке на порядки выше и делает их вычислительно неподъемными для поиска на первом этапе по большим корпусам. В практических производственных системах стандартным является двухэтапный конвейер: двухкодировщик извлекает K лучших кандидатов (например, K=100) с низкой задержкой, за которым следует кросс-кодировщик, который переранжирует их для достижения высокой точности.

# Stage 1: Dual-Encoder First-Stage Retrieval (Fast, Vector Index)
query_emb = text_encoder(query_text) # [1, D]
# Cosine similarity over pre-indexed image embeddings [N, D]
scores = query_emb @ precomputed_image_embeddings.T # [1, N]
top_k_indices = torch.topk(scores, k=100).indices[0]

# Stage 2: Cross-Encoder Reranker (Accurate, Token Interaction)
candidate_images = [load_image(idx) for idx in top_k_indices]
rerank_scores = cross_encoder(candidate_images, [query_text] * 100) # Full cross-attention
final_ranking = top_k_indices[torch.argsort(rerank_scores, descending=True)]
Попробовать ответить на вопрос AI-тренеру

Вопросы для Senior

13Разработайте мультимодальную систему RAG (Retrieval-Augmented Generation) для PDF-файлов или руководств, содержащих текст, таблицы, диаграммы, скриншоты, схемы и встроенные изображения.

Сквозная мультимодальная система RAG (Retrieval-Augmented Generation) для сложных визуальных документов (PDF-файлов, руководств, отчетов) охватывает четыре основные архитектурные стадии: 1. **Прием данных и парсинг с учетом разметки:** Страницы PDF обрабатываются с помощью моделей документов, учитывающих разметку (например, LayoutLM, DocTR) или конвейеров визуального парсинга, для сегментации контента на структурированные блоки: текстовые фрагменты, структурированные таблицы (преобразованные в HTML/Markdown с объединением ячеек), визуализированные изображения диаграмм с рядами данных, а также отдельные схемы или скриншоты с пространственными ограничивающими рамками. 2. **Мультимодальное индексирование и двойное представление:** * **Визуальные активы (диаграммы, скриншоты, схемы):** Хранятся как обрезанные изображения с плотными мультимодальными встраиваниями (эмбеддингами) (например, SigLIP, CLIP или визуальные патч-токены ColPali) наряду с синтетическими текстовыми сводками и OCR-текстом (Optical Character Recognition), сгенерированным VLM (Vision-Language Model), и хранятся в плотном текстовом индексе. * **Таблицы:** Хранятся как структурированные Markdown/HTML в текстовых векторных и BM25-индексах. * **Текст:** Разделен на фрагменты по семантическим разделам и индексирован с помощью плотных встраиваний и разреженных ключевых слов. 3. **Гибридный поиск и мультимодальное переранжирование:** * **Поиск на первом этапе:** Осуществляется параллельный поиск по разреженным BM25-индексам (ключевые слова, OCR-текст, разметка таблиц), плотным текстовым векторам и индексам визуальных встраиваний (ANN-поиск (Approximate Nearest Neighbor)). * **Слияние и переранжирование:** Объединяет кандидатов (например, с помощью Reciprocal Rank Fusion) и оценивает лучшие элементы с помощью мультимодального кросс-энкодера или модели позднего визуального взаимодействия (оценка текста запроса по отношению к обрезанным изображениям высокого разрешения и разобранному тексту). 4. **Сбор мультимодального контекста и обоснованная генерация:** Мультимодальный контекст из топ-$k$ элементов — визуализированные фрагменты изображений, схемы таблиц и текстовые фрагменты с метаданными документа/страницы — передается в VLM (Vision-Language Model), настроенную для следования инструкциям (например, GPT-4o, Claude 3.5 Sonnet или открытая Qwen2-VL). Промпт генерации обеспечивает проверку происхождения источника, требуя явных ссылок (номера страниц, номера рисунков или ограничивающие рамки).

from dataclasses import dataclass
from typing import Optional, List

@dataclass
class MultimodalChunk:
    chunk_id: str
    document_id: str
    page_number: int
    modality_type: str  # 'text', 'table', 'chart', 'diagram'
    text_payload: str   # Raw text or structured Markdown/HTML
    vlm_caption: Optional[str] = None  # Synthetic summary of visual content
    bbox: Optional[List[float]] = None  # [x0, y0, x1, y1]
    image_crop_path: Optional[str] = None
    dense_embedding: Optional[List[float]] = None

# Indexing strategy: Text search covers text_payload + vlm_caption;
# Multimodal search matches dense_embedding or visual tokens.
Попробовать ответить на вопрос AI-тренеру

14Объясните, как оценка мультиканальной генерации с дополненным поиском (RAG) должна отдельно измерять качество извлечения, использование доказательств, происхождение данных и точность окончательного ответа.

Оценка мультиканального RAG (Retrieval Augmented Generation) требует декомпозиции системы на четыре независимых измерения для выявления того, где возникают ошибки: в извлечении, потреблении контекста, точности цитирования или генерации: 1. **Качество извлечения**: Оценивает, насколько компонент извлечения (retriever) находит необходимые визуальные и текстовые фрагменты. Ключевые метрики включают мультиканальные Recall@K, NDCG@K и MRR. Для визуальных элементов это также включает Visual IoU (Intersection over Union) / Полноту по ограничивающим рамкам (Bounding-Box Recall) (содержит ли извлеченная вырезка изображения соответствующую диаграмму/график) и Баланс полноты по модальностям (Modality Recall Balance) (обеспечение того, что нетекстовые модальности, такие как таблицы и графики, не пропускаются систематически). 2. **Использование доказательств (достаточность и необходимость)**: Измеряет, действительно ли модель генерации опирается на извлеченные мультиканальные доказательства, а не генерирует ответы исключительно из параметрической памяти. Это измеряется с помощью Релевантности контекста (точность извлеченных визуальных/текстовых токенов, подтверждающих вопрос), Необходимости доказательств / Абляционного тестирования (маскирование или удаление извлеченного графика/таблицы для проверки того, испортится ли ответ) и анализа атрибуции перекрестного внимания. 3. **Происхождение и точность цитирования**: Измеряет, являются ли указания на источники точными и поддающимися проверке. Оценивается с помощью Precision, Recall и F1-меры для цитат (имена документов, номера страниц, идентификаторы рисунков или координаты ограничивающих рамок). Автоматические проверки подтверждают, что цитируемая ограничивающая рамка или страница фактически содержит эталонные доказательства, необходимые для ответа на вопрос. 4. **Точность и корректность окончательного ответа**: * **Достоверность / Обоснованность (Faithfulness / Grounding)**: Оценивает, следует ли каждое сгенерированное утверждение из извлеченного мультиканального контекста без галлюцинаций (обычно оценивается с помощью VLM (Visual Language Model) в качестве оценщика, проверяющего логическое следование утверждений по отношению к текстовым и визуальным вырезкам). * **Фактическая корректность (Factual Correctness)**: Оценивает, соответствует ли сгенерированный ответ эталонным данным. * **Надежность при отказе (Refusal Robustness)**: Проверяет, правильно ли модель отказывается отвечать, когда извлеченный контекст нерелевантен или противоречив.

# Evaluation record schema for a single Multimodal RAG query:
eval_record = {
    'retrieval_quality': {
        'hit_at_k': True,          # Top-3 chunks contain target diagram
        'visual_bbox_iou': 0.85    # Retrieved crop overlap with true figure region
    },
    'evidence_utilization': {
        'necessity_ablation_passed': True  # Removing chart causes answer to fail
    },
    'provenance': {
        'page_match': True,        # Cited Page 12 (Ground Truth Page 12)
        'figure_id_match': True    # Cited 'Figure 4'
    },
    'faithfulness': {
        'claim_entailment_score': 1.0,  # All claims entailed by context
        'hallucination_detected': False
    }
}
all_passed = all(all(metrics.values()) for metrics in eval_record.values())
print(f'System passes all decoupled checks: {all_passed}')
Попробовать ответить на вопрос AI-тренеру

15Обсудите обновление производственных мультиканальных моделей извлечения, когда эмбеддинги галереи и индексы должны обновляться в большом масштабе.

Обновление мультиканальной системы извлечения в большом масштабе представляет проблему дрейфа представлений: вновь сгенерированные эмбеддинги находятся в другом геометрическом латентном пространстве и не могут быть напрямую сравнены с существующими эмбеддингами галереи без серьезного ухудшения полноты (recall). Следовательно, обновления без простоя требуют либо развертываний blue/green с двойным индексом, либо обучения совместимости (такого как обратно-совместимое обучение или адаптеры преобразования), либо поэтапных конвейеров переиндексации. В стандартном рабочем процессе переиндексации blue/green офлайн-пакетные задания вычисляют новые эмбеддинги по всей галерее и строят новый векторный индекс (такой как HNSW или IVF). Пока выполняется перестроение, живой поисковый трафик продолжает запрашивать активный устаревший индекс. Новые входящие элементы обрабатываются с помощью двойной записи (dual-writing) или потоковых журналов захвата измененных данных (CDC (Change Data Capture)), чтобы оба индекса оставались актуальными. После того как новый индекс проверен с помощью теневого трафика (shadow traffic) и разогрет в памяти, трафик атомарно переключается на новый кодировщик и индекс, после чего старый индекс выводится из эксплуатации. В качестве альтернативы, обратно-совместимое обучение ограничивает новый кодировщик запросов для выравнивания с пространством устаревшей галереи, что позволяет немедленно обновлять модель запросов, асинхронно заполняя галерею с течением времени.

class MultimodalRetrievalRouter:
    def __init__(self, v1_service, v2_service, dual_write=True):
        self.v1 = v1_service  # Model v1 + Index v1
        self.v2 = v2_service  # Model v2 + Index v2
        self.active_version = "v1"
        self.dual_write = dual_write

    def search(self, query_multimodal):
        # Route query strictly to the encoder matching the active index
        if self.active_version == "v1":
            return self.v1.search(query_multimodal)
        return self.v2.search(query_multimodal)

    def ingest_new_item(self, item):
        # Dual-write during migration window so the new index is up-to-date at cutover
        self.v1.index_item(item)
        if self.dual_write and self.v2.is_ready_for_ingest:
            self.v2.index_item(item)
Попробовать ответить на вопрос AI-тренеру