多模态 Agent 如何理解视觉信息并生成自然语言?请描述完整的信息流。
1️⃣ 考察意图
面试官想确认你是否真正理解 VLM 的端到端信息流,而非只会说"ViT 编码图像、LLM 生成文本"。刁钻点在于:很多人说不清视觉特征如何"变成"LLM 能理解的 token,以及在这个转换过程中信息是如何被压缩和变换的。答好了能展示你对多模态信息流的系统性理解。
2️⃣ 标准答
多模态 Agent 从图像输入到文本输出,经历五个阶段:
1. 图像预处理
- 输入图像(如 JPEG/PNG)被 resize 到固定分辨率(如 224×224 或 448×448)
- 归一化:像素值从 [0,255] 归一化到 [-1,1](CLIP 标准)或 [0,1]
- 数据增强(训练时):随机裁剪、颜色抖动、水平翻转
2. 视觉编码(ViT Encoding)
- 图像被切分为 patch(如 16×16 像素),224×224 图像产生 196 个 patch
- 每个 patch 经线性投影(Patch Embedding)变成 1024 维向量(ViT-L 的 hidden size)
- 加入 position embedding(告知模型每个 patch 的空间位置)
- 送入 Transformer Encoder(24 层 for ViT-L),通过 self-attention 交互
- 输出:196 个 1024 维的视觉 token
3. 模态桥接(Modality Bridging)
- 视觉 token(1024 维)通过投影层(MLP/线性)映射到 LLM 的词嵌入空间(如 4096 维 for Vicuna-7B)
- 映射后的视觉 token 与文本 token 拼接:
[视觉token_1, ..., 视觉token_196, 文本token_1, ..., 文本token_N] - 这一步是"跨空间映射"——将视觉表征空间的特征变换到语言表征空间
4. 多模态理解(LLM Reasoning)
- 拼接后的 token 序列送入 LLM(如 Vicuna-7B,32 层 Transformer)
- LLM 通过 self-attention 让视觉 token 和文本 token 交互——文本 token 可以 attend 到视觉 token,理解"图像中有猫"这个信息
- LLM 基于视觉+文本的综合理解,进行推理和决策
5. 自回归生成(Autoregressive Decoding)
- LLM 逐 token 生成输出文本,每一步都 attend 到之前的所有 token(包括视觉 token)
- 生成过程:
P(y_t | y_{<t}, visual_tokens, text_prompt) - 生成结束条件:遇到 EOS token 或达到最大长度
信息流中的关键信息损失点:
- Patch 切分:16×16 patch 会丢失亚像素级细节(如小文字)
- 视觉编码:ViT 的 self-attention 压缩了空间信息(196 patch → 196 token,但语义已经高度抽象化)
- 模态桥接:投影层可能丢失部分视觉细节(尤其是低频信息)
- LLM 上下文限制:如果视觉 token 过多(如 256+),会挤占文本 token 的空间
3️⃣ 答题模板(30 秒电梯版)
"多模态 Agent 信息流分五步。第一步图像预处理——resize+归一化。第二步 ViT 编码——图像切 16×16 patch,线性投影成 token,送入 Transformer,输出 196 个视觉 token。第三步模态桥接——投影层把视觉 token 从视觉空间映射到 LLM 词嵌入空间,与文本 token 拼接。第四步 LLM 推理——self-attention 让视觉和文本 token 交互,理解图像内容。第五步自回归生成——逐 token 生成文本,每步都 attend 到视觉 token。关键信息损失在 patch 切分和模态桥接。"
4️⃣ 高频追问 & 应对
追问 1:视觉 token 在 LLM 推理时一直保留吗?多轮对话会不会越来越慢?
视觉 token 在多轮对话中的处理取决于 KV cache 策略。默认情况下,视觉 token 的 KV cache 会一直保留在内存中,每轮对话都能 attend 到图像。但这会导致:(1) 内存增长——196 个视觉 token 的 KV cache 约 196×4096×2×32×2 = 100MB(FP16),10 轮对话后累积到 1GB;(2) 推理变慢——attention 计算量与序列长度成正比。优化方案:如果对话已经不需要图像参考(如用户转向纯文本话题),可以"驱逐"视觉 token 的 KV cache,释放内存。但需要保留"图像摘要"(如 1-2 个 token 的图像描述)以备后续参考。
追问 2:为什么不用 CNN 提取特征后直接送入 LLM,非要转成 token?
两个原因:(1) 架构不兼容——CNN 输出的是空间特征图 [H,W,C],LLM 期望的是 token 序列 [N, D]。虽然可以 flatten 成 [H×W, C],但 C 和 D 维度不同需要投影,且 flatten 后空间关系丢失;(2) 交互方式不同——CNN 的卷积是局部的(3×3 kernel),LLM 的 self-attention 是全局的。ViT 和 LLM 共享 self-attention 机制,视觉 token 可以自然地与文本 token 交互。直接用 CNN 特征需要额外的 cross-attention 层来做交互(如 Flamingo 的设计),架构更复杂。
追问 3:视觉 token 和文本 token 在 attention 中是平等的,还是有某种优先级?
在标准 VLM 中是平等的——self-attention 不区分视觉 token 和文本 token,每个 token 都可以 attend 到所有其他 token。但实验发现,LLM 倾向于更多 attend 到文本 token(尤其是 instruction token),视觉 token 的 attention 权重相对较低。这可能导致"视觉信息利用不足"。改进方案:(1) 视觉 token 加 bias——在 attention 计算中给视觉 token 加一个可学习的 bias,提高其被 attend 的概率;(2) 分层 attention——浅层更多关注视觉 token(理解图像),深层更多关注文本 token(生成语言)。LLaVA 的实验:加视觉 bias 后 VQA v2 提升 1.5%。
5️⃣ 避坑 · 常见错误答法
- ❌ "ViT 直接输出文本描述,LLM 再基于描述生成回答" → ✅ "ViT 输出的是视觉 token(数值向量),不是文本。视觉 token 通过投影层映射到 LLM 空间,与文本 token 拼接后一起送入 LLM。LLM 直接处理视觉+文本 token,不需要中间文本描述。"
- ❌ "视觉和文本是分开处理再合并的" → ✅ "视觉 token 和文本 token 在 LLM 中是统一处理的——通过 self-attention 交互。没有'分开处理再合并'的步骤,而是从一开始就拼接在一起送入 LLM。"
- ❌ "图像越大效果越好" → ✅ "图像越大 patch 越多,计算量 O(N²) 爆炸。需要在分辨率和计算成本之间平衡。224×224(196 token)是经验最优值,更高分辨率只在密集视觉任务(OCR)中有收益。"
6️⃣ 简历呼应
- 如果你有 VLM 项目:从"信息流优化"切入,描述你如何通过 KV cache 释放或视觉 token 压缩优化了多轮对话的延迟和内存
- 如果你只做过 NLP:用"encoder-decoder 架构"类比——ViT encoder 到 LLM decoder 的信息流类似于机器翻译中 source encoder 到 target decoder 的 cross-attention
- 如果你是校招无项目:用 LLaVA 的可视化工具(如 attention map 可视化)分析 LLM 如何 attend 到视觉 token,写一篇博客
- "Visual Instruction Tuning" (Liu et al., 2023, LLaVA)
- "An Image is Worth 16x16 Words" (Dosovitskiy et al., 2021, ViT)
- "Attention Is All You Need" (Vaswani et al., 2017)