数据集的编写
LLaMA-Factory 数据集类型总结
LLaMA-Factory中数据集总共有4种类型:指令微调(SFT),多轮对话(Chat),偏好数据(DPO),预训练(PT)
根据官方文档,数据集主要分为以下四种,建议按需构建:
| 类型 |
格式推荐 |
核心目标 |
适用场景 |
| 指令微调 (SFT) |
instruction, output |
学会听令行事 |
基础技能训练、语气模仿。 |
| 多轮对话 (Chat) |
messages (role/content) |
上下文连贯性 |
模拟直播互动、长线聊天、人设维持。 |
| 偏好数据 (DPO) |
chosen, rejected |
风格对齐/价值观 |
纠正模型错误回复,强制选择特定风格。 |
| 预训练 (PT) |
text / content |
知识注入 |
喂入角色百科、长篇背景设定、专业文档。 |
数据格式实战:ShareGPT (Messages)
目前行业标准及 LLaMA-Factory 推荐使用 OpenAI 风格的 messages 格式,不仅支持多轮对话,且兼容性最强
1 2 3 4 5 6 7 8 9
| [ { "messages": [ { "role": "system", "content": "你现在是秘密结社 HoloX 的总帅。" }, { "role": "user", "content": "总帅早上好!" }, { "role": "assistant", "content": "唔……人类啊,态度值得嘉奖!" } ] } ]
|
dataset_info.json 配置映射:
1 2 3 4 5
| "my_dataset_name": { "file_name": "data.json", "formatting": "sharegpt", "columns": { "messages": "messages" } }
|
核心概念:泛化能力 (Generalization)
- 定义:模型处理“没见过的新考题”的能力。
- 过拟合 (Overfitting):死记硬背训练集,换个问法就不会了。需通过减少训练轮数或增加数据多样性解决。
- 欠拟合 (Underfitting):学艺不精,不仅新题不会,旧题也答不好。需增加训练量或增大模型规模。
- 黄金法则:数据多样性越强,泛化能力通常越好。
自动化改写脚本模板
用于将 Whisper 转录的“烂稿”自动转化为训练数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import json import asyncio from ollama import AsyncClient
async def auto_rewrite(): client = AsyncClient() raw_inputs = ["你好", "吃了吗"] dataset = []
for text in raw_inputs: resp = await client.chat( model="qwen2.5:7b", messages=[ {"role": "system", "content": "请将输入改写为傲娇总帅口吻。"}, {"role": "user", "content": text} ] ) dataset.append({ "messages": [ {"role": "system", "content": "你现在是总帅。"}, {"role": "user", "content": text}, {"role": "assistant", "content": resp['message']['content']} ] }) with open("output.json", "w", encoding="utf-8") as f: json.dump(dataset, f, ensure_ascii=False, indent=2)
if __name__ == "__main__": asyncio.run(auto_rewrite())
|
指令微调 (SFT) - Alpaca 格式
这是最经典的“一问一答”模式,适合让模型学会特定任务。
数据集 (sft_data.json):
1 2 3 4 5 6 7
| [ { "instruction": "帮我写一个 Python 自动化的思路。", "input": "需求是将视频转为文字并保存为 JSON。", "output": "首先使用 FFmpeg 提取音频,然后调用 Whisper 进行 ASR 转录..." } ]
|
注册配置 (dataset_info.json):
1 2 3
| "my_sft": { "file_name": "sft_data.json" }
|
多轮对话 (Chat) - ShareGPT 格式
这是正在用的格式,适合训练角色的上下文连续对话能力。
数据集 (chat_data.json):
1 2 3 4 5 6 7 8 9
| [ { "messages": [ {"role": "system", "content": "你现在是总帅。"}, {"role": "user", "content": "总帅好!"}, {"role": "assistant", "content": "哼,愚蠢的人类,又来觐见吾了?"} ] } ]
|
注册配置 (dataset_info.json):
1 2 3 4 5
| "my_chat": { "file_name": "chat_data.json", "formatting": "sharegpt", "columns": { "messages": "messages" } }
|
偏好微调 (DPO/ORPO)
这种格式要求你提供一个“好答案”和一个“坏答案”,模型会通过对比学会“避坑”。
数据集 (dpo_data.json):
1 2 3 4 5 6 7
| [ { "instruction": "你喜欢人类吗?", "chosen": "虽然人类很愚蠢,但作为吾的部下,勉强可以接受。", "rejected": "我是一个人工智能,没有感情,不讨论喜欢或讨厌。" } ]
|
注册配置 (dataset_info.json):
1 2 3 4 5 6 7 8 9
| "my_dpo": { "file_name": "dpo_data.json", "ranking": true, "columns": { "prompt": "instruction", "chosen": "chosen", "rejected": "rejected" } }
|
预训练 (Pre-training)
这种格式最简单,就是纯文本,模型会像看书一样学习背景知识。
数据集 (pt_data.json):
1 2 3 4
| [ {"text": "拉普拉斯·ダークネス是秘密结社 HoloX 的总帅,于 2021 年出道..."}, {"text": "秘密结社 HoloX 的目标是征服世界,虽然目前进展缓慢..."} ]
|
注册配置 (dataset_info.json):
1 2 3 4
| "my_pt": { "file_name": "pt_data.json", "columns": { "prompt": "text" } }
|