多模态大模型的微调和纯文本模型微调有一个关键差异输入里多了一路图像信息。Qwen3-VL 这类模型要把图片转换成视觉 token再和文本 token 一起送入语言模型主干因此在数据集构造、LoRA 注入位置、图像分辨率控制和显存规划上都和纯文本微调完全不同。很多初学者跑通文本 LoRA 之后做 Qwen3-VL 微调仍然会遇到各种问题原因就是没有把“多模态”这三个字拆开理解。这篇教程围绕 Qwen3-VL 微调整理出一条完整链路先理解多模态模型为什么需要微调再准备环境和数据集然后用 Llama-Factory 快速跑通第一个 LoRA 微调再用 transformers peft 手写一遍关键代码最后讲解推理验证和常见问题排查。学完以后你可以把同样的流程迁移到其他 Qwen 多模态模型也可以把微调后的模型接入多模态 Agent 场景。1. 先理清 Qwen3-VL 微调的三个前提1.1 多模态模型的输入输出和单模态有什么不同单模态大模型接收的是文本序列输入是 token ids输出也是 token ids。多模态大模型在结构上多了一个视觉编码器图像会先被切成小块然后转换成视觉 token再与文本 token 拼接后送入语言模型主干。Qwen3-VL 的工作方式大体也是这样。这个结构带来的直接影响是微调时不能只套用文本数据的做法。文本数据只需要分词、构造对话模板、截断长度多模态数据还要处理图片加载、图像尺寸、视觉 token 数量、图像与文本的对应关系。训练时每一条样本都包含一个 image 字段这个字段可能指向本地图片路径也可能指向可下载的 URL预处理阶段必须先把图片真正读成 PIL Image 对象再交给 processor 处理。另外多模态模型的对话模板和纯文本模型也不完全一样。用户输入中通常需要插入image这样的特殊占位符用于告诉模型“这里有一张图”。在 Qwen 系列模型的常见做法里用户消息可能是image 这张图里描述的是什么场景processor 在把对话模板转成 input_ids 时会把image替换成图像对应的视觉 token。如果数据里缺失了这个图片占位符模型可能只看到文本看不到图片内容训练出来的效果自然不对。1.2 提示词工程解决不了的问题才需要微调在思考是否需要微调之前先要区分三种增强手段提示词工程、RAG 检索、模型微调。提示词工程适合快速约束模型的输出格式和行为风格成本低但效果不稳定RAG 检索适合给模型补充外部知识模型本身能力不变模型微调则适合改变模型固定的输出习惯、领域术语、视觉理解偏好比如让模型在识别某个特定场景时给出更符合业务要求的回答。对多模态模型来说微调的典型场景包括让模型识别特定类型的图片、让模型按固定的 JSON 结构输出图片信息、让模型在医学影像或工业质检图上做特定描述、让模型掌握某个产品线专属的视觉问答习惯。这些场景不是简单改提示词就能稳定解决的尤其是输出格式和视觉偏好层面的调整微调往往是更可靠的方式。但微调不是万能的。如果模型本身没有某个能力比如连最基本的图片内容都识别不了微调几百条数据也很难凭空生成新能力。微调更适合做“引导”和“对齐”而不是从零教会模型视觉理解。数据量很少时也优先考虑提示词工程和少量示例而不是直接上微调。1.3 全参微调、LoRA、QLoRA 的选择依据微调方式主要有三种选择依据是显存、数据量和效果预期。全参微调会更新模型中所有参数效果上限最高但显存占用非常大。以 Qwen3-VL 这类动辄几十亿甚至上百亿参数的多模态模型为例即便使用 bf16 精度单卡 24G 显存也很难直接跑全参微调。LoRA 只给模型的注意力层和 MLP 层注入低秩矩阵冻结原始权重大幅减少可训练参数量和优化器状态是当前开源社区微调大模型最常用的方式。QLoRA 在 LoRA 基础上再把基础模型量化为 4-bit进一步降低显存适合单卡或低显存环境。微调方式可训练参数显存要求适合场景缺点全参微调全部参数很高数据量大、算力充足显存占用高、训练慢LoRA少量低秩参数中等常规微调项目需要选择 target_modulesQLoRA少量低秩参数较低单卡、低显存量化后训练速度略慢实际项目中建议优先从 LoRA 开始。数据量在几百到几千条时LoRA 已经能获得比较明显的效果提升。数据量很大且训练资源充足时再考虑全参微调。2. 环境准备先跑通推理再谈训练2.1 硬件要求与显存规划微调多模态模型的显存压力来自几个方面模型权重、优化器状态、中间激活值、图像视觉 token 和梯度。同样的 batch size图片分辨率越高视觉 token 越多显存占用越大。以 LoRA 微调为例下面是一个粗略参考环境显存要求建议方案个人学习8G 到 12GQLoRA 小分辨率 batch size 1常规实验24G 单卡LoRA bf16 梯度累积生产训练多卡 40G/80GLoRA 或全参 DeepSpeed如果只有 MacBook不建议做大规模训练。MacBook 上可以体验模型推理、做数据准备和代码调试但 Qwen3-VL 这种规模的多模态模型在 Mac 上做完整 LoRA 训练效率很低显存和算力都不适合。学习阶段如果只有 Mac可以先在本机把推理流程和数据处理好训练部分放到云 GPU 或带独立显卡的机器上执行。2.2 Python 依赖安装推荐使用 Python 3.10 或 3.11创建独立虚拟环境避免和系统环境冲突。python -m venv venv source venv/bin/activate pip install --upgrade pip pip install torch torchvision pip install transformers accelerate peft datasets pip install sentencepiece pillow安装后检查关键依赖版本python -c import torch; print(torch.__version__) python -c import transformers; print(transformers.__version__)如果使用 Llama-Factory还需要额外安装它对应的依赖。不同版本对 transformers、torch 的版本要求不同建议安装完成后先跑一次推理脚本确认模型加载和图片预处理都正常再进入训练阶段。这样能过滤掉一半以上的环境问题。注意先跑通推理再谈训练。很多训练报错看起来是训练代码的问题实际是模型加载或 processor 版本不兼容导致的提前验证可以大幅减少排查时间。2.3 下载模型并跑通 baseline 推理以 Hugging Face 上的 Qwen3-VL 模型为例先写一个最小推理脚本确认模型和环境正常。如果你所在网络无法直接访问 Hugging Face可以使用国内镜像站或 ModelScope 下载具体方式以你实际可用的渠道为准。import torch from PIL import Image from transformers import Qwen3VLForConditionalGeneration, AutoProcessor MODEL_PATH ./models/Qwen3-VL model Qwen3VLForConditionalGeneration.from_pretrained( MODEL_PATH, torch_dtypetorch.bfloat16, device_mapauto ) processor AutoProcessor.from_pretrained(MODEL_PATH) image Image.open(test.jpg).convert(RGB) messages [ { role: user, content: [ {type: image}, {type: text, text: 请详细描述这张图片的内容。} ] } ] text processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) inputs processor( images[image], text[text], return_tensorspt ).to(model.device) outputs model.generate(**inputs, max_new_tokens256) print(processor.decode(outputs[0], skip_special_tokensTrue))这段代码是后续所有微调工作的 baseline。如果这一步能正常输出图片描述说明模型加载、图像预处理、推理链路都没有问题。如果这一步就报错优先检查模型路径、transformers 版本和 torch 精度参数。3. 构造多模态微调数据集3.1 Qwen 多模态对话数据的标准结构Qwen 系列多模态模型常用的微调数据格式是 conversations 结构每个样本包含图片字段和一组多轮对话。下面是常见的最小结构[ { id: 001, image: images/001.jpg, conversations: [ { from: human, value: image\n这张图片里有哪些商品 }, { from: gpt, value: 图片里有一个蓝色保温杯和一本笔记本。 } ] } ]image 字段指向图片路径conversations 是按顺序排列的对话列表。human 表示用户gpt 表示模型回答。用户消息里的image是图片占位符表示在这一轮对话中模型可以看到图片。数据量不需要很大。几百条高质量数据已经足够让模型学会一个明确的输出偏好。重点是每个样本的图片和问答要对应准确回答内容要符合目标场景的格式要求。3.2 准备一份最小可训练数据集假设要做一个“商品图片描述”的微调任务期望模型看到商品图后输出包含商品名称、颜色、材质和适用场景的固定结构。准备数据时可以把图片放在项目根目录的 images 目录下JSON 文件放在 data 目录下。这里给出一份只包含 3 条样本的最小数据用于验证训练流程[ { id: 001, image: images/001.jpg, conversations: [ {from: human, value: image\n请按固定格式描述这张商品图。}, {from: gpt, value: 商品名称保温杯颜色蓝色材质不锈钢适用场景办公室、户外。} ] }, { id: 002, image: images/002.jpg, conversations: [ {from: human, value: image\n请按固定格式描述这张商品图。}, {from: gpt, value: 商品名称笔记本颜色黑色材质纸质适用场景学习、办公。} ] }, { id: 003, image: images/003.jpg, conversations: [ {from: human, value: image\n请按固定格式描述这张商品图。}, {from: gpt, value: 商品名称台灯颜色白色材质塑料适用场景书桌、卧室。} ] } ]真实项目中数据量建议从 200 条起步分布要覆盖目标场景里的常见情况。如果业务场景有分类每个分类最好都有一部分样本避免模型产生偏差。3.3 数据校验清单训练前至少检查以下几点图片路径是否存在JSON 里的路径是相对路径还是绝对路径。图片是否能正常打开如果是 JPEG 或 PNG 之外的格式统一转换成 RGB 图片。每个样本是否包含image占位符。每条回答是否符合期望的输出格式。多轮对话是否有明显的身份混淆human 和 gpt 是否按实际对话顺序排列。不要包含不合适的、非法的图片和文本内容。注意数据里的图片路径写相对路径时以训练进程的工作目录为基准不是以 JSON 文件所在目录为基准。路径写错是最常见的低级错误。4. 使用 Llama-Factory 完成第一个 LoRA 微调4.1 安装 Llama-Factory 并对齐版本Llama-Factory 是目前社区使用较多的大模型微调工具封装了数据加载、训练、评估和导出流程非常适合快速跑通基线。安装方式git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e .安装完成后确认命令行可用llamafactory-cli version不同版本对模型的支持范围不一样使用 Qwen3-VL 前先确认你拉取的版本已经支持该模型。如果不支持升级到最新 release 版本。4.2 注册数据集并配置训练参数把上一步的 JSON 数据放到 LLaMA-Factory 的 data 目录下然后在数据集配置文件里注册数据集的名称和格式。不同版本的字段命名会有差异下面是一个常见写法mllm_demo: file: mllm_demo.json images: image columns: - conversations注册完成后可以先运行数据校验命令确认数据能被正确解析。如果字段名不对这里会直接报错。4.3 启动训练使用命令行方式启动 LoRA 训练llamafactory-cli train \ --model_name_or_path ./models/Qwen3-VL \ --dataset mllm_demo \ --template qwen \ --finetuning_type lora \ --output_dir outputs/qwen3vl-lora \ --num_train_epochs 3 \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 4 \ --learning_rate 2e-4 \ --lr_scheduler_type cosine \ --optim adamw_torch \ --bf16 \ --logging_steps 10 \ --save_steps 100训练开始后日志中会出现可训练参数量、loss 变化和内存占用。第一次训练建议把 epoch 设小一点例如 3 epoch数据量少时训练很快就能结束。训练完成后outputs 目录下会保存 LoRA 权重目录。Llama-Factory 也可以使用llamafactory-cli export把 LoRA 权重合并到基础模型导出后的模型可以直接用于推理或部署。4.4 关键参数速查表参数含义常见值调大影响调小影响per_device_train_batch_size单卡 batch size1 到 2显存占用增加显存占用降低gradient_accumulation_steps梯度累积步数2 到 16等效 batch 增大等效 batch 减小learning_rate学习率1e-4 到 3e-4训练加速但易发散训练变慢但更稳num_train_epochs训练轮数1 到 5拟合更充分可能欠拟合bf16混合精度训练开启精度更高可能不支持LoRA 训练常见的学习率范围在 1e-4 到 3e-4 之间。如果发现 loss 不降或迅速发散优先降低学习率。5. 手写 transformers peft 微调脚本5.1 为什么还需要手写脚本Llama-Factory 可以快速跑通流程但它屏蔽了很多细节。实际项目里你可能会遇到自定义图像预处理、特殊对话格式、复杂多轮数据、自定义评测逻辑等需求这些都需要自己写训练脚本。手写一遍并不是重复造轮子而是把微调过程里的数据流和控制点真正掌握。5.2 模型与处理器加载使用 transformers 和 peft 手写训练脚本时先加载基础模型和 processor。加载时建议使用 bf16 精度低显存环境可以改用 4-bit 量化。import torch from transformers import Qwen3VLForConditionalGeneration, AutoProcessor from peft import LoraConfig, get_peft_model MODEL_PATH ./models/Qwen3-VL model Qwen3VLForConditionalGeneration.from_pretrained( MODEL_PATH, torch_dtypetorch.bfloat16, device_mapauto ) processor AutoProcessor.from_pretrained( MODEL_PATH, padding_sideleft )processor 的作用是把图片和文本统一预处理成模型需要的 input_ids、pixel_values 等张量也可以把image占位符替换成视觉 token。这一步必须和模型配套使用不能拿其他模型的 processor 混用。5.3 数据预处理与 data_collator训练时不能用原始 JSON 直接进入模型需要先把图片读出来然后应用对话模板最后通过 processor 转成张量。import json from PIL import Image def load_dataset(data_path): with open(data_path, r, encodingutf-8) as f: raw_data json.load(f) samples [] for item in raw_data: image Image.open(item[image]).convert(RGB) messages [] for turn in item[conversations]: role user if turn[from] human else assistant messages.append({role: role, content: turn[value]}) samples.append({image: image, messages: messages}) return samples这里把每一轮 human 和 gpt 的文本映射成 OpenAI 风格的 messages 结构方便后续调用apply_chat_template。多模态消息中文本里的image占位符会被 processor 识别。接着实现 data_collator用于在训练时把一个 batch 的样本拼接成统一张量class MultimodalCollator: def __init__(self, processor, max_length2048): self.processor processor self.max_length max_length def __call__(self, features): images [feat[image] for feat in features] texts [] for feat in features: text self.processor.apply_chat_template( feat[messages], tokenizeFalse, add_generation_promptFalse ) texts.append(text) batch self.processor( imagesimages, texttexts, paddingTrue, truncationTrue, max_lengthself.max_length, return_tensorspt ) labels batch[input_ids].clone() batch[labels] labels return batch这个 collator 是训练链路的核心。它把图片和文本统一打包成一个 batch并且生成 labels。实际项目中如果要屏蔽 prompt 部分的 loss还需要把 user 消息对应的 token 位置设置为 -100这里为了演示先直接复制 input_ids。5.4 LoRA 注入与训练配置接下来配置 LoRA并查看可训练参数量lora_config LoraConfig( r16, lora_alpha32, target_modules[ q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj ], lora_dropout0.05, biasnone, task_typeCAUSAL_LM ) model get_peft_model(model, lora_config) model.print_trainable_parameters()target_modules 是 LoRA 注入的模块列表。把注意力层的 q/k/v/o 和 MLP 层的 gate/up/down 都注入 LoRA模型需要训练的参数会显著减少但依然能有较强的拟合能力。如果只想改语言部分不注入视觉编码器可以只保留 q_proj、k_proj、v_proj、o_proj 等语言模型模块具体以你的模型内部模块命名为准。使用 transformers 的 Trainer 启动训练from transformers import TrainingArguments, Trainer training_args TrainingArguments( output_dir./outputs/qwen3vl-lora-manual, per_device_train_batch_size1, gradient_accumulation_steps4, learning_rate2e-4, num_train_epochs3, logging_steps10, save_steps100, bf16True, optimadamw_torch, lr_scheduler_typecosine ) trainer Trainer( modelmodel, argstraining_args, train_datasetsamples, data_collatorMultimodalCollator(processor), ) trainer.train()多模态模型训练时显存往往比文本模型更紧张所以 batch size 通常设置为 1然后通过gradient_accumulation_steps累积梯度等效扩大 batch。5.5 权重保存与合并Trainer 训练结束后LoRA 权重默认保存在 output_dir 中。保存后的目录结构通常是 adapter_model.safetensors 和 adapter_config.json。推理时需要先加载基础模型再加载 LoRA 权重from peft import PeftModel base_model Qwen3VLForConditionalGeneration.from_pretrained( MODEL_PATH, torch_dtypetorch.bfloat16, device_mapauto ) model PeftModel.from_pretrained(base_model, ./outputs/qwen3vl-lora-manual)如果需要把 LoRA 权重合并回基础模型生成一个完整模型文件可以使用 merge_and_unloadmerged_model model.merge_and_unload() merged_model.save_pretrained(./models/Qwen3-VL-merget) processor.save_pretrained(./models/Qwen3-VL-merget)合并后的模型不再依赖 peft 库可以直接用原生 transformers 加载也方便用 vLLM 等推理框架部署。6. 微调后的推理验证与效果对比6.1 加载 LoRA 权重进行推理训练完先不要急着合并且直接部署先用测试集验证效果。加载 LoRA 权重后对测试图片进行推理import torch from PIL import Image from transformers import Qwen3VLForConditionalGeneration, AutoProcessor from peft import PeftModel MODEL_PATH ./models/Qwen3-VL ADAPTER_PATH ./outputs/qwen3vl-lora-manual model Qwen3VLForConditionalGeneration.from_pretrained( MODEL_PATH, torch_dtypetorch.bfloat16, device_mapauto ) model PeftModel.from_pretrained(model, ADAPTER_PATH) processor AutoProcessor.from_pretrained(MODEL_PATH) image Image.open(test.jpg).convert(RGB) messages [ { role: user, content: [ {type: image}, {type: text, text: 请按固定格式描述这张商品图。} ] } ] text processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) inputs processor(images[image], text[text], return_tensorspt).to(model.device) outputs model.generate(**inputs, max_new_tokens256) print(processor.decode(outputs[0], skip_special_tokensTrue))如果训练数据里的输出是固定结构这里应该能观察到模型输出的格式明显向训练数据靠拢。6.2 微调前后效果对比验证时不要只看一条输出建议准备一个测试集覆盖训练数据里出现过的场景和未出现过的相似场景。对比角度包括输出格式是否稳定。关键信息是否准确比如商品名称、颜色、数量。是否出现幻觉比如图片里没有的信息被模型编造出来。对未见过图片的泛化能力。如果模型在训练集上表现好在测试集上表现差说明过拟合。应对方式是增加数据多样性、降低训练轮数、增大 LoRA rank 或引入正则化。如果模型输出格式仍然混乱先检查训练数据本身的格式是否一致。模型学的是训练数据里的统计规律训练数据混乱输出就不可能稳定。6.3 从效果反推训练问题微调效果不理想时按以下顺序排查现象可能原因检查方向输出和原模型差不多学习率太小、epoch 太少、数据量太少检查训练 loss 是否下降增加 epoch输出变成乱码或重复学习率过大、loss 发散降低学习率检查数据训练集效果好、测试集差过拟合减少 epoch增加数据多样性输出格式像训练数据但内容错误数据标注错误或不一致重新审查训练数据验证这一步是整个微调流程中最容易忽略的环节。很多项目把训练跑完就结束不检查实际输出导致交付后发现问题。7. 常见问题排查7.1 显存溢出现象是训练开始时直接报 CUDA out of memory或者运行到中途突然 OOM。处理顺序把 per_device_train_batch_size 调整为 1。降低图片输入分辨率或者在 processor 中限制最大像素数。开启 bf16 或启用 QLoRA 4-bit 量化。减少 LoRA 注入的 target_modules临时去掉 MLP 层。使用 gradient_accumulation_steps 控制等效 batch而不是增大 batch size。多模态模型的显存占用和图片分辨率强相关。一张 1024x1024 的图片产生的视觉 token 数量远多于 512x512显存占用可能翻倍。训练时建议先设置一个较低的分辨率跑通流程再逐步提高。7.2 图像加载失败常见报错是 FileNotFoundError 或 PIL 无法打开图片。首先确认图片路径在训练脚本的工作目录下是否真实存在。使用相对路径时路径基准是进程启动目录。然后确认图片格式有些 PNG 图片带有特殊通道统一用Image.open(path).convert(RGB)转换。最后检查有没有损坏图片可以在加载前打印图片数量并用 try except 跳过坏图。对于图片路径维护建议在数据预处理阶段就把所有图片路径转成绝对路径避免工作目录变化导致路径失效。7.3 loss 不收敛loss 不下降通常有几个原因。学习率太大或太小都会导致 loss 波动明显或下降缓慢LoRA 微调一般从 2e-4 开始。数据质量差是另一个重要原因回答内容和图片不一致、格式混乱、错别字多模型学不到稳定规律。数据量太少也会导致模型几乎没有可学习的模式几百条数据比较常见几十条数据效果就不稳定。处理方式是先拿少量数据小规模实验比如 50 条看 loss 是否下降。如果 loss 都不下降优先检查数据和预处理。如果小数据能下降再扩大到完整数据。7.4 训练结果和预期不一致训练完成后模型输出格式不稳定或者回答内容错误。出现这类问题先不要急着调参回到训练数据里逐条检查。重点是模型训练出的输出格式是否和标注数据一致。如果标注数据里 80% 的回答是固定格式20% 是随意写的话模型学到的就会是“大部分时候固定格式偶尔自由发挥”。统一输出格式后重新训练通常会有明显改善。7.5 版本兼容性transformers、peft、accelerate、torch 之间版本不匹配会导致加载模型或执行 forward 时出现各种底层错误。使用 Qwen3-VL 时优先安装较新版本的 transformers确认模型类和 processor 类存在。如果找不到 Qwen3VLForConditionalGeneration 这个类说明 transformers 版本太旧。升级依赖后需要重新跑一遍推理脚本确认环境没问题再继续训练。不要升级依赖后直接跑几小时训练最后才发现环境已经坏了。8. 工程化最佳实践与 Agent 扩展8.1 数据质量优先于参数调优微调项目里数据质量的影响远大于训练参数。几十条高质量数据带来的提升往往比盲目调大 LoRA rank 更明显。做数据时应该关注每个样本的图片与文本是否匹配、输出格式是否统一、场景分布是否覆盖目标业务。整理数据时可以做一个简单的分布统计场景样本数量图片示例输出格式商品描述80商品实拍图固定四要素场景识别70室内外实拍图固定描述图表理解50截图、报表JSON 结构统计之后会发现哪些场景缺数据补数据时更有针对性。8.2 训练参数选择的实用建议第一次跑 LoRA 时建议使用下面的保守配置epoch3learning rate2e-4LoRA rank16LoRA alpha32batch size1gradient accumulation4max length2048图片分辨率测试时先用较低值这套配置适用于小规模学习项目也适合作为新数据集的 baseline。之后根据 loss 曲线和验证集表现再调整。不要在高频参数上反复试错。每次只调整一个变量同时记录训练日志和验证结果否则很难判断是哪个改动带来了提升。8.3 微调模型的生产部署注意点训练完成之后的部署阶段有几点容易踩坑。第一生产环境尽量合并 LoRA 权重。每次推理都动态加载 adapter 会增加加载时间合并后模型更接近普通模型部署链路更简单。第二部署前要在独立的测试集上完整评估不要只凭几条示例判断效果。第三生产环境要固定依赖版本建议把 requirements.txt 和模型版本信息一起保存。第四如果使用量化或推理框架部署要确认框架支持 Qwen3-VL 的视觉输入格式。日志和监控也是生产环境必须考虑的。记录每次请求的图片路径、输入文本、输出文本、响应耗时当线上效果变差时可以通过日志回溯是哪一侧出了问题。8.4 从“能对话”扩展到“能做事”多模态 Agent 方向微调完成后的 Qwen3-VL 不只是聊天机器人它可以作为多模态 Agent 的视觉底座。典型场景包括让 Agent 读取屏幕截图并执行操作、让 Agent 理解业务图表并生成结构化报告、让 Agent 识别图片工单并自动分类。这里的微调目标是让模型的视觉理解能力更贴合特定任务而不是让模型学会调用工具。在 Agent 架构中模型输出的质量直接影响后续工具调用和决策链路的准确性。通过 LoRA 微调让 Qwen3-VL 按约定格式输出图片中的关键信息再把输出交给 Agent 的规划模块可以降低提示词长度也能提升复杂场景下的稳定性。真实项目里Agent、RAG、微调经常会组合使用。微调负责固定模型的输出习惯和领域理解RAG 负责补充动态知识提示词工程负责控制交互方式。三者各司其职不要试图用微调解决所有问题。最后给出一个可以直接复用的训练前检查清单1. 推理 baseline 是否跑通 2. 图片路径是否全部可访问 3. 每张图片是否都有 image 占位符 4. 回答格式是否统一 5. 学习率是否在 LoRA 常见范围 6. batch size 是否满足显存 7. 是否准备测试集 8. 训练日志保存路径是否正常 9. 是否保留了原始模型权重备份这套流程适合 Qwen3-VL也适合其他 Qwen 多模态模型。你先用最小数据把全链路跑通再慢慢扩大数据规模和训练参数遇到问题就回到排查清单里按顺序检查。