数据集的编写

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" }
}