3. 数据准备
这是什么:数据集格式 = LLaMA-Factory 认识的两种数据排版方式——Alpaca(扁平三字段)和 ShareGPT(多轮对话列表)。
为什么用:框架不知道你的数据怎么存的,它只认固定格式。不按格式写,训练直接报「找不到数据集」。这一章不需要显卡,纯看文件就能学会。
如何用:本章先给两种格式各写一个最小样例,再教你把文件注册进 data/dataset_info.json,最后讲 template 这个最容易翻车的坑。
3.1 格式一:Alpaca(最常用)
Alpaca 格式把一条样本拆成三个平级字段:
[
{
"instruction": "把下面这句话翻译成英文",
"input": "今天天气真好",
"output": "The weather is really nice today."
}
]
| 字段 | 必填 | 说明 |
|---|---|---|
instruction |
✅ | 用户指令,会和 input 拼成用户提示词 |
input |
❌ | 补充上下文,可以是空字符串 |
output |
✅ | 模型要学的回答 |
system |
❌ | 系统提示词 |
history |
❌ | 历史轮次,形如 [["上一轮问", "上一轮答"]] |
你会看到(示意)——框架把上面那条渲染成的训练文本:
<|im_start|>user
把下面这句话翻译成英文
今天天气真好<|im_end|>
<|im_start|>assistant
The weather is really nice today.<|im_end|>
注意 instruction 和 input 是拼在一起的,用换行隔开。官方 demo 数据就在仓库的 data/alpaca_en_demo.json,可以先打开看一眼真实长什么样。
3.2 格式二:ShareGPT(多轮对话)
ShareGPT 格式把所有消息塞进 conversations 列表,每条消息有「身份」和「内容」两个字段:
[
{
"conversations": [
{"from": "human", "value": "帮我写一句关于秋天的短句"},
{"from": "gpt", "value": "秋风起,梧桐叶落满阶。"}
],
"system": "你是一个文雅的中文写作者"
}
]
你会看到(示意)——框架把上面这条渲染成的训练文本:
<|im_start|>system
你是一个文雅的中文写作者<|im_end|>
<|im_start|>user
帮我写一句关于秋天的短句<|im_end|>
<|im_start|>assistant
秋风起,梧桐叶落满阶。<|im_end|>
ShareGPT 的优势是角色更多:除了 human / gpt,还能用 observation(工具返回结果)和 function_call(工具调用),所以做 Agent(智能体)微调基本都用它。规则有两条:human 和 observation 放奇数位,gpt 和 function 放偶数位;只有 gpt 和 function 的内容会被学习。
3.3 关键一步:在 dataset_info.json 里注册
数据文件光放在那儿没用,必须在 data/dataset_info.json 里登记一份「说明书」,框架才知道去哪儿找、怎么解析。
最简单的注册(Alpaca 格式,列名用默认值时):
{
"my_alpaca_demo": {
"file_name": "my_alpaca_demo.json"
}
}
然后在训练配置里写 dataset: my_alpaca_demo 就能用了。注册名随便起,但必须和 YAML 里的 dataset 对得上。
3.4 列名不一样怎么办:用 columns 映射
如果你的字段叫 question / answer 而不是 instruction / output,不用改数据,改注册说明就行:
{
"my_qa_dataset": {
"file_name": "my_qa.json",
"columns": {
"prompt": "question",
"response": "answer"
}
}
}
columns 支持的映射键(左边是框架内部叫法,右边填你数据里的真实列名):
| 内部键 | 默认值 | 用途 |
|---|---|---|
prompt |
instruction | 用户指令 |
query |
input | 补充输入 |
response |
output | 模型回答 |
history |
无 | 历史轮次 |
messages |
conversations | ShareGPT 的消息列表 |
system |
无 | 系统提示词 |
tools |
无 | 工具描述 |
chosen / rejected |
无 | 偏好数据的好/坏回答(第 5 章) |
kto_tag |
无 | KTO 用的好/坏标签(第 5 章) |
ShareGPT 格式还要额外写 "formatting": "sharegpt",否则框架会用 Alpaca 的方式去解析你的 conversations 字段,直接读出空数据。
如果你的对话用 role / content 这种 OpenAI 风格字段名,加一段 tags 映射就行:
{
"my_openai_style": {
"file_name": "my_openai.json",
"formatting": "sharegpt",
"columns": {"messages": "messages"},
"tags": {
"role_tag": "role",
"content_tag": "content",
"user_tag": "user",
"assistant_tag": "assistant",
"system_tag": "system"
}
}
}
3.5 也可以不下载,直接用现成的
dataset_info.json 里很多条目是从 HuggingFace 或 ModelScope 拉的,不用手动下载:
{
"alpaca_en": {
"hf_hub_url": "llamafactory/alpaca_en",
"ms_hub_url": "llamafactory/alpaca_en"
},
"alpaca_zh": {
"hf_hub_url": "llamafactory/alpaca_zh",
"ms_hub_url": "llamafactory/alpaca_zh"
}
}
直接 dataset: alpaca_zh 就行。国内下载慢就加一个环境变量切到 ModelScope:
export USE_MODELSCOPE_HUB=1
数据文件可以放本地、也可以放 s3/gcs 云存储(用 cloud_file_name 字段)。dataset_dir 默认是 ./data,想换目录改这个参数即可。
3.6 最后一个坑:template 必须训练推理一致
template(对话模板)决定「你的数据被拼成什么样子喂给模型」。同一个模型有思考版和非思考版时,用 _nothink 后缀区分,比如 qwen3 和 qwen3_nothink。
template: qwen3_nothink
训练和推理必须用同一个 template,否则模型学的是 A 的格式,你却按 B 的格式去问它,回答自然对不上。常见做法是在训练和推理的 YAML 里都写同一行,改的时候一起改。
动手改
- 新建
data/my_demo.json,写 5 条 Alpaca 格式的数据,然后在data/dataset_info.json里注册成my_demo - 把注册说明里的
columns改成prompt: question,看看框架是按什么列去读你数据的 - 找一条现成的 ShareGPT 数据(比如
data/glaive_toolcall_en_demo.json),数数它的from是不是严格 human/observation 在奇数位、gpt/function 在偶数位
小结
- 两种格式:Alpaca(
instruction/input/output)适合单轮,ShareGPT(conversations列表)适合多轮和工具调用 - 数据文件必须先在
data/dataset_info.json注册,名字要和 YAML 的dataset一致 - 字段名不一样就用
columns映射;ShareGPT 还要写"formatting": "sharegpt" - 现成数据集可以用
hf_hub_url/ms_hub_url直接拉,USE_MODELSCOPE_HUB=1切国内源 - template 训练和推理必须一致,推理版模型用
_nothink后缀
下一章:SFT 实战 🐸