多模态大模型硬核解析:从 CLIP 到 LLaVA,图像是如何“喂”给语言模型的?
前言
大语言模型本质上只能处理 token,也就是离散文本序列。但现在很多模型已经可以“看图说话”,例如识别图片内容、回答图像问题、理解图表、解析截图,甚至根据 UI 截图生成操作建议。
这类系统属于 AI 细分领域中的一个重要方向:视觉语言多模态大模型(Vision-Language Large Model,VLLM)。
很多人以为多模态模型就是“把图片和文字一起输入给大模型”,但真正的难点在于:
图像是连续高维像素,语言模型只懂 token,二者的表示空间完全不同,如何对齐?
本文就从工程和模型结构角度,拆解多模态大模型的关键技术路线:视觉编码器、图像 patch、投影层、视觉 token、视觉语言对齐、指令微调。典型代表模型包括 CLIP、BLIP、LLaVA、Qwen-VL、MiniGPT-4 等。
一、为什么语言模型不能直接读图片?
语言模型的输入通常是文本 token,例如:
text
用户:这张图片里有什么?
经过 tokenizer 后变成 token id:
text
[1251, 392, 8472, ...]
然后进入 Embedding 层,映射成向量。
但是图片不是 token,而是一个三维张量:
text
image: [H, W, C]
例如一张 224×224 的 RGB 图片:
text
[224, 224, 3]
它包含的是像素值,不具备自然语言中的词序结构。因此不能直接把图片送进 LLM。
多模态大模型的核心任务就是:
把图片转换成语言模型能够理解的“视觉 token”。
二、CLIP:视觉语言对齐的起点
理解多模态大模型,必须先理解 CLIP。
CLIP 的核心思想是:用大量图文对训练两个编码器:
- Image Encoder:编码图片
- Text Encoder:编码文本
训练目标是让匹配的图文向量相似,不匹配的图文向量远离。
例如:
text
图片:一只狗在草地上奔跑文本:a dog running on the grass
模型会把图片和文本分别编码为向量,然后计算相似度。训练完成后,CLIP 的图像编码器就具备了很强的语义理解能力。
CLIP 最重要的贡献不是生成文本,而是提供了一个高质量的视觉语义表示空间。后续很多多模态大模型都会直接使用 CLIP ViT 作为视觉编码器。
三、ViT 如何把图片变成 patch token?
现代多模态模型中常用的视觉编码器是 ViT(Vision Transformer)。
ViT 的处理方式和 CNN 不同。它会把图片切成一个个小块,也就是 patch。
例如输入图片大小为 224×224,patch size 为 14:
text
224 / 14 = 16
那么整张图片会被切成:
text
16 × 16 = 256 个 patch
每个 patch 被拉平成向量,再经过线性映射,得到一个 patch embedding。于是图片就变成了类似文本 token 的序列:
text
[patch_1, patch_2, patch_3, ..., patch_256]
这一步非常关键,因为 Transformer 擅长处理序列。通过 patch 化,图片被转成了一个视觉 token 序列。
ViT 后续会通过多层 Transformer 编码这些 patch token,最终输出视觉特征:
text
image_features: [num_patches, vision_hidden_size]
例如:
text
[256, 1024]
四、视觉特征为什么不能直接给 LLM?
即使 ViT 已经输出了图像特征,也不能直接送入语言模型。原因是视觉编码器和语言模型的 hidden size 通常不同。
例如:
text
CLIP ViT hidden size = 1024LLaMA hidden size = 4096
维度不一致,无法直接拼接。
更重要的是,视觉特征所在的语义空间和语言模型 token embedding 空间也不一致。即使强行投影维度,LLM 也未必理解这些向量代表什么。
因此需要一个模块进行对齐,这就是多模态模型中的核心组件:Projector,视觉投影层。
五、Projector:把视觉 token 映射到语言空间
Projector 的作用是:
text
视觉特征空间 -> 语言模型 embedding 空间
最简单的 projector 是一个线性层:
python
visual_tokens = Linear(vision_hidden, llm_hidden)(image_features)
更常见的是 MLP:
python
visual_tokens = MLP(image_features)
例如 LLaVA 中使用的 projector 就是一个小型 MLP,把 CLIP 输出的视觉特征映射到 LLaMA 的 embedding 维度。
经过 projector 后,图片就被转换成语言模型可以接收的视觉 token:
text
[visual_token_1, visual_token_2, ..., visual_token_256]
然后可以和文本 token embedding 拼接:
text
[<image>, visual_tokens, 用户问题 tokens]
最终送入 LLM。
这就是“图像喂给语言模型”的核心路径。
六、LLaVA 的整体结构
LLaVA 是非常典型的视觉语言模型,其结构可以简化为:
text
Image -> CLIP ViT -> Projector -> Visual TokensText -> Tokenizer -> Text TokensVisual Tokens + Text Tokens -> LLaMA -> Answer
也就是说:
- 图片进入 CLIP 视觉编码器
- 得到 patch-level 图像特征
- 通过 projector 映射到 LLM hidden size
- 与文本 token embedding 拼接
- 送入 LLaMA 生成回答
这里要注意,LLaVA 并不是从零训练整个系统。通常它会:
- 使用预训练 CLIP 作为视觉编码器
- 使用预训练 LLaMA/Vicuna 作为语言模型
- 重点训练 projector 和部分指令对齐能力
这样成本远低于从头训练一个多模态大模型。
七、多模态训练通常分两阶段
多模态模型不是简单拼接就能用,必须经过训练对齐。常见训练分两阶段。
1. 视觉语言对齐预训练
第一阶段通常冻结视觉编码器和语言模型,只训练 projector。
训练数据是图文对,例如:
text
图片 -> 描述文本
目标是让 projector 学会把图像特征映射到语言模型能理解的空间。
这个阶段解决的是:
LLM 能不能“读懂”视觉 token。
2. 多模态指令微调
第二阶段使用多模态问答数据进行指令微调,例如:
text
用户:图片中有几个人?助手:图片中有三个人。
用户:这张图可能发生在什么场景?助手:这看起来像是在办公室会议中。
这个阶段解决的是:
模型能不能按照人类指令进行图像问答。
LLaVA 的一个关键点就是使用 GPT-4 生成多模态指令数据,降低人工标注成本。
八、图像 token 数量带来的性能问题
多模态模型一个很现实的问题是:图像 token 会显著增加上下文长度。
例如一张图片被切成 576 个 patch,经 projector 后就是 576 个视觉 token。再加上用户文本,LLM 实际处理的序列长度会明显变长。
如果用户输入多张图片:
text
3 张图片 × 576 visual tokens = 1728 visual tokens
这会直接增加:
- Prefill 计算量
- KV Cache 显存占用
- 首 token 延迟
- 推理成本
因此很多模型会做视觉 token 压缩。
常见方法包括:
- 使用更大的 patch size,减少 patch 数量
- 使用 pooling 压缩视觉 token
- 使用 Q-Former 做查询压缩
- 只保留关键区域特征
- 多尺度特征选择性输入
例如 BLIP-2 使用 Q-Former,把大量视觉特征压缩成少量 query token,再送给语言模型。这比直接把所有 patch token 塞进去更高效。
九、Q-Former:视觉 token 压缩的经典方案
Q-Former 可以理解为一个“视觉信息抽取器”。
它内部有一组可学习 query token,例如 32 个:
text
query_tokens: [32, hidden_size]
这些 query token 会通过 cross-attention 去读取视觉编码器输出的图像特征。最后输出固定数量的视觉摘要 token。
也就是说,不管原始图片有多少 patch:
text
原始视觉特征:256 / 576 / 1024 个 patchQ-Former 输出:固定 32 个视觉 token
这样就大幅降低了 LLM 的输入长度。
它的优势是:
- 减少视觉 token 数量
- 降低推理成本
- 提高多图输入能力
- 保留较强语义信息
缺点是可能损失细粒度信息,例如小目标、文字、局部细节。
十、多模态模型为什么容易看错图?
虽然多模态大模型很强,但它仍然经常出现视觉幻觉,例如:
- 图片里没有猫,模型说有猫
- 数错人数
- 看错文字
- 把左边说成右边
- 对复杂图表做出错误结论
原因主要有几个:
1. 视觉分辨率不足
如果图片被缩放到 224×224 或 336×336,很多细节会丢失,尤其是 OCR、小物体、图表坐标轴。
2. 视觉 token 被过度压缩
为了推理效率,模型可能只保留少量视觉 token,导致细节缺失。
3. 语言模型先验太强
LLM 很擅长“补全合理答案”,即使视觉证据不足,也可能根据常识生成看似合理的描述。
4. 训练数据偏差
如果训练集中某类场景经常和某些描述绑定,模型可能形成错误偏见。
因此在高可靠场景中,多模态模型常常要结合专用 OCR、目标检测、版面分析等工具,而不是完全依赖端到端 VLM。
十一、工程落地建议
如果要做一个图片问答系统,可以采用如下架构:
text
图片上传 -> 图像预处理 -> OCR / 目标检测 / 版面分析(可选) -> VLM 视觉编码 -> 用户问题拼接 -> 多模态大模型生成 -> 结果校验与引用
在具体实践中建议:
- 如果是通用看图问答,优先使用成熟 VLM
- 如果是票据、合同、表格,必须结合 OCR 和结构化解析
- 如果是工业缺陷检测,不能只靠 VLM,应结合检测/分割模型
- 如果是医疗影像,必须做领域专用训练和严格评测
- 如果是多图长上下文,要关注视觉 token 数量和 KV Cache 成本
十二、总结
多模态大模型的核心不是“让 LLM 直接看图”,而是构建一条视觉到语言的表示对齐链路:
text
Image -> Patch -> Vision Encoder -> Projector/Q-Former -> Visual Tokens -> LLM
其中:
- CLIP 提供强大的视觉语义编码能力
- ViT 将图片切成 patch token 序列
- Projector 完成视觉空间到语言空间的映射
- Q-Former 用于压缩视觉 token,降低推理成本
- 指令微调让模型具备图像问答能力
真正落地时,还必须考虑分辨率、视觉 token 数量、OCR、局部细节、幻觉控制和推理成本。
如果说 RAG 是“让模型接入外部知识”,那么 VLM 是“让模型接入视觉世界”。理解 CLIP、ViT、Projector 和视觉 token,是深入多模态大模型的第一道门槛。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)