
简介围绕多模态大语言模型MLLM领域进展整理的演示文稿面向人工智能研究人员、算法工程师及感兴趣的学习者。先从大语言模型难以处理图片、表情包等多模态输入的局限切入说明转向多模态研究的必要性随后介绍由视觉编码器、连接器和大语言模型构成的三段式架构视觉编码器常用CLIP预训练ViT并适配不同分辨率连接器可通过MLP投影或Q-Former将图像token压缩为固定数量训练分为模态对齐和指令微调两阶段前者对齐视觉与文本语义空间后者提升指令遵循与泛化能力评测部分区分常规任务与专门Benchmark分别考察基础感知和复杂推理水平。内容还展望了提高视觉编码器分辨率的两种思路及在图像描述、智能交互、教育医疗等场景的应用前景。资源共1个文件为7.13MB的PPTX演示文稿结构清晰、框架图丰富适合用作组会研讨、技术分享或快速入门参考。已有502人学习是一份了解多模态大模型前沿趋势的实用资料。1. 多模态大语言模型的进展不只在数据量上给模型一张带红框的报错截图三个月前它只会告诉你“图上有一段英文”现在能指出红框里是Exception in thread main并且建议你先看栈顶第三行。这个变化不是某条提示词的功劳而是多模态大语言模型的整条流水线换了血视觉编码器从单一的 CLIP 走向 SigLIP、BadCLIP 等变体连接器从一层 MLP 变成可伸缩的 Resampler训练数据也把图文交错和文档图像当成一等公民。这篇分享把“领域进展”落到三层架构部件怎么换、训练数据怎么喂、微调和部署有哪些绕不开的坑。适合准备做多模态技术选型的人也适合手里已经有一批多模态数据、想在本地跑通微调和评测的工程师。2. 多模态大模型的架构部件视觉编码器、连接器与分辨率的角逐多模态融合论文里最常比较的三个变量不是参数量、也不是榜单分数而是视觉编码器选哪个、连接器怎么压缩 visual token、图像分辨率按什么策略进模型。这三个变量组合起来基本决定了一个视觉大语言模型“看得清什么”和“记得住多少”。2.1 视觉编码器CLIP 之外的三个选择CLIP 至今仍是默认起点ViT-L/14336px这类权重在大量开源模型里服役。真正的变化发生在两个方向上一是训练目标从 contrastive 变成其他形式二是把分辨率从固定值改成动态区域划分。SigLIP 用 sigmoid loss 替代 softmax小 batch 下更稳所以不少新版模型直接拿它做视觉塔BadCLIP 这类工作则针对标签噪声和对抗扰动做鲁棒性增强属于“视觉塔本身的改进”换进 LMM 时不能只换权重还要重新做一遍对齐。替换视觉塔之前先确认两件事输出维度是否匹配连接器以及 patch 大小是否影响你期望的最小识别粒度。from transformers import CLIPVisionModel, SiglipVisionModel # 视觉塔决定两个数字patch 大小和输出 hidden_size # 它们直接决定了连接器的输入维度 clip CLIPVisionModel.from_pretrained(openai/clip-vit-large-patch14-336) siglip SiglipVisionModel.from_pretrained(google/siglip-so400m-patch14-384) # 替换视觉塔前先做维度断言而不是直接改模型路径 assert clip.config.hidden_size in (1024, 1280) assert siglip.config.hidden_size in (1152, 1280)输出维度决定 MLP 连接器要把视觉特征“翻译”到语言模型的 embedding 空间patch 大小决定一个 14×14 像素块对应一个 tokenpatch 越大同样分辨率下 token 越少但对小字的识别越差。常见做法是文档类场景优先提高输入分辨率、保持 patch 不变而不是反过来。2.2 连接器MLP、Q-Former、Pixel Shuffle 各解决什么问题连接器是视觉塔和大语言模型本体之间的翻译层。早期 LLaVA 用一层 MLP视觉 token 数量不变信息保真度最高代价是序列变长。BLIP-2 的 Q-Former 把视觉 token 压缩到固定 32 或 64 个适合算力紧张但细节保留弱的场景。近一年被用得最多的其实是 Pixel Shuffle 或 Resampler 思路把相邻 patch 按 2×2 合并token 数降到四分之一同时保留空间位置关系。连接器类型视觉 token 变化典型特征MLPLLaVA 路线不变patch 数即 token 数细节保真序列长Q-FormerBLIP-2 路线压缩到 32/64显存友好细节有损Pixel Shuffle / Resampler按倍数降采样动态分辨率友好信息密度高当你用最小代价复现多模态模型代码时我一般建议先固定视觉塔只换连接器观察 loss 变化。因为视觉塔的重新对齐成本最高而连接器是“先学维度映射、再学语义对应”的组件改动它最容易看出数据质量的影响。动态分辨率模型里的 Pixel Shuffle 还有一个好处不同长宽比的图可以按区域切 patch不强制 resize 成正方形这对截图和文档类任务很关键。2.3 训练范式两阶段和三阶段里谁解冻谁冻结常见做法是两阶段第一阶段用海量图文对预训练对齐通常冻结大语言模型本体、只训练连接器或加视觉塔第二阶段指令微调视觉塔可以选择冻结或解冻。新一代模型会把第三阶段偏好优化加进来变成“预训练对齐 指令微调 偏好对齐”整体更接近文本大模型那套训练链路。阶段顺序不能乱。直接跳掉第一阶段、拿少量指令数据硬训模型会学会“回答”但学不会“看”。第一阶段的数据规模通常比第二阶段大一两个数量级这也是很多复现项目效果差的原因不是 LoRA rank 不够而是没有先做对齐。这里有一个常被忽略的参数视角多模态微调的最小微调单位不是 embedding而是“连接器 注意力投影矩阵”这个组合。LoRA 的 rank 从 16 降到 8 时掉得最明显的往往不是语言能力而是对图像细节的跟随能力因为跨模态映射需要足够大的秩来容纳视觉特征与文本语义的对应关系。3. 多模态训练范式与数据组织两阶段、交错数据与配比架构决定上限数据决定能不能到上限。多模态大模型和纯文本模型最大的差别是文本 token 是离散的、顺序的图像则是连续的区域块这种差异让“数据怎么摆放”成为训练效果的分水岭。3.1 从对齐到指令微调阶段划分决定数据配比阶段一的数据目标是“看到图能知道这是什么”阶段二的目标是“听懂指令并按格式回答”。这两个阶段的数据配比完全不同。阶段一以图文对为主阶段二则需要大量指令型样本而且不能全是“描述图片”这种单一指令。数据类别建议配比在训练里承担的角色图文对20%30%建立对象与词的基本映射图文交错网页/多图30%40%多图对比、指代消解OCR/文档15%25%文档类落地的关键能力纯文本10%20%防止语言能力灾难性遗忘图文交错数据不是“一张图配一段话”而是“文本—图片—文本—图片”交替出现的连贯序列。近一年不少开源模型突然变好用一多半靠的是交错数据而不是更大的视觉塔。它让模型学会了一个重要能力当前这句话到底该看图还是看文本。3.2 多模态数据集下载与统一格式转换多模态数据集下载最大的坑是格式不统一有的是 COCO 风格的 JSON有的是 parquet有的把图片存在云端、只给你 URL。统一转换成jsonl是最省事的方式训练框架按行读取也方便按类别采样。huggingface-cli download lmms-lab/LLaVA-OneVision-Data \ --repo-type dataset \ --local-dir ./data/onevision全量数据集通常很大建议先下载一部分做小规模验证。--local-dir指定存放目录不加--include就是全量拉取磁盘不够时可以先挑子集。多模态数据集下载后别急着训练先跑一个统计脚本看图片平均尺寸和文本长度分布这决定你要不要调max_pixels和max_length。3.3 一张图说明白的 JSONL 样本和转换脚本训练框架通用的格式是messages结构user里放指令和image占位符assistant里放期望输出images字段放图片路径。Qwen 系列要求image放在 content 开头其他模型可能允许放在任意位置最好按各框架的模板说明处理。{messages: [{role: user, content: image\n这张图表里趋势是先升还是先降}, {role: assistant, content: 先升后降峰值在第二季度。}], images: [chart_q2.png]}如果你手里的数据还是“图片路径 caption”的图说对需要先转成指令格式否则模型学到的是“补全描述”不是“看图回答问题”。import json from pathlib import Path def convert_captions(image_dir: Path, captions: list[dict], out_path: Path): # 把图说对转成指令微调格式prompt 固定为描述指令 with out_path.open(w, encodingutf-8) as f: for item in captions: f.write(json.dumps({ messages: [ {role: user, content: image\n用一句话描述这张图片。}, {role: assistant, content: item[caption]} ], images: [str(image_dir / item[image])] }, ensure_asciiFalse) \n)这里把ensure_ascii设为false避免中文被转成\uXXXX之后在训练日志里难以排查。指令统一成“用一句话描述”能让模型把注意力放在图像内容上而不是猜测用户到底想问什么。转换完成后抽查前 50 行重点看图片路径是不是相对路径、文件是否真实存在路径错误在训练时通常只报一次 warning但会静默丢样本。4. 用 LoRA 微调多模态大模型命令、参数与最小改动单位这一章进入实操。选什么基座、用什么框架、参数怎么设三个问题一次讲完。4.1 先选模型7B 视觉模型的取舍本地跑通微调的性价比选择通常是 7B8B 量级的视觉大语言模型。选择时不要只看 MMMU 分数先确认三件事是否原生支持多图输入、动态分辨率上限多少、OCR 能力是否够用。文档类任务优先选动态分辨率方案通用对话任务则看指令跟随和幻觉控制。一个常见误用是拿纯对话模型的 LoRA 脚本直接微调视觉模型导致图像 token 根本没有参与训练。确认你的训练框架支持images字段并且target_modules覆盖了连接器所在的线性层。4.2 最小可复现命令ms-swift 跑一次 LoRA我一般用 ms-swift 做多模态 LoRA 微调它对 Qwen2.5-VL 这类模型的 chat template 和数据格式处理得比较完整。最小命令如下CUDA_VISIBLE_DEVICES0 swift sft \ --model Qwen/Qwen2.5-VL-7B-Instruct \ --train_type lora \ --dataset ./data/mixed.jsonl \ --torch_dtype bfloat16 \ --output_dir ./output/qwen25vl-lora \ --num_train_epochs 2 \ --learning_rate 2e-4 \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 16 \ --lora_rank 16 --lora_alpha 32 \ --target_modules q_proj k_proj v_proj o_proj gate_up_proj down_proj \ --max_length 4096 \ --max_pixels 12845056 \ --freeze_vit true \ --save_steps 200 --eval_steps 200freeze_vit true表示冻结视觉塔只训练连接器和语言部分的 LoRA 层显存压力小适合数据量在几千到几万的场景。max_pixels控制图像输入的面积上限12845056 是 Qwen2.5-VL 系列的推荐默认值超过这个像素的图会被缩放。target_modules显式列出注意力投影和 FFN 的线性层确保连接器也落在 LoRA 作用范围内。提示如果训练时遇到 CUDA OOM优先降max_pixels不要先降batch_size。图像 token 占用的激活显存通常比 batch size 的单位增量更大。4.3 五个必调参数表下面五个参数是经验里最值得反复调的部分。参数建议范围说明lora_rank8/16/32多模态微调的最小微调单位数据少时从 8 起步lora_alpharank×2与 rank 保持比例避免缩放因子失控learning_rate1e-45e-4LoRA 通常比全参高一个数量级max_pixels12845056 附近控制图像 token 数调高提升 OCR 但增加显存freeze_vittrue/false数据量大时可解冻视觉塔数据少时强开必崩lora_rank是最值得关注的参数。它不是越大越好rank 32 在几千条数据上容易过拟合模型会复读训练集里的固定句式rank 8 又可能让视觉特征映射不充分。数据量小于 5000 条时先从 rank 8 开始验证集 loss 不再下降再升到 16。4.4 训练到一半怎么看有没有学坏训练日志里最该盯的两个指标是 loss 和 grad_norm。grad_norm 持续在 10 以上说明学习率过高或数据里有异常样本loss 下降但验证集回答开始重复则是过拟合信号。tail -f ./output/qwen25vl-lora/run.log | grep -E loss|grad_norm如果 stdout 没有被重定向到文件就自己加21 | tee run.log。多模态训练里有一个常见现象loss 曲线很漂亮但模型对图像的描述完全不变。这种情况通常是target_modules没覆盖连接器LoRA 只训了语言部分视觉通道等于没接上。另一个隐蔽问题是数据泄漏评测集被混进训练集eval loss 低得异常换新数据立刻露馅。5. 多模态模型的评测与坏 case从基准到手工检查多模态融合论文都喜欢把“多模态 AGI”挂在嘴上但真正制约落地的是评测方式。榜单分数高不等于截图对话好用因为多数基准测的是“识别 常识”不是“在真实界面里定位信息”。5.1 先分清五个基准各自在测什么选基准不是越多越好而是看你正在解决什么问题。基准测什么对落地任务的意义MMMU跨学科知识与多模态组合推理看模型上限不反映日常使用MMBench中英文双语、对抗性选项适合筛选中文场景OCRBench文字检测、识别、结构化文档类任务首选MathVista图表、几何、科学图表图表理解能力的快速 proxyGQA场景细粒度推理看空间关系和属性OCRBench 对文档类项目最有参考价值它覆盖了检测、识别和版面理解三个维度。MMMU 分数高但 OCRBench 差的模型在截图对话场景里会表现得“什么都懂但看字不准”。5.2 用 VLMEvalKit 一键跑齐三个维度VLMEvalKit 把多个基准封装成了统一入口进入仓库根目录后运行python run.py \ --model qwen2_5_vl \ --data MMMU_DEV_VAL MMBench_DEV_EN OCRBench \ --work-dir ./evals--model的取值不是 HuggingFace 路径而是仓库里预先注册好的模型别名跑之前先看python run.py --help确认当前版本支持的名称。--data传基准名多个基准用空格分隔。--work-dir存放预测结果和分数用于对比不同 checkpoint。评测完不要只看总分把 OCRBench 的子项拆开看文字检测分高但识别分低说明视觉编码器看到了文字区域却认不清字符优先提高输入分辨率识别正常但结构化分低说明模型把文字读出来了但没按表格结构组织问题在指令数据而不是视觉塔。5.3 手工检查清单长截图、表格、多图对比基准是过滤器不是验收标准。我一般会在微调后留出 20 条和业务数据同分布的样本逐条看输出。场景样本怎么构造重点看什么长截图把一段多轮问答截成一张长图模型能否定位到最后一个问题双页表格表格横跨两页扫描件是否串行、漏列设计稿对比两张只有按钮颜色不同的图能否指出差异位置手写便利贴手机拍一张带倾斜和阴影OCR 错字率时序折线图一张带时间轴的折线图能否正确判断“先升后降”多模态时序数据融合方法在评测里容易被忽略模型能把趋势说得头头是道但让它指出“哪个时间点开始转折”就露馅。这类时序判断如果频繁出错可以在指令数据里加入“先列坐标点再下结论”的思维链样本。5.4 坏 case 的四种修法坏 case 出现后按顺序试四个手段性价比从高到低排列。第一步改 prompt 约束输出格式比如要求“先引用图中文字再判断”第二步调高max_pixels这能解决大部分 OCR 误读第三步给模型外挂一个 OCR 结果作为额外文本输入很多文档场景这是最稳定的方案第四步才考虑增加训练数据因为错误样本收集和清洗成本最高。提示如果模型出现了“模板泄漏”也就是把 prompt 里的指令原样复述出来优先检查纯文本数据占比而不是加大图像数据。6. 部署技巧显存不够时先动 max_pixels 而不是换卡6.1 先看 OOM 发生在哪一段多模态模型部署时最容易遇到的就是“24G 显卡跑 7B 也 OOM”。先看报错栈如果发生在视觉编码器前向说明图像 token 太多让max_pixels变小如果发生在生成阶段则是 KV cache 撑爆优先降max_model_len。这两个参数动哪一个取决于 OOM 的位置而不是随机试。6.2 vLLM 部署与 AWQ 量化的合理解法vLLM 部署多模态模型时用--limit-mm-per-prompt限制单轮图像数量防止有人一次塞 20 张图把显存打爆。vllm serve Qwen/Qwen2.5-VL-7B-Instruct \ --max-model-len 8192 \ --limit-mm-per-prompt image4 \ --gpu-memory-utilization 0.92 \ --dtype bfloat16max-model-len 8192对多数截图和文档场景足够不要盲目拉长KV cache 是按这个长度预分配的。gpu-memory-utilization 0.92表示允许 vLLM 使用 92% 显存留出一点给视觉编码器的临时激活。如果还是显存不足再用 AWQ 量化模型权重python -m awq.entry \ --model_path Qwen/Qwen2.5-VL-7B-Instruct \ --quant_path ./qwen2.5vl-7b-awq \ --quant_mode w4a16量化后的模型体积约是原来的三分之一但视觉塔里有些算子在 4bit 下可能缺少 kernel 实现量化后 OCR 效果不一定保持不变必须做对照评测。6.3 换部署方式后必须跑一次对照评测量化和降分辨率都会改变图像输入不能只看推理速度就上线。把第 5 章的 OCRBench 再跑一遍对比量化前后的文本行识别准确率。如果准确率掉幅超过预期优先回退量化方案保持max_pixels不变如果掉幅只是集中在高分辨率小字号样本上再考虑把max_pixels调回原值、继续使用量化模型。这个顺序能让你在不出新 bug 的前提下把显存余量压到最小。本文还有配套的精品资源点击获取