多模态大模型(Multimodal LLM / VLM)¶
面试高频考点¶
- 多模态模型的两条主流技术路线是什么?
- 视觉编码器(CLIP/SigLIP)如何与 LLM 对齐?
- 高分辨率图像如何处理?动态分辨率方案是什么?
- 早期融合(Early Fusion)和晚期融合(Late Fusion)的区别?
- 为什么说 GPT-4o 是"原生多模态"?
- 视频理解为什么比图像理解更难?
一、技术路线全景¶
细化理解: 多模态模型的核心是把视觉、音频或视频信号对齐到语言模型可理解的表示空间。常见路线包括视觉编码器 + projector + LLM、原生多模态 token 化、以及面向视频的帧采样和时序建模。难点在于细粒度定位、OCR、空间关系和跨模态指令跟随。
2025 年多模态 LLM 已从"给 LLM 加视觉插件"进化为原生 Any-to-Any 架构。两条主流路线:
graph TB
subgraph 路线一_Connector_桥接
IMG1[图像] --> VE1[Vision Encoder<br/>CLIP/SigLIP<br/>冻结]
VE1 --> PROJ[Projector<br/>MLP / Q-Former]
TEXT1[文本] --> TE1[Text Tokenizer]
PROJ --> LLM1[LLM<br/>可微调]
TE1 --> LLM1
LLM1 --> OUT1[文本输出]
end
subgraph 路线二_早期融合_Omni
IMG2[图像] --> VT[视觉 Tokenizer]
TEXT2[文本] --> TT[文本 Tokenizer]
AUDIO2[语音] --> AT[语音 Tokenizer]
VT --> UT[统一 Transformer<br/>全模态联合预训练]
TT --> UT
AT --> UT
UT --> OUT2[文本/图像/语音输出]
end
style LLM1 fill:#7c6af7,color:#fff
style UT fill:#f472b6,color:#fff
style PROJ fill:#5eead4,color:#000
| 维度 | 路线一:Connector 桥接 | 路线二:早期融合(Omni) |
|---|---|---|
| 代表模型 | LLaVA, InternVL, Qwen-VL | GPT-4o, Gemini 2.0, Chameleon |
| 视觉编码器 | 独立(CLIP/SigLIP,通常冻结) | 内嵌在统一模型中 |
| 训练成本 | 低(可冻结大部分参数) | 高(全模态联合预训练) |
| 输入支持 | 图像 + 文本 | 任意模态组合 |
| 输出支持 | 仅文本 | 任意模态(文/图/音) |
| 灵活性 | 可独立升级视觉/语言模块 | 紧耦合,但交互更自然 |
| 当前主流 | 开源生态主流 | 闭源前沿模型走向 |
二、连接器桥接(Connector-based)详解¶
LLaVA 风格架构¶
细化理解: LLaVA 风格架构通常用 CLIP/ViT 提取图像特征,再通过投影层连接到 LLM,最后用图文指令数据对齐。它结构清晰、成本相对低,但视觉细节受编码器分辨率和训练数据影响很大。面试时可以把它概括为“视觉特征作为软提示输入语言模型”。
graph LR
IMG[图像 224×224] --> CLIP[CLIP ViT-L<br/>冻结]
CLIP --> FEAT[576个视觉特征<br/>每个4096维]
FEAT --> MLP[2层 MLP<br/>Projector<br/>训练]
MLP --> TOK[576个视觉 Token<br/>与文本Token同维度]
TXT[请描述这张图] --> EMBED[Text Embedding]
EMBED --> TOK_T[文本 Token]
TOK --> CONCAT[拼接]
TOK_T --> CONCAT
CONCAT --> LLM[LLM<br/>Vicuna/LLaMA]
LLM --> OUT[图中是一只猫...]
style CLIP fill:#94a3b8,color:#fff
style MLP fill:#5eead4,color:#000
style LLM fill:#7c6af7,color:#fff
# LLaVA 的核心:把视觉特征"翻译"成 LLM 能理解的 token
class LLaVA(nn.Module):
def __init__(self):
self.vision_encoder = CLIPVisionModel.from_pretrained(...) # 冻结
self.projector = nn.Sequential(
nn.Linear(1024, 4096), # CLIP 1024 → LLaMA 4096
nn.GELU(),
nn.Linear(4096, 4096)
)
self.llm = LlamaForCausalLM.from_pretrained(...)
def forward(self, image, text_ids):
# 1. 图像 → 视觉特征
vision_features = self.vision_encoder(image) # [B, 576, 1024]
# 2. 视觉特征 → LLM Token 空间
vision_tokens = self.projector(vision_features) # [B, 576, 4096]
# 3. 与文本 token 拼接
text_embeddings = self.llm.embed_tokens(text_ids)
combined = torch.cat([vision_tokens, text_embeddings], dim=1)
# 4. 送入 LLM
return self.llm(inputs_embeds=combined)
三、视觉编码器对比¶
graph TD
A[视觉编码器选择] --> B[CLIP ViT<br/>2021]
A --> C[SigLIP<br/>2023]
A --> D[DINOv2<br/>2023]
B --> B1[图文对比学习<br/>InfoNCE Loss]
B --> B2[强语义对齐]
B --> B3[使用: LLaVA, BLIP-2]
C --> C1[Sigmoid Loss<br/>不用 softmax]
C --> C2[支持任意 batch<br/>性能更强]
C --> C3[使用: InternVL, PaliGemma]
D --> D1[纯自监督<br/>无需文本]
D --> D2[空间特征丰富]
D --> D3[使用: 检测/分割]
style B fill:#7c6af7,color:#fff
style C fill:#5eead4,color:#000
style D fill:#fbbf24,color:#000
| 编码器 | 训练方式 | 优势 | 短板 | 主要使用 |
|---|---|---|---|---|
| CLIP ViT | 图文对比学习(InfoNCE) | 强语义对齐,多语言支持好 | softmax 受 batch size 限制 | LLaVA, BLIP-2 |
| SigLIP | Sigmoid 损失 | 任意 batch size, 更强性能 | 较新,生态尚在建设 | InternVL, PaliGemma |
| DINOv2 | 纯自监督(无文本) | 空间特征丰富,适合检测分割 | 缺乏语义对齐 | 检测/分割任务为主 |
四、高分辨率图像处理¶
问题:标准 ViT 难处理高分辨率¶
CLIP ViT 通常在 224×224 或 336×336 训练
如果输入 1024×1024 的高清图:
① 直接 resize 到 224 → 文字、细节全糊
② 直接喂给 ViT → 位置编码不匹配,效果崩
但很多任务需要高分辨率:
- OCR:识别图片中的文字
- 图表理解:精确读取数值
- 医学影像:肿瘤等微小特征
- 文档理解:表格、字段对齐
动态分辨率(InternVL/Qwen-VL 方案)¶
graph TD
IMG[高分辨率图像<br/>例如 1280×960] --> SPLIT{自适应切片<br/>选择最佳比例}
SPLIT --> T1[Tile 1<br/>448×448]
SPLIT --> T2[Tile 2<br/>448×448]
SPLIT --> T3[Tile 3<br/>448×448]
SPLIT --> T4[Tile 4<br/>448×448]
SPLIT --> T5[Tile 5<br/>448×448]
SPLIT --> T6[Tile 6<br/>448×448]
SPLIT --> THUMB[缩略图<br/>448×448<br/>提供全局信息]
T1 --> VE[ViT 独立编码]
T2 --> VE
T3 --> VE
T4 --> VE
T5 --> VE
T6 --> VE
THUMB --> VE
VE --> CAT[拼接所有 Token]
CAT --> LLM[LLM]
style IMG fill:#f472b6,color:#fff
style THUMB fill:#fbbf24,color:#000
style LLM fill:#7c6af7,color:#fff
关键点: - 切片之间无 Attention 交互(独立编码降低算力) - 加入"缩略图 token"提供全局上下文(防止 LLM 看不到整体) - LLM 通过位置 token 或特殊分隔符理解切片的空间关系
InternVL 2.5 在 OCR 任务上的效果¶
固定 336×336 分辨率: ✗ 长文档/小字识别失败
动态切片(最多 12 个 tile): ✓ OCR 精度接近商用引擎
✓ 图表数值读取准确
✓ 文档表格结构理解
五、Q-Former(BLIP-2 风格)¶
graph LR
IMG[图像] --> VE[ViT]
VE --> VF[视觉特征<br/>~1000个 Token]
Q[32个可学习<br/>查询向量] --> CA[Cross-Attention]
VF --> CA
CA --> OUT[32个视觉 Token<br/>固定数量]
OUT --> LLM[LLM]
style Q fill:#5eead4,color:#000
style CA fill:#fbbf24,color:#000
style LLM fill:#7c6af7,color:#fff
传统 LLaVA:图像 → 576 个视觉 Token → 占用大量上下文
Q-Former:图像 → 32 个固定 Token → 上下文压力小
Q-Former 优点:
- 视觉 Token 数量固定(与图像分辨率无关)
- LLM 上下文压力小,可处理多图输入
Q-Former 缺点:
- 信息压缩损失,不适合 OCR/细粒度任务
- 32 个 token 难以编码复杂场景
适用场景:图像描述、视觉问答等"粗粒度"任务。OCR/细粒度任务推荐用动态分辨率方案。
六、多模态对齐训练阶段¶
LLaVA 等模型通常分三阶段训练:
graph LR
A[Stage 1<br/>特征对齐] --> B[Stage 2<br/>视觉指令微调]
B --> C[Stage 3<br/>RLHF/DPO 对齐]
A1[训练数据:<br/>图文对<br/>~500K] --> A
A2[冻结:<br/>LLM + Vision] --> A
A3[训练:<br/>仅 Projector] --> A
B1[训练数据:<br/>视觉指令<br/>~700K] --> B
B2[冻结:<br/>Vision Encoder] --> B
B3[训练:<br/>Projector + LLM] --> B
C1[训练数据:<br/>人类偏好] --> C
C2[训练:<br/>整体对齐] --> C
style A fill:#5eead4,color:#000
style B fill:#fbbf24,color:#000
style C fill:#f472b6,color:#fff
| 阶段 | 训练数据 | 冻结 | 目标 |
|---|---|---|---|
| Stage 1:特征对齐 | 图文对(如 LAION-558K) | LLM + Vision Encoder | 训练 Projector 把视觉特征"翻译"成 LLM 语言 |
| Stage 2:指令微调 | 视觉指令数据(GPT-4 生成) | Vision Encoder | 联合训练 Projector + LLM,学会回答视觉问题 |
| Stage 3(可选):RLHF | 视觉对话偏好数据 | - | 提升对话质量、安全性、视觉幻觉缓解 |
七、视频理解的额外挑战¶
视频 = 时序图像序列 + 音频,但简单"把视频拆成帧"会爆炸:
1 分钟视频 @ 1fps = 60 帧
每帧 256 个视觉 token
总计 60 × 256 = 15,360 token
如果 5 分钟视频 = 76,800 token,已经超出常规 LLM 上下文
更不用说细粒度的 30fps 视频
主流解决方案¶
graph TD
V[视频输入] --> S{帧采样策略}
S --> US[均匀采样<br/>简单但漏关键帧]
S --> KF[关键帧检测<br/>基于场景变化]
S --> DS[密集采样<br/>需要时序压缩]
KF --> TC[时序 Token 压缩<br/>多帧合并为少量 Token]
DS --> TC
TC --> SA[稀疏注意力<br/>降低 token 间 attention 成本]
SA --> LLM[LLM]
style V fill:#f472b6,color:#fff
style TC fill:#5eead4,color:#000
style LLM fill:#7c6af7,color:#fff
| 策略 | 描述 | 代表 |
|---|---|---|
| 均匀采样 | 每 N 秒取 1 帧 | 简单基线,常用于评测 |
| 关键帧检测 | 用 SAM 等模型识别场景变化 | LLaVA-Video |
| 时序 Token 压缩 | 多帧 token 在时间维度池化/聚合 | Video-ChatGPT |
| 时序 Attention | 在时间维度做轻量 Attention 学习时序关系 | Qwen2.5-VL |
| 专门时序模块 | 用 TimeSformer 等替代静态 ViT | InternVideo |
八、当前 SOTA 模型对比(2025)¶
| 模型 | 开源 | 参数量 | 上下文 | 输出模态 | 特色 |
|---|---|---|---|---|---|
| GPT-4o | 否 | - | 128K | 文/图/音 | 原生 Any-to-Any,实时语音 |
| Gemini 2.0 Flash | 否 | - | 1M | 文/图/音/视频 | 超长上下文 + 原生视频 |
| Claude 3.5 Sonnet | 否 | - | 200K | 文 + 图理解 | 视觉推理强 |
| InternVL 2.5 | 是 | 1B-78B | 32K | 文 | 开源最强 VLM,动态分辨率 |
| Qwen2.5-VL | 是 | 3B-72B | 128K | 文 | 中文好,视频理解强 |
| LLaMA 3.2 Vision | 是 | 11B/90B | 128K | 文 | Meta 开源 VLM |
| MiniCPM-V 2.6 | 是 | 8B | 32K | 文 | 端侧最强,OCR 出色 |
| DeepSeek-VL2 | 是 | 28B MoE | 32K | 文 | MoE + 视觉 |
九、面试延伸¶
Q:为什么视觉 Token 数量很重要?
每张图片通常生成 256-4096 个 token,直接占用 LLM 上下文窗口。例如:① 8K 上下文模型,输入 4 张图片(每张 1024 token)就用掉一半上下文;② 视觉 token 越多 → KV Cache 越大 → 推理延迟越高、显存压力越大。所以 Q-Former(固定 32 token)、动态分辨率(按需切片)、视觉 token 压缩等技术都很重要。生产环境中通常按场景选:粗粒度任务用 Q-Former 风格压缩、细粒度(OCR/图表)用动态切片。
Q:多模态模型为什么在 OCR 和图表理解上困难?
文字和图表识别需要像素级的高分辨率感知:① 标准 ViT 训练分辨率(224/336)下,小字直接变模糊;② ViT 的 patch(如 14×14 像素)粒度对单个字符来说太大;③ CLIP 等编码器的预训练目标是"语义对齐",不是精确字符识别。解决路径:动态分辨率切片 + 更大的视觉编码器 + OCR 专项训练数据。InternVL/Qwen-VL 的 OCR 能力强主要靠这条路线。
Q:语音模态通常如何加入?
两种方式:① 桥接方式:Whisper 等 ASR 模型提取声学特征,通过 Projector(类似视觉的 MLP)映射到 LLM token 空间,与文本 token 拼接(如 LLaSM、Qwen-Audio)。② 原生方式:把语音离散化为 token(用 codec 模型),与文本 token 联合训练一个统一 Transformer(如 GPT-4o 的语音模式、Moshi)。桥接方式实现简单但延迟高(先 ASR 再 LLM),原生方式延迟低但训练成本高。
Q:为什么 GPT-4o 被称为"原生多模态"?
"原生"指的是同一个 Transformer 在 token 级别处理多模态,而不是用桥接器把各模态外挂到 LLM 上。具体表现:① 语音输入端到端处理(不先 ASR),延迟 ~320ms(人类反应级别);② 可以直接输出语音(不依赖 TTS);③ 训练时是图/文/音联合预训练,而非"先训语言模型再加多模态"。代价是训练成本极高,目前只有几家头部公司能做到。
原始论文¶
| 论文 | 链接 |
|---|---|
| CLIP (Radford et al., 2021) | arxiv.org/abs/2103.00020 |
| LLaVA (Liu et al., NeurIPS 2023) | arxiv.org/abs/2304.08485 |
| BLIP-2 / Q-Former (Li et al., ICML 2023) | arxiv.org/abs/2301.12597 |
| InternVL 2.5 (Chen et al., 2024) | arxiv.org/abs/2412.05271 |
| SigLIP (Zhai et al., ICCV 2023) | arxiv.org/abs/2303.15343 |
| Chameleon: Mixed-Modal Early-Fusion (Meta, 2024) | arxiv.org/abs/2405.09818 |
| LLaVA-OneVision: Easy Visual Task Transfer (2024) | arxiv.org/abs/2408.03326 |
| LLaVA-Video: Learning Video Representations (2024) | arxiv.org/abs/2410.02713 |
| Qwen2.5-VL: Expanding Horizons for Vision-Language Models (2025) | arxiv.org/abs/2502.13923 |
| InternVL3: Advanced Training for Multimodal Models (2025) | arxiv.org/abs/2504.10479 |
官方仓库¶
| 项目 | 链接 |
|---|---|
| LLaVA GitHub | github.com/haotian-liu/LLaVA |
| InternVL GitHub | github.com/OpenGVLab/InternVL |
延伸阅读与视频¶
| 平台 | 标题 | 说明 |
|---|---|---|
| 📺 B站 | 多模态大模型LLaVA模型讲解——transformers源码解读 | 4万播放,LLaVA架构源码级深度解析 |
| 📖 GitHub | OpenGVLab InternVL | InternVL 官方项目页与模型资料 |
| 📖 GitHub | LLaVA | LLaVA 官方项目页,理解视觉编码器 + LLM 路线 |
| 📺 B站 | 【AI大模型-LLM多模态视觉大模型精讲教程 全40集】 | 1.8万播放,系统完整的多模态学习课程 |