前言

大语言模型本质上只能处理 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

也就是说:

  1. 图片进入 CLIP 视觉编码器
  2. 得到 patch-level 图像特征
  3. 通过 projector 映射到 LLM hidden size
  4. 与文本 token embedding 拼接
  5. 送入 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 压缩。

常见方法包括:

  1. 使用更大的 patch size,减少 patch 数量
  2. 使用 pooling 压缩视觉 token
  3. 使用 Q-Former 做查询压缩
  4. 只保留关键区域特征
  5. 多尺度特征选择性输入

例如 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 视觉编码  -> 用户问题拼接  -> 多模态大模型生成  -> 结果校验与引用

在具体实践中建议:

  1. 如果是通用看图问答,优先使用成熟 VLM
  2. 如果是票据、合同、表格,必须结合 OCR 和结构化解析
  3. 如果是工业缺陷检测,不能只靠 VLM,应结合检测/分割模型
  4. 如果是医疗影像,必须做领域专用训练和严格评测
  5. 如果是多图长上下文,要关注视觉 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,是深入多模态大模型的第一道门槛。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐