【大模型微调与部署02】—— ms-swift 自定义数据集完全教程:格式、dataset_info 配置、多格式兼容实战

本文基于官方文档:https://swift.readthedocs.io/zh-cn/latest/Customization/Custom-dataset.html

结合医疗对话数据集实战,手把手教你正确配置 dataset_info.json,一次跑通不报错。


一、前言:MS-Swift 数据集为什么要这么配?

MS-Swift 是魔搭 ModelScope 开源的大模型轻量化微调框架,支持几乎所有常见对话/指令格式 ,但它有一套内部标准格式 ,所有外部数据集最终都会被 AutoPreprocessor 自动对齐到这套标准。

你只需要做两件事:

  1. 确保你的 JSON/JSONL 结构合法
  2. dataset_info.json 里做字段映射

本文会覆盖:

  • 3 种数据集接入方式
  • 4 类自动兼容的数据格式
  • messages / sharegpt / alpaca / query-response 格式详解
  • 医疗多轮对话数据集实战配置
  • 你自己的两份数据集 正确 dataset_info 写法

二、MS-Swift 支持的数据集格式(核心必看)

Swift 内置自动预处理,支持以下 4 大类格式,不需要写代码即可加载

1. Standard Messages 格式(官方最推荐)

json 复制代码
{
  "messages": [
    {"role": "system", "content": "你是医疗助手"},
    {"role": "user", "content": "足部骨折恢复要注意什么"},
    {"role": "assistant", "content": "需要注意休息..."}
  ]
}

2. ShareGPT / Multi-turn Conversation 格式

和你数据集1完全一致

json 复制代码
{
  "conversation": [
    {"role": "user", "content": "..."},
    {"role": "assistant", "content": "..."}
  ]
}

3. Alpaca 格式(指令微调)

和你数据集2完全一致

json 复制代码
{
  "instruction": "你是谁?",
  "input": "",
  "output": "我是医疗助手..."
}

4. Query-Response 格式(单轮问答)

json 复制代码
{
  "query": "颈椎病术后怎么睡觉?",
  "response": "仰卧可以不用枕头...",
  "system": "...",
  "history": []
}

三、自定义数据集的 3 种接入方式

方式1:命令行直接指定(最简单)

bash 复制代码
--dataset data.json

支持:json / jsonl / csv / txt / 文件夹

方式2:使用 dataset_info.json(推荐,企业/多数据集常用)

  • 统一管理多个数据集
  • 支持字段映射
  • 可混合训练

使用方法:

bash 复制代码
--dataset_info dataset_info.json

方式3:手动注册数据集(高级自定义)

适合复杂预处理、特殊格式,通过 register_dataset 实现。


四、字段映射规则(columns 怎么写?)

columns 的作用:
把你的 JSON 字段名 → 映射成 Swift 内部标准字段名

固定规则:

  • messages 格式 → "messages": "你的字段名"
  • alpaca 格式 → "prompt": "instruction", "response": "output"
  • query-response → "query": "用户问题字段", "response": "回答字段"

五、你的真实数据集 + 正确 dataset_info.json(实战)

你的数据集1:med-disc(医疗多轮对话)

结构:

json 复制代码
{
  "_id": "01-1704633",
  "source": "meddial",
  "conversation": [
    {"role": "user", "content": "..."},
    {"role": "assistant", "content": "..."}
  ]
}

字段映射:
conversation → messages


你的数据集2:med-self-cog(模型身份认知)

结构:

json 复制代码
{
  "instruction":"你是谁?",
  "output":"我是专业医疗助手..."
}

字段映射:
instruction → prompt
output → response


最终完整版 dataset_info.json

你原来写的完全正确,我帮你规范化并加注释:

json 复制代码
[
  {
    "dataset_name": "med-disc",
    "dataset_path": "/root/data1/MyProject/AIDoctor/llm/train_data/DISC-Med-SFT/DISC-Med-SFT_released.jsonl",
    "columns": {
      "messages": "conversation"
    }
  },
  {
    "dataset_name": "med-self-cog",
    "dataset_path": "/root/data1/MyProject/AIDoctor/llm/train_data/Model-Self-cog/med_self_cog.jsonl",
    "columns": {
      "prompt": "instruction",
      "response": "output"
    }
  }
]

100% 可直接训练 ✅


六、训练命令怎么写?

bash 复制代码
CUDA_VISIBLE_DEVICES=0,1 NPROC_PER_NODE=2 swift sft \
    --model_type qwen1_5 \
    --model ./Qwen1_5-1_8B-Chat \
    --train_type lora \
    --dataset_info dataset_info.json \
    --dataset med-disc med-self-cog \
    --load_in_4bit true \
    --gradient_checkpointing true \
    --max_length 2048 \
    --output_dir ./output

七、常见格式问题与避坑

1. JSON/JSONL 必须严格合法

  • 每行一个 JSON
  • 不要尾逗号
  • 字符串必须双引号

2. 多轮对话必须用 messages/conversation 格式

不能混用 alpaca 和多轮。

3. system 提示词优先级

数据内 system > 命令行 --system > 模板默认

4. 数据集路径必须绝对路径

避免相对路径找不到文件。

5. 字段名写错会直接报错

例如把 conversation 写成 conversations


八、支持的更多高级格式(扩展)

1. RLHF 系列格式(DPO/ORPO/KTO/SimPO)

json 复制代码
{
  "messages": [...],
  "rejected_response": "..."
}

2. 多模态格式

json 复制代码
{
  "messages": [...],
  "images": ["1.jpg"]
}

3. Agent 工具调用格式

json 复制代码
{
  "tools": "...",
  "messages": [...]
}

4. 带 loss 控制格式

json 复制代码
{"role": "assistant", "content": "...", "loss": false}

九、总结(最精简版)

  1. 多轮对话(ShareGPT)columns: {"messages": "conversation"}
  2. 指令微调(Alpaca)columns: {"prompt":"instruction","response":"output"}
  3. dataset_info.json 统一管理多数据集
  4. 你的医疗数据集 配置完全正确
  5. Swift 自动预处理,不用改原始数据
相关推荐
Hello--_--World2 小时前
JS:闭包、函数柯里化、工厂函数、偏函数、立即执行函数 相关知识点与面试题
开发语言·javascript·ecmascript
一只幸运猫.2 小时前
字节跳动Java大厂面试版
java·开发语言·面试
xier_ran2 小时前
【C++】“内部”、“外部”、“派生类”、“友元“类
java·开发语言·c++
im_AMBER2 小时前
从面试题看JS变量提升
开发语言·前端·javascript·前端框架
故事和你912 小时前
洛谷-数据结构1-2-二叉树1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
大橘2 小时前
【qml-5.1】qml与c++交互(QML_ELEMENT/QML_SINGLETON)
开发语言·c++·qt·交互·qml
凭君语未可2 小时前
从静态代理走向动态代理:理解 JDK 动态代理的本质
java·开发语言
小碗羊肉3 小时前
【从零开始学Java | 第三十八篇】序列化流(Object Stream)
java·开发语言
百锦再3 小时前
使用JavaScript获取和解析页面内容的完整指南
开发语言·前端·javascript·python·flask·fastapi