5、关键词数据清洗与划分
按照第 2 节的标注规则整理关键词样本,再把它们分成训练、验证和测试三份。本节的数据处理在本机完成。
5.1 常见问题与处理方法
数据清洗,就是把不适合直接训练的记录整理好。 能确定的格式错误可以批量修正;答案内容有问题,则要对照输入重新标注。不能修正、又无法确认的记录,先不放进训练数据。
下面用几个教学示例说明处理方法:
| 问题 | 示例 | 处理方法 |
|---|---|---|
| 多余前缀、中文分号和尾部分号 | 关键词:图书馆;阅读课; | 改为 图书馆;阅读课,保留关键词内容 |
| 同一答案重复列词 | 图书馆;阅读课;图书馆 | 删除重复词,保留 图书馆;阅读课 |
| 输入或答案为空 | 有 user,但 content 没有正文 | 核对来源,补齐后审核;无法补齐则暂不使用 |
| 答案缺少依据 | 输入只讲儿童阅读课,答案却有“成人培训” | 按当前输入重新标注,不能只修分号 |
第 2 节已经讲过内容审核。这里要特别区分两种“重复”:上表第二行是在一个答案中重复列词;下面则是同一条样本出现多次。
输入 A → 图书馆;阅读课
输入 A → 图书馆;阅读课相同输入、相同答案,保留一条即可。如果同一输入对应的答案不同,就不能直接按重复记录删除:
输入 A → 图书馆;阅读课
输入 A → 图书馆;公众号预约这叫答案冲突。可能是某份标注漏了内容,也可能是两种表达都合理,需要结合文章和选词规则判断。课程脚本遇到这种情况会停止,不会随便留下第一条。
这些处理应在划分之前完成,否则同一道题可能同时进入训练集和测试集。清洗与后续评分共用格式检查规则;关键词内容仍需按第 2.2 节的方法对照原文审核。
5.2 训练集、验证集和测试集
第 28 章介绍过三份数据的用途。放到关键词练习中,可以把它们理解为“练习、模拟考试、期末考试”:
| 集合与文件 | 类比 | 是否更新参数 | 怎样使用 |
|---|---|---|---|
训练集 keywords_train.jsonl | 日常练习册 | 是 | 让模型学习关键词抽取 |
验证集 keywords_validation.jsonl | 备考期间的模拟考试 | 否 | 比较配置、观察表现、选择检查点 |
测试集 keywords_test.jsonl | 最后才拆封的期末考试 | 否 | 方案确定后,比较原始模型与微调模型 |
三份文件都保留参考答案。checkpoint(检查点) 是训练时保存的阶段存档,例如训练一轮、两轮后分别保存一个版本,再用验证集比较哪个更合适。
5.2.1 泛化与过拟合
我们训练模型,不是为了让它只会回答这 1,600 条文章,而是希望以后换一篇同类文章,它也能按要求抽取关键词。这种把学到的规律用到未参与训练的新输入上的能力,叫作泛化能力。
沿用第 1 节的图书馆例子。假设模型练习过第一篇文章,现在用第二篇检查它。下面是教学示例,不是课程数据或模型实测结果:
| 用途 | 文章 | 参考关键词 |
|---|---|---|
| 训练时练习 | 市图书馆周末开设儿童阅读课,读者可通过公众号预约。 | 市图书馆;儿童阅读课;公众号预约 |
| 换一篇同类文章检查 | 区图书馆暑假举办少儿科普讲座,家长可在小程序中报名。 | 区图书馆;少儿科普讲座;小程序报名 |
两篇都要求抽取关键词,但活动、参与方式变了。模型需要根据新文章选词,不能照搬“儿童阅读课”和“公众号预约”。如果它能在多篇这样的新文章上抓住主题、遵守分号格式,才说明学到的做法能用于新输入。
过拟合则是模型过分贴合训练样本,在没有参与训练的同类数据上表现不好。可以类比成反复刷熟一套题,原题答得很好,考查内容相同、条件稍有变化的新题却不会做。
例如,继续训练后,模型对练习过的文章选词更准确了,对留出的新文章却经常漏掉主题、带入训练题中的词。如果这种情况在多条样本上持续出现,就需要警惕过拟合,而不能只看练习题答得越来越好。
不过,一道新题答错不等于过拟合。参考答案有误、文章被截断,或者新文章明显超出了训练数据覆盖的范围,也可能导致回答不好。需要结合多条样本和训练过程判断,不能看到一个错误就认定“训太多了”。
这也解释了验证集为什么要留在训练集之外:训练过程中用它观察模型处理新文章的表现,再决定是否继续训练、选择哪个阶段的存档。具体怎样结合训练与验证曲线判断,见第 30 章“过拟合的判断与处理”。
5.2.2 数据泄漏
不要让测试题混进训练集。 完整关键词文件包含 small 中的样本,因此不能“用完整文件训练,再用 small 测试”。测试题已经被练过,这是一种数据泄漏,分数不能代表模型处理新文章的能力。
验证集也一样:用来检查的文章如果已经参与过训练,就不能再把它的表现当作处理新文章的证据。过拟合说的是模型学得怎样,数据泄漏说的是检查过程出了问题;两者不是同一件事,数据泄漏还可能掩盖模型在新文章上的问题。
同一篇文章换一种问法,也不一定是独立的新材料。课程脚本只比较合并连续空白后的完整输入,不能识别所有近似样本。对于第 4 节那类文档问答,应按来源文档分组,同一文档的关联问答不要随意拆到训练和测试两边。
本例按 80% / 10% / 10% 划分,比例可以根据任务调整。如果反复根据测试结果修改参数,测试集也参与了开发,之后需要另备独立测试数据。
5.3 运行数据处理脚本
现在使用 prepare_keywords_dataset.py 完成关键词数据的检查、清洗与划分。
脚本按顺序完成:
- 检查 JSON、
conversations、user → assistant顺序以及非空内容。 - 统一关键词前缀、分号、首尾空白,去掉空项和重复关键词。
- 按输入去重;同一输入对应不同答案时停止,交给人工核对。
- 对处理后的样本进行固定划分,并检查三份数据的输入互不重复。
在代码编辑器中打开课程项目,在项目根目录新建终端,进入案例目录并确认 Python 为 3.10 或以上版本:
cd "案例与源码-4-微调"
python3 --version如果终端已经位于案例目录,就不必再次执行 cd。接着运行:
python3 prepare_keywords_dataset.py \
--source keywords_data_sharegpt_small.jsonl \
--seed chapter-29-v1 \
--output-dir processed/keywords-clean-repro| 参数 | 作用 |
|---|---|
--source | 指定要处理的关键词文件 |
--seed | 固定分组所用的种子 |
--output-dir | 指定一个尚不存在的结果目录 |
种子可以理解为分组时使用的约定值。数据、处理规则和种子都不变时,每条输入的排序与分组才会保持一致。本例使用 chapter-29-v1 作为固定种子,跟做时保持这个值即可。
本次练习另存到 keywords-clean-repro/,让你核对自己完成的处理过程。课程后续训练示例固定使用附带的 keywords-clean/,两者的用途在下一节对照。脚本遇到已存在的输出目录会停止,避免误覆盖。
脚本使用本机 Python 处理文件,无需联网或显卡。它只适用于单轮关键词数据,不能拿第 4 节的自然语言问答按分号规则清洗。
5.4 查看处理结果
正常完成后,终端会列出三份数据的条数。主要输出如下:
keywords_train.jsonl: 1600 条
keywords_validation.jsonl: 200 条
keywords_test.jsonl: 200 条这是一张处理流程图,展示脚本与三份数据、配套报告的关系。运行时使用第 5.3 节写明种子的完整命令。
在编辑器中展开 processed/keywords-clean-repro/,检查生成的六个文件:
- 三个 JSONL 是实际数据。分别打开一条,仍能看到
user输入和assistant参考答案,格式并没有因为划分而改变。 dataset_info.json是数据集登记表,供第 31 章的 LLaMA-Factory 读取。cleaning_report.json保存自动修改和待检查项目;manifest.json保存来源、划分规则和条数,供核对处理结果时查阅。
如果脚本中途停止,按报错检查:
| 提示或现象 | 处理方法 |
|---|---|
| 找不到输入文件 | 检查终端所在目录和 --source 路径 |
| JSON、角色顺序或空内容错误 | 打开提示的行,修正样本结构与内容 |
| 相同输入的答案冲突 | 对照输入审核答案,不让脚本替代判断 |
| 只生成清洗报告,没有三个 JSONL | 查看报告中的 review_required,修正剩余格式问题后另存新目录重试 |
| 输出目录已存在 | 换一个新目录名,避免覆盖已保存的结果 |
脚本完成只说明通过了这些结构、格式和重复检查,不代表每条答案都经过人工审核。换用自己的数据时,还应抽查文章与关键词是否对应、同源或近似样本是否跨组。
自己的处理结果怎样接到后面? 先按当前练习选择文件,避免把不同版本混在一起:
| 当前在做什么 | 使用哪份产物 | 下一步 |
|---|---|---|
| 学习清洗与划分 | 自己生成的 processed/keywords-clean-repro/ | 核对三份数据的条数、样本、清洗报告和划分记录,确认自己完成了哪些检查 |
| 复现本课程训练 | 附带的 processed/keywords-clean/ | 第 31 章上传这一目录;训练用 train、过程检查用 validation,第 32 章再用 test |
| 改用自有数据 | 审核后另存的新数据版本及配套登记表 | 按第 31 章登记自己的文件,训练与评估始终对应同一版划分;新实验单独保存 |
两个目录名称不同,本身不能证明内容相同。若要用自己的复算数据替代课程数据,应先对照处理规则、三份 JSONL 和登记内容;不要只看总条数。预测结果另外保存,参考答案继续留作比较依据。