最近更新时间:2026-05-20 16:38:13
本文介绍在 ms-swift 中进行 CPT(预训练)和 SFT(监督微调)时,数据集的格式要求、适用场景、示例写法以及使用限制。
ms-swift 支持通过 --dataset 参数接入本地数据集,并通过 AutoPreprocessor 将多种原始数据格式转换为标准 messages 格式。为便于数据生产、数据验收和训练前校验,建议您将最终数据统一整理为标准 messages 格式。
本文仅说明 CPT 和 SFT 两类训练任务的数据格式。DPO、KTO、GRPO、PPO、GKD、序列分类、Embedding、Reranker 等任务不在本文范围内。
本文适用于以下场景:
使用 ms-swift 进行继续预训练(CPT)。
使用 ms-swift 进行监督微调(SFT)。
将本地 JSON、JSONL、CSV、TXT 或文件夹数据接入 ms-swift。
将 Alpaca、ShareGPT、query-response 等格式转换为标准 messages 格式。
对训练集、验证集进行格式准入检查。
为数据生产方提供统一的数据格式规范。
CPT 即 continued pretraining,用于让模型继续学习领域文本、文档、代码、知识库、多模态描述等数据。CPT 的核心目标是学习语料本身的生成分布,不是学习问答行为。
在 ms-swift 中,CPT 使用以下命令:
swift pt可以将其理解为生成式训练方式。一般情况下,CPT 数据建议使用 assistant-only 格式。
SFT 即 supervised fine-tuning,用于让模型学习在给定用户输入、系统提示、多模态输入或工具调用上下文下生成 assistant 回复。
在 ms-swift 中,SFT 使用以下命令:
swift sftSFT 数据通常包含 user 和 assistant 两类消息,必要时可以包含 system、tool_call、tool_response 等消息。
AutoPreprocessor 是 ms-swift 的数据接入和归一化机制,用于将不同原始格式转换为标准格式。它不是一种独立的数据训练格式。
常见转换关系如下:
原始格式 | 预处理方式 | 转换结果 |
| MessagesPreprocessor | 标准 |
| MessagesPreprocessor | 标准 |
ShareGPT | MessagesPreprocessor | 标准 |
Alpaca | AlpacaPreprocessor | 标准 |
query-response | ResponsePreprocessor | 标准 |
response-only / text-only | ResponsePreprocessor | assistant-only |
您可通过对象存储KS3或文件存储KPFS接入自定义数据集,支持自定义训练数据集和验证数据集。将符合模型微调数据集格式的数据提前挂载至您的存储配置,在创建模型微调任务的数据配置时选择存储配置和挂载路径即可。
ms-swift 支持以下本地数据形式:
数据形式 | 说明 |
JSON | 适合结构化数据 |
JSONL | 推荐格式,便于流式读取和错误定位 |
CSV | 适合表格型问答数据 |
TXT | 适合 PT 纯文本语料 |
文件夹 | 适合 HuggingFace 可识别数据目录或包含媒体资源的数据目录 |
如果原始字段名称与 ms-swift 默认识别字段不一致,可以通过 --columns 进行映射。
原始数据:
{"prompt":"什么是 LoRA?","answer":"LoRA 是一种参数高效微调方法。"}启动命令:
swift sft \
--model Qwen/Qwen3-8B \
--dataset data/train.jsonl \
--columns '{"prompt":"query","answer":"response"}'映射后等价于:
{"query":"什么是 LoRA?","response":"LoRA 是一种参数高效微调方法。"}最终会转换为:
{
"messages": [
{"role": "user", "content": "什么是 LoRA?"},
{"role": "assistant", "content": "LoRA 是一种参数高效微调方法。"}
]
}字段 | 是否必需 | 适用任务 | 说明 |
| 是 | CPT / SFT | 核心训练字段 |
| 否 | 多模态 CPT / SFT | 图像路径、URL、base64 或图像对象 |
| 否 | 多模态 CPT / SFT | 视频路径、URL、base64 或视频帧列表 |
| 否 | 多模态 CPT / SFT | 音频路径、URL 或 base64 |
| 否 | Agent SFT | 工具定义 |
| 否 | Grounding SFT | 目标框、引用对象等 |
| 否 | SFT | channel loss 使用 |
| 否 | SFT / 多模态 | 样本级 template 参数 |
以下字段不属于 CPT/SFT 主线,本文不展开说明:
字段 | 适用任务 |
| DPO、ORPO、CPO、SimPO、RM |
| DPO、ORPO、CPO、SimPO、RM |
| KTO、分类、回归 |
| RM |
| GKD 等蒸馏任务 |
messages 是数组,每个元素表示一条消息。
{
"messages": [
{"role": "system", "content": "你是一个有用的助手。"},
{"role": "user", "content": "介绍一下 LoRA。"},
{"role": "assistant", "content": "LoRA 是一种参数高效微调方法。"}
]
}role | 说明 | 适用场景 |
| 系统提示 | SFT,可选 |
| 用户输入 | SFT |
| 模型回复或生成目标 | CPT / SFT |
| 工具调用 | Agent SFT |
| 工具返回 | Agent SFT |
| 工具返回,兼容写法 | Agent SFT |
注意事项:
CPT 推荐只使用 assistant。
标准 SFT 推荐使用 system/user/assistant。
tool_call、tool_response、tool 仅建议在 Agent SFT 中使用。
system 建议仅出现在第一条消息中。
格式说明
CPT 推荐使用 assistant-only messages 格式。每条样本表示一段需要模型学习的文本内容。
示例
{"messages":[{"role":"assistant","content":"I love music"}]}
{"messages":[{"role":"assistant","content":"教练我要打篮球"}]}
{"messages":[{"role":"assistant","content":"西红柿鸡蛋盖饭和地三鲜盖饭哪个更权威"}]}适用场景
领域语料继续预训练。
企业知识库预训练。
代码语料预训练。
长文档、论文、百科、新闻等文本语料预训练。
使用限制
不建议将问答式数据作为 CPT 主数据。
不建议在 CPT 中使用 user-only 数据。
如果需要训练问答能力,请使用 SFT 格式。
格式说明
如果原始数据为纯文本,可以使用 .txt 文件接入。
示例
第一段预训练文本。
第二段预训练文本。
第三段预训练文本。使用建议
TXT 适合快速接入纯文本语料,但不利于样本级审计和错误定位。生产环境建议转换为 JSONL assistant-only 格式。
推荐转换为:
{"messages":[{"role":"assistant","content":"第一段预训练文本。"}]}
{"messages":[{"role":"assistant","content":"第二段预训练文本。"}]}格式说明
对于只有生成文本的 JSONL 数据,可以使用 response-only 格式接入。
示例
{"response":"第一段预训练文本。"}
{"text":"第二段预训练文本。"}
{"content":"第三段预训练文本。"}
{"completion":"第四段预训练文本。"}使用限制
response-only 格式适用于 CPT,不建议作为标准 SFT 数据。SFT 数据应包含 user 条件输入和 assistant 回复。
格式说明
多模态 PT 数据仍然使用 assistant-only messages。通过 <image>、<video>、<audio> 标识模态内容插入位置,并在外层字段中提供对应资源。
图像 CPT 示例
{"messages":[{"role":"assistant","content":"<image>是一只小狗,<image>是一只小猫"}],"images":["/data/img/dog.jpg","/data/img/cat.png"]}视频 CPT 示例
{"messages":[{"role":"assistant","content":"<video>是一只狮子在跑步"}],"videos":["/data/video/lion.mp4"]}音频 CPT 示例
{"messages":[{"role":"assistant","content":"<audio>描述了今天天气真不错"}],"audios":["/data/audio/weather.wav"]}混合多模态 CPT 示例
{"messages":[{"role":"assistant","content":"<image>是一个大象,<video>是一只狮子在跑步,<audio>是环境声音"}],"images":["/data/img/elephant.jpg"],"videos":["/data/video/lion.mp4"],"audios":["/data/audio/env.wav"]}base64 资源示例
{"messages":[{"role":"assistant","content":"<image>是一张图片"}],"images":["data:image/jpg;base64,<base64_encoded>"]}视频帧列表示例
部分模型支持以视频帧列表形式传入视频:
{"messages":[{"role":"assistant","content":"<video>展示了一个动作过程"}],"videos":[["/data/frames/001.png","/data/frames/002.png","/data/frames/003.png"]]}使用限制
使用多模态 CPT 前,请确认模型和 template 支持对应模态。
<image> 数量必须与 images 数量一致。
<video> 数量必须与 videos 数量一致。
<audio> 数量必须与 audios 数量一致。
使用相对路径时,请确保路径可基于数据集目录解析。
base64 格式会增加数据体积,生产环境需评估读取效率。
格式说明
标准 SFT 使用 messages 表达一轮或多轮对话。每个样本至少应包含一条 assistant 回复。
单轮示例
{"messages":[{"role":"system","content":"你是个有用无害的助手"},{"role":"user","content":"告诉我明天的天气"},{"role":"assistant","content":"明天天气晴朗"}]}多轮示例
{"messages":[{"role":"system","content":"你是个有用无害的数学计算器"},{"role":"user","content":"1+1等于几"},{"role":"assistant","content":"等于2"},{"role":"user","content":"再加1呢"},{"role":"assistant","content":"等于3"}]}不带 system 示例
{"messages":[{"role":"user","content":"浙江的省会在哪?"},{"role":"assistant","content":"浙江的省会在杭州。"}]}使用建议
标准 messages 是 SFT 推荐落库格式。其他格式可以作为接入格式,但建议在数据入库前转换为标准 messages。
格式说明
query-response 适用于单轮或带历史数据上下文的问答数据。
单轮示例
{"system":"你是个有用无害的助手","query":"告诉我明天的天气","response":"明天天气晴朗"}等价转换结果:
{"messages":[{"role":"system","content":"你是个有用无害的助手"},{"role":"user","content":"告诉我明天的天气"},{"role":"assistant","content":"明天天气晴朗"}]}多轮示例
{"system":"你是个数学助手","query":"再加1呢","response":"等于3","history":[["1+1等于几","等于2"]]}等价转换结果:
{"messages":[{"role":"system","content":"你是个数学助手"},{"role":"user","content":"1+1等于几"},{"role":"assistant","content":"等于2"},{"role":"user","content":"再加1呢"},{"role":"assistant","content":"等于3"}]}支持的字段别名
目标字段 | 可识别字段 |
|
|
|
|
|
|
注意事项
如果数据同时包含 instruction 和 input 字段,ms-swift 会优先按 Alpaca 格式处理。
格式说明
Alpaca 格式适用于“指令 + 输入 + 输出”类型的单轮指令微调数据。
标准示例
{"system":"你是翻译助手","instruction":"翻译成英文","input":"你好,世界","output":"Hello, world."}转换逻辑:
query = instruction + "\n" + input
response = output等价转换结果:
{"messages":[{"role":"system","content":"你是翻译助手"},{"role":"user","content":"翻译成英文\n你好,世界"},{"role":"assistant","content":"Hello, world."}]}instruction-only 示例
{"instruction":"解释什么是 LoRA","input":"","output":"LoRA 是一种参数高效微调方法。"}input-only 示例
{"instruction":"","input":"解释什么是 LoRA","output":"LoRA 是一种参数高效微调方法。"}使用限制
Alpaca 格式适合单轮指令数据。
多轮对话建议使用标准 messages 或 query-response + history。
Agent、Grounding、复杂多模态任务不建议使用 Alpaca 格式。
格式说明
ShareGPT 类格式适用于开源多轮对话数据接入。ms-swift 可以将 conversation、conversations 或兼容 messages 转换为标准 messages。
conversation 示例
{"system":"你是个有用无害的助手","conversation":[{"human":"你好","assistant":"你好,有什么可以帮你?"},{"human":"1+1等于几?","assistant":"等于2"}]}转换结果:
{"messages":[{"role":"system","content":"你是个有用无害的助手"},{"role":"user","content":"你好"},{"role":"assistant","content":"你好,有什么可以帮你?"},{"role":"user","content":"1+1等于几?"},{"role":"assistant","content":"等于2"}]}conversations 示例
{"conversations":[{"from":"human","value":"你好"},{"from":"gpt","value":"你好,有什么可以帮你?"}]}转换结果:
{"messages":[{"role":"user","content":"你好"},{"role":"assistant","content":"你好,有什么可以帮你?"}]}messages 兼容示例
{"messages":[{"from":"human","value":"你好"},{"from":"gpt","value":"你好,有什么可以帮你?"}]}role 映射关系
原始字段 | 标准字段 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
使用建议
ShareGPT 格式适合作为外部数据接入格式。生产环境建议在入库时转换为标准 messages,以降低后续校验和训练成本。
格式说明
多模态 SFT 在标准 messages 基础上增加 images、videos、audios 字段。消息内容中的 <image>、<video>、<audio> 用于标识多模态特征插入位置。
图像问答示例
{"messages":[{"role":"user","content":"<image>请描述这张图"},{"role":"assistant","content":"图中是一只猫"}],"images":["/data/images/cat.jpg"]}多图问答示例
{"messages":[{"role":"user","content":"<image><image>两张图片有什么区别"},{"role":"assistant","content":"前一张是小猫,后一张是小狗"}],"images":["/data/images/cat.jpg","/data/images/dog.jpg"]}视频问答示例
{"messages":[{"role":"user","content":"<video>视频中发生了什么?"},{"role":"assistant","content":"视频中一只狗在草地上奔跑。"}],"videos":["/data/videos/dog.mp4"]}音频问答示例
{"messages":[{"role":"user","content":"<audio>语音说了什么"},{"role":"assistant","content":"今天天气真好呀"}],"audios":["/data/audios/demo.mp3"]}混合多模态示例
{"messages":[{"role":"system","content":"你是个有用无害的助手"},{"role":"user","content":"<image>图片中是什么,<video>视频中是什么,<audio>音频中说了什么"},{"role":"assistant","content":"图片中是大象,视频中是小狗奔跑,音频中说今天天气很好。"}],"images":["/data/images/elephant.jpg"],"videos":["/data/videos/dog.mp4"],"audios":["/data/audios/weather.mp3"]}多模态字段别名
标准字段 | 可识别字段 |
|
|
|
|
|
|
使用限制
模型和 template 必须支持对应模态。
占位符数量必须与资源数量一致。
本地资源路径必须可访问。
视频帧列表仅部分模型支持。
base64 资源会显著增加文件体积,需谨慎使用。
格式说明
Agent 数据用于训练模型进行工具调用。Agent 样本可以包含 tools 字段,以及 tool_call、tool_response 或 tool 消息。
Agent 数据需要配合合适的 agent_template 使用,例如 hermes、react_en 等。
纯文本 Agent 示例
{"tools":"[{\"type\":\"function\",\"function\":{\"name\":\"realtime_aqi\",\"description\":\"获取实时空气质量\",\"parameters\":{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\",\"description\":\"城市名\"}},\"required\":[\"city\"]}}}]","messages":[{"role":"user","content":"北京和上海今天的空气质量"},{"role":"tool_call","content":"{\"name\":\"realtime_aqi\",\"arguments\":{\"city\":\"北京\"}}"},{"role":"tool_call","content":"{\"name\":\"realtime_aqi\",\"arguments\":{\"city\":\"上海\"}}"},{"role":"tool_response","content":"{\"city\":\"北京\",\"aqi\":\"10\"}"},{"role":"tool_response","content":"{\"city\":\"上海\",\"aqi\":\"72\"}"},{"role":"assistant","content":"北京空气质量良好,上海为轻度污染。"}]}多模态 Agent 示例
{"tools":"[{\"type\":\"function\",\"function\":{\"name\":\"click\",\"description\":\"点击屏幕中的某个位置\",\"parameters\":{\"type\":\"object\",\"properties\":{\"x\":{\"type\":\"integer\"},\"y\":{\"type\":\"integer\"}},\"required\":[\"x\",\"y\"]}}}]","messages":[{"role":"user","content":"<image>现在几点了?"},{"role":"assistant","content":"<think>\n我可以打开日历 App 查看当前时间。\n</think>\n"},{"role":"tool_call","content":"{\"name\":\"click\",\"arguments\":{\"x\":105,\"y\":132}}"},{"role":"tool_response","content":"{\"images\":\"<image>\",\"status\":\"success\"}"},{"role":"assistant","content":"成功打开日历 App,现在的时间为中午11点"}],"images":["desktop.png","calendar.png"]}参数说明
字段 | 说明 |
| 工具列表,建议写为 JSON 字符串 |
| 工具调用内容,必须为 JSON 字符串 |
| 工具返回内容,必须为 JSON 字符串 |
| 与 |
| 工具调用模板,需在训练参数中设置 |
使用限制
Agent 格式不是普通 SFT 格式。
需要确保工具定义、工具调用和工具返回均可解析。
多模态 Agent 仍需满足多模态占位符和资源数量一致。
如果未设置合适的 agent_template,可能无法获得预期训练效果。
格式说明
Grounding 数据用于训练模型完成视觉定位、目标引用、bbox 输出等任务。该格式属于多模态 SFT 的特殊场景。
模型原生 token 示例
{"messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"<image>描述图像"},{"role":"assistant","content":"<|object_ref_start|>一只狗<|object_ref_end|><|box_start|>(221,423),(569,886)<|box_end|>"}],"images":["/data/images/demo.jpg"]}objects 格式示例
{"messages":[{"role":"user","content":"<image>找到图像中的<ref-object>"},{"role":"assistant","content":"[\n\t{\"bbox_2d\": <bbox>, \"label\": \"<ref-object>\"}\n]"}],"images":["cat.png"],"objects":{"ref":["羊"],"bbox":[[90.9,160.8,135,212.8]],"bbox_type":"real"}}objects 字段说明
字段 | 说明 |
| 用于替换 |
| 用于替换 |
| bbox 类型,可为 |
| 多图场景下指定 bbox 属于第几张图 |
使用限制
Grounding 仅适用于支持 grounding 的多模态模型和 template。
不同模型对 bbox 坐标、归一化方式、图像缩放方式要求不同。
建议训练前必须执行 template.encode 校验。
格式说明
当 assistant 的输出是图像时,可以使用 <image> 作为 assistant 输出内容,并在外层 images 字段中提供对应图像。
示例
{"messages":[{"role":"system","content":"你是个有用无害的助手"},{"role":"user","content":"给我画出一个苹果"},{"role":"assistant","content":"<image>"}],"images":["/data/generated/apple.jpg"]}使用限制
该格式仅适用于支持图像输出或 any-to-any 能力的模型和 template。
普通文本模型不支持通过该格式训练出图像生成能力。
需要确保 <image> 占位符数量与 images 数量一致。
功能说明
loss 用于控制某条 assistant 回复是否参与损失计算。
示例
{"messages":[{"role":"user","content":"你好"},{"role":"assistant","content":"你好,有什么可以帮助你的吗?","loss":false},{"role":"user","content":"1+1等于几?"},{"role":"assistant","content":"等于2","loss":true}]}参数说明
取值 | 说明 |
| 对该 assistant 内容计算损失 |
| 不对该 assistant 内容计算损失 |
不填写 | 使用命令行 |
使用限制
loss 应作用于 assistant 消息。放在 user 或 tool_response 上通常没有训练意义。
功能说明
loss_scale 用于控制某条 assistant 回复的损失权重。
示例
{"messages":[{"role":"user","content":"hello!"},{"role":"assistant","content":"<think>\n...\n</think>\n","loss_scale":1.0},{"role":"assistant","content":"hi!","loss_scale":2.0}]}注意事项
如果 loss_scale 中存在大于 1 的数值,建议设置:
--is_binary_loss_scale falseloss_scale 是字段扩展,不是独立数据格式。
功能说明
channel 用于 channel loss 场景,可按业务域、能力域或数据来源区分训练样本。
示例
{"messages":[{"role":"user","content":"告诉我明天的天气"},{"role":"assistant","content":"明天天气晴朗"}],"channel":"general"}
{"messages":[{"role":"user","content":"1+1等于几"},{"role":"assistant","content":"等于2"}],"channel":"math"}使用限制
使用 channel 前,需要启用:
--enable_channel_loss true功能说明
chat_template_kwargs 用于设置样本级 template 参数,例如多模态 max_pixels,或部分模型支持的 enable_thinking 等参数。
示例
{"messages":[{"role":"user","content":"<image>这是什么"},{"role":"assistant","content":"这是一只兔子","loss":false}],"images":["rabbit.jpg"],"chat_template_kwargs":{"max_pixels":1048576}}{"messages":[{"role":"user","content":"who are you?"},{"role":"assistant","content":"I am an assistant."}],"chat_template_kwargs":{"enable_thinking":false}}使用限制
对于普通 SFT,样本仍应包含 assistant 回复。只有 user、没有 assistant 的样本不应作为普通 SFT 训练样本。
如果训练时传入多个数据集,建议在训练前逐个验证:
python validate_msswift_dataset_sample.py data/train_1.jsonl --task sft --sample-size 1000
python validate_msswift_dataset_sample.py data/train_2.jsonl --task sft --sample-size 1000训练集和验证集应分别验证:
python validate_msswift_dataset_sample.py data/train.jsonl \
--task sft \
--sample-size 2000 \
--audit-json audit.train.jsonpython validate_msswift_dataset_sample.py data/val.jsonl \
--task sft \
--sample-size 500 \
--audit-json audit.val.json验证集同样会进入 template、tokenize、eval 或 infer 流程,因此不能只验证训练集。
文件夹类型 | 处理建议 |
目录中包含 | 建议直接指定具体文件 |
HuggingFace | 可以传入目录 |
| 需要验证脚本支持 |
包含图片、视频、音频资源的目录 | 相对路径应以数据集目录为基准 |
以下任务虽然 ms-swift 支持,但不属于本文 CPT/SFT 数据格式范围。建议单独编写数据契约。
任务 | 典型字段 | 说明 |
DPO / ORPO / CPO / SimPO / RM |
| 偏好训练 |
KTO |
| 偏好标签训练 |
PPO / GRPO | prompt-only messages / ORM 字段 | 强化学习 |
GKD | teacher / seq_kd 相关字段 | 蒸馏训练 |
序列分类 / 回归 |
| 判别式任务 |
Embedding | pair / triplet | 向量模型训练 |
Reranker | query-doc | 重排序模型训练 |
纯净模式
