难度
进阶
从图文对齐、视觉编码器、投影层到视觉指令微调,建立多模态大模型的核心心智模型与应用判断框架。
难度
进阶
阅读时长
约 125 分钟
更新日期
2026/03/24
主题
多模态 / 视觉-语言 / 视觉指令微调 / CLIP / LLaVA
读完这篇教程后,你应该能:
如果你已经读过 CLIP:Learning Transferable Visual Models From Natural Language Supervision 和 LLaVA:Visual Instruction Tuning,这篇文章会把它们串成一条更偏工程实践的认知路径。
语言模型擅长处理的是 token 序列,而图片最初是像素网格。两者之间至少隔着三层问题:
所以多模态系统真正要解决的,不只是“能看图”,而是:
这也是为什么多模态方向会经历从 CLIP 到视觉语言模型,再到视觉指令微调的演化。
如果把近年的开源多模态路线压缩成一条主线,大致可以这样理解:
| 阶段 | 代表思路 | 解决的核心问题 |
|---|---|---|
| 图文对齐 | CLIP | 让图像和文本进入同一相似度空间 |
| 视觉桥接 | 冻结视觉编码器 + 投影层 + LLM | 让视觉特征能被 LLM 消化 |
| 指令跟随 | LLaVA 一类视觉指令微调 | 让模型学会围绕图片执行具体任务 |
这条主线很重要,因为它说明:
换句话说,多模态不是一个单点技巧,而是“表征对齐 + 跨模态桥接 + 任务适配”的组合。
把这条主线画出来,会比单看术语更容易建立稳定心智模型:
<g>
<rect x="34" y="86" width="266" height="246" rx="24" fill="#f6f9ff" stroke="#d7e2f1" />
<text x="64" y="120" font-size="20" font-weight="700">阶段一:CLIP 式图文对齐</text>
<rect x="62" y="148" width="90" height="66" rx="16" fill="#e8f1ff" stroke="#98b7e1" />
<text x="107" y="188" text-anchor="middle" font-size="18" font-weight="700">图片</text>
<rect x="182" y="148" width="90" height="66" rx="16" fill="#eef6e8" stroke="#a8c48e" />
<text x="227" y="188" text-anchor="middle" font-size="18" font-weight="700">文本</text>
<line x1="152" y1="181" x2="182" y2="181" stroke="#5b6b7f" stroke-width="3" marker-end="url(#vlm-roadmap-arrow)" />
<rect x="78" y="238" width="176" height="56" rx="16" fill="#fff4dc" stroke="#e2c36f" />
<text x="166" y="271" text-anchor="middle" font-size="18" font-weight="700">共享相似度空间</text>
<text x="64" y="314" font-size="13" fill="#4b5563">强项:检索、匹配、zero-shot 分类</text>
</g>
<g>
<rect x="356" y="86" width="266" height="246" rx="24" fill="#f8fbf4" stroke="#d5e4c6" />
<text x="386" y="120" font-size="20" font-weight="700">阶段二:视觉桥接</text>
<rect x="382" y="156" width="74" height="118" rx="16" fill="#e8f1ff" stroke="#98b7e1" />
<text x="419" y="204" text-anchor="middle" font-size="15" font-weight="700">视觉</text>
<text x="419" y="225" text-anchor="middle" font-size="15" font-weight="700">编码器</text>
<rect x="478" y="174" width="70" height="82" rx="16" fill="#fff4dc" stroke="#e2c36f" />
<text x="513" y="220" text-anchor="middle" font-size="17" font-weight="700">投影层</text>
<rect x="570" y="156" width="78" height="118" rx="16" fill="#fce7ef" stroke="#e2a8bd" />
<text x="609" y="204" text-anchor="middle" font-size="16" font-weight="700">LLM</text>
<text x="609" y="225" text-anchor="middle" font-size="16" font-weight="700">主干</text>
<line x1="456" y1="215" x2="478" y2="215" stroke="#5b6b7f" stroke-width="3" marker-end="url(#vlm-roadmap-arrow)" />
<line x1="548" y1="215" x2="570" y2="215" stroke="#5b6b7f" stroke-width="3" marker-end="url(#vlm-roadmap-arrow)" />
<text x="386" y="314" font-size="13" fill="#4b5563">关键问题:视觉特征如何进入语言空间</text>
</g>
<g>
<rect x="678" y="86" width="268" height="246" rx="24" fill="#fff8ef" stroke="#eed6a0" />
<text x="708" y="120" font-size="20" font-weight="700">阶段三:视觉指令微调</text>
<rect x="710" y="152" width="204" height="66" rx="18" fill="#ede9fe" stroke="#b7a8ea" />
<text x="812" y="181" text-anchor="middle" font-size="18" font-weight="700">图片 + 指令 + 对话数据</text>
<text x="812" y="202" text-anchor="middle" font-size="13" fill="#4b5563">“看图回答”“解释截图”“多轮问答”</text>
<line x1="812" y1="218" x2="812" y2="246" stroke="#5b6b7f" stroke-width="3" marker-end="url(#vlm-roadmap-arrow)" />
<rect x="734" y="246" width="156" height="52" rx="16" fill="#dff4f0" stroke="#8dc7bd" />
<text x="812" y="278" text-anchor="middle" font-size="18" font-weight="700">多模态助手</text>
<text x="708" y="314" font-size="13" fill="#4b5563">关键问题:是否真的围绕视觉证据完成任务</text>
</g>
<line x1="300" y1="209" x2="356" y2="209" stroke="#5b6b7f" stroke-width="3" marker-end="url(#vlm-roadmap-arrow)" />
<line x1="622" y1="209" x2="678" y2="209" stroke="#5b6b7f" stroke-width="3" marker-end="url(#vlm-roadmap-arrow)" />
</g>
大多数开源视觉语言模型,最小结构都可以拆成下面几层:
| 组件 | 作用 | 常见选择 |
|---|---|---|
| 视觉编码器 | 把图像编码成高层特征 | ViT、CLIP image encoder、SigLIP encoder |
| 投影层 | 把视觉特征映射到语言模型可消费的维度 | 线性层、MLP projector |
| 语言模型 | 负责指令理解、文本生成、推理组织 | LLaMA、Qwen、Mistral 等 |
| 输入拼接策略 | 把视觉 token 与文本 token 组织进同一上下文 | 前缀拼接、特殊 token 占位 |
| 训练数据 | 教模型在视觉证据下执行任务 | 图文对、对话数据、问答数据 |
这里最容易被忽略的是投影层。很多人会把它理解成“只是一个小线性层”,但它承担的是跨模态桥接角色:
如果这个桥接没做好,模型即使参数很多,也会表现出“看了图像但没真正用上”的现象。
一个简化后的处理流程通常如下:
如果写成最小伪代码,可以表示为:
image_features = vision_encoder(images) # [batch, num_patches, d_vision]
visual_tokens = projector(image_features) # [batch, num_patches, d_llm]
text_tokens = tokenizer(prompts)
inputs = fuse(visual_tokens, text_tokens)
outputs = llm(inputs, labels=target_text)
这个流程说明了一个关键事实:
多模态 LLM 本质上还是在做“条件生成”,只是条件里除了文字,还多了视觉 token。
这也解释了为什么视觉 token 的数量、图像分辨率、patch 粒度,会直接影响延迟和显存。
CLIP 的历史意义非常大,因为它证明了:
但 CLIP 的目标更接近“对齐”和“检索”,而不是“复杂对话与指令执行”。它更擅长的是:
它并不天然擅长:
所以你可以把 CLIP 理解成“多模态地基”,而不是已经装修完成的应用层产品。
LLaVA 一类模型真正补上的,是“围绕图片执行语言任务”的能力。常见做法通常分两步:
先冻结视觉编码器和大语言模型,只训练中间的投影层或少量桥接参数,让视觉特征能顺畅进入语言模型空间。
再用图像问答、描述、对话数据做 instruction tuning,让模型学会:
这一阶段的本质,不只是“继续训练”,而是把视觉输入正式纳入任务接口。
很多团队一说多模态,就默认是“看图聊天”。但落到产品里,任务类型其实差异很大:
| 任务类型 | 典型输入 | 关键难点 |
|---|---|---|
| 图像描述 / VQA | 商品图、场景图、截图 | 是否真正引用了图中证据 |
| OCR + 文档问答 | 发票、合同、表格、报告截图 | 文字识别和版面理解 |
| 图表 / UI 理解 | 仪表盘、流程图、网页截图 | 空间关系、组件定位 |
| 视觉工作流 | 图片 + 检索 + 工具调用 | 不是单模型问题,而是系统编排问题 |
这张表的意义在于提醒你:不同任务,系统设计完全不同。
例如:
做多模态应用时,很容易陷入一个误区:既然模型能看图,那所有文档都直接丢给视觉模型即可。现实往往更复杂。
通常可以这样判断:
也就是说,多模态并不意味着抛弃传统文档处理,而是把视觉建模作为额外能力层。
很多产品真正卡住的地方,不是“要不要多模态”,而是“该把哪种多模态能力和传统链路怎么组合”。可以先用一个判断图收住:
<rect x="344" y="72" width="292" height="76" rx="22" fill="#f6f9ff" stroke="#d7e2f1" />
<text x="490" y="104" text-anchor="middle" font-size="20" font-weight="700">你的任务主要在解决什么?</text>
<text x="490" y="127" text-anchor="middle" font-size="13" fill="#4b5563">字段读取、图像语义理解,还是长文档合规问答</text>
<g>
<rect x="42" y="206" width="270" height="156" rx="24" fill="#f8fbf4" stroke="#d5e4c6" />
<text x="72" y="240" font-size="20" font-weight="700">路线 A:OCR + 规则</text>
<text x="72" y="267" font-size="13" fill="#4b5563">适合:金额、日期、编号、表单字段抽取</text>
<text x="72" y="289" font-size="13" fill="#4b5563">优点:稳定、可审计、结构化清晰</text>
<text x="72" y="311" font-size="13" fill="#4b5563">短板:对场景语义与开放问答支持弱</text>
<rect x="72" y="326" width="120" height="22" rx="11" fill="#e2f3e6" />
<text x="132" y="342" text-anchor="middle" font-size="12" fill="#4b5563">先识别,再抽取</text>
</g>
<g>
<rect x="356" y="206" width="270" height="156" rx="24" fill="#fff8ef" stroke="#eed6a0" />
<text x="386" y="240" font-size="20" font-weight="700">路线 B:直接用 VLM</text>
<text x="386" y="267" font-size="13" fill="#4b5563">适合:截图问答、图像描述、场景理解</text>
<text x="386" y="289" font-size="13" fill="#4b5563">优点:交互自然,能结合视觉与语言</text>
<text x="386" y="311" font-size="13" fill="#4b5563">短板:OCR、计数、空间定位未必稳</text>
<rect x="386" y="326" width="146" height="22" rx="11" fill="#f7edd1" />
<text x="459" y="342" text-anchor="middle" font-size="12" fill="#4b5563">先理解,再作答</text>
</g>
<g>
<rect x="670" y="206" width="270" height="156" rx="24" fill="#f7f4ff" stroke="#d9cdf6" />
<text x="700" y="240" font-size="20" font-weight="700">路线 C:OCR + RAG + VLM</text>
<text x="700" y="267" font-size="13" fill="#4b5563">适合:多页 PDF、合同、报表、强合规问答</text>
<text x="700" y="289" font-size="13" fill="#4b5563">优点:可追溯,能处理长文档与外部知识</text>
<text x="700" y="311" font-size="13" fill="#4b5563">短板:系统更复杂,评测与运维成本更高</text>
<rect x="700" y="326" width="168" height="22" rx="11" fill="#ebe5fb" />
<text x="784" y="342" text-anchor="middle" font-size="12" fill="#4b5563">先解析,再检索,再回答</text>
</g>
<line x1="438" y1="148" x2="176" y2="206" stroke="#5b6b7f" stroke-width="3" marker-end="url(#multimodal-choice-arrow)" />
<line x1="490" y1="148" x2="491" y2="206" stroke="#5b6b7f" stroke-width="3" marker-end="url(#multimodal-choice-arrow)" />
<line x1="542" y1="148" x2="806" y2="206" stroke="#5b6b7f" stroke-width="3" marker-end="url(#multimodal-choice-arrow)" />
<text x="54" y="390" font-size="13" fill="#64748b">经验上,字段提取优先走 OCR,开放视觉问答优先走 VLM,长文档与强合规任务更适合把 OCR、检索和多模态模型组合起来。</text>
</g>
在 demo 阶段,很多多模态系统看起来非常惊艳。但上线后最常见的瓶颈通常是下面这些:
因此你评估多模态系统时,至少要拆开看三层问题:
只看最终回答,很容易把这些问题混在一起。
一个最小可用的多模态评测,通常应该至少覆盖这些维度:
如果是业务系统,还应该加上:
这也是为什么多模态评测经常比纯文本评测更复杂,因为你不仅要评“推理”,还要评“感知”。
多模态项目最容易失败的原因之一,是一开始就想做“什么图都能看、什么问题都能答”的通用助手。更务实的路线通常是:
这条路线的好处是,你会更快知道:
很多系统只是“支持上传图片”,但回答并不真正依赖视觉证据。判断多模态是否成熟,要看模型是否真的因为图像而改变了推理结果。
更高分辨率通常意味着更多视觉 token、更高延迟和成本。关键是让信息密度与任务匹配,而不是盲目堆像素。
视觉问答能力和复杂空间推理能力不是同一件事。很多模型能描述画面,却依旧不擅长严谨的空间定位和计数。
在很多企业场景里,OCR、版面解析和检索仍然是强约束组件。多模态模型通常是在它们之上补“理解”和“交互”,而不是完全取代。