AI 基础入门 · 第18课
投影层与投影 GGUF:多模态模型的眼睛
为什么 Qwen-VL 这类能看图的模型,下载时会多出一个 .mmproj 文件?因为 LLM 只认向量,图片得先经视觉编码器 编码,再由投影层 Projector 把维度对齐到 LLM 的词向量空间,才能“喂”给大模型。这一课讲清这条 vision encoder → projector → LLM 的数据流,以及为什么投影权重必须单独出文件、和主 .gguf 组合加载、不能省。
① 小白第一课怎么学(4 步走,约 50 分钟)
先回顾第15课(.gguf 是主权重文件)和第5课(参数是什么)。这一课讲多模态模型为什么还要额外一个 mmproj 文件。
1 建立直觉(10 分钟) 读②③:图片怎么变成 LLM 能懂的向量。
2 看懂投影层(15 分钟) 读④:vision encoder → projector → LLM embedding。
3 搞清文件组合(15 分钟) 读⑤:主 .gguf + 投影 .mmproj 怎么一起加载。
4 刷题自测(10 分钟) 做⑦⑩,错题回⑥看易错点。
本课小目标 学完你要能:① 画出 vision encoder→projector→LLM 的数据流;② 解释为什么投影权重单独出一个文件(mmproj);③ 说清 .gguf 主权重和 .mmproj 如何组合加载;④ 知道为什么 mmproj 不能省。
② 一图看懂:图片是怎么进大模型的
一张图片
像素 RGB
(高×宽×3)
视觉编码器
Vision Encoder
把图片切成 patch
输出视觉特征序列
维度≠LLM 词向量维度
投影层 Projector
(mmproj 文件装的就是它)
线性层/MLP
把视觉维度
映射进 LLM 词向量维度
大语言模型 LLM
(主 .gguf 装的就是它)
把"图像 token"当作文本 token
一起理解 → 生成文字回答
图片 →(视觉编码)→ 视觉特征 →(投影)→ 塞进 LLM 的词向量空间 → LLM 看图说话
关键断点:视觉特征维度和 LLM 词向量维度对不上,必须靠 Projector 搭桥
读法:左边图片先进视觉编码器变成一串视觉特征向量,但它的维度和语言模型词向量的维度不一样,不能直接喂。中间的 Projector(投影层)就是一座"桥",把视觉特征映射到 LLM 的向量空间,LLM 才能把"图像信息"当成一种特殊的"词"来读。这座桥的权重,就是单独的 mmproj 文件。
③ 本质直觉:LLM 只认向量,投影层负责"翻译"
先回忆 LLM 的输入: 大语言模型本质上只吃一种东西——token 的向量(embedding) 。文字先经分词器变 token,再查嵌入表变成向量序列,喂进 Transformer。图片对它来说是完全陌生的输入。
多模态模型怎么看图: 以 Qwen2-VL 这类视觉语言模型为例,数据通路是三段:
① Vision Encoder(视觉编码器) :把图片切成小块(patch),编码成一串视觉特征向量;
② Projector(投影层) :一个小的线性层/MLP,把视觉特征的维度投影 成和 LLM 词向量一样的维度;
③ LLM :把这些"投影后的图像向量"当成特殊的图像 token,和文字 token 拼在一起,照常做注意力、生成回答。
为什么必须有 Projector 视觉编码器输出的维度(如 1024/1280)和 LLM 的隐藏维度(如 3584)通常不一样 。维度不匹配,向量根本没法拼进 LLM 的序列。Projector 就是那个做"维度对齐 + 语义翻译"的小网络,让图片信息能被 LLM 读懂。没有它,LLM 看不了图。
④ 完整体系:投影权重为什么单独出一个文件
在 llama.cpp / Ollama 体系里,多模态模型的权重被拆成两个文件 :
文件 装的是什么 类比
主权重 .gguf 纯语言模型部分(Transformer 主干 + 词表),和普通 LLM 一样 模型的"大脑",负责说话
投影文件 .mmproj 视觉编码器 + Projector(看图所需的那部分权重) 模型的"眼睛 + 视神经"
为什么拆开而不塞进一个 .gguf?
原因 说明
语言模型可复用 同一套 LLM 主干,可以配不同的视觉编码器做不同多模态任务;拆开后主干 .gguf 能被多个投影方案复用
按需加载 纯聊天时只加载主 .gguf,省内存;要"看图"时才额外加载 .mmproj
生态约定 llama.cpp 把多模态投影权重规范成单独的 mmproj GGUF 文件,Ollama/LM Studio 都按这个约定组合加载
mmproj 是什么格式 它本质上也是一个 GGUF 文件(只是内容是视觉投影权重),后缀习惯叫 .mmproj(multimodal projector)。Ollama 拉多模态模型时会同时拉下主模型和对应的 mmproj。
⑤ 用法场景:完整权重 + 投影如何组合加载
以 llama.cpp 命令行为例,跑一个视觉语言模型要同时指定两个文件 :
./llama-cli \
-m qwen2.5-vl-7b-instruct.Q4_K_M.gguf \
--mmproj mmproj-model-f16.gguf \
-p "描述这张图" --image cat.jpg
参数 作用
-m 主模型.gguf加载语言模型主干权重
--mmproj 投影.gguf加载视觉投影权重(没有它就看不了图)
--image 图片输入要理解的图片
典型例题:我只下了主 .gguf,能跑图文问答吗?
缺了 mmproj 会怎样?
能聊天(纯文本没问题),但一上传图片就报错或忽略图片 ——因为没有视觉投影权重,图片根本没被编码进 LLM 的向量空间。必须再下对应的 .mmproj 并用 --mmproj 指给引擎。
为什么 mmproj 不能省 ① 没有它,视觉编码器和 Projector 的权重不存在,图片无法转成 LLM 能读的向量;② 它和主 .gguf 是配套的——视觉编码器维度、Projector 映射形状都要和主模型严格对应,下错版本还会加载失败。所以多模态模型=主 .gguf + 匹配的 .mmproj,缺一不可。
⑥ 高频错误诊断(4 条)
错误 1:只下主 .gguf 就想看图 多模态模型必须同时有对应的 .mmproj。只有主权重只能纯文本对话,传图无效或报错。
错误 2:拿错版本的 mmproj 视觉投影权重要和主模型版本严格配套(同一发布、同一量化配套)。混用不同模型的 mmproj,会因维度不匹配加载失败或输出乱码。
错误 3:以为 Projector 在做"识别物体" Projector 不做物体分类,它只是把视觉特征投影对齐 到 LLM 向量空间;真正"看懂"靠后面的 LLM 和视觉编码器一起。
错误 4:把 mmproj 当成模型主权重 mmproj 只装视觉投影部分,单独加载它没有任何聊天能力;它必须和主 .gguf 配合,单独用没意义。
⑦ 考点真题演练(4 题)
考点分布
考法 出题形式 应对
数据流 问图片到 LLM 经过哪三步 encoder→projector→LLM
Projector 作用 问它干嘛用 维度对齐/翻译
文件分工 问 mmproj 装什么 视觉投影权重
组合加载 问缺 mmproj 会怎样 看不了图
真题 基础 1. 视觉语言模型处理一张图片的正确数据流是?
A. 图片 → 视觉编码器 → Projector 投影 → LLM
B. 图片 → LLM → 视觉编码器
C. 图片直接变成文字喂给 LLM
D. LLM 直接读取像素
真题 中档 2. Projector(投影层)的核心作用是?
A. 对图片做裁剪压缩
B. 把视觉特征的维度映射对齐到 LLM 词向量维度,让图片能被 LLM 读取
C. 给图片加滤镜
D. 替代 LLM 直接回答
真题 中档 3. Ollama/llama.cpp 里,.mmproj 文件装的是什么?
A. 聊天记录
B. LLM 主干权重
C. 视觉编码器 + 投影层的多模态投影权重
D. 分词器词表
真题 拔高 4. 只加载主 .gguf、不加载 .mmproj,会发生什么?
A. 模型完全不能运行
B. 能纯文本聊天,但上传图片时无法理解/报错
C. 图片会被自动识别得更好
D. 模型会自动下载 mmproj
⑧ 必背知识点卡
三段数据流: 图片 → 视觉编码器 → Projector → LLM 看图说话的 pipeline
Projector: 把视觉特征投影对齐到 LLM 向量维度 搭桥翻译
为什么拆开: 语言主干可复用、按需加载、生态约定 眼睛和大脑分文件
主文件: .gguf = LLM 主干 负责说话
投影文件: .mmproj = 视觉投影权重 负责看图
加载: -m 主.gguf --mmproj 投影.gguf 两个都要给
不能省: 缺 mmproj 看不了图,且要和主模型配套 缺一不可
⑨ 应用输出:搭一个本地"看图"模型
实战场景:你想在 Ollama 本地跑一个能"看图答题"的 Qwen-VL。
① 下对模型: 拉多模态模型时,Ollama 会自动同时下载主权重和配套的 mmproj(不用你手动找)。
② 手动用 llama.cpp: 要自己拼命令,就得 -m 指主 .gguf、--mmproj 指投影文件,缺一不可。
③ 传图: 对话里附一张图,引擎先过视觉编码器+Projector 转成图像向量,再和你的问题一起喂给 LLM。
④ 排错: 如果传图没反应,先检查是不是漏了/用错了 mmproj——十有八九是投影文件没配对。
口述全链路 "多模态模型=大脑+眼睛。大脑是主 .gguf(LLM 主干),眼睛是视觉编码器+Projector,权重单独存成 .mmproj。图片先被编码成视觉特征,再由 Projector 投影到 LLM 的向量维度,LLM 才能把图当特殊 token 来读。跑的时候主 .gguf 和匹配的 .mmproj 必须一起加载,缺了 mmproj 就只能纯打字、看不了图。"
⑩ 分层练习 16 题(基础 6 + 中档 5 + 拔高 5)
▍基础 6 题
基础1 多模态模型里,把图片编码成视觉特征的部件叫什么?
解析 视觉编码器(Vision Encoder) 。
基础2 Projector 的中文名叫什么?
解析 投影层 (也叫投影器)。
基础3 Ollama 里投影权重文件的后缀通常是?
解析 .mmproj (multimodal projector)。
基础4 主 .gguf 装的是哪部分?
解析 LLM 语言模型主干 + 词表 ,负责文字理解与生成。
基础5 mmproj 文件本质上是什么格式?
解析 本质是一个 GGUF 文件 ,只是内容是视觉投影权重。
基础6 llama.cpp 里指定投影文件用哪个参数?
解析 --mmproj 。
▍中档 5 题
中档7 为什么视觉特征不能直接喂给 LLM?
解析 视觉编码器输出的维度和 LLM 词向量维度通常不一致,无法拼接进同一序列;需要 Projector 做维度对齐。
中档8 为什么把投影权重单独存一个文件?
解析 让语言主干可被不同视觉方案复用、纯聊天时可不加载投影省内存、并遵循 llama.cpp 生态的多模态约定。
中档9 Qwen2-VL 里,Projector 连接的是哪两段?
解析 连接视觉编码器输出 与 LLM 的词向量(embedding)输入 ,把前者映射到后者的维度。
中档10 只加载 mmproj 不加载主 .gguf 会怎样?
解析 没有语言主干,模型根本不能对话/生成文字。mmproj 只是"眼睛",必须配"大脑"才有意义。
中档11 Ollama 拉多模态模型时为什么不用你手动找 mmproj?
解析 Ollama 按模型清单自动把配套的主权重和 mmproj 一起拉取并在运行时组合加载,对用户透明。
▍拔高 5 题
拔高12 为什么 mmproj 必须和主 .gguf 版本严格配套?
解析 Projector 的输出维度要精确等于 LLM 的隐藏维度,视觉编码器结构也要匹配。版本错配会导致形状对不上、加载失败或输出乱码。
拔高13 "Projector 是个小网络"对模型总参数量影响大吗?
解析 通常很小(常是一层线性映射),远小于 LLM 主干。这也是它能单独拆出来、按需加载的原因之一。
拔高14 音频/语音多模态模型是不是也有类似投影层?
解析 思路一致:音频编码器输出音频特征,也要经投影层对齐到 LLM 向量空间,才能和文字一起进 LLM。只是换了个编码器。
拔高15 为什么说"看图问答"里 LLM 才是真正做推理的?
解析 视觉编码器和 Projector 只负责把图转成 LLM 能读的向量;"这图里有什么、说明了什么、怎么回答"都靠 LLM 在对齐后的表征上做注意力与生成。
拔高16 如果想让一个纯文本 LLM 临时"看图",最省事的做法是什么?
解析 不是改造 LLM,而是直接换用已训练好的多模态模型(带配套视觉编码器+Projector+主 LLM)。Projector 是和模型一起训练出来的,不能事后随便插一个。
⑪ 记忆口诀 + 7 天复习计划
三句口诀
① 看图三步:图片→视觉编码器→Projector→LLM。
② 大脑是主 .gguf,眼睛是 .mmproj,两者配套。
③ 缺了 mmproj 看不了图,主文件和投影文件必须一起加载。
天 任务 自检
第 1 天 读②③,画看图数据流图 说清 Projector 作用
第 2 天 背知识点卡 + 基础 1-6 文件分工全对
第 3 天 读④⑤组合加载,做中档 7-11 能写加载命令
第 4 天 做拔高 12-16 讲清为何要配套
第 5 天 做⑦真题 4 题 限时每题 2 分钟
第 6-7 天 合上书口述看图 pipeline 与两文件分工 不看资料全说对