多模态 LLM · 视觉 token
学习舱 / 多模态 LLM / 视觉 token

图像怎么变成 token:patch 化与视觉 token

整理中 深度 · 应用 更新 2026-09-09

前置 Tokenizer

图像怎么变成 token:patch 化与视觉 token

一句话定位:把图像铺成固定大小的网格(patch),每格变成一个「视觉 token」,图像就能和文字挤进同一条序列——本文讲这条流水线怎么转、一张图到底占多少 token。前置:Tokenizer 与分词(BPE)——先知道文本怎么切成 token、token 是模型的最小计算单元。

先从一个赛博读图体验说起

把一张报错截图拖进对话框,问「哪个环节出了问题」,模型不光认出这是一个代码界面,还能逐行读出报错文字。看图说话这件事,今天的对话模型已经当成理所当然。

可它底下的语言模型只认 token——上一篇讲过分词器,文本要先切成 token 才进得了模型,而 token 本质是从一张「词表」里查出来的词条。图像不是文字:它是一张几百万像素的彩色矩阵,在词表里根本查不到。从一幅图到一串排好队的 token,中间隔着一条鸿沟。

图像也要先「分词」吗?它切出来的「词」长什么样?一张图又要占多少个 token?

要切,但完全不走 BPE 那套统计合并——把图铺成固定大小的网格,每格作为一个单元送进模型,业界管这个格子叫 patch(图块),对应的编号就叫视觉 token。这条流水线怎么转、账单怎么算,就是本文的主角。

全景图:从一张图到一串 token

先看整条流水线:图像进模型前要过四道工序——切网格、展平排队、投影对齐、拼进序列。前两道解决「图怎么变成队列」,第三道解决「图的语言怎么对齐到文字的语言」,第四道把视觉 token 塞进文本 token 的队伍里一起算。

图像 → token:patch 化流水线全景 原图 数百万像素的 彩色矩阵 词表里查不到 ① 切网格 14 像素见方一格(主流之一) 336² 图 = 24×24 = 576 块 不重叠、不学习 ② 展平排队 按行扫成一维序列 第 1 行排到第 24 行 行列位置单独标记 ③ 投影对齐 编码器出向量 投影改写成同款格式 与文本 token 同尺寸 ④ 拼进序列 视觉 token 两头包特殊标记(图开始 / 图结束) 插进文本 token 队伍 之后走同一条注意力流水线 成本钩子 分辨率翻倍 → 格子 ×4 576 块 → 2304 块 格子大小、合并、钳制都改账单 图压成队列: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 靠分辨率和格子大小。两种「分词」并排看:

文本与图像:殊途同归的两种「分词」 文本 · BPE 分词 输入:一串文字 规则:从语料统计学出的合并 单元:词表里查出的词条 账单:随内容长度变 省法:词表越厚,切得越粗 中文约 1.5–1.8 字/token(Qwen 口径) 图像 · patch 切块 输入:一张图 规则:固定几何网格(不学习) 单元:每格编码加投影出的向量 账单:随分辨率变 省法:格子越大越省,细节越糊 336² 图 = 576 token(14px 口径) ≈ ≈ ≈ ≈ ≈ 殊途同归:两种 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 账 LLaVA-1.5(14px 不合并) 576 Qwen 系(28px 有效 · 未钳制) 144 OpenAI 新模型(32px×1.2) 146 gpt-4o 低细节(一口价) 85 分辨率翻倍(336²→672²):token ×4,注意力打分对 ×16,键值缓存 ×4 576→2304(LLaVA 口径);一张 1080p 截图在新口径下约 2448,顶四张 336² 小图 读法:条长 = token 数;每格面积、合并、钳制是四行差距的全部来源

图:同一张 336² 图的四种 token 账——从 85 到 576,切法说了算

三条推论把账算透

  1. token ×4:token 数正比于像素数除以每格面积,分辨率翻倍就是 token ×4。
  2. 打分对 ×16:token 多 4 倍,注意力两两配对数按平方涨 16 倍——长上下文里讲过的第一堵墙,图像换了个方式撞上去。
  3. 缓存线性:键值缓存按 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 做重要性剪枝或合并(研究活跃方向)。另外先验也存在:信息能用一句话说清的图,就别整图进上下文。

参考与延伸

下一站:VLM 架构:视觉编码器 + LLM 的连接方式——视觉 token 备好了,编码器、连接器与 LLM 怎么拼成一台看图机器。

本节点大纲与自测题(3 个子点 · 3 问)

大纲

  • 图像 patch 化与序列化
  • ViT 与 LLM 的 token 对齐
  • 视觉 token 的成本账(一张图多少 token)

自测——答不上来就是缺口

  • 分辨率翻倍,视觉 token 和显存成本怎么变?
  • 图像 token 化和文本 BPE 有什么本质区别?谁决定「一张图多少 token」?
  • 多图任务的视觉 token 爆窗,有哪些压缩杠杆?