🐸 青蛙编程网
首页 / AI / 微调 LLaMA-Factory / 3. 数据准备

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 里都写同一行,改的时候一起改。

动手改

  1. 新建 data/my_demo.json,写 5 条 Alpaca 格式的数据,然后在 data/dataset_info.json 里注册成 my_demo
  2. 把注册说明里的 columns 改成 prompt: question,看看框架是按什么列去读你数据的
  3. 找一条现成的 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 实战 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。