6、数据上传与登记
第 29 章已经生成 keywords-clean,本节直接使用其中清洗并划分好的数据,不再重新清洗或随机分组。上传之后,先检查文件,再让 LLaMA-Factory 读取登记信息,最后在页面预览。
6.1 数据上传与完整性检查
在 AutoDL 的 JupyterLab 文件面板进入 /root/autodl-tmp/LLaMA-Factory/data/,新建 keywords-clean 文件夹。打开它,点击文件面板上方的“上传文件”,选择本机 案例与源码-4-微调/processed/keywords-clean/ 中的六个文件;也可以把这些文件拖进当前文件面板。上传完成后应看到:
data/keywords-clean/
├── keywords_train.jsonl # 1,600 条,用于训练
├── keywords_validation.jsonl # 200 条,用于开发和选择检查点
├── keywords_test.jsonl # 200 条,留给第 32 章最终测试
├── dataset_info.json # 三份文件的登记
├── manifest.json # 条数、文件校验值、原始行号
└── cleaning_report.json # 自动处理明细与检查范围若服务器已存在同名目录,先核对版本,不覆盖里面的数据。测试文件即使已上传,也不应加入训练或训练期间验证。
在 AutoDL 的 LLaMA-Factory 根目录检查上传内容:
cd /root/autodl-tmp/LLaMA-Factory
python - <<'PY'
import hashlib
import json
from pathlib import Path
folder = Path("data/keywords-clean")
manifest = json.loads((folder / "manifest.json").read_text(encoding="utf-8"))
for name, info in manifest["splits"].items():
file = folder / info["file"]
assert hashlib.sha256(file.read_bytes()).hexdigest() == info["sha256"], file
rows = [json.loads(line) for line in file.read_text(encoding="utf-8").splitlines()]
assert len(rows) == info["records"], file
print(f"{name}: {len(rows)} 条,校验通过")
PY这里的 SHA-256 可以理解为文件内容的“指纹”:上传前后相同,才说明服务器读到的是这份数据。上面代码同时检查文件指纹和记录条数,正常结果应是:
train: 1600 条,校验通过
validation: 200 条,校验通过
test: 200 条,校验通过校验失败时先检查上传是否完整、是否混入了别的版本,不修改训练参数来绕过。
下图中,三份数据均通过文件指纹与条数核对:

图中前三行对应数据校验结果;本步骤只核对指纹和条数。末行“输出目录尚未创建”不属于这段代码的输出,训练输出目录在第 8 节检查。
6.2 数据集路径与登记文件
本次 WebUI 的数据路径填写 data/keywords-clean。工具会读取这个目录内的 dataset_info.json,不需要修改 LLaMA-Factory 自带的 data/dataset_info.json。
上传的是文件,页面选择的是登记名。以训练集为例,工具会按下面的关系找到它:
因此,数据路径填文件夹,下拉框选 keywords_train;不要把 keywords_train.jsonl 填进数据路径,也不要把登记名当作另一个需要上传的文件。
清洗脚本已经登记了三项:
| 登记名 | 指向的文件 | 用途 |
|---|---|---|
keywords_train | keywords_train.jsonl | 训练 |
keywords_validation | keywords_validation.jsonl | 训练期间验证 |
keywords_test | keywords_test.jsonl | 方案确定后的测试 |
其中一项的结构如下;另外两项只更换登记名和文件名:
{
"keywords_train": {
"file_name": "keywords_train.jsonl",
"formatting": "sharegpt",
"columns": { "messages": "conversations" },
"tags": {
"role_tag": "role",
"content_tag": "content",
"user_tag": "user",
"assistant_tag": "assistant"
}
}
}这段用于阅读字段,上传时仍使用清洗脚本生成的完整登记文件。按下面的对应关系理解它怎样读取一条样本:
| 配置字段 | 中文含义 | 本例告诉工具什么 |
|---|---|---|
file_name | 数据文件名 | 从同目录的 keywords_train.jsonl 读取样本 |
formatting | 数据格式 | sharegpt 表示按对话消息结构读取 |
columns.messages | 消息列表字段 | 样本中的消息保存在 conversations 中 |
tags.role_tag | 角色字段 | 每条消息用 role 标明角色 |
tags.content_tag | 内容字段 | 每条消息的文字保存在 content 中 |
tags.user_tag | 用户角色的取值 | role 为 user 时,识别为用户输入 |
tags.assistant_tag | 助手角色的取值 | role 为 assistant 时,识别为助手参考答案 |
在 JupyterLab 左侧打开刚上传的 dataset_info.json,展开 keywords_train,再展开 columns 和 tags。下图左边是六份实际文件,右边是登记内容:先对照 file_name,再核对 messages 和两个角色。

6.3 数据集预览与选择
填写数据路径后,在数据集下拉框选择 keywords_train,点击“预览数据集”。数量应为 1,600,每条都是 user → assistant,助手答案只包含分号分隔的关键词。

先看上方的 数量 1600,再在样例中找到 conversations、role: user 和 role: assistant。这个版本把样例显示为较长的文本;不必逐字阅读文章,重点确认中文没有乱码、角色对应正确、答案中的分隔符仍是英文分号。
预览验证集时,先清除训练集选项,再选 keywords_validation,确认数量为 200。预览结束后,训练页的数据集选择框恢复为只选 keywords_train;验证集在第 7.2 节单独指定,测试集留给最终评估。

预览用于核对文件、角色、中文显示和字段映射;实际 token 长度与参与损失计算的位置,还要按第 30 章“检查实际训练长度”核对,不能只看预览是否成功。
<details> <summary>数据下拉框或预览出现问题时</summary>- 下拉框没有
keywords_train。 先确认数据路径为data/keywords-clean,再在 JupyterLab 中打开这个目录,检查是否有dataset_info.json,其中是否登记了keywords_train。 - 能选中名称,但提示找不到文件。 查看登记项中的
file_name,确认它填写的是keywords_train.jsonl,且文件确实位于同一个数据目录。 - 打开后角色或内容不对。 对照 JSONL 中的
conversations、role、content,检查第 6.2 节的字段映射;本例应把user识别为输入,把assistant识别为参考答案。如果提示 JSON 格式错误,再打开报错对应的记录检查。