ms-swift自定义数据集教程:灵活训练新技能

1. 为什么你需要自定义数据集能力

你是否遇到过这些情况:

  • 想让模型学会公司内部的专属术语和业务流程,但公开数据集里找不到对应内容
  • 希望模型掌握某种特定风格的文案写作(比如法律文书、医疗报告或电商话术),但通用微调数据效果平平
  • 需要模型理解行业特有的多轮对话逻辑,而标准Alpaca格式无法准确表达这种交互结构

这些问题的答案,往往不在“换更大模型”里,而在“用对的数据”上。ms-swift不是简单地支持自定义数据集——它把数据准备这件事,从技术障碍变成了可复用的工作流。

本文不讲抽象概念,只聚焦一件事:如何用最短路径,把你手头的真实业务数据,变成ms-swift能直接吃的“饲料”。你会看到:
不需要写复杂脚本,3种零代码方式快速组织数据
避开90%新手踩坑的格式陷阱(特别是多模态和长文本场景)
一条命令完成数据验证+训练启动,连路径拼写错误都自动提示
实际案例演示:从Excel表格到模型能力提升的完整闭环

不需要你提前掌握数据工程知识,只要你会整理表格、写提示词、看懂JSON,就能跟着操作。

2. 自定义数据集的三种落地方式

ms-swift为不同熟练度的用户准备了三套方案。别急着选最难的——先看看哪种最适合你当前的场景。

2.1 方式一:纯文本JSONL(推荐给90%的用户)

这是最轻量、最不容易出错的方式。你只需要一个文本文件,每行一个JSON对象,包含messages字段即可。

正确示例(保存为my_data.jsonl):

{"messages": [{"role": "user", "content": "请用专业术语解释‘信用证议付’的操作流程"}, {"role": "assistant", "content": "信用证议付是指受益人将符合信用证条款的单据提交给指定银行,由该银行审核单据无误后,向受益人支付货款的行为..."}]}
{"messages": [{"role": "user", "content": "我们公司新上线的SaaS系统叫‘智链云’,主要功能是合同智能审查。请生成一段面向法务总监的介绍文案"}, {"role": "assistant", "content": "智链云是专为法务团队设计的AI合同审查平台,通过深度学习模型自动识别200+类风险条款..."}]}

关键要点:

  • 每行必须是独立JSON,不能有逗号分隔或数组包裹
  • messages必须是列表,且按对话顺序排列(user→assistant→user→...)
  • 不需要system字段——训练时统一用--system参数指定
  • 中文数据无需特殊编码,UTF-8即可

验证命令(执行后会显示数据条数和字段检查结果):

swift check-dataset --dataset ./my_data.jsonl

2.2 方式二:CSV/Excel表格(适合业务人员)

如果你的数据在Excel里,完全不用转JSON。ms-swift原生支持CSV和XLSX格式,只需两列:

queryresponse
请用专业术语解释‘信用证议付’的操作流程信用证议付是指受益人将符合信用证条款的单据提交给指定银行...
我们公司新上线的SaaS系统叫‘智链云’...智链云是专为法务团队设计的AI合同审查平台...

操作步骤:

  1. 将Excel另存为CSV(UTF-8编码)
  2. 在训练命令中直接引用:
swift sft \
    --model Qwen/Qwen2.5-7B-Instruct \
    --dataset ./my_business_data.csv \
    --train_type lora \
    --output_dir ./output

自动转换原理:
ms-swift会把query列作为user消息,response列作为assistant消息,自动组装成标准messages格式。如果列名不同(比如叫input/output),用--dataset_args指定:

--dataset_args '{"query_column": "input", "response_column": "output"}'

2.3 方式三:Python脚本(适合复杂场景)

当你的数据需要动态处理时(比如从数据库读取、清洗脏数据、添加上下文),用Python脚本最灵活。

创建custom_dataset.py

from datasets import Dataset
import pandas as pd

def load_dataset():
    # 示例:从数据库读取(替换为你的真实逻辑)
    df = pd.read_csv("raw_data.csv")
    
    # 数据清洗:过滤空响应、截断超长文本
    df = df.dropna(subset=['response'])
    df['response'] = df['response'].str[:2048]
    
    # 构造messages列表
    messages_list = []
    for _, row in df.iterrows():
        messages = [
            {"role": "user", "content": row["query"]},
            {"role": "assistant", "content": row["response"]}
        ]
        messages_list.append({"messages": messages})
    
    return Dataset.from_list(messages_list)

训练时引用:

swift sft \
    --model Qwen/Qwen2.5-7B-Instruct \
    --dataset ./custom_dataset.py \
    --train_type lora \
    --output_dir ./output

优势场景:

  • 多轮对话数据(需保持会话ID关联)
  • 图文混合数据(图片路径+文本描述)
  • 需要实时数据增强(如随机插入行业术语)

3. 避开新手必踩的5个格式陷阱

即使按文档操作,仍有大量用户卡在数据加载阶段。以下是真实调试日志中出现频率最高的问题:

3.1 陷阱一:JSONL文件末尾多了一个空行

现象: ValueError: Extra data: line 101 column 1 (char 12345)
原因: 文件最后有一个空行,导致JSON解析器读到空字符串
修复: 用VS Code打开,显示所有字符(Ctrl+Shift+P → “Toggle Render Whitespace”),删除末尾空行

3.2 陷阱二:CSV文件用了中文逗号分隔

现象: pandas.errors.ParserError: Error tokenizing data. C error: Expected 2 fields in line 5, saw 5
原因: Excel默认用中文逗号(,)而非英文逗号(,)分隔
修复: 在Excel中选择“数据”→“从文本/CSV”,导入时手动指定分隔符为英文逗号

3.3 陷阱三:messages字段嵌套层级错误

错误示例:

{"messages": {"user": "hello", "assistant": "hi"}} //  错误:messages必须是列表
{"messages": [{"user": "hello", "assistant": "hi"}]} //  错误:缺少role字段

正确格式:

{"messages": [{"role": "user", "content": "hello"}, {"role": "assistant", "content": "hi"}]} // 

3.4 陷阱四:长文本超出max_length限制

现象: 训练启动后立即报错Token indices sequence length is longer than the specified maximum sequence length
解决方案:

  • 方法1(推荐):用--truncation_strategy 'delete'自动丢弃超长样本
  • 方法2:预处理时截断,保留关键信息
# 在Python脚本中添加
row["query"] = row["query"][:1024]  # 保留前1024字符
row["response"] = row["response"][:1024]

3.5 陷阱五:多模态数据路径错误

场景: 训练图文模型时,图片路径在JSONL中写成相对路径
错误: "image": "./images/product1.jpg"
正确: "image": "/absolute/path/to/images/product1.jpg""image": "https://example.com/images/product1.jpg"
验证技巧: 先用Python测试路径可读性:

from PIL import Image
Image.open("/your/absolute/path.jpg")  # 应该不报错

4. 实战案例:30分钟打造行业专属客服模型

我们以某跨境电商公司的实际需求为例,演示从零到模型上线的全流程。该公司需要模型理解以下业务特征:

  • 专属产品编码规则(如SKU-2024-EN-001
  • 物流状态术语(已清关海外仓待出库
  • 多语言混合回复(中英混杂的客户咨询)

4.1 数据准备(10分钟)

原始数据来源: 过去3个月的客服对话记录(Excel格式)
处理步骤:

  1. 筛选有效对话(排除“你好”等无效消息)
  2. 提取关键字段:customer_query(客户问题)、agent_response(客服回答)
  3. 添加业务上下文:在customer_query前拼接[物流状态:已清关][产品SKU:SKU-2024-EN-001]

生成ecommerce_data.csv

customer_queryagent_response
[物流状态:已清关][产品SKU:SKU-2024-EN-001]这个订单什么时候发货?您好,该订单已在海外仓完成备货,预计24小时内发出,物流单号将通过短信通知您...
[物流状态:海外仓待出库]SKU-2024-EN-002的包装规格是什么?SKU-2024-EN-002采用防震气泡袋+硬质纸箱包装,尺寸为30×20×15cm,重量1.2kg...

4.2 启动训练(5分钟)

# 单卡A10显存足够,使用QLoRA节省资源
CUDA_VISIBLE_DEVICES=0 swift sft \
    --model Qwen/Qwen2.5-7B-Instruct \
    --dataset ./ecommerce_data.csv \
    --train_type qlora \
    --quant_bits 4 \
    --lora_rank 64 \
    --lora_alpha 128 \
    --learning_rate 2e-4 \
    --num_train_epochs 3 \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 8 \
    --max_length 2048 \
    --output_dir ./ecommerce_model \
    --system "你是一名跨境电商平台的资深客服,熟悉所有SKU编码规则和物流状态术语。回答时需中英混杂,优先使用客户提问中的术语。"

关键参数说明:

  • --quant_bits 4:4位量化,显存占用从14GB降至6GB
  • --lora_rank 64:比默认8更高,适应业务术语学习需求
  • --system:用自然语言明确约束模型行为,比调整loss权重更直接

4.3 效果验证(15分钟)

训练完成后,立即测试:

# 启动交互式推理
swift infer \
    --adapters ./ecommerce_model/checkpoint-xxx \
    --stream true \
    --temperature 0.1 \
    --max_new_tokens 512

测试输入:

[物流状态:已清关][产品SKU:SKU-2024-EN-001]这个订单什么时候发货?

预期输出(对比基线模型):

模型输出问题
基线Qwen2.5“请提供订单号,我帮您查询物流状态”未识别已清关状态,要求额外信息
本教程模型“您好,该订单已在海外仓完成备货,预计24小时内发出,物流单号将通过短信通知您...”准确理解状态并给出具体承诺

进阶验证:
swift eval跑定制评测集:

# 创建评测文件eval_questions.jsonl
{"query": "[物流状态:海外仓待出库]SKU-2024-EN-002的包装规格是什么?", "expected": "防震气泡袋+硬质纸箱"}
swift eval \
    --model ./ecommerce_model/checkpoint-xxx \
    --eval_dataset ./eval_questions.jsonl \
    --metric accuracy

5. 进阶技巧:让数据集发挥最大价值

5.1 数据质量自检清单

在启动训练前,用这5个问题快速判断数据健康度:

  • □ 所有response字段长度是否>10字符?(避免“好的”“收到”等无信息回复)
  • query中是否包含至少1个业务关键词?(如SKU编码、物流状态)
  • □ 是否存在重复的queryresponse完全不同?(需人工去重)
  • □ 中文文本是否混入全角空格或不可见字符?(用正则\u3000检测)
  • □ 样本数量是否≥200条?(少于200条建议用--num_train_epochs 5增加遍历次数)

5.2 动态数据增强(Python示例)

当数据量不足时,在加载阶段实时增强:

# 在custom_dataset.py中添加
import random

def augment_sample(sample):
    # 随机替换同义词(需准备同义词表)
    synonyms = {
        "发货": ["发出", "寄出", "安排出库"],
        "清关": ["通关", "海关放行"]
    }
    for word, words in synonyms.items():
        if word in sample["query"]:
            sample["query"] = sample["query"].replace(word, random.choice(words))
    return sample

# 加载数据后应用
dataset = dataset.map(augment_sample, num_proc=4)

5.3 多任务数据混合

同时训练多个能力(如客服+文案生成):

# 用#符号分割不同数据集,权重按比例分配
--dataset ./ecommerce_data.csv#300 ./marketing_prompts.jsonl#100

这表示:从电商数据取300条,从营销文案数据取100条,混合训练。

6. 总结:你的数据资产正在升值

回顾整个流程,你真正获得的不仅是单个模型:
🔹 可复用的数据管道:下次训练新模型时,只需替换--dataset参数,无需重新整理数据
🔹 业务知识沉淀:那些曾散落在客服对话、Excel表格、会议纪要里的隐性知识,现在被结构化为机器可学习的资产
🔹 快速迭代能力:当业务规则变更(如新增物流状态保税仓直发),只需更新几十条数据,1小时完成模型升级

记住一个原则:不要追求“完美数据集”,而要追求“够用的数据集”。ms-swift的设计哲学是——让第一次尝试的成本趋近于零。哪怕只有50条高质量样本,也能启动训练并看到初步效果。真正的优化,永远发生在“第一次运行之后”。

现在,打开你的终端,选一个最想解决的业务问题,用本文的方法,把它变成第一份训练数据。当你看到模型第一次准确说出那个专属SKU编码时,你就完成了从使用者到创造者的跨越。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

更多推荐