ms-swift自定义数据集教程:灵活训练新技能
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格式,只需两列:
| query | response |
|---|---|
| 请用专业术语解释‘信用证议付’的操作流程 | 信用证议付是指受益人将符合信用证条款的单据提交给指定银行... |
| 我们公司新上线的SaaS系统叫‘智链云’... | 智链云是专为法务团队设计的AI合同审查平台... |
操作步骤:
- 将Excel另存为CSV(UTF-8编码)
- 在训练命令中直接引用:
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格式)
处理步骤:
- 筛选有效对话(排除“你好”等无效消息)
- 提取关键字段:
customer_query(客户问题)、agent_response(客服回答) - 添加业务上下文:在
customer_query前拼接[物流状态:已清关][产品SKU:SKU-2024-EN-001]
生成ecommerce_data.csv:
| customer_query | agent_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编码、物流状态) - □ 是否存在重复的
query但response完全不同?(需人工去重) - □ 中文文本是否混入全角空格或不可见字符?(用正则
\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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐


所有评论(0)