多模态:一张图怎么变成 token
这篇文档只回答一个问题:一张图片,怎么变成能进 Transformer 那 12 行 的东西。
一旦它变成了 token,后面的事——残差流、attention、FFN、KV Cache、采样——一个字都不用改。模型不知道自己在看图。这是全文最重要的一句话。
每个条目固定三行:是什么 / 一个可验证的数字 / 没有它会坏在哪。
0. 骨架
glossary §0 的第一行是 ids = tokenizer.encode(text)。多模态做的全部事情,就是给这一行加一条平行支路:
# 文本支路(glossary §1,原样不动)
text_emb = embedding[tokenizer.encode("这张图里有几只猫?")] # → [T_txt, d_model]
# 图像支路(本文全部内容)
patches = split(image, patch_size=14) # → [N, 14, 14, 3] §1
feats = vision_encoder(patches) # → [N, d_vis] §2
img_emb = projector(feats) # → [N, d_model] §3 ★对齐到同一维度
# 汇流——从这里开始,两者再无区别
x = concat([img_emb, text_emb]) # → [N + T_txt, d_model]
for layer in range(L): # ← glossary §2~§4,一字未改
x = x + attn(rmsnorm(x))
x = x + ffn (rmsnorm(x))
... # ← glossary §5~§6,一字未改三件事看完这段就该记住:
projector那一行是全部的魔法。它把视觉编码器的输出维度d_vis掰成d_model,让图像向量能挤进残差流。掰完之后,它在数值上和一个词的 embedding 没有任何区别。- 图像 token 是真 token。它占上下文、占 KV Cache、按
O(T²)参与 attention、要花钱。「传图便宜」是错觉。 N是这篇文章的主角。一张图变成多少个 token,是所有多模态成本、所有分辨率取舍、所有失败模式的唯一自变量。
速查表
| 名词 | 在哪 | 名词 | 在哪 |
|---|---|---|---|
| Patch / patch_size | §1 | 像素重排 / 2×2 合并 | §3 |
| ViT / CLIP / SigLIP | §2 | 图像计费公式 | §4 |
| DINOv2 / v3 | §2 | M-RoPE / RoPE-2D | §5 |
| 线性投影 / MLP 连接器 | §3 | 视频 / 音频 token 率 | §6 |
| Q-Former / Perceiver | §3 | 早期融合 / 原生多模态 | §7 |
| 交叉注意力适配器 | §3 | 分辨率悬崖 | §8 |
1. 切块:patch 就是图像的 token
Patch(图块)
是什么:把图像切成不重叠的
P×P小方块,每块拉平成一个向量,当成一个 token。这就是图像世界的分词——只不过它不需要学,是纯粹的几何切割。数字:token 数
N = (H/P) × (W/P)。P只有三个常见值:14、16、32。编码器 分辨率 patch token 数 ViT-B/16 224 16 196(+1 CLS = 197) CLIP ViT-L/14 224 14 256 CLIP ViT-L/14@336 336 14 576 SigLIP So400m/14 384 14 729 DINOv3 ViT-7B/16 224 16 196(+1 CLS +4 register = 201) 没有它会坏在哪:不切块就得让每个像素当一个 token。224×224 = 50,176 个 token,而 attention 是
O(T²)——一张最小尺寸的图就能把 attention 撑爆。切块首先是一个压缩手段,和子词分词的动机一模一样。⚠️ 二次方陷阱:
N随边长平方增长,不是线性。分辨率从 224 提到 336,token 从 256 涨到 576(2.25×);提到 896,涨到 4096(16×)。「把分辨率调高一点」在成本上从来不是「一点」。
为什么是 14 和 16
- 这两个数不是调出来的,是算力预算的直接后果。224/14 = 16,224/16 = 14,都落在「几百个 token」这个和文本序列可比的量级上。
- DINOv3(2025)把 patch 从 14 改回了 16,224px 下 token 从 261 降到 201。这是一次明确的成本让步——在特征质量和序列长度之间,它选了后者。
2. 视觉编码器:把 patch 变成向量
ViT(Vision Transformer)
- 是什么:patch 拉平 → 线性投影 → 加位置编码 → 走
L层标准 Transformer block。注意:和 glossary §2~§4 描述的结构完全相同,唯一区别是它不用因果掩码——图像没有「未来」,每个 patch 能看见所有 patch(双向)。 - 数字:ViT-B / L / H 的隐藏维度是 768 / 1024 / 1280。CLIP ViT-L/14 是 24 层、宽 1024、16 头,约 304M 参数。
- 没有它会坏在哪:直接把原始像素块投影进 LLM,你得到的是一堆没有语义的颜色统计。编码器的作用是把像素变成语义——「这块是猫耳朵」而不是「这块偏棕色」。
CLIP / SigLIP:语义从哪来
- 是什么:视觉编码器的语义不是凭空来的,是用图文对训出来的。CLIP 用对比学习(一个 batch 内做 softmax 匹配),SigLIP 换成 sigmoid 逐对损失,去掉了 batch 内归一化。
- 数字:CLIP 训练用了 4 亿图文对。SigLIP 的效率提升很直白:SigLiT 在 4 块 TPUv4 上训 2 天就到 84.5% ImageNet 零样本。SigLIP 2 的规格档位:Base 86M / Large 303M / So400m 400M / giant 1B,输出维度 1152(So400m-patch14-384)。
- 没有它会坏在哪:它决定了 LLM「能看见什么」的上限。 编码器没学过的概念,后面再大的 LLM 也读不出来——投影层不会凭空造出信息。这是多模态最常被忽略的瓶颈:大家盯着 LLM 的参数量,但天花板往往在那个 400M 的编码器上。
- ⚠️ 现在的默认选择是 SigLIP 不是 CLIP。Gemma 3 用 SigLIP 400M,且三个尺寸(4B/12B/27B)共用同一个编码器并全程冻结。编码器已经变成了一个可复用的、和 LLM 解耦的部件。
DINOv2 / DINOv3:另一条路
- 是什么:纯自监督,不用任何文本。它学的是稠密的空间特征(哪里是边界、哪些像素属于同一物体),而不是「图文对齐」。
- 数字:DINOv2 用 LVD-142M(1.42 亿图);DINOv3 用 LVD-1689M(16.89 亿图,从 170 亿 Instagram 图池里筛出来),最大 ViT-7B/16 有 6,716M 参数、嵌入维 4096。它在训练约 100 万步后要做一次 Gram anchoring 来修复稠密特征坍缩——这是一个诚实的工程细节:纯自监督在长训练下会自己退化。
- 没有它会坏在哪:CLIP 系的特征擅长「这是什么」,不擅长「它在哪、有多大、和谁相邻」。分割、深度、对应点这类任务需要 DINO 系的稠密特征。目前主流 VLM 走的是 CLIP/SigLIP 路线,这也部分解释了 §8 那些空间推理上的惨败。
3. 连接器:怎么接进残差流
这一节是整篇文章的技术核心。
d_vis和d_model不一样宽,中间必须有东西。而这个「东西」怎么设计,是过去三年多模态架构的主要战场。
① 线性投影 / MLP(现在的胜者)
- 是什么:一个 1~2 层的 MLP,把
[N, d_vis]直接投影成[N, d_model],然后当普通 token 拼进序列。就这么简单。 - 数字:LLaVA-1.5 = CLIP-ViT-L-336px + 两层 MLP(1.0 版本是单层线性,1.5 升级成 MLP),576 个视觉 token,用 120 万条公开数据,单台 8×A100 训约一天,在 11 个 benchmark 上 SOTA。
- 没有它会坏在哪:维度对不上,向量根本进不了残差流。
- 为什么它赢了:它保留了全部
N个 token 的信息,且不改动 LLM 的任何结构。代价是序列变长——但序列长度问题有 GQA、有 KV 压缩、有滑动窗口去解决,而信息丢了就是丢了。「Don't be a hero」在这里应验了一次:最简单的方案赢了。
② Q-Former / Perceiver Resampler(被淘汰的路)
- 是什么:用固定数量的可学习 query 向量,通过交叉注意力从
N个视觉特征里「抽取」出固定长度的摘要。Flamingo 的 Perceiver Resampler 用 64 个 latent,BLIP-2 的 Q-Former 用一组可学习 query。 - 数字:BLIP-2 靠这个设计,用少 54 倍的可训练参数,在零样本 VQAv2 上比 Flamingo-80B 高 8.7%。
- 没有它会坏在哪:不压缩的话,高分辨率图的 token 数会失控。
- ⚠️ 但它输了:固定 64 个 latent 意味着不管图多复杂,信息都被压进同一个瓶颈。OCR、密集文档、小物体计数——这些恰恰是需要保留细节的场景。轨迹很清楚:
Q-Former/Perceiver(2022-23)→ 纯 MLP(LLaVA-1.5,2023)→ MLP + 空间合并(2024-25)。
③ 交叉注意力适配器(还在用,但代价明确)
- 是什么:不把图像 token 拼进序列,而是在 LLM 内部每隔几层插一个交叉注意力层,让文本去「查」图像特征。Flamingo 和 Llama 3.2 Vision 走这条路。
- 数字:Llama 3.2 Vision 每 4 层自注意力后插一层交叉注意力——11B 版本的 GGUF 元数据显示
cross_attention_layers = [3, 8, 13, 18, 23, ...],40 个 block 里 8 层是交叉注意力。Llama 3 论文明说这些层带来 约 25% 的参数增量;如果给 405B 加,光交叉注意力就是 约 1000 亿参数(还不算视觉编码器)。标称 11B / 90B 的实际参数是 10.6B / 88.8B。 - 没有它会坏在哪:好处很实在——图像不占文本上下文,且训练时可以冻结整个语言模型(Llama 3.2 就是这么做的,只更新适配器和视觉编码器)。
- ⚠️ 但显存账不划算:有研究测出交叉注意力层里图像 token 的 KV Cache 显著超过自注意力层里文本 token 的 KV Cache,而且砍掉 50% 视觉特征 benchmark 基本不掉。Llama 4 已经放弃交叉注意力,转向早期融合(§7)。
④ 空间合并 / 像素重排(真正的降本手段)
- 是什么:在投影之前,把相邻的 2×2 个 patch 特征拼成一个,token 数直接砍 4 倍。它压的是空间冗余,不是语义瓶颈——所以比 Q-Former 温和得多。
- 数字:
- Qwen2-VL:ViT 后接一个 MLP,把相邻 2×2 token 压成 1 个。原文的例子:「224×224 的图,patch_size=14,进 LLM 前被压成 66 个 token」(256/4 = 64 个 patch token + 2 个视觉起止特殊 token)。ViT 本体 675M 参数。
- InternVL 2.5:像素重排把每个 448×448 图块的 1024 个 token 降到 256 个(4×)。动态切块最多 12 块 + 1 张缩略图。
- Gemma 3:896×896 进编码器,输出用 4×4 平均池化压到 256 个 token。
- 没有它会坏在哪:不压的话,896×896 / patch 14 = 4096 个 token——一张图就吃掉 4k 上下文。压到 256 之后才有「一次传 10 张图」的可能。
- 这是当前的标准配方:
原生分辨率 ViT → 2×2 合并 → 两层 MLP → 拼进序列。Qwen2.5-VL、InternVL、Gemma 3 用的都是这一套的变体。
4. 账单:一张图到底多少 token
这一节是全文最实用的部分。每一家的公式都不一样,而且都在变。
⚠️ 两个必须先纠正的过时说法
- Claude 的
(宽×高)/750已经不是官方公式了。现行文档给的是 28×28 像素网格:⌈w/28⌉ × ⌈h/28⌉。(好消息:两者几乎等价——784 px/token vs 750 px/token,说明/750一直是同一个网格的近似。作为心算仍然可用,但别当公式写。) - OpenAI 现在同时跑两套公式。经典的
85 + 170×tiles只适用于 GPT-4o / 4.1 / o1 / o3 这一代;新一代模型换成了 32×32 patch + 1536 上限 + 每模型乘数。
OpenAI(A)图块制
先缩到 2048×2048 以内 → 再把短边缩到 768 → 数有多少个 512×512 方块。
| 模型 | 基数 | 每图块 |
|---|---|---|
| GPT-4o / 4.1 / 4.5 | 85 | 170 |
| GPT-4o-mini | 2833 | 5667 |
| o1 / o1-pro / o3 | 75 | 150 |
| computer-use-preview | 65 | 129 |
GPT-4o-mini 那一行不是笔误。 它的图像 token 单价是 4o 的 33 倍——因为它按自己更小的 token 尺度折算。「用 mini 省钱」这个直觉在图像上直接反过来。
OpenAI(B)patch 制
适用于 GPT-4.1-mini/nano、o4-mini、GPT-5 系:
patches = ⌈w/32⌉ × ⌈h/32⌉ 上限 1536
超限则按 sqrt(32² × 1536 / (w×h)) 缩放后重新数
tokens = patches × 模型乘数乘数:GPT-4.1-mini / GPT-5-mini = 1.62,nano = 2.46,o4-mini = 1.72。 官方给的完整例子:1800×2400 → 57×75 = 4275 patch → 缩放到 1056×1408 → 1452 patch。
Anthropic Claude
⌈w/28⌉ × ⌈h/28⌉,两档上限:
| 档位 | 模型 | 长边上限 | token 上限 |
|---|---|---|---|
| 高分辨率 | Claude 4.7+ | 2576 px | 4784 |
| 标准 | 其余 | 1568 px | 1568 |
官方表里最说明问题的一行:3840×2160 在标准档被缩到 1456×819——829 万像素砍到 119 万,丢掉 85%。高分辨率档保留 2576×1449,token 从 1560 涨到 4784(约 3 倍)。
Google Gemini
- 两边都 ≤ 384 px → 恒定 258 token
- 更大 → 切成 768×768 的块,每块 258 token
- 切块单位 =
floor(min(w,h) / 1.5) - 官方例子:960×540 → 单位 360 → 3×2 = 6 块
Qwen2.5-VL(开源系的做法)
tokens = (H/28) × (W/28),边长向 28 的倍数取整。默认范围 4 ~ 16,384 token,推荐区间 min_pixels = 256×28×28(256 token)、max_pixels = 1280×28×28(1280 token)。它把 token 预算直接暴露成了一个可调参数——这是开源模型相对闭源 API 最实际的一个优势。
⭐ 同一张 1024×1024 的照片,各家收多少
| 系统 | 算法 | token |
|---|---|---|
| o1 / o3 | 75 + 150×4 | 675 |
| GPT-4o / 4.1 | 短边→768,2×2=4 块,85+170×4 | 765 |
| Gemini | 单位 682 → 2×2=4 块 × 258 | 1,032 ⚠️推导 |
| Qwen2.5-VL(推荐上限) | 封顶 1280 | 1,280 |
| Claude(两档同值) | 37×37 | 1,369 |
| Qwen2.5-VL(不封顶) | 37×37 | 1,369 |
| GPT-4.1-mini | 1024 patch × 1.62 | ~1,659 |
| o4-mini | 1024 patch × 1.72 | ~1,761 |
| GPT-4.1-nano | 1024 patch × 2.46 | ~2,519 |
| GPT-4o-mini | 2833 + 5667×4 | 25,501 |
⚠️ Gemini 那一行是我按官方切块规则推导的(用 960×540→6 块的官方例子反推出必须向上取整),不是官方给的例子;GPT-4o 的 765 同理是按文档流程算的。上生产前用返回里的 usage 字段自己核一遍——已有开发者报告实际计费高于文档公式。
读完这张表该记住的:同一张图,最贵的比最便宜的差 37 倍。图像 token 不是一个可以糊弄过去的成本项,它是选型的一个硬输入。
5. 位置编码:二维的顺序
为什么不能直接用 RoPE
glossary §3 说过:不给位置信息,attention 对输入顺序是置换等变的。图像上这个问题更严重——patch 是二维排列的,把它拉平成一维序列,「上下相邻」这个关系就丢了。第 1 个 patch 和第 17 个 patch 在图上是垂直相邻,在序列里却隔了 16 位。
M-RoPE(Qwen2-VL)
- 是什么:把 RoPE 的旋转维度拆成三组:时间 / 高 / 宽。文本 token 三个 ID 相同(退化成普通 RoPE),图像 token 时间维恒定、高宽维变化,视频 token 三维全动。
- 数字:通道切分从发布的 config 里能直接读到——
mrope_section = [16, 24, 24],即 16 维给时间、24 维给高、24 维给宽。(注意:这是 config 里的值,论文正文没写死这个切分。) - 没有它会坏在哪:模型无法判断两个 patch 是「左右相邻」还是「上下相邻」,所有空间关系推理(「杯子在书的左边」)都无从谈起。
其他做法
- RoPE-2D(Pixtral):直接把旋转按二维展开,支持任意分辨率和长宽比,最大 1024×1024,并加了
[IMG BREAK]/[IMG END]特殊 token 来标记换行和结束——行边界得显式告诉模型,因为拉平之后它看不出来。 - 轴向 RoPE(DINOv3):配合 box jittering 数据增强,训练时只用 256 分辨率,推理能稳到 4k。
- 插值(最经典的一招):CLIP 的 336px 模型不是重训的,它的位置编码是从 224px 模型插值出来的,再多训一个 epoch。这是变分辨率的标准做法。
- Qwen2.5-VL 的绝对时间编码:让时间维 ID 对齐真实墙上时钟,这才有了「秒级事件定位」。
6. 视频与音频:把时间也切成 token
视频
视频没有新机制,就是图像 × 帧数。全部的设计空间只有两个旋钮:采样率和每帧 token 数。
Gemini 的账(官方数字,最清楚):
- 采样 1 fps
- 默认 258 token/帧;低分辨率档 66 token/帧
- 音轨 32 token/秒
- 合计:默认 约 300 token/秒,低分辨率 约 100 token/秒
- ⭐ 一分钟视频 ≈ 18,000 token(默认)/ 6,000 token(低分辨率)
- 100 万上下文能装 1 小时(默认)或 3 小时(低分辨率)
Qwen2-VL:采样 2 fps,但每个视频总 token 硬性封顶 16,384——采样率和总预算是两个独立的闸门。
没有它会坏在哪:不封顶的话,一分钟 1080p 视频按每帧 1560 token(Claude 标准档)× 30 fps = 281 万 token,任何模型都装不下。所有视频多模态本质上都是在做激进的时间降采样——1 fps 意味着你丢掉了 96.7% 的帧。快速动作、瞬时事件,模型在物理上就看不见。
音频
- Whisper 编码器(几乎所有音频前端的祖宗):68 万小时训练,30 秒定长窗口,80 通道 log-Mel,25ms 窗 / 10ms 跳,一个 30 秒窗产出 1500 帧(即 50 帧/秒)。
- GPT-4o Realtime 的计费口径最直白:用户音频 1 token / 100ms(10 token/秒 ≈ 600/分钟),助手音频 1 token / 50ms(20 token/秒 ≈ 1200/分钟)。静音不产生 token。
- Qwen2-Audio:编码器从 Whisper-large-v3 初始化,加一个 stride=2 的池化层,每帧约对应 40ms,即 25 Hz / 25 token 每秒。
- Mimi / Moshi(离散音频编解码):24kHz 音频 → 12.5 Hz 帧率,8 个码本 → 100 token/秒,码率 1.1 kbps,端到端延迟 80ms。设计动机写得很直白:12.5 Hz 是在向文本 token 约 3-4 Hz 的速率靠拢——让音频和文本在同一个数量级上,才能塞进同一个自回归循环。
- SNAC:多尺度 RVQ,三层量化器跑在不同时间分辨率(12 / 23 / 47 Hz)上,合计 约 82 token/秒,0.98 kbps,19.8M 参数。
没有它会坏在哪:音频天然是每秒 16,000 个采样点。不做 100~1000 倍的降采样,它连一句话都进不了上下文。「实时语音对话」这件事的全部工程难点,就是把这个降采样做到既省 token 又不丢语义。
7. 原生多模态:原生在哪
「原生多模态」这个词被用滥了。它只有一个技术含义:图像编码器是不是和 LLM 一起从头训的,而不是事后接上去的。
后期融合(接上去的)
预训练好的 ViT + 预训练好的 LLM,中间训一个连接器。LLaVA、Llama 3.2 Vision、Gemma 3 都是这类(Gemma 3 甚至全程冻结视觉编码器)。优点是便宜、模块可复用;缺点是编码器的语义边界在多模态训练开始前就定死了。
早期融合(一起训的)
图像被转成离散 token,和文本 token 共享同一张词表,从预训练第一步就混在一起。
- Chameleon(Meta):512×512 图 → 1024 个离散 token,码本大小 8192;BPE 词表 65,536,其中 8192 个就是图像码本——文本和图像在字面意义上共用一个词表。训练 9.2T token、2.1 个 epoch,7B / 34B 两档,用 QK-Norm 稳训练。
- Emu3:纯 next-token 预测,8B 参数,视觉 tokenizer 做 8×8 空间压缩、码本 32,768、4× 时间压缩。理解和生成都不用扩散、不用组合系统。
- Llama 4:官方措辞是「early fusion,把文本和视觉 token 统一进同一个主干」,视觉编码器基于 MetaCLIP 但配合一个冻结的 Llama 重新训过。Scout 是 17B 激活 / 16 专家 / 109B 总参 / 10M 上下文;Maverick 是 17B 激活 / 128 专家 / 400B 总参。官方只承诺最多 8 张图的后训练效果。
哪条路对
Apple 那篇《Scaling Laws for Native Multimodal Models》(ICCV 2025 oral)训了 457 个模型来回答这个问题,结论很直接:
后期融合相对早期融合没有内在优势。 早期融合在小参数量下表现更强、训练更省、部署更简单。
而且它指出 MoE 让模型能自己学出模态专属的权重,这对早期融合是实质性加成——glossary §4 说 MoE 只作用在 FFN 上,那么在多模态里,不同专家自然会分化去处理不同模态。这也解释了 Llama 4 为什么同时选了早期融合和 MoE。
⚠️ GPT-4o 和 Gemini 的「原生」是厂商说法,没有公开架构细节——没有参数量、没有 tokenizer 规格、没有融合方式。别把它们当技术论据用。
8. 坏在哪里
多模态最反直觉的一点:这些模型的「看」和人类的「看」,重合度远低于 demo 给人的印象。
BLINK:最强的一记耳光
3,807 道选择题,考的全是经典 CV 任务(相对深度、视觉对应、多视角推理、伪造检测)——人类平均 95.70%,而:
GPT-4V 51.26%,Gemini 45.72%——只比随机猜(38.09%)高 13.17 和 7.63 个百分点。
论文的措辞很克制也很致命:这些感知能力在多模态 LLM 上「尚未涌现」,因为这类任务「抵抗通过自然语言中介」。
翻译一下:能被语言描述的视觉任务,模型做得不错;不能被语言描述的,它基本在瞎猜。 这直接对应 §2 那个判断——主流 VLM 用的是 CLIP/SigLIP 的图文对齐特征,不是 DINO 系的稠密空间特征。它学的一直是「怎么用语言描述这张图」,不是「这张图的几何结构是什么」。
其他有数字的失败面
| benchmark | 最好成绩 | 参照 |
|---|---|---|
| BLINK | GPT-4V 51.26% | 人类 95.70%,随机 38.09% |
| MathVista | GPT-4V 49.9% | 人类 60.3%(差 10.4 分) |
| MMMU | Gemini Ultra 59% / GPT-4V 56% | 11.5K 题,30 学科 |
MathVista 论文对失败原因的判断是「难以理解复杂图形、难以做严格推理」。InternVL 2.5 报告 CoT 能给 MMMU +3.7 分——说明有一部分失败是推理侧的,不全是感知侧。这两类失败要分开看,修法完全不同。
分辨率悬崖(可量化)
Claude 的两档上限是公开数据里最干净的例子:同一张 3840×2160 的图,标准档缩到 1456×819(丢 85% 像素,1560 token),高分辨率档保留 2576×1449(4784 token,约 3 倍)。小字 OCR 就是在这条线上失败的——不是模型「不认识字」,是那些字在进编码器之前已经被插值抹掉了。
Anthropic 自己列的限制里还有几条值得抄下来:200 像素以下的小图、旋转图、多次 JPEG 压缩的图会诱发幻觉;坐标定位是近似值;「大量小物体的计数不保证准确」。
计数这一条特别能说明问题。数数在人看来是最简单的视觉任务,但对模型来说——它没有一个「逐个指认并累加」的机制,只有一次前向里的加权平均。glossary §3 说 attention 是加权求和,加权求和天生不会数数。
9. 一句话收尾
图像变成 token 之后,模型不知道自己在看图。这是多模态能这么快铺开的原因——不用改架构,只用改入口。
也是它现在这些毛病的原因。整条链路的每一环都在把二维的、连续的、高信息量的东西,压成一维的、离散的、几百个 token 的序列,然后指望一个从文本里学会推理的模型在这上面做几何。它在能被语言描述的部分做得很好,在其余部分接近随机。
N 是唯一的自变量。 成本、分辨率、能不能读小字、能不能数清楚——全在这一个数上。
附:本文用到的未定论/未公开项
写技术文档最容易出问题的地方是把「厂商说法」当「已验证事实」。下面这些我在正文里做了标注,这里再集中列一次:
- GPT-4o / Gemini 的内部架构:未公开,「原生多模态」是厂商措辞,无法作为技术论据。
- Llama 4 的单图 token 数:官方未发布。
- Gemini 1024×1024 = 1032 token、GPT-4o = 765 token:按官方规则推导,非官方给出的例子,生产前请用
usage字段核对。 - Q-Former 的 query 数与参数量:常见的「32 个 query / 188M」我没能从论文正文确认,正文中未采用。
- Claude 的
(w×h)/750:已被 28px 网格公式取代,仅可作心算近似。