大模型是怎么"看懂"图片的?——多模态视觉理解全解析
当你把一张自拍、一张表格截图、或者一段代码报错的截图丢给 ChatGPT、Claude 或 Gemini 时,它几乎都能给你一个合理的回答。但你有没有想过——它到底是怎么"看懂"这些图片的?
人看图片是一种直觉——瞬间就能感知到"这是一个人在微笑"、"这是一张 Excel 表格"、"这段代码报了空指针异常"。但对模型来说,图片进来的时候只是一堆像素值(RGB 数字矩阵),它需要经过一整套流程,才能把这些数字转化成它能理解的"语义信息"。
这篇文章会带你从底层原理出发,彻底搞懂多模态大模型的"视觉能力"是怎么来的。
1. 图片在模型眼中长什么样?
在聊模型如何理解图片之前,我们得先搞清楚一件事:图片在计算机中是怎么表示的。
一张彩色图片本质上是一个三维数组 [高度 × 宽度 × 3],其中 3 代表 RGB 三个颜色通道。一张 1024×1024 的图片就有 1024 × 1024 × 3 ≈ 314 万个数字。
如果直接把这些数字扔给 Transformer 处理,每个像素当作一个 token,那一张普通照片就是几百万个 token——这个计算量是完全不可接受的。
所以第一个核心问题就是:怎么把图片信息"压缩"成模型能处理的规模?
2. Vision Transformer(ViT):把图片变成"文字"

这是多模态大模型最核心的技术之一——Vision Transformer(ViT)。
ViT 的核心思想非常优雅:既然 Transformer 擅长处理序列数据(文字),那就把图片也变成序列。
2.1 第一步:切片(Patch Embedding)
ViT 不会逐像素处理图片,而是把图片切成一个个固定大小的小方块,叫做 patch。
以一张 224×224 的图片为例,如果 patch 大小设为 16×16:
- 图片被切成
(224 ÷ 16) × (224 ÷ 16) = 14 × 14 = 196个 patch - 每个 patch 包含
16 × 16 × 3 = 768个像素值 - 通过一个线性投影层,把这 768 个数字压缩成一个固定维度的向量(比如 768 维)
这样,一张图片就变成了 196 个向量,就像一段话有 196 个词一样。
为什么是 16×16? 这是经验和性能的平衡:
- 太大(比如 32×32):patch 数量少,处理快,但丢失细节
- 太小(比如 4×4):patch 数量多,细节保留好,但计算量爆炸
- 16×16 是目前比较主流的选择,在效果和效率之间取得了良好平衡
2.2 第二步:位置编码(Positional Encoding)
切片之后有一个问题——模型不知道每个 patch 原来在图片的哪个位置。
如果只是把 196 个向量丢给 Transformer,它会把这些 patch 当成一个无序的"词袋",完全丧失空间信息。一只猫的耳朵在上面、爪子在下面,这种空间关系对理解图片至关重要。
解决方法就是加上位置编码:给每个 patch 向量加上一个表示其位置的向量。这样模型就知道"第 1 个 patch 在左上角,第 196 个 patch 在右下角"。
常见的位置编码方式有:
- 可学习的位置编码:直接让模型在训练中学会每个位置应该对应什么向量
- 2D 正弦位置编码:用数学公式编码行列信息,泛化能力更好
- RoPE(旋转位置编码):近年来越来越流行,支持动态分辨率
2.3 第三步:Transformer 自注意力
位置编码加完后,这 196 个向量就被送进 Transformer 的多层自注意力(Self-Attention)模块。
自注意力的核心作用是:让每个 patch 都能"看到"其他所有 patch 的信息。
- 一个 patch 包含猫的耳朵,另一个 patch 包含猫的眼睛——通过自注意力,模型能把这些局部信息关联起来,形成"这是一只猫"的完整理解
- 一个 patch 包含代码的行号,另一个 patch 包含报错信息——模型能把它们关联起来,理解"第 42 行报了空指针异常"
经过多层 Transformer 的处理,每个 patch 向量已经不再是一个局部的像素块信息了,而是融合了全局上下文的高级语义特征。
2.4 不同分辨率的图片怎么办?
实际使用中,用户上传的图片大小各异。常见的处理策略有:
- 直接 resize:把所有图片统一缩放到固定尺寸(如 224×224),简单粗暴但可能丢失细节
- 动态分辨率:根据原图比例,切出不同数量的 patch。比如一张 448×224 的横图会切出
28×14 = 392个 patch - 多尺度切片:先在低分辨率下切片获得全局信息,再在高分辨率下切片获取局部细节,两路信息合并——这是目前高端模型常用的方案
3. 视觉与语言的"桥梁":怎么让模型同时理解图片和文字?

ViT 让模型能"看"图片了,但这只完成了一半——模型还需要把视觉信息和语言信息放进同一个"思考空间"。
这就好比一个人同时懂中文和英文,但如果脑子里两套语言系统完全独立、互不相通,那他就无法做"看图说话"这样的跨模态任务。
3.1 方案一:投影层对齐(LLaVA 方案)
最直接的方案:用一个线性投影层(或 MLP),把视觉编码器输出的向量映射到语言模型的 embedding 空间。
图片 → ViT 编码 → 视觉向量 [196个] → 投影层 → 语言空间向量 [196个]
↓
文字 → Tokenizer → 文本 Token [N个] ──────────────→ 拼接 → LLM 处理简单来说就是把视觉 token 和文本 token 拼在一起,一起送给语言模型处理。语言模型不需要关心输入是来自图片还是文字,它只看到一串向量。
LLaVA 系列模型就是用这个方案,效果出奇地好,证明了"简单有效"。
3.2 方案二:Q-Former 查询机制(BLIP-2 方案)
如果图片分辨率很高,直接拼接可能产生太多视觉 token(比如数百甚至上千个),会大幅增加语言模型的计算负担。
BLIP-2 提出了一个巧妙的方案:用一组可学习的 query token(通常只有 32 个),去"询问"视觉特征中最重要的信息。
图片 → ViT 编码 → 视觉向量 [196个]
↓
32 个 Query Token → Q-Former 交叉注意力 → 32 个压缩后的视觉向量
↓
投影 → 送入 LLM这就像你看一张复杂的图片,不会记住每一个像素,而是提取出"关键信息"——有什么物体、什么颜色、在哪个位置。Q-Former 就是做这件事的。
3.3 方案三:CLIP 对比学习预对齐
还有一种更底层的方案:在预训练阶段就让视觉和语言住进同一个空间。
CLIP(Contrastive Language-Image Pre-training) 的做法是:
- 收集海量的(图片, 文本描述)配对数据——比如"一只橘猫趴在键盘上"配上对应的照片
- 同时训练一个图片编码器和一个文本编码器
- 训练目标:让匹配的(图片, 文本)对在向量空间中靠近,不匹配的远离
训练完成后,图片和文字天然就在同一个语义空间里了。"猫的照片"和"猫"这个词的向量会非常接近。
很多多模态大模型会用 CLIP 预训练好的视觉编码器作为起点,再进行微调。
4. 不同类型的图片,模型是怎么理解的?

理解了底层原理后,我们来看看具体场景。当你发送不同类型的图片时,模型内部的"思考过程"有什么不同?
4.1 用户自拍 / 自然场景照片
这是视觉模型最"基础"的能力场景。
模型的处理流程:
- 物体检测与分类:识别出画面中的主要元素——人脸、身体、背景物体
- 属性识别:性别、年龄范围、表情(微笑/严肃)、穿着、姿势
- 场景理解:通过背景元素推断场景——室内/室外、咖啡厅/公园/办公室
- 空间关系:谁在前面、谁在后面、物体之间的相对位置
这种能力主要来源于训练数据中海量的图文对——互联网上有无数的照片及其描述文字,模型在预训练阶段已经学会了把视觉模式映射到语义概念。
4.2 表格截图
表格识别是多模态模型非常擅长但也非常考验能力的场景。
模型需要同时完成多项任务:
- 文字识别(OCR 能力):识别出表格中每个单元格的文字内容
- 结构理解:识别出行、列、表头、合并单元格等结构信息
- 空间关系映射:理解"销售额 100 万"是属于"2024年Q1"这一列、"华东区"这一行的
这里有一个关键点:现代多模态大模型的 OCR 能力通常是"内置"的,而非依赖外部 OCR 模块。
在 ViT 切片过程中,如果 patch 足够小(比如 14×14 像素),每个 patch 恰好能覆盖一两个字符。模型在大量包含文字的图片上训练后,自然学会了从像素模式中"认"出文字。这就是为什么你把一张手写笔记的照片丢给模型,它也能读出来。
4.3 代码报错截图
代码截图的理解融合了多种能力:
- OCR:先"读"出截图中的代码文本和错误信息
- 代码理解:凭借语言模型在海量代码上训练获得的编程知识,理解代码逻辑
- 错误诊断:结合报错信息和代码上下文,推断问题原因
比如你发一张 NullPointerException 的截图,模型会:
- 先读出错误类型、堆栈跟踪、涉及的代码行
- 理解代码逻辑,找到可能产生空值的地方
- 给出修复建议
这里视觉能力和语言能力是紧密配合的——视觉负责"读",语言负责"理解"和"推理"。
4.4 图表 / 数据可视化
当你发送一张柱状图、折线图或饼图时,模型的理解过程是:
- 图表类型识别:判断是柱状图、折线图、饼图还是其他类型
- 元素提取:识别坐标轴标签、图例、数据点、标题
- 数值估算:根据视觉比例估算各数据点的大致数值
- 趋势分析:综合所有信息,得出"销售额呈上升趋势"这样的结论
5. 训练数据:这些能力从哪来?
多模态模型的视觉能力不是凭空而来的,它来自于精心构造的多阶段训练:
5.1 预训练阶段
- 数据规模:数亿到数十亿组(图片, 文本)配对数据
- 数据来源:互联网上的图片及其 alt 文本、图片描述网站、学术数据集等
- 训练目标:学会图片和文字之间的对应关系
典型的预训练数据集如 LAION-5B,包含 50 亿个图文对。
5.2 指令微调阶段
预训练让模型学会了"看",但还不会"按要求回答"。指令微调阶段会用高质量的多模态问答数据来训练:
- "这张图片里有什么?" → 详细的图片描述
- "这个表格第二行第三列的值是多少?" → 精确的数值回答
- "这段代码报错的原因是什么?" → 技术分析和修复建议
5.3 RLHF / 偏好对齐
最后通过人类反馈强化学习(RLHF),让模型的回答更符合人类的期望——更准确、更有帮助、更安全。
6. 当前的局限与未来方向
多模态模型虽然已经很强大,但仍有一些明显的局限:
- 幻觉问题:模型可能"看到"图片里并不存在的东西,或者误读文字
- 细粒度理解:对于非常小的文字、密集的表格、复杂的图表,识别准确率仍有提升空间
- 空间推理:对物体的精确位置、大小比例的判断还不够准确
- 视频理解:从静态图片到动态视频的理解,仍是活跃的研究方向
未来的发展趋势包括:
- 更高分辨率的支持:让模型看到更多细节
- 原生多模态架构:不再是"视觉编码器 + 语言模型"的拼接,而是从头设计的统一架构
- 实时视觉理解:支持视频流的实时处理和理解
总结
回到最初的问题——大模型是怎么看懂图片的?
核心流程可以概括为:
- 切片(ViT):把图片切成小方块,每个小方块变成一个向量
- 编码(Transformer):让每个小方块都能感知全局信息,形成高级语义特征
- 对齐(桥梁层):把视觉特征映射到语言模型能理解的空间
- 理解(LLM):语言模型综合视觉信息和文字信息,进行推理和生成
不管是自拍、表格、代码截图还是数据图表,走的都是这一套流程——区别只在于模型在不同类型的图片上积累了不同的"经验"(训练数据)。
本质上,多模态大模型做的事情就是:把"看"的过程翻译成"读"的过程,然后用它最擅长的语言理解能力来处理。