← 算法与AI总览 首页 / 算法与AI / AI 基础入门 / 第18课 · 投影层与投影 GGUF
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. 视觉语言模型处理一张图片的正确数据流是?

真题中档2. Projector(投影层)的核心作用是?

真题中档3. Ollama/llama.cpp 里,.mmproj 文件装的是什么?

真题拔高4. 只加载主 .gguf、不加载 .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)。
基础2Projector 的中文名叫什么?
投影层(也叫投影器)。
基础3Ollama 里投影权重文件的后缀通常是?
.mmproj(multimodal projector)。
基础4主 .gguf 装的是哪部分?
LLM 语言模型主干 + 词表,负责文字理解与生成。
基础5mmproj 文件本质上是什么格式?
本质是一个 GGUF 文件,只是内容是视觉投影权重。
基础6llama.cpp 里指定投影文件用哪个参数?
--mmproj。

▍中档 5 题

中档7为什么视觉特征不能直接喂给 LLM?
视觉编码器输出的维度和 LLM 词向量维度通常不一致,无法拼接进同一序列;需要 Projector 做维度对齐。
中档8为什么把投影权重单独存一个文件?
让语言主干可被不同视觉方案复用、纯聊天时可不加载投影省内存、并遵循 llama.cpp 生态的多模态约定。
中档9Qwen2-VL 里,Projector 连接的是哪两段?
连接视觉编码器输出与 LLM 的词向量(embedding)输入,把前者映射到后者的维度。
中档10只加载 mmproj 不加载主 .gguf 会怎样?
没有语言主干,模型根本不能对话/生成文字。mmproj 只是"眼睛",必须配"大脑"才有意义。
中档11Ollama 拉多模态模型时为什么不用你手动找 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 与两文件分工不看资料全说对
📌 知识链路

前置知识(先学):第15课 · GGUF 格式:mmproj 本质也是个 GGUF 文件,先懂 .gguf 容器才懂投影文件怎么来;第5课 · 模型权重:投影层本身也是一堆参数权重,拆出来单独存。

本节位置:在"多模态模型怎么加载"这一环——它把第15课的单文件 .gguf 扩展为"主权重 + 投影权重"双文件组合。

下一步(学完去):第20课 · llama.cpp 配置实战:实战里会用 --mmproj 组合加载多模态模型;多模态模型专题:深入看图、听音等多模态架构。

← 第17课 · MTP 多 Token 预测 算法与AI总览