在 从 Prompt 到输出 里我们讲过:文本会先被分词器切成一个个 token、再变成向量送进模型。那很自然会问——图像和音频也讲「token」,它们的 token 又是什么?是像素吗?是采样点吗?
答案是:token 从来就不是「字」,而是「Transformer 处理的最小单位」。理解了这一点,三种模态其实是同一套路。
统一视角:切块 → 变向量
不管什么模态,进模型前都是固定两步:
- 切块:把输入切成一个个小单元;
- 变向量:把每个小单元变成一个向量(token embedding)。
切完、向量化之后,进 Transformer 的链路和文本完全一样。模态之间的差异只在「怎么切」和「怎么变向量」。
而「变向量」有两条路,这是理解图像 / 音频 token 的关键分叉:
- 连续 patch 路线:把原始数值线性投影成向量,不查表、没有离散 id。多用于理解(看图、听音)。
- 离散 codebook 路线:把小块量化到一个学好的「视觉 / 声学词表」里最近的条目,得到整数 id,和文本 token id 一模一样。多用于生成(画图、合成语音)——因为离散 id 才能像文本一样逐 token 自回归地「长」出来。
记住这条「连续 vs 离散」的分叉,下面就好懂了。
图像的 token
① 连续路线(主流多模态理解模型,ViT 那套)
把图像切成固定大小的小方块(patch),比如 16×16 像素。每个 patch 拉平后线性投影成一个向量,这就是一个 image token,再加上二维位置编码。
- 一张 224×224 的图、按 16×16 切 → 14×14 = 196 个 patch token。
- 直觉:一个 patch ≈ 文本里的一个词。
- 分辨率越高、图越大 → patch 越多 → token 越多。这也解释了为什么 API 里一张图按 N 个 token 计费、且随分辨率上涨——本质就是 patch 数量。
1 | 图像 → 切成 patch 网格 → 每个 patch 线性投影 → patch token 序列 |
② 离散路线(图像生成模型,VQ-VAE / VQGAN)
编码器把每个 patch 映射到一个视觉码本(codebook)里最近的条目,输出整数 id。这样图像就变成一串离散 token,模型能像写句子一样一个 token 一个 token 地「画」出来,再由解码器还原成像素。
音频的 token
思路完全平行,只是「切块」从二维 patch 变成一维时间窗口(帧)。
① 连续路线(语音识别 / 音频理解,如 Whisper)
先把波形转成频谱(log-mel spectrogram),再切成一小段一小段时间帧(比如每 ~20–40ms 一帧),每帧过编码器变成一个向量 = 一个 audio token。
- 帧率大致是几十帧 / 秒这个量级,所以音频按时长 → 帧数 → token 数,这也是音频 API 常按秒计费的原因。
② 离散路线(音频 / 语音生成,神经音频编解码器,如 EnCodec / SoundStream)
用**残差矢量量化(RVQ)**把每帧音频量化成离散码(声学 token,整数 id),让模型能自回归地「生成」声音。常还会分成两层:
- 语义 token:管「说了什么内容」;
- 声学 token:管「音色、细节」怎么还原。
一张表对齐三种模态
| 模态 | 怎么切(一个 token) | 连续路线(理解) | 离散路线(生成) |
|---|---|---|---|
| 文本 | 子词片段 | —(本身就是离散 id) | token id 查表 |
| 图像 | 一个 patch(如 16×16) | patch 线性投影成向量(ViT) | 视觉码本 id(VQ-VAE) |
| 音频 | 一段时间帧(如 ~20ms) | 帧编码成向量(Whisper) | 声学码本 id(RVQ / EnCodec) |
一句话总结
token 不是「字」,而是**「Transformer 处理的最小单位」。文本切成子词、图像切成 patch、音频切成时间帧;每个单位要么线性投影成连续向量**(用于理解),要么量化成离散码本 id(用于生成)。切法和向量化方式不同,但切完之后进模型的链路,和 从 Prompt 到输出 讲的完全是同一条。
理解了这点,「多模态大模型」就不神秘了:它无非是把不同模态都翻译成同一种「token 序列」,再丢进同一个 Transformer——统一表示,正是多模态的地基。