引子这个系列前文讲了好几篇全是纯文本大模型——输入是文字输出也是文字一切都是 token。但你有没有好奇过为什么 ChatGPT 能回答这张图里有什么为什么你发给它一张手绘数学题它能帮你解题图片不是 tokenLLM 不直接认像素。那它是怎么看懂图片的反过来问你让它画一幅日落图它是怎么生成一张图片的它输出的 token 怎么变成像素的这两个问题分别对应多模态大模型的两面输入端理解多模态和输出端生成多模态。一、先说结论多模态大模型并不是另一套架构而是在文本大模型的两端各接了几根管道输入侧图片/音频/视频 → 各模态编码器 → 向量序列 → 拼入 LLM 输出侧LLM 生成文本扩散模型 DiT 生成图片/视频声码器生成音频 LLM 核心本身——Attention FFN 的堆叠——完全不变。前文讲的所有东西Attention 公式、残差连接、LayerNorm、KV Cache、预测下一个 token在多模态模型里照用不误。二、核心思路把一切都变成向量前文第三篇讲过文本进入 LLM 核心堆叠 Attention FFN之前要走两步文字 → Token → 向量 → 进入多层 Attention FFN 堆叠LLM 核心只操作向量。它不关心这些向量是从文字来的还是从图片来的。只要是向量它就能处理。多模态的核心思路就这么简单给每种模态各配一个编码器把图片、音频都翻译成向量然后交给同一个 LLM 核心处理。文本大模型 文字 → Tokenizer → Embedding →[向量₁, 向量₂, 向量₃]→ 多层 Attention FFN 多模态大模型 文字 → Tokenizer → Embedding →[向量₁, 向量₂, 向量₃]─┐ ├→ 拼在一起 → 多层 Attention FFN 图片 → 图像编码器 → 投影层 →[向量ₐ, 向量ᵦ, 向量ᵧ,...]─┘对 LLM 核心来说它看到的就是一个向量序列——前几个来自图片后面几个来自文字。它用同样的 Attention 机制处理所有向量根本不区分来源。三、图片是怎么变成向量的文本变向量前文讲透了文字 → BPE 分词 → Token ID → 查 Embedding 表。图片的路径不同但目标一样——变成一组向量。3.1 把图片切成碎片ViT最常用的方法叫ViTVision Transformer思路非常直接一张224×224 的图片 │ ▼ 切成14×14196个小方块每个16×16 像素 │ ▼ 每个小方块通过线性层变成一个向量比如768维 │ ▼ 加上位置编码告诉模型这个方块在左上角还是右下角 │ ▼ 得到196个向量这 196 个向量就是图片的token。每个向量代表图片的一个局部区域——就像文本的一个 token 代表一个词或子词。为什么要切成 patch而不是把整张图压成一个向量如果把整张 224×224 图直接压成一个向量会丢失空间细节。切成 196 个 patch 后每个 patch 保留局部信息后续 Attention 让这些 patch 互相交流模型就能同时看到整体和局部。和文本 token 的对比文本图片原始输入字符串像素矩阵分词方式BPE 切成子词切成 16×16 方块patch每个token一个子词一个图片方块变成向量查 Embedding 表线性投影矩阵乘法向量维度768768对齐到同一维度典型数量几十到几千1961024 个3.2 投影层对齐到同一个空间图像编码器如 ViT输出的向量和文本 Embedding 的向量通常不在同一个空间里——维度不同语义含义也不同。需要一个投影层通常一两层线性网络把图像向量翻译到文本模型的向量空间图像编码器输出1024维 → 投影层1024 →4096 → 和文本向量同维度4096维投影层的权重是训练时学出来的。训练目标是让投影后的图像向量和对应文本描述的向量尽量接近——一只猫的图像向量应该靠近cat的文本向量。3.3 以 LLaVA 为例LLaVALarge Language and Vision Assistant是最经典的多模态架构之一结构清晰看一张图就够了输入请描述这张图片[一张猫的照片]┌──────────────────────────────────────────────┐ │ 文本部分 │ │请描述这张图片→ Tokenizer → Embedding │ │ →[向量₁, 向量₂, 向量₃, 向量₄, 向量₅]│ └──────────────────────┬───────────────────────┘ │ 拼接 ▼ ┌──────────────────────┴───────────────────────┐ │ 图片部分 │ │ 猫的照片 → ViT 编码器 →196个图像向量 │ │ → 投影层 →[向量ₐ, 向量ᵦ,..., 向量₁₉₆]│ └──────────────────────┬───────────────────────┘ ▼[向量₁,..., 向量₅, 向量ₐ,..., 向量₁₉₆]│ ▼ 多层 Attention FFN和前文一模一样 │ ▼ 逐 token 生成回答这张图片中有一只橘色的猫...LLM 核心和前文完全一样唯一的改动是在前面加了一条图像处理的管线模型的大脑没变只是眼睛是新装的。四、Attention 是怎么工作的看上面的 LLaVA 流程图有个细节还没展开文本向量和图像向量混在一起Attention 怎么知道哪些是文字、哪些是图片答案是它不需要知道序列顺序已经解决了这个问题。输入的向量序列是这样的输入序列[patch₁, patch₂,..., patch₁₉₆, 请, 描述, 这张, 图片,...]↑ 图片部分 ↑ 文本部分因果掩码决定了每个位置能看到谁所以 patch 为什么要在文字前面因为生成是自左向右的——生成描述这个词时还不知道自己要说什么必须先看到整张图。把 patch 放在前面标准因果掩码自然让每个文本 token 可以回看所有 patch不需要任何特殊设计。五、音频和视频同一套思路图片讲完了但多模态的世界远不止图片。音频、视频都可以走同样的路子编码成向量序列 → 投影到文本空间 → 交给 LLM 核心处理。音频、视频、图片的编码思路其实是一回事图片: 像素矩阵 → 切 patch → 向量序列 音频: 频谱图 → 切 patch → 向量序列 视频: 帧序列 → 每帧切 patch → 向量序列 文本: 字符串 → BPE 分词 → 向量序列区别只在于切分方式和用什么编码器。5.1 音频让模型听懂声音一段语音进入模型之前需要先做一层预处理原始波形PCM→ 短时傅里叶变换STFT→ 梅尔频谱图Mel Spectrogram→ 编码器 → 向量序列为什么要转成频谱图原始音频波形每秒包含上万个采样点16kHz 采样率 每秒 16000 个数字直接处理太贵而且不直观。转成梅尔频谱图之后相当于把声音翻译成了一张图横轴是时间纵轴是频率颜色深浅代表能量大小。这张图再交给类似 ViT 的编码器去处理——音频的图片化思路和把图片切成 patch 一模一样。[一段5秒的语音16kHz采样]│ ▼ STFT 梅尔滤波器[频谱图: 约500帧 ×80频带]│ ▼ 切成16×16 的 patch时间×频率[约2000个音频 patch]│ ▼ 线性投影 → 每个 patch 一个向量[约2000个音频向量]每帧约 2040ms相邻帧重叠 50%所以 1 秒音频大约产生 50100 个向量。一段 30 秒的语音就能产生几千个音频向量直接塞进 LLM 核心。OpenAI 的 Whisper 是目前最常用的音频编码器之一——它的编码器部分基于 Transformer Encoder 架构输入梅尔频谱图输出向量序列再通过跨注意力机制接入 LLM。GPT-4o 的音频理解、Gemini 的语音理解大多是这个路子。5.2 视频时间维度的挑战视频比图片多了一个维度时间。图片的信息是静态的一张图切 196 个 patch 就够了。但视频是一连串图片帧的序列模型不仅要理解每一帧里有什么还要理解帧和帧之间发生了什么——物体的运动、场景的切换、动作的先后顺序。视频的处理思路是先从时间轴上采样帧再对每帧分别做图片的处理[一段30帧/秒的30秒视频900帧]│ ▼ 均匀采样比如每隔15帧取1帧[30帧]│ ▼ 每帧 resize 到224×224通过 ViT 切 patch[每帧196个 patch ×30帧5880个 patch]│ ▼ 每个 patch 投影成一个向量[5880个视频向量]1 秒视频如果采样 2~3 帧一段 1 分钟的视频就可能产生几千到上万个视频向量。随之而来的有三个实际问题上下文窗口很快被填满Attention 计算量随 token 数量平方增长1 万个 token 的 Attention 矩阵就是 1 亿个元素推理成本比处理图片贵上几十到上百倍。这也是为什么目前的视频理解模型大多只处理短视频几十秒或者对视频先做描述压缩——用另一个模型先把视频转成一段文字描述再让 LLM 处理。视频还有一个图片没有的问题帧的顺序很重要。图片的 patch 可以加位置编码视频除了每帧内部的空间位置编码还需要全局时间位置编码让模型知道哪帧在前、哪帧在后。主流做法是给每个帧分配一个时间戳 embedding和帧内 patch 的空间位置编码加在一起patch_final_vectorpatch_vector 空间位置编码 时间戳编码这样Attention 机制就能同时学到帧内关系猫的各个部位在一帧内的空间关系和帧间关系猫从左跳到右的运动轨迹。六、输出端模型怎么生成图片和音频前面讲的都是输入——把图片、音频、视频变成向量让模型看懂。但多模态还有另一半输出。当模型能看图之后它是怎么把一只猫的意图变成一张真正的猫的图片的当你让 ChatGPT 画一幅日落它是怎么一步步生成像素的6.1 两种生成范式两个 Transformer多模态大模型的输出有两种完全不同的生成范式共用同一套骨架——Attention FFN 堆叠但各有各的玩法范式代表注意力掩码训练目标生成方式自回归 TransformerGPTLLM 文本生成因果掩码只能看过去预测下一个 Token逐个 token 前向生成扩散 TransformerDiT图像/视频生成无掩码双向可见预测噪声 ε从噪声迭代去噪T 步两种模型的大脑是一样的堆叠 Attention FFN差别只在于掩码方式不同、输出不同、训练目标不同。6.2 图片生成扩散 TransformerDiT自回归 LLM 生成图片直接输出像素很难主流方案是扩散 TransformerDiT——它也是一个 Transformer骨架和 LLM 完全一样Attention FFN 堆叠但有三处不同区别一注意力无掩码GPT 有因果掩码每个 token 只能看到之前的 token。DiT 没有掩码所有位置两两可见——就像一个双向的 Transformer。区别二输入是噪声 条件DiT 输入的不是 token 序列而是带噪潜变量z_t 时间步t 文本条件。LLM 输出的向量通过交叉注意力或 AdaLN 调制注入进去。区别三训练目标和生成方式• 训练目标MSE(ε, ε̂)— 预测噪声不是预测 token• 生成方式从纯噪声z_T开始迭代 T 步去噪每步预测并去掉一部分噪声最终得到干净图像用户输入画一只在草地上奔跑的狗▼ LLM 理解用户意图输出文本条件嵌入 ▼ DiT 主干Attention FFN 堆叠无因果掩码 输入噪声 z_T 文本条件 迭代 T 步预测噪声 → 去除部分噪声 → 降噪到 z_{T-1}→... 最终输出干净潜变量 z_0 ▼ VAE 解码器 把潜变量映射回像素空间 →512×512 图片具体代表GPT-4o 用 DALL·E 3DiTGemini 用 ImageFXDiT。LLaVA 这类理解型模型本身只理解图片生成靠调用外部 DiT如 Stable Diffusion。DiT 和 GPT 骨架相同都是 Attention FFN差别只在三点DiT 没有因果掩码、输入是噪声而非 token、目标是预测噪声而非下一个 token。6.3 音频生成声学 Token 的路子图片生成靠扩散模型音频生成靠另一套声学 Token。流程是用户输入用温柔的声音朗读这段文字▼ LLM 理解内容 情感意图 ▼ LLM 输出两类 token - 文本 token说话内容 - 声学 token音高、语速、停顿 ▼ 声学解码器基于 Transformer 架构的声码器 把声学 token 还原成波形 输出真实的人声音频这里的核心思想是把声学特征也 token 化——像文本 token 一样让 LLM 预测声学 token再把 token 变回波形。GPT-4o 的语音对话就是这个路子输入音频 → Whisper 编码器 → LLM → 声学 token → 声码器 → 输出语音。全程 token 流打通了文本和语音的边界。6.4 视频生成最难的那块视频生成是当前最前沿、也最困难的方向。为什么难因为视频 图片 × 时间。生成一张图已经很难了还要保证几十帧、上百帧之间的连贯性——人物不能跳变动作要流畅光影要一致。目前主流的视频生成模型如 Sora、Runway、Pika走的是扩散模型 时序建模的路子用户输入一只猫从左向右奔跑▼ LLM 解析意图输出文本条件嵌入 ▼ 时序 DiT 主干Attention FFN 堆叠无掩码 从噪声开始在时间轴上逐步去噪 保证帧间连贯性通过时序 Attention 机制 ▼ VAE 解码器 → 输出16~60fps时长5~60 秒视频时序 DiT 和图片 DiT 的区别在于在每帧内部切 patch 的基础上还要在时间轴上加时序位置编码让模型区分第 1 秒的猫和第 3 秒的猫。目前多模态大模型大多还不具备高质量视频生成能力原因是视频 token 数量太大几分钟视频可能有数十万 token超出 LLM 核心处理能力时序一致性难以保证计算成本极高。所以现在常见的产品形态是LLM 做理解规划时序 DiT如 Sora做生成两者配合工作而不是一个模型搞定一切。6.5 完整的双向多模态架构讲到这里可以画一张完整的架构图了。从用户视角看这就是一个整体——你给它文字图片它给你文字图片只是内部用了两套不同的生成机制。以用户输入把图中的狗给删除 [一张狗的照片] 为例用户输入: 文字把图中的狗给删除 图片 │ │ ┌─────────▼──────────┐ ┌─────────────▼─────────────┐ │ 文本 Tokenizer │ │ 图片编码器(ViT)│ │ → Embedding 层 │ │ → 切成 patch → 投影层 │ └─────────┬──────────┘ └─────────────┬─────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌──────────────────────────┐ │ 文字向量序列 │ │ 图片向量序列[patch₁..]│ └────────┬─────────┘ └────────────┬─────────────┘ │ │ └──────────────┬───────────────────────────┘ │ 拼接 →[patch₁..,文字向量序列]▼ ┌──────────────────────────────────────┐ │ LLM 核心同一个 Transformer │ │ 堆叠 Attention FFN × N │ │ 输入: 向量序列图片 patch 文本 │ │ 输出: 文本 token自回归因果掩码 │ └──────────┬───────────────┬────────────┘ │ │ ┌──────────┘ └──────────────────┐ ▼ ▼ 自回归生成文本 LLM 输出的文本条件嵌入Text Embedding │ │ ▼ ▼ 直接输出文字 注入 DiT扩散 Transformer │ 从噪声 z_T 迭代去噪 T 步 │ ▼ 潜变量 z_0 → VAE 解码 → 像素编辑后的图片总结一下输入侧文字和图片各走各的管线最后拼在一起进同一个 LLM 核心输出侧LLM 自回归生成文字同时把文本条件注入给 DiT由 DiT 生成图片。两套机制骨架相同都是 Attention FFN 堆叠但输入、掩码和训练目标都不同。最后要纠正一个常见误解扩散模型不是 LLM 的解码器它是一个独立的 Transformer只是靠 LLM 提供文字条件来控制生成内容。七、多模态带来的新问题7.1 上下文窗口压力更大前文第八篇讲过上下文窗口的限制。多模态让这个问题更严重一段文本:请描述这张图片→ 约5个 token 一张图片:224×224,16×16 patch →196个 token 一张高清图:448×448,16×16 patch →784个 token一张图片就吃掉了几百个 token 的窗口空间。如果对话中包含多张图片窗口会被快速占满。这也是为什么很多多模态模型会对图像做压缩——比如只保留最重要的几十个 patch 向量而不是全部 196 个。7.2 推理成本更高更多的 token 意味着更大的 KV Cache 和更多的 Attention 计算n²。处理一张图片的推理成本远高于处理一句话。7.3 对齐的难度让图像向量和文本向量在同一个空间里说同一种语言这件事比字面上听起来要难得多。投影层的训练如果不到位模型很可能看到了图片但还是看不懂——图片的向量和文字的向量虽然在数学上碰巧维度相同但在语义上各说各话。八、总结读完前文再看多模态你会发现核心其实没变多少。LLM 那部分完全照旧Attention 公式、残差连接、LayerNorm、KV Cache一个都没改。真正新加的只有两件事入口处给图片、音频、视频各配一个编码器 投影层把它们变成向量序列拼进 LLM 的输入里出口处图片和视频不走 LLM 的自回归管线而是交给扩散 DiT音频走声学 Token 加声码器。两套生成机制自回归 LLM 生成文字扩散 DiT 生成图片/视频骨架相同——都是 Attention FFN 的堆叠——只是输入、掩码和训练目标不同。说白了多模态就是给同一个大脑接了两组新的感官和手脚。文章首发于 「小小寰宇」