图像怎么变成 token:patch 化与视觉 token
一句话定位:把图像铺成固定大小的网格(patch),每格变成一个「视觉 token」,图像就能和文字挤进同一条序列——本文讲这条流水线怎么转、一张图到底占多少 token。前置:Tokenizer 与分词(BPE)——先知道文本怎么切成 token、token 是模型的最小计算单元。
先从一个赛博读图体验说起
把一张报错截图拖进对话框,问「哪个环节出了问题」,模型不光认出这是一个代码界面,还能逐行读出报错文字。看图说话这件事,今天的对话模型已经当成理所当然。
可它底下的语言模型只认 token——上一篇讲过分词器,文本要先切成 token 才进得了模型,而 token 本质是从一张「词表」里查出来的词条。图像不是文字:它是一张几百万像素的彩色矩阵,在词表里根本查不到。从一幅图到一串排好队的 token,中间隔着一条鸿沟。
图像也要先「分词」吗?它切出来的「词」长什么样?一张图又要占多少个 token?
要切,但完全不走 BPE 那套统计合并——把图铺成固定大小的网格,每格作为一个单元送进模型,业界管这个格子叫 patch(图块),对应的编号就叫视觉 token。这条流水线怎么转、账单怎么算,就是本文的主角。
全景图:从一张图到一串 token
先看整条流水线:图像进模型前要过四道工序——切网格、展平排队、投影对齐、拼进序列。前两道解决「图怎么变成队列」,第三道解决「图的语言怎么对齐到文字的语言」,第四道把视觉 token 塞进文本 token 的队伍里一起算。
图:patch 化流水线四步——①切网格 ②展平排队 ③投影对齐 ④拼进序列;token 总数由分辨率与每格面积决定
渐进拆解:一块瓷砖一张速记卡
把图像 token 化想象成给一幅马赛克壁画编目。语言模型的世界是一条线:它读任何东西,都是读一串排好队的 token。要让「一幅画」上这条线,只能先把画铺满小方格,给每格写一张「特征速记卡」(这格是天蓝色、带直线纹理),再按从左到右、从上到下的顺序把卡片排成一列——一幅画就变成了「一串格子描述」。格子铺多细、卡片写多准,决定了模型看图的清晰度和这张图的账单。
四步流程(①–④)逐道过:
- ①切网格:按固定边长把图切成不重叠的小块,主流编码器用 14 或 16 像素见方,一张 336×336 的图按 14 像素切就是 24×24 = 576 块。
- ②展平排队:把二维网格按行扫成一维序列,先后顺序里藏着行列位置(位置怎么标记,见本节末的加餐)。
- ③投影对齐:每格像素先过视觉编码器变成向量(就是类比里那张「特征速记卡」),再经一层线性投影改写成文本 token 进模型时随身的那种数字格式。这一步之后,视觉 token 和文本 token 在模型眼里已是同一种东西。
- ④拼进序列:视觉 token 两头包上特殊标记(Qwen 的写法是
<|vision_start|>与<|vision_end|>),插进文本 token 队伍,一起走注意力流水线。
和 BPE 的三点不同:
- 学出来的对画出来的:BPE 统计语料频率,高频组合熔成词条,词表是炼出来的;patch 化是固定几何网格,不学习、不合并,什么图进来都是同一副切法。
- 账单随内容对随分辨率:文本 token 数随内容长度变;图像 token 数随分辨率变——同样的图,缩放一下尺寸账单就变(中文的换算口径见分词篇:约 1.5–1.8 字/token,Qwen 官方文档口径)。
- 直查词表对多一道转换:文本 token 直接查词表拿向量;图像 patch 要先过编码器再投影。
三处不同指向同一句话:文本省 token 靠词表,图像省 token 靠分辨率和格子大小。两种「分词」并排看:
图:文本与图像的 token 化对照——规则一学一画,账单一个看内容、一个看分辨率
大白话:模型不「看」图,它读一份按格子写的图画速记——把画铺满小格,每格一句话描述特征,从头到尾读完整份清单。清单多长,取决于格子多细、画多大。
技术定义:这套切法随 ViT(Vision Transformer)定型——2020 年论文「一张图值 16×16 个词」把图像切成 patch、展平成序列、直接套 Transformer 编码器,视觉从此与语言共用同一套架构;今天主流视觉编码器几乎都是 ViT 系,patch 边长 14 与 16 像素是两大主流(论文见文末参考)。
顺带回答一个自然会冒出来的疑问:为什么不把像素直接当 token?一张 336² 的图有超过 11 万个像素——一像素一 token 的话,序列比一整章书还长,注意力根本算不起;而相邻像素高度冗余,天空一片蓝、白墙一整面,全是重复信息。patch 是压缩的第一步:14×14 = 196 个像素先压成一个单元,token 数除以 196,信息由编码器挑着保。今天各家视觉编码器的差异,主要就差在「挑什么、怎么挑」。「编码器怎么选、选完怎么接」,下一篇专门拆。
成本账:一张图到底多少 token
上一节是机制,这一节算钱。视觉 token 和文本 token 同价:进同一条上下文窗口、按同样单价计费、占同样的键值缓存。所以「一张图多少 token」直接决定多图对话的预算,和批量截图任务里窗口还剩多少。
各家口径差异很大,先把主流切法排成一张表(2026-09 查证):
| 模型口径 | 切法 | 一格覆盖 | 参考量 |
|---|---|---|---|
| LLaVA-1.5(CLIP ViT-L/14) | 14 像素一格,不合并 | 14×14 像素 | 336² 图 = 576 个 |
| Qwen2-VL 起(动态分辨率) | 14 像素切块再 2×2 合并 | 28×28 像素 | 224² 图 = 64 个(连首尾标记 66);默认可容 4–16384,官方建议按 256–1280 钳制 |
| OpenAI gpt-4o / 4.1(瓦片计费) | 按 512 像素瓦片计费 | 不按格 | 低细节一口价 85;高细节每瓦片 170 + 底 85 |
| OpenAI 新一代(patch 计费) | 32 像素一格 | 32×32 像素 | 单图上限 3 万格;计费乘系数后向上取整(gpt-5 主档 1.2,小杯档另有系数如 nano 1.5,以文档乘数表为准) |
同一张 336² 小图在四种口径下的账,一眼看差距:
图:同一张 336² 图的四种 token 账——从 85 到 576,切法说了算
三条推论把账算透
- token ×4:token 数正比于像素数除以每格面积,分辨率翻倍就是 token ×4。
- 打分对 ×16:token 多 4 倍,注意力两两配对数按平方涨 16 倍——长上下文里讲过的第一堵墙,图像换了个方式撞上去。
- 缓存线性:键值缓存按 token 线性累积——一张高清图占的显存,抵得上一篇几千字的长文。
完整的数字账(576 → 2304、56 KiB/token 折算 31.5 → 126 MiB)看上图底注;想亲手算一遍,下方动手节有二十行 Python 账本。
一个最容易漏算的场景
批量截图任务最吃预算:一张 1080p 截图在 OpenAI 新口径下是 60×34 = 2040 格——十张就是两万四千多 token,还没算文字(单图账见上图底注)。高细节模式另有预算规则,超了自动降采样,以官方文档现行口径为准;多图 Agent 的上下文预算,必须先按目标模型的口径把图的账算进去。
动手:三套口径的 token 账本
切法不同、账单差数倍。下面二十行 Python 把三套口径写成函数账本,输入分辨率立刻出账(输出为实跑结果):
import math
def llava_tokens(w, h, patch=14): # 口径 A:LLaVA,14px 一格,不合并
return (w // patch) * (h // patch)
def qwen_tokens(w, h, patch=14, merge=2): # 口径 B:Qwen,切块后 2×2 合并(未钳制)
return (w // patch) * (h // patch) // (merge * merge)
def openai_tokens(w, h, px=32, mult=1.2): # 口径 C:OpenAI 新口径,32px 格 × 系数,向上取整
return math.ceil(math.ceil(w / px) * math.ceil(h / px) * mult)
KV_KIB = 56 # Qwen2-7B 每 token 键值缓存(长上下文篇口径)
for w, h in [(336, 336), (672, 672)]:
print(f"{w}x{h}: LLaVA={llava_tokens(w, h)} Qwen={qwen_tokens(w, h)} "
f"OpenAI={openai_tokens(w, h)}")
print(f"KV: 576 token={576 * KV_KIB / 1024:.1f}MiB 翻倍后={4 * 576 * KV_KIB / 1024:.1f}MiB")
实际运行输出(已验证):
336x336: LLaVA=576 Qwen=144 OpenAI=146
672x672: LLaVA=2304 Qwen=576 OpenAI=530
KV: 576 token=31.5MiB 翻倍后=126.0MiB
对着输出读规律:同一张 336² 图,LLaVA 口径 576、Qwen 合并后 144、OpenAI 新口径计费 146——每格面积与是否合并是 token 数的第一杠杆;分辨率翻倍,LLaVA 与 Qwen 精确 ×4,OpenAI 因计费向上取整略有出入(146→530,约 ×3.6);键值缓存一行是显存账,翻倍分辨率单图就多花约 94.5 MiB。把这段函数抄进评估脚本,多图任务的上下文预算就能先算后跑。
边界与取舍:patch 不是唯一答案
格子大小的取舍
格子大则 token 少、序列短,但每格描述粗、细节糊;格子小则细节保住、token 涨。14–16 像素是业界多年折中的落点;Qwen 系则干脆把分辨率做成旋钮——动态分辨率原生切图,默认可容 4–16384 个 token,官方建议按 256–1280 钳制,超上限先降采样。
视觉 token 太多怎么办
一张图几千 token,多图任务很快爆窗。业界两条路:
- 切之前压分辨率:Qwen 的处理器提供 min_pixels 与 max_pixels 两个参数,把每图 token 的上下限写进配置,超限自动缩放。
- 切之后剪或合并:对视觉 token 做重要性打分,把打分低的剪掉或合并——当前活跃的研究方向,本文不展开。
连同上一条讲的格子大小与合并,一共三个旋钮可调,记住「图进上下文前,token 数是个可调的杠杆」即可。视频是这张账的乘法版:每帧都按同口径切 token,帧数一乘就是几十倍,所以视频理解模型对压缩的需求最迫切。
「看图」和「画图」是两条 token 化路线
本文的 patch 化服务于「看」:把连续的图像压成语义 token 交给语言模型理解。文生图主流走另一套压缩:先用 VAE 这类压缩器把图变成一串连续的数字草稿(行业叫潜码,不是词条),交给扩散模型去画;把图压成离散视觉词表 token 的是自回归、掩码生成那一派。两个「视觉 token」同名不同物,别混为一谈。
什么时候根本不该放图
视觉 token 挤占的是文本的上下文预算,纯文本任务硬塞图不会更好。先问一句:这张图的信息能不能用一句话说清?能,就别付几百个 token 的账。
自测
合上文章先自己答,再展开对照:
分辨率翻倍,视觉 token 和显存成本怎么变?
token 数正比于像素数:分辨率翻倍、像素 ×4,token 跟着 ×4(LLaVA 口径 336² 的 576 个变 672² 的 2304 个)。注意力打分对数是平方关系,涨 16 倍;键值缓存按 token 线性累积,涨 4 倍——按 Qwen2-7B 的 56 KiB/token 口径,单图显存从约 31.5 MiB 涨到约 126 MiB。所以分辨率是成本最敏感的旋钮:控制图贵不贵,先钳分辨率,再谈别的优化。
图像 token 化和文本 BPE 有什么本质区别?谁决定「一张图多少 token」?
BPE 是学出来的:统计语料频率把高频组合合并成词条,token 数随内容长度变;patch 化是画出来的:固定几何网格、不学习不合并,token 数随分辨率变。文本省 token 靠词表,图像省 token 靠分辨率与每格面积。所以「一张图多少 token」没有统一答案,由格子边长、是否合并、是否钳制共同决定——同一张 336² 图,LLaVA 口径 576、Qwen 口径 144(未钳制)、OpenAI gpt-4o 低细节一口价 85(2026-09 口径)。
多图任务的视觉 token 爆窗,有哪些压缩杠杆?
三个旋钮按顺序用:入口端钳分辨率(Qwen 的处理器提供 min_pixels 与 max_pixels 参数,超限自动缩放);切法端放大每格面积或加合并(Qwen 的 2×2 合并把 576 压到 144);序列端对已有视觉 token 做重要性剪枝或合并(研究活跃方向)。另外先验也存在:信息能用一句话说清的图,就别整图进上下文。
参考与延伸
- ViT 原论文「An Image is Worth 16x16 Words」(2020-10,ICLR 2021):patch 化 + Transformer 的奠基出处 — arxiv.org/abs/2010.11929
- LLaVA-1.5 论文「Improved Baselines with Visual Instruction Tuning」(2023-10):336px 输入的出处(576 = 24×24 由 patch 14 推得) — arxiv.org/abs/2310.03744
- Qwen2-VL 论文(2024-09):原生动态分辨率与 2×2 合并的官方出处(224² 压到 66 含标记) — arxiv.org/abs/2409.12191
- Qwen2.5-VL 官方博客(2025-01):动态分辨率的官方说明 — qwenlm.github.io/blog/qwen2.5-vl/
- Qwen2.5-VL 官方模型卡:每图 token 默认范围 4–16384 与 256–1280 建议钳制的出处 — huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct
- OpenAI 图像输入文档(2026-09 查证):瓦片计费与 patch 计费两代口径、3 万格上限、计费系数分档 — developers.openai.com/api/docs/guides/images
- Qwen 官方文档「核心概念」:中文与 token 的换算口径(约 1.5–1.8 字/token) — qwen.readthedocs.io/zh-cn/latest/getting_started/concepts.html
下一站:VLM 架构:视觉编码器 + LLM 的连接方式——视觉 token 备好了,编码器、连接器与 LLM 怎么拼成一台看图机器。