Qwen3-VL微调数据准备ShareGPT格式数据集构建指南1. 前言微调的第一步从数据开始如果你正在尝试让Qwen3-VL这个强大的视觉语言模型学会你的专属任务比如识别公司内部特定的表格格式、理解产品设计图的标注规范或者分析医学影像中的特定特征那么你很快就会意识到一件事预训练模型虽然聪明但它不认识你的“方言”。这就像请一位精通多国语言的翻译但他从未接触过你们行业的专业术语。微调就是教模型说你的“方言”的过程。而教任何AI模型第一步永远是准备“教材”——也就是训练数据。在众多微调框架中LLaMA-Factory因其对多模态模型的友好支持而备受青睐。它默认采用一种名为ShareGPT的数据格式来组织图文对话数据。今天我就来和你详细聊聊如何从零开始为你的Qwen3-VL模型准备一份高质量的ShareGPT格式数据集。这是整个微调流程中最关键、也最容易出错的一步数据质量直接决定了模型最终的表现。2. 理解ShareGPT格式图文对话的“剧本”在开始动手之前我们得先搞清楚ShareGPT格式到底是什么。你可以把它想象成一个为多轮对话设计的“剧本”。这个剧本不仅记录了用户和AI助手之间说了什么还指明了对话中引用了哪些“道具”——也就是图片。2.1 核心数据结构一个标准的ShareGPT格式数据集通常是一个JSON文件里面包含一个列表列表中的每个元素就是一次独立的对话样本。每个样本的核心结构如下{ messages: [...], images: [...] }messages: 这是一个列表按时间顺序记录了对话的每一轮。每一轮都是一个字典包含role说话者和content说话内容。images: 这也是一个列表里面是字符串每个字符串是对话中引用到的图片文件的绝对路径。2.2 一个完整的例子光看定义可能有点抽象我们来看一个实际的例子。假设我们想教模型识别身份证上的姓名。对应的图片文件/home/user/data/id_card_zhangsan.jpgShareGPT格式数据样本{ messages: [ { role: user, content: image\n请识别这张身份证上的姓名。 }, { role: assistant, content: 张三 } ], images: [/home/user/data/id_card_zhangsan.jpg] }关键点解析image占位符在用户的content中image是一个特殊的标记它告诉模型“嘿注意了下面我要描述的内容和images列表里的某张图有关。”对于单张图片的简单情况模型默认将image与images列表中的第一张也是唯一一张图片关联。图片路径images列表里的路径必须是服务器或容器内可访问的绝对路径。在后续使用LLaMA-Factory训练时它会根据这个路径去加载图片。对话轮次messages列表严格按顺序排列user和assistant交替出现模拟真实的对话流程。3. 实战构建你的第一个数据集理论讲完了我们动手创建一个简单的数据集。假设我们的任务是让模型学习识别几种常见水果。3.1 第一步组织你的图片文件首先创建一个清晰的文件目录。混乱的文件管理是后期调试的噩梦。建议的目录结构/data/ └── my_qwen_dataset/ ├── images/ # 存放所有图片 │ ├── apple_001.jpg │ ├── banana_001.jpg │ └── orange_001.jpg └── dataset.json # ShareGPT格式的数据文件小贴士给图片起名时最好包含一些有意义的标识比如apple_001.jpg这样在后期检查和排查问题时一目了然。3.2 第二步编写JSON数据文件现在我们来编写dataset.json文件。根据上面的目录图片的绝对路径就是/data/my_qwen_dataset/images/xxx.jpg。[ { messages: [ { role: user, content: image\n图片中是什么水果 }, { role: assistant, content: 这是一个苹果。 } ], images: [/data/my_qwen_dataset/images/apple_001.jpg] }, { messages: [ { role: user, content: image\n请描述一下图中水果的颜色和形状。 }, { role: assistant, content: 这是一个黄色的香蕉形状是弯曲的长条状。 } ], images: [/data/my_qwen_dataset/images/banana_001.jpg] }, { messages: [ { role: user, content: image\n这种水果通常怎么吃 }, { role: assistant, content: 这是一个橙子通常需要剥皮后食用里面的果肉瓣。 } ], images: [/data/my_qwen_dataset/images/orange_001.jpg] } ]恭喜你一个最简单的单轮问答数据集就构建完成了。每个样本都是一问一答对应一张图片。4. 处理复杂场景多图与多轮对话现实任务往往更复杂。比如你可能需要模型比较两张图片的差异或者进行多轮追问。ShareGPT格式同样可以优雅地处理这些情况。4.1 多张图片的引用当对话涉及多张图片时你需要在images列表中按顺序列出所有图片并在content中使用image1,image2...来指代它们。例子比较两张猫的图片{ messages: [ { role: user, content: image1和image2中的两只猫哪一只看起来更胖一些 }, { role: assistant, content: image1中的橘猫看起来更胖一些。 } ], images: [ /data/my_qwen_dataset/images/fat_cat.jpg, /data/my_qwen_dataset/images/thin_cat.jpg ] }这里image1对应images列表中的第一张图胖猫image2对应第二张图瘦猫。4.2 多轮对话带历史多轮对话能训练模型理解上下文。我们只需要在messages列表中按顺序追加对话轮次即可。例子关于一张风景照的连续对话{ messages: [ { role: user, content: image\n这张照片是在哪里拍的 }, { role: assistant, content: 这张照片拍摄于一个雪山脚下的湖泊边。 }, { role: user, content: 湖水的颜色看起来是蓝色的这是什么原因 }, { role: assistant, content: 湖水呈现蓝色通常是因为对太阳光中蓝色波段的散射作用更强同时水比较深且清澈底部反射的杂质光较少。 } ], images: [/data/my_qwen_dataset/images/lake_mountain.jpg] }在这个例子中模型在回答第二个问题时需要结合图片内容湖泊和第一轮对话的历史“雪山脚下”来进行综合推理。5. 数据质量检查与常见陷阱数据构建好了先别急着开始训练。花点时间做检查能避免很多后续的麻烦。5.1 必须检查的清单路径有效性确保images字段里的每一个路径都是绝对路径并且在该路径下确实存在对应的图片文件。你可以写个简单的Python脚本批量检查。import json import os with open(dataset.json, r) as f: data json.load(f) for item in data: for img_path in item[images]: if not os.path.exists(img_path): print(f图片不存在: {img_path})标记匹配检查content中使用的image、image1等标记数量是否与images列表中的图片数量匹配。一个image2意味着images列表至少要有2张图。角色顺序确保messages列表中role是user和assistant严格交替的并且通常以user开始以assistant结束。内容格式助理assistant的回答应该是你期望模型学习的最终、正确的输出。避免在答案中包含不确定的、引导性的或者错误的描述。5.2 需要避免的陷阱陷阱一使用相对路径。在JSON中使用./images/cat.jpg这样的相对路径在LLaMA-Factory加载时很可能找不到文件因为它运行时的当前工作目录不确定。陷阱二图片格式问题。确保图片是常见的格式如.jpg, .png并且能够被PIL或OpenCV等库正常读取。损坏的图片文件会导致训练过程崩溃。陷阱三指令模糊不清。用户的指令content应该清晰明确。例如“描述这张图”比“说说这个”要好得多。清晰的指令有助于模型建立更准确的“问题-图片-答案”关联。陷阱四答案不一致。对于相似或相同的图片问题确保助理的答案在表述上保持一致。例如对于同一张苹果的图片不要一次回答“这是一个苹果”另一次回答“这是苹果”。6. 在LLaMA-Factory中注册并使用数据集数据文件准备好后我们需要告诉LLaMA-Factory这个数据集的存在和结构。6.1 注册数据集信息找到LLaMA-Factory项目下的data/dataset_info.json文件如果不存在就创建一个。在这个文件中为你新建的数据集添加一个配置项。假设你的数据集JSON文件名为my_fruit_dataset.json添加如下配置{ ... // 其他已有的数据集配置 my_fruit_dataset: { file_name: my_fruit_dataset.json, formatting: sharegpt, columns: { messages: messages, images: images }, tags: { role_tag: role, content_tag: content, user_tag: user, assistant_tag: assistant } } }参数解释my_fruit_dataset: 这是你给数据集起的名字后续在训练配置中会用到。file_name: 你的JSON数据文件名。formatting: sharegpt: 明确指定数据格式。columns: 告诉框架你的JSON里对话列表的键名是messages图片路径列表的键名是images。tags: 定义了messages列表中每个字典里角色和内容对应的键名。6.2 在训练配置中引用在你的训练YAML配置文件例如qwen3vl_lora_sft.yaml中指定使用这个数据集### dataset dataset: my_fruit_dataset # 这里填写你在dataset_info.json中定义的名称 template: qwen2_vl cutoff_len: 2048 ...完成这一步后当你启动LLaMA-Factory训练命令时它就会自动找到并加载你的my_fruit_dataset.json文件以及其中指定的图片开始微调流程。7. 总结高质量数据是微调成功的基石为Qwen3-VL准备ShareGPT格式的数据集本质上是在精心编写一本图文并茂的“教学手册”。这本手册的质量直接决定了模型“学生”能学到多少真本事。回顾一下核心要点结构是根本严格遵守{“messages”: [], “images”: []}的格式image标记和图片路径要准确对应。路径要绝对始终使用绝对路径这是避免“文件找不到”错误的最可靠方法。指令需清晰用户的问题要明确助理的答案要准确、一致这是模型学会正确响应的关键。检查不可少在投入训练前务必进行路径有效性、格式正确性等检查。当你按照这个指南一步步构建起自己的数据集时你就已经为Qwen3-VL的定制化之旅铺好了最关键的第一段路。接下来结合LLaMA-Factory的微调能力和Qwen3-VL-WEBUI的便捷部署你就能亲眼见证一个通用的视觉大模型如何一步步成长为精通你特定业务的“领域专家”。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。