全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

模型微调数据集格式说明

最近更新时间:2026-05-20 16:38:13

ms-swift CPT 与 SFT 数据集格式说明

概述

本文介绍在 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

CPT 即 continued pretraining,用于让模型继续学习领域文本、文档、代码、知识库、多模态描述等数据。CPT 的核心目标是学习语料本身的生成分布,不是学习问答行为。

在 ms-swift 中,CPT 使用以下命令:

swift pt

可以将其理解为生成式训练方式。一般情况下,CPT 数据建议使用 assistant-only 格式。

SFT

SFT 即 supervised fine-tuning,用于让模型学习在给定用户输入、系统提示、多模态输入或工具调用上下文下生成 assistant 回复。

在 ms-swift 中,SFT 使用以下命令:

swift sft

SFT 数据通常包含 user 和 assistant 两类消息,必要时可以包含 system、tool_call、tool_response 等消息。

AutoPreprocessor

AutoPreprocessor 是 ms-swift 的数据接入和归一化机制,用于将不同原始格式转换为标准格式。它不是一种独立的数据训练格式。

常见转换关系如下:

原始格式

预处理方式

转换结果

messages

MessagesPreprocessor

标准 messages

conversation / conversations

MessagesPreprocessor

标准 messages

ShareGPT

MessagesPreprocessor

标准 messages

Alpaca

AlpacaPreprocessor

标准 messages

query-response

ResponsePreprocessor

标准 messages

response-only / text-only

ResponsePreprocessor

assistant-only messages


数据接入方式

通过数据配置接入自定义数据集

您可通过对象存储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 是一种参数高效微调方法。"}
  ]
}

标准数据结构

标准字段

字段

是否必需

适用任务

说明

messages

CPT / SFT

核心训练字段

images

多模态 CPT / SFT

图像路径、URL、base64 或图像对象

videos

多模态 CPT / SFT

视频路径、URL、base64 或视频帧列表

audios

多模态 CPT / SFT

音频路径、URL 或 base64

tools

Agent SFT

工具定义

objects

Grounding SFT

目标框、引用对象等

channel

SFT

channel loss 使用

chat_template_kwargs

SFT / 多模态

样本级 template 参数

以下字段不属于 CPT/SFT 主线,本文不展开说明:

字段

适用任务

rejected_response

DPO、ORPO、CPO、SimPO、RM

rejected_messages

DPO、ORPO、CPO、SimPO、RM

label

KTO、分类、回归

margin

RM

teacher_prompt

GKD 等蒸馏任务

messages 结构

messages 是数组,每个元素表示一条消息。

{
  "messages": [
    {"role": "system", "content": "你是一个有用的助手。"},
    {"role": "user", "content": "介绍一下 LoRA。"},
    {"role": "assistant", "content": "LoRA 是一种参数高效微调方法。"}
  ]
}

支持的 role

role

说明

适用场景

system

系统提示

SFT,可选

user

用户输入

SFT

assistant

模型回复或生成目标

CPT / SFT

tool_call

工具调用

Agent SFT

tool_response

工具返回

Agent SFT

tool

工具返回,兼容写法

Agent SFT

注意事项:

  • CPT 推荐只使用 assistant

  • 标准 SFT 推荐使用 system/user/assistant

  • tool_calltool_responsetool 仅建议在 Agent SFT 中使用。

  • system 建议仅出现在第一条消息中。


CPT 数据集格式

CPT 标准 messages 格式

  • 格式说明

CPT 推荐使用 assistant-only messages 格式。每条样本表示一段需要模型学习的文本内容。

  • 示例

{"messages":[{"role":"assistant","content":"I love music"}]}
{"messages":[{"role":"assistant","content":"教练我要打篮球"}]}
{"messages":[{"role":"assistant","content":"西红柿鸡蛋盖饭和地三鲜盖饭哪个更权威"}]}
  • 适用场景

    • 领域语料继续预训练。

    • 企业知识库预训练。

    • 代码语料预训练。

    • 长文档、论文、百科、新闻等文本语料预训练。

  • 使用限制

    • 不建议将问答式数据作为 CPT 主数据。

    • 不建议在 CPT 中使用 user-only 数据。

    • 如果需要训练问答能力,请使用 SFT 格式。


CPT 纯文本格式

  • 格式说明

如果原始数据为纯文本,可以使用 .txt 文件接入。

  • 示例

第一段预训练文本。
第二段预训练文本。
第三段预训练文本。
  • 使用建议

TXT 适合快速接入纯文本语料,但不利于样本级审计和错误定位。生产环境建议转换为 JSONL assistant-only 格式。

推荐转换为:

{"messages":[{"role":"assistant","content":"第一段预训练文本。"}]}
{"messages":[{"role":"assistant","content":"第二段预训练文本。"}]}

CPT response-only 格式

  • 格式说明

对于只有生成文本的 JSONL 数据,可以使用 response-only 格式接入。

  • 示例

{"response":"第一段预训练文本。"}
{"text":"第二段预训练文本。"}
{"content":"第三段预训练文本。"}
{"completion":"第四段预训练文本。"}
  • 使用限制

response-only 格式适用于 CPT,不建议作为标准 SFT 数据。SFT 数据应包含 user 条件输入和 assistant 回复。


CPT 多模态格式

  • 格式说明

多模态 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 数据集格式

SFT 标准 messages 格式

  • 格式说明

标准 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


SFT query-response 格式

  • 格式说明

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"}]}
  • 支持的字段别名

目标字段

可识别字段

system

system, system_prompt

query

query, prompt, input, instruction, question, problem

response

response, answer, output, targets, target, answer_key, answers, solution, text, completion, content

  • 注意事项

如果数据同时包含 instructioninput 字段,ms-swift 会优先按 Alpaca 格式处理。


SFT 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 格式。


SFT ShareGPT / messages 兼容格式

  • 格式说明

ShareGPT 类格式适用于开源多轮对话数据接入。ms-swift 可以将 conversationconversations 或兼容 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 映射关系

原始字段

标准字段

human

user

gpt

assistant

bot

assistant

function_call

tool_call

function_response

tool_response

observation

tool_response

observations

tool_response

  • 使用建议

ShareGPT 格式适合作为外部数据接入格式。生产环境建议在入库时转换为标准 messages,以降低后续校验和训练成本。


SFT 多模态格式

  • 格式说明

多模态 SFT 在标准 messages 基础上增加 imagesvideosaudios 字段。消息内容中的 <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"]}
  • 多模态字段别名

标准字段

可识别字段

images

image, images

videos

video, videos

audios

audio, audios

  • 使用限制

    • 模型和 template 必须支持对应模态。

    • 占位符数量必须与资源数量一致。

    • 本地资源路径必须可访问。

    • 视频帧列表仅部分模型支持。

    • base64 资源会显著增加文件体积,需谨慎使用。


SFT Agent / tool-call 格式

  • 格式说明

Agent 数据用于训练模型进行工具调用。Agent 样本可以包含 tools 字段,以及 tool_calltool_responsetool 消息。

Agent 数据需要配合合适的 agent_template 使用,例如 hermesreact_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"]}
  • 参数说明

字段

说明

tools

工具列表,建议写为 JSON 字符串

tool_call.content

工具调用内容,必须为 JSON 字符串

tool_response.content

工具返回内容,必须为 JSON 字符串

tool.content

tool_response 类似的兼容写法

agent_template

工具调用模板,需在训练参数中设置

  • 使用限制

    • Agent 格式不是普通 SFT 格式。

    • 需要确保工具定义、工具调用和工具返回均可解析。

    • 多模态 Agent 仍需满足多模态占位符和资源数量一致。

    • 如果未设置合适的 agent_template,可能无法获得预期训练效果。


SFT Grounding 格式

  • 格式说明

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 字段说明

字段

说明

ref

用于替换 <ref-object>

bbox

用于替换 <bbox>

bbox_type

bbox 类型,可为 realnorm1

image_id

多图场景下指定 bbox 属于第几张图

  • 使用限制

    • Grounding 仅适用于支持 grounding 的多模态模型和 template。

    • 不同模型对 bbox 坐标、归一化方式、图像缩放方式要求不同。

    • 建议训练前必须执行 template.encode 校验。


SFT 文生图 / 图像输出格式

  • 格式说明

当 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 数量一致。


SFT 字段扩展

loss

  • 功能说明

loss 用于控制某条 assistant 回复是否参与损失计算。

  • 示例

{"messages":[{"role":"user","content":"你好"},{"role":"assistant","content":"你好,有什么可以帮助你的吗?","loss":false},{"role":"user","content":"1+1等于几?"},{"role":"assistant","content":"等于2","loss":true}]}
  • 参数说明

取值

说明

true

对该 assistant 内容计算损失

false

不对该 assistant 内容计算损失

不填写

使用命令行 --loss_scale 策略

  • 使用限制

loss 应作用于 assistant 消息。放在 user 或 tool_response 上通常没有训练意义。


loss_scale

  • 功能说明

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 false

loss_scale 是字段扩展,不是独立数据格式。


channel

  • 功能说明

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

  • 功能说明

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.json
python validate_msswift_dataset_sample.py data/val.jsonl \
  --task sft \
  --sample-size 500 \
  --audit-json audit.val.json

验证集同样会进入 template、tokenize、eval 或 infer 流程,因此不能只验证训练集。

文件夹数据

文件夹类型

处理建议

目录中包含 train.jsonl / val.jsonl

建议直接指定具体文件

HuggingFace load_dataset(path) 可识别目录

可以传入目录

Dataset.save_to_disk() 目录

需要验证脚本支持 load_from_disk,或先导出 JSONL

包含图片、视频、音频资源的目录

相对路径应以数据集目录为基准


不在本文范围内的格式

以下任务虽然 ms-swift 支持,但不属于本文 CPT/SFT 数据格式范围。建议单独编写数据契约。

任务

典型字段

说明

DPO / ORPO / CPO / SimPO / RM

rejected_response, rejected_messages

偏好训练

KTO

label

偏好标签训练

PPO / GRPO

prompt-only messages / ORM 字段

强化学习

GKD

teacher / seq_kd 相关字段

蒸馏训练

序列分类 / 回归

label

判别式任务

Embedding

pair / triplet

向量模型训练

Reranker

query-doc

重排序模型训练

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈