📑 目录
- 一、微调数据集常见格式总览
- [二、Alpaca 格式](#二、Alpaca 格式)
- [1. 基础格式](#1. 基础格式)
- [2. 字段说明](#2. 字段说明)
- [3. 适合场景](#3. 适合场景)
- [4. 如何构建 Alpaca 数据集](#4. 如何构建 Alpaca 数据集)
- [三、带 system 的 Alpaca 格式](#三、带 system 的 Alpaca 格式)
- [1. 示例](#1. 示例)
- [2. 适合场景](#2. 适合场景)
- [3. 构建建议](#3. 构建建议)
- [四、Alpaca 多轮对话格式](#四、Alpaca 多轮对话格式)
- [1. 示例](#1. 示例)
- [2. 字段说明](#2. 字段说明)
- [3. 适合场景](#3. 适合场景)
- [4. 构建建议](#4. 构建建议)
- [五、ShareGPT 格式](#五、ShareGPT 格式)
- [1. 基础格式](#1. 基础格式)
- [2. 多轮对话示例](#2. 多轮对话示例)
- [3. 字段说明](#3. 字段说明)
- [4. 适合场景](#4. 适合场景)
- [5. 如何构建 ShareGPT 数据集](#5. 如何构建 ShareGPT 数据集)
- [六、OpenAI Messages 格式](#六、OpenAI Messages 格式)
- [1. 字段说明](#1. 字段说明)
- [2. 适合场景](#2. 适合场景)
- [3. 和 ShareGPT 的区别](#3. 和 ShareGPT 的区别)
- [七、Preference / DPO 偏好数据格式](#七、Preference / DPO 偏好数据格式)
- [1. Alpaca 偏好格式示例](#1. Alpaca 偏好格式示例)
- [2. ShareGPT 偏好格式示例](#2. ShareGPT 偏好格式示例)
- [3. 字段说明](#3. 字段说明)
- [4. 适合场景](#4. 适合场景)
- [5. 如何构建 DPO 数据](#5. 如何构建 DPO 数据)
- [八、KTO 数据格式](#八、KTO 数据格式)
- [1. 示例](#1. 示例)
- [2. 字段说明](#2. 字段说明)
- [3. 适合场景](#3. 适合场景)
- [4. 如何构建 KTO 数据](#4. 如何构建 KTO 数据)
- [九、Pretrain 纯文本数据格式](#九、Pretrain 纯文本数据格式)
- [1. 示例格式](#1. 示例格式)
- [2. 适合场景](#2. 适合场景)
- [3. 不适合场景](#3. 不适合场景)
- [4. 如何构建预训练数据](#4. 如何构建预训练数据)
- 十、多模态图文数据格式
- [1. Alpaca 图文格式示例](#1. Alpaca 图文格式示例)
- [2. 字段说明](#2. 字段说明)
- [3. 适合场景](#3. 适合场景)
- [4. 构建建议](#4. 构建建议)
- 十一、音频数据格式
- [1. 示例](#1. 示例)
- [2. 适合场景](#2. 适合场景)
- [十二、CSV / JSON / JSONL / Parquet 文件格式区别](#十二、CSV / JSON / JSONL / Parquet 文件格式区别)
- [1. JSON](#1. JSON)
- [2. JSONL](#2. JSONL)
- [3. CSV](#3. CSV)
- [4. Parquet](#4. Parquet)
- [十三、LLaMA-Factory 中 dataset_info.json 怎么写](#十三、LLaMA-Factory 中 dataset_info.json 怎么写)
- [1. Alpaca 格式注册示例](#1. Alpaca 格式注册示例)
- [2. ShareGPT 格式注册示例](#2. ShareGPT 格式注册示例)
- [3. DPO 偏好数据注册示例](#3. DPO 偏好数据注册示例)
- [4. KTO 数据注册示例](#4. KTO 数据注册示例)
- [5. 预训练数据注册示例](#5. 预训练数据注册示例)
- 十四、不同任务应该选择什么格式?
- [1. 普通问答助手](#1. 普通问答助手)
- [2. 客服机器人](#2. 客服机器人)
- [3. 角色扮演模型](#3. 角色扮演模型)
- [4. 固定格式输出](#4. 固定格式输出)
- [5. 偏好优化](#5. 偏好优化)
- [6. 行业知识继续学习](#6. 行业知识继续学习)
- 十五、数据集构建流程建议
- 十六、数据质量建议
- [1. 好数据的特点](#1. 好数据的特点)
- [2. 差数据的特点](#2. 差数据的特点)
- [3. 数据量建议](#3. 数据量建议)
- 十七、常见错误
- [1. 把知识文档直接当 SFT 数据](#1. 把知识文档直接当 SFT 数据)
- [2. output 太短](#2. output 太短)
- [3. 多轮对话顺序错乱](#3. 多轮对话顺序错乱)
- [4. chosen / rejected 写反](#4. chosen / rejected 写反)
- [5. 数据里混入隐私信息](#5. 数据里混入隐私信息)
- 十八、完整示例:构建一个客服微调数据集
- [1. 原始资料](#1. 原始资料)
- [2. 转成 Alpaca 数据](#2. 转成 Alpaca 数据)
- [3. 加入 system](#3. 加入 system)
- [4. 注册到 LLaMA-Factory](#4. 注册到 LLaMA-Factory)
- 十九、总结
前言
在做大模型微调时,很多人第一步不是卡在模型,也不是卡在显卡,而是卡在数据集格式。
同样是"微调数据",不同训练任务需要的数据格式并不一样:
- SFT 需要指令问答数据
- 多轮对话需要 conversation 数据
- DPO 需要偏好对比数据
- KTO 需要好坏标签数据
- 预训练需要纯文本数据
- 多模态微调还需要图片或音频路径
如果数据格式不对,轻则训练效果差,重则直接报错。
本文整理大模型微调中常见的数据集格式、适用场景,以及如何构建对应格式的数据集。内容主要参考 LLaMA-Factory 的数据组织方式,同时也适用于理解其他微调框架的数据准备思路。
一、微调数据集常见格式总览
常见数据集格式可以分为下面几类:
| 数据格式 | 主要用途 | 是否适合新手 | 典型场景 |
|---|---|---|---|
| Alpaca 格式 | SFT 指令微调 | 推荐 | 单轮问答、指令任务 |
| Alpaca 多轮格式 | SFT 多轮微调 | 推荐 | 带历史上下文的对话 |
| ShareGPT 格式 | 多轮聊天微调 | 推荐 | 聊天助手、客服、角色扮演 |
| Pretrain 纯文本格式 | 继续预训练 | 不建议新手优先 | 领域语料学习 |
| Preference / DPO 格式 | 偏好优化 | 进阶 | 让模型更偏向优质回答 |
| KTO 格式 | 偏好优化 | 进阶 | 只有好/坏标签的数据 |
| 多模态格式 | 图文/音频微调 | 进阶 | 视觉问答、语音理解 |
| OpenAI Messages 格式 | 对话数据交换 | 推荐了解 | ChatGPT 风格多轮数据 |
二、Alpaca 格式
Alpaca 格式是最常见、最适合新手入门的 SFT 数据格式。
它通常由三个核心字段组成:
text
instruction:用户指令
input:补充输入,可为空
output:模型应该回答的内容
1. 基础格式
json
[
{
"instruction": "请解释什么是 LoRA 微调。",
"input": "",
"output": "LoRA 微调是一种低成本的大模型微调方法,它通过训练少量额外参数来适配新任务,而不是更新模型的全部参数。"
},
{
"instruction": "根据下面的内容回答问题。",
"input": "公司营业时间是周一到周五上午 9 点到下午 6 点。",
"output": "公司的营业时间是周一到周五上午 9 点到下午 6 点。"
}
]
2. 字段说明
| 字段 | 是否必填 | 说明 |
|---|---|---|
| instruction | 必填 | 用户的任务指令 |
| input | 选填 | 指令的补充信息 |
| output | 必填 | 期望模型输出的答案 |
| system | 选填 | 系统提示词 |
| history | 选填 | 历史对话 |
3. 适合场景
Alpaca 格式适合:
- 单轮问答
- 指令微调
- 固定格式输出
- 文本分类
- 信息抽取
- 文案生成
- 企业知识库问答
- 客服话术训练
例如:
text
用户问:退货流程是什么?
模型答:您可以在订单页面申请退货,填写原因后等待审核。
这种数据非常适合用 Alpaca 格式。
4. 如何构建 Alpaca 数据集
假设原始资料是公司 FAQ:
text
问题:发票什么时候开?
答案:订单完成后 1-3 个工作日内开具电子发票。
可以整理成:
json
{
"instruction": "发票什么时候开?",
"input": "",
"output": "订单完成后 1-3 个工作日内会开具电子发票。"
}
如果问题依赖上下文:
text
资料:会员有效期为一年,到期后需要续费。
问题:会员到期后怎么办?
答案:会员到期后需要续费,续费成功后可以继续使用会员权益。
可以整理成:
json
{
"instruction": "根据下面资料回答问题。",
"input": "会员有效期为一年,到期后需要续费。",
"output": "会员到期后需要续费,续费成功后可以继续使用会员权益。"
}
三、带 system 的 Alpaca 格式
有些场景需要给模型固定角色或回答规则,这时可以加入 system 字段。
1. 示例
json
[
{
"instruction": "用户说商品损坏了,应该怎么回复?",
"input": "",
"output": "非常抱歉给您带来不便。请您提供商品照片和订单号,我们会尽快为您核实并处理售后。",
"system": "你是一个电商平台客服助手,回答要礼貌、简洁、专业。"
}
]
2. 适合场景
带 system 的格式适合:
- 固定角色
- 固定语气
- 固定行业身份
- 固定安全边界
- 固定输出规范
比如:
text
你是法律助手
你是医疗咨询助手
你是电商客服
你是代码审查助手
你必须用 JSON 输出
3. 构建建议
如果整个数据集都属于同一个角色,system 可以统一设置。
例如客服助手:
text
你是一个专业、礼貌、耐心的电商客服助手。
如果不同样本角色不同,也可以每条数据单独设置 system。
四、Alpaca 多轮对话格式
Alpaca 格式也可以表达多轮对话,通常使用 history 字段。
1. 示例
json
[
{
"instruction": "那可以开发票吗?",
"input": "",
"output": "可以的,您可以在订单完成后申请电子发票。",
"history": [
["这个商品支持退货吗?", "支持,签收后 7 天内可以申请无理由退货。"],
["退货需要运费吗?", "如果是商品质量问题,运费由商家承担;如果是个人原因,运费通常由买家承担。"]
]
}
]
2. 字段说明
| 字段 | 说明 |
|---|---|
| history | 历史对话列表 |
| instruction | 当前这一轮用户问题 |
| output | 当前这一轮模型回答 |
history 中每个元素一般是:
json
["用户上一轮问题", "模型上一轮回答"]
3. 适合场景
Alpaca 多轮格式适合:
- 多轮客服
- 连续追问
- 需要上下文的问答
- 任务型对话
- 简单角色对话
4. 构建建议
如果你的原始数据是连续聊天记录,可以把最后一轮作为训练目标,把前面的对话放入 history。
原始对话:
text
用户:这个商品支持退货吗?
客服:支持,签收后 7 天内可以申请无理由退货。
用户:退货需要运费吗?
客服:如果是商品质量问题,运费由商家承担。
用户:那可以开发票吗?
客服:可以,订单完成后可以申请电子发票。
整理成:
json
{
"instruction": "那可以开发票吗?",
"input": "",
"output": "可以,订单完成后可以申请电子发票。",
"history": [
["这个商品支持退货吗?", "支持,签收后 7 天内可以申请无理由退货。"],
["退货需要运费吗?", "如果是商品质量问题,运费由商家承担。"]
]
}
五、ShareGPT 格式
ShareGPT 格式也是大模型微调里非常常见的格式,尤其适合多轮聊天数据。
它的核心字段是:
text
conversations
里面按顺序保存用户和助手的对话。
1. 基础格式
json
[
{
"conversations": [
{
"from": "human",
"value": "你是谁?"
},
{
"from": "gpt",
"value": "我是一个经过微调的中文助手。"
}
]
}
]
2. 多轮对话示例
json
[
{
"conversations": [
{
"from": "human",
"value": "这个商品支持退货吗?"
},
{
"from": "gpt",
"value": "支持,签收后 7 天内可以申请无理由退货。"
},
{
"from": "human",
"value": "退货运费谁承担?"
},
{
"from": "gpt",
"value": "如果是商品质量问题,运费由商家承担;如果是个人原因,运费通常由买家承担。"
}
]
}
]
3. 字段说明
| 字段 | 说明 |
|---|---|
| conversations | 对话列表 |
| from | 角色,例如 human、gpt |
| value | 对话内容 |
常见角色:
text
human:用户
gpt:助手
system:系统提示
function:函数
observation:工具返回结果
不同框架对角色字段的支持可能不完全一致,需要根据训练框架要求调整。
4. 适合场景
ShareGPT 格式适合:
- 多轮聊天助手
- 客服机器人
- 角色扮演
- 通用聊天能力微调
- 工具调用数据
- 带函数调用的对话数据
如果你的数据本来就是聊天记录,ShareGPT 格式通常比 Alpaca 更自然。
5. 如何构建 ShareGPT 数据集
原始聊天记录:
text
用户:你能帮我写一份请假条吗?
助手:可以,请告诉我请假原因、时间和收件人。
用户:因身体不适,请假一天,发给班主任。
助手:请假条:尊敬的班主任老师,我因身体不适,需请假一天,请您批准。
整理为:
json
{
"conversations": [
{
"from": "human",
"value": "你能帮我写一份请假条吗?"
},
{
"from": "gpt",
"value": "可以,请告诉我请假原因、时间和收件人。"
},
{
"from": "human",
"value": "因身体不适,请假一天,发给班主任。"
},
{
"from": "gpt",
"value": "请假条:尊敬的班主任老师,我因身体不适,需请假一天,请您批准。"
}
]
}
六、OpenAI Messages 格式
OpenAI Messages 格式是现在很多聊天模型和 API 常用的数据结构。
它通常长这样:
json
[
{
"messages": [
{
"role": "system",
"content": "你是一个专业的中文写作助手。"
},
{
"role": "user",
"content": "帮我写一个产品介绍。"
},
{
"role": "assistant",
"content": "当然可以。请告诉我产品名称、功能和目标用户。"
}
]
}
]
1. 字段说明
| 字段 | 说明 |
|---|---|
| messages | 消息列表 |
| role | 角色 |
| content | 消息内容 |
常见 role:
text
system
user
assistant
tool
2. 适合场景
OpenAI Messages 格式适合:
- 从 ChatGPT / API 日志整理数据
- 多轮对话训练
- 工具调用数据
- 准备迁移到其他训练格式
3. 和 ShareGPT 的区别
OpenAI Messages 格式:
json
{
"role": "user",
"content": "你好"
}
ShareGPT 格式:
json
{
"from": "human",
"value": "你好"
}
两者本质上很像,主要是字段名称不同。
可以简单理解为:
text
OpenAI: role + content
ShareGPT: from + value
七、Preference / DPO 偏好数据格式
DPO、ORPO、PPO 等偏好优化方法,需要的数据不是单个标准答案,而是一组好坏对比。
一般包含:
text
prompt:问题
chosen:更好的回答
rejected:较差的回答
1. Alpaca 偏好格式示例
json
[
{
"instruction": "请解释什么是机器学习。",
"input": "",
"chosen": "机器学习是一种让计算机从数据中学习规律,并利用这些规律进行预测或决策的人工智能技术。",
"rejected": "机器学习就是机器自己变聪明。"
}
]
2. ShareGPT 偏好格式示例
json
[
{
"conversations": [
{
"from": "human",
"value": "请解释什么是机器学习。"
}
],
"chosen": {
"from": "gpt",
"value": "机器学习是一种让计算机从数据中学习规律,并利用这些规律进行预测或决策的人工智能技术。"
},
"rejected": {
"from": "gpt",
"value": "机器学习就是机器自己变聪明。"
}
}
]
3. 字段说明
| 字段 | 说明 |
|---|---|
| instruction / prompt / conversations | 用户问题 |
| chosen | 更好的回答 |
| rejected | 较差的回答 |
4. 适合场景
DPO 偏好数据适合:
- SFT 后继续优化模型
- 改善模型回答风格
- 减少啰嗦回答
- 减少错误回答
- 让模型更偏向人类喜欢的答案
- 做模型对齐训练
5. 如何构建 DPO 数据
方式一:人工标注
同一个问题准备两个回答:
text
问题:什么是 LoRA?
回答 A:准确、清楚、结构完整
回答 B:模糊、错误、啰嗦
然后人工判断哪个更好。
整理为:
json
{
"instruction": "什么是 LoRA?",
"input": "",
"chosen": "LoRA 是一种参数高效微调方法,它通过训练少量低秩矩阵来适配新任务。",
"rejected": "LoRA 就是让模型随便学一点东西。"
}
方式二:模型生成多个答案后筛选
可以让模型对同一个问题生成多个回答,然后人工挑选:
text
chosen:更准确、更符合要求的回答
rejected:错误、不完整或风格不符合要求的回答
方式三:从线上反馈构建
例如用户对回答点赞/点踩:
text
点赞回答 -> chosen
点踩回答 -> rejected
这种数据非常适合偏好优化。
八、KTO 数据格式
KTO 也是一种偏好优化方法。和 DPO 不同,DPO 通常需要成对的好坏回答,而 KTO 可以使用单条回答的好坏标签。
也就是说,KTO 数据通常包含:
text
问题
回答
这个回答是否好
1. 示例
json
[
{
"instruction": "请解释什么是 LoRA。",
"input": "",
"output": "LoRA 是一种参数高效微调方法,它通过训练少量额外参数来适配新任务。",
"kto_tag": true
},
{
"instruction": "请解释什么是 LoRA。",
"input": "",
"output": "LoRA 是一个模型名字。",
"kto_tag": false
}
]
2. 字段说明
| 字段 | 说明 |
|---|---|
| instruction | 用户问题 |
| input | 补充输入 |
| output | 模型回答 |
| kto_tag | 回答是否符合偏好 |
3. 适合场景
KTO 适合:
- 只有点赞/点踩数据
- 没有成对 chosen/rejected 数据
- 有单条回答质量标签
- 想做轻量偏好优化
4. 如何构建 KTO 数据
如果业务系统里有用户反馈:
text
回答 A:用户点赞
回答 B:用户点踩
可以整理为:
json
{
"instruction": "会员怎么续费?",
"input": "",
"output": "您可以在个人中心的会员页面点击续费按钮完成续费。",
"kto_tag": true
}
json
{
"instruction": "会员怎么续费?",
"input": "",
"output": "你自己去找一下。",
"kto_tag": false
}
九、Pretrain 纯文本数据格式
预训练数据和 SFT 数据不同。
SFT 是教模型怎么回答问题,而预训练更像是让模型继续阅读大量文本,学习某个领域的语言和知识分布。
1. 示例格式
json
[
{
"text": "机器学习是人工智能的一个重要分支,它通过数据训练模型,使模型能够进行预测、分类和决策。"
},
{
"text": "在电商售后场景中,用户常见问题包括退货、换货、发票、物流查询和订单取消。"
}
]
也可以是 JSONL:
json
{"text": "机器学习是人工智能的一个重要分支。"}
{"text": "深度学习是机器学习的一种方法。"}
2. 适合场景
预训练格式适合:
- 行业语料继续预训练
- 法律文本学习
- 医疗文本学习
- 代码语料学习
- 企业内部文档语言适配
3. 不适合场景
如果你的目标是让模型学会"如何回答问题",不建议直接用预训练格式。
例如客服问答:
text
用户:怎么退货?
客服:请在订单页面申请退货。
这种更适合 SFT,而不是继续预训练。
4. 如何构建预训练数据
原始资料:
text
公司售后政策:
用户签收商品后 7 天内可以申请无理由退货。若商品存在质量问题,退货运费由商家承担。
整理为:
json
{
"text": "公司售后政策:用户签收商品后 7 天内可以申请无理由退货。若商品存在质量问题,退货运费由商家承担。"
}
十、多模态图文数据格式
如果训练的是视觉语言模型,比如 Qwen-VL、LLaVA 等,就需要图文数据。
图文数据通常除了文本外,还需要图片路径。
1. Alpaca 图文格式示例
json
[
{
"instruction": "请描述这张图片。",
"input": "",
"output": "图片中有一只白色的小猫坐在沙发上。",
"images": [
"images/cat.jpg"
]
}
]
2. 字段说明
| 字段 | 说明 |
|---|---|
| instruction | 用户指令 |
| input | 补充输入 |
| output | 模型回答 |
| images | 图片路径列表 |
3. 适合场景
图文格式适合:
- 图片描述
- OCR 问答
- 视觉问答
- 商品图片理解
- 医学影像辅助说明
- 截图内容理解
4. 构建建议
目录可以这样组织:
text
data/
my_vl_dataset.json
images/
001.jpg
002.jpg
003.jpg
数据文件:
json
[
{
"instruction": "这张商品图里有什么?",
"input": "",
"output": "图片中是一双黑色运动鞋,鞋底为白色,适合日常运动穿着。",
"images": [
"images/001.jpg"
]
}
]
注意:图片路径需要和训练框架的数据目录对应,不能随便写一个不存在的路径。
十一、音频数据格式
如果训练音频理解模型,需要加入音频路径字段。
1. 示例
json
[
{
"instruction": "请转写这段音频。",
"input": "",
"output": "今天天气很好,我们下午去公园散步。",
"audios": [
"audios/example.wav"
]
}
]
2. 适合场景
音频数据适合:
- 语音识别
- 音频问答
- 语音内容理解
- 多模态语音助手
十二、CSV / JSON / JSONL / Parquet 文件格式区别
微调数据不仅有内容结构差异,也有文件存储格式差异。
常见文件类型包括:
text
json
jsonl
csv
parquet
arrow
1. JSON
JSON 是最容易理解的格式。
json
[
{
"instruction": "你好",
"input": "",
"output": "你好,有什么可以帮你?"
}
]
优点:
- 直观
- 适合小数据集
- 容易手动编辑
缺点:
- 大文件加载慢
- 文件太大时不方便处理
2. JSONL
JSONL 是一行一个 JSON 对象。
json
{"instruction": "你好", "input": "", "output": "你好,有什么可以帮你?"}
{"instruction": "你是谁", "input": "", "output": "我是一个 AI 助手。"}
优点:
- 适合大数据集
- 可以逐行读取
- 不容易因为一个逗号导致整个文件损坏
缺点:
- 对新手来说不如 JSON 直观
3. CSV
CSV 是表格格式。
csv
instruction,input,output
你好,,你好,有什么可以帮你?
你是谁,,我是一个 AI 助手。
优点:
- Excel 可以打开
- 适合表格型数据
缺点:
- 多行文本和特殊符号容易出问题
- 不太适合复杂多轮对话
4. Parquet
Parquet 是高性能列式存储格式。
优点:
- 适合大规模数据
- 读取效率高
- 常用于 Hugging Face 数据集
缺点:
- 不适合手动编辑
- 新手不容易直接查看
十三、LLaMA-Factory 中 dataset_info.json 怎么写
在 LLaMA-Factory 中,自定义数据集通常需要在 data/dataset_info.json 中注册。
默认数据目录是:
text
data
如果你的数据文件是:
text
data/my_alpaca.json
就需要在 dataset_info.json 中添加配置。
1. Alpaca 格式注册示例
json
"my_alpaca": {
"file_name": "my_alpaca.json",
"formatting": "alpaca",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"system": "system",
"history": "history"
}
}
训练时数据集名称填写:
text
my_alpaca
2. ShareGPT 格式注册示例
json
"my_sharegpt": {
"file_name": "my_sharegpt.json",
"formatting": "sharegpt",
"columns": {
"messages": "conversations"
},
"tags": {
"role_tag": "from",
"content_tag": "value",
"user_tag": "human",
"assistant_tag": "gpt"
}
}
训练时数据集名称填写:
text
my_sharegpt
3. DPO 偏好数据注册示例
json
"my_dpo": {
"file_name": "my_dpo.json",
"formatting": "alpaca",
"ranking": true,
"columns": {
"prompt": "instruction",
"query": "input",
"chosen": "chosen",
"rejected": "rejected"
}
}
4. KTO 数据注册示例
json
"my_kto": {
"file_name": "my_kto.json",
"formatting": "alpaca",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"kto_tag": "kto_tag"
}
}
5. 预训练数据注册示例
json
"my_pretrain": {
"file_name": "my_pretrain.json",
"columns": {
"prompt": "text"
}
}
十四、不同任务应该选择什么格式?
1. 普通问答助手
推荐:
text
Alpaca 格式
适合数据:
text
问题 -> 答案
指令 -> 输出
示例:
json
{
"instruction": "如何申请退款?",
"input": "",
"output": "您可以在订单详情页点击申请退款,并按照页面提示提交申请。"
}
2. 客服机器人
推荐:
text
Alpaca 格式 或 ShareGPT 格式
如果是单轮 FAQ,用 Alpaca。
如果是连续聊天记录,用 ShareGPT。
3. 角色扮演模型
推荐:
text
ShareGPT 格式
因为角色扮演通常是多轮对话,ShareGPT 更适合表达连续上下文。
4. 固定格式输出
推荐:
text
Alpaca 格式
例如训练模型输出 JSON:
json
{
"instruction": "从文本中抽取姓名和手机号,以 JSON 输出。",
"input": "张三的手机号是 13800138000。",
"output": "{\"name\": \"张三\", \"phone\": \"13800138000\"}"
}
5. 偏好优化
推荐:
text
DPO / Preference 格式
适合已经有 SFT 模型后继续优化回答质量。
6. 行业知识继续学习
推荐:
text
Pretrain 纯文本格式 或 SFT 格式
如果只是让模型熟悉行业语料,可以用 Pretrain。
如果希望模型能回答具体问题,建议用 SFT。
十五、数据集构建流程建议
推荐按照下面流程构建数据集。
第一步:确定训练目标
先问自己:
text
我是要让模型学知识?
还是让模型学会回答方式?
还是让模型更偏向某种回答?
不同目标对应不同数据格式:
| 目标 | 推荐格式 |
|---|---|
| 学会问答 | Alpaca / ShareGPT |
| 学会聊天 | ShareGPT |
| 学会行业语言 | Pretrain |
| 优化回答偏好 | DPO / KTO |
| 学会看图回答 | 多模态图文格式 |
第二步:收集原始数据
常见数据来源:
- FAQ 文档
- 客服聊天记录
- 企业知识库
- 产品说明书
- 技术文档
- 人工编写问答
- 用户反馈数据
- 模型生成后人工筛选
第三步:清洗数据
需要处理:
- 删除重复样本
- 删除错误答案
- 删除过短或无意义内容
- 删除隐私信息
- 统一标点和格式
- 修正错别字
- 保证回答风格一致
第四步:转换格式
例如把 FAQ 转成 Alpaca:
原始数据:
text
Q:怎么修改手机号?
A:请进入个人中心,在账号安全页面修改手机号。
转换后:
json
{
"instruction": "怎么修改手机号?",
"input": "",
"output": "请进入个人中心,在账号安全页面修改手机号。"
}
第五步:抽样检查
训练前一定要人工检查一部分数据。
重点检查:
- instruction 是否清楚
- output 是否正确
- 是否有乱码
- 是否有格式错误
- 多轮对话顺序是否正确
- chosen 是否真的比 rejected 好
十六、数据质量建议
数据质量比数据数量更重要。
对于个人微调,建议优先准备:
text
100 条高质量数据 > 10000 条低质量数据
1. 好数据的特点
好数据通常具备:
- 问题明确
- 答案准确
- 风格统一
- 没有明显错别字
- 没有自相矛盾
- 输出格式稳定
- 与目标场景高度相关
2. 差数据的特点
差数据通常包括:
- 答非所问
- 答案太短
- 答案错误
- 重复样本太多
- 同一个问题多个矛盾答案
- 包含大量无关内容
- 充满广告、乱码、隐私信息
3. 数据量建议
| 阶段 | 建议数据量 |
|---|---|
| 测试流程 | 50 - 200 条 |
| 初步有效果 | 500 - 1000 条 |
| 较明显风格适配 | 3000 - 10000 条 |
| 行业助手 | 10000 条以上更好 |
注意:数据越多不一定越好,低质量数据会拉低模型效果。
十七、常见错误
1. 把知识文档直接当 SFT 数据
错误做法:
json
{
"instruction": "公司制度如下",
"input": "",
"output": "第一条......第二条......第三条......"
}
这种数据不一定能让模型学会问答。
更好的做法是把文档拆成问答:
json
{
"instruction": "员工请假需要提前多久申请?",
"input": "",
"output": "员工请假通常需要至少提前一天提交申请,特殊情况可以事后补交说明。"
}
2. output 太短
例如:
json
{
"instruction": "什么是 LoRA?",
"input": "",
"output": "一种微调方法。"
}
这种答案信息量太少。
更好的写法:
json
{
"instruction": "什么是 LoRA?",
"input": "",
"output": "LoRA 是一种参数高效微调方法,它通过训练少量额外参数来适配新任务,而不是更新模型的全部参数,因此显存占用更低,适合个人电脑进行大模型微调。"
}
3. 多轮对话顺序错乱
多轮对话必须保持顺序:
text
用户 -> 助手 -> 用户 -> 助手
不要出现:
text
助手 -> 用户 -> 用户 -> 助手
4. chosen / rejected 写反
DPO 数据中最常见的错误是把好答案和差答案写反。
错误:
json
{
"instruction": "什么是机器学习?",
"chosen": "机器学习就是机器自己想事情。",
"rejected": "机器学习是让计算机从数据中学习规律并进行预测的技术。"
}
这会让模型越训越差。
5. 数据里混入隐私信息
训练前要去除:
- 手机号
- 身份证号
- 地址
- 订单号
- 银行卡号
- 真实姓名
- 公司敏感信息
十八、完整示例:构建一个客服微调数据集
假设目标是训练一个电商客服助手。
1. 原始资料
text
退货政策:用户签收商品后 7 天内可以申请无理由退货。
发票政策:订单完成后可以申请电子发票。
物流政策:用户可以在订单详情页查看物流信息。
2. 转成 Alpaca 数据
json
[
{
"instruction": "商品可以退货吗?",
"input": "",
"output": "可以。用户签收商品后 7 天内可以申请无理由退货。"
},
{
"instruction": "怎么申请发票?",
"input": "",
"output": "订单完成后,您可以在订单详情页申请电子发票。"
},
{
"instruction": "在哪里查看物流?",
"input": "",
"output": "您可以在订单详情页查看物流信息。"
}
]
3. 加入 system
json
[
{
"instruction": "商品可以退货吗?",
"input": "",
"output": "可以。用户签收商品后 7 天内可以申请无理由退货。",
"system": "你是一个专业、礼貌、耐心的电商客服助手。"
}
]
4. 注册到 LLaMA-Factory
假设文件名是:
text
data/ecommerce_service.json
在 dataset_info.json 添加:
json
"ecommerce_service": {
"file_name": "ecommerce_service.json",
"formatting": "alpaca",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"system": "system"
}
}
训练时选择数据集:
text
ecommerce_service
十九、总结
大模型微调数据集格式很多,但入门阶段只需要重点掌握三类:
text
Alpaca:适合单轮问答和指令微调
ShareGPT:适合多轮聊天和角色对话
DPO / KTO:适合 SFT 之后做偏好优化