泛化、数据划分与泄漏
本节目标
学完本节,你应能解释泛化、过拟合、训练集、验证集、测试集与数据泄漏,用一个简单场景设计独立测试,并识别时间、用户、文档和提示层面的泄漏。
为什么“做过的题会”还不够
模型在见过的数据上表现好,可能只是记住样例或利用了不该出现的线索。工程真正关心的是 泛化(generalization):系统面对来自目标使用情境、但没有参与开发的新输入时,仍能达到可接受表现。
**过拟合(overfitting)**是系统过度适应开发数据,以至于对新输入表现下降。它不只发生在训练参数时:反复针对固定评测题修改提示、规则或 RAG,也会对那组题过拟合。
训练集、验证集和测试集
| 数据集合 | 主要用途 | 可以据此修改方案吗 |
|---|---|---|
| 训练集 | 学习模型参数或构建检索/规则资产 | 可以 |
| 验证集/开发集 | 选择特征、提示、阈值、超参数和候选方案 | 可以,但要记录次数与版本 |
| 测试集 | 方案基本冻结后,独立估计最终表现 | 不应反复据此调参 |
如果看完测试错误后立即修改方案,再用同一测试集宣布提升,它已经逐渐变成开发集。此时应保留新的独立测试,或明确报告测试集已被用于开发。
随机切分并不总是正确
切分单位必须与真实独立性一致:
- 同一用户的多封邮件可能语言高度相似,应按用户分组;
- 同一文档的相邻 chunk 不能一部分进训练、一部分进测试;
- 预测未来事件时应按时间切分,不能让未来记录泄漏到过去;
- 同一模板生成的合成样例要按模板或生成种子分组;
- 多轮对话应按完整会话切分,不能把前后轮拆开。
随机按“行”切分很方便,却可能让近乎重复的内容跨集合出现,得到过于乐观的结果。
什么是数据泄漏
**数据泄漏(data leakage)**是开发或评测过程使用了在真实预测时不可用、或本应保持独立的信息,使结果虚高。常见类型包括:
| 类型 | 示例 | 检查方法 |
|---|---|---|
| 目标泄漏 | 特征直接含最终标签或事后字段 | 逐字段问“预测时能否获得” |
| 时间泄漏 | 用处理完成后的状态预测是否会完成 | 按事件时间画数据流 |
| 重复泄漏 | 同文档、同用户或改写副本跨集合 | 哈希、近重复与分组检查 |
| 预处理泄漏 | 用全量数据计算归一化或词表 | 只在训练部分拟合预处理 |
| 评测污染 | 测试题进入训练数据、few-shot 示例或检索库 | 记录数据谱系并做重合检查 |
| 人工泄漏 | 标注者看到不应提供的答案或未来信息 | 审查标注界面与指南 |
LLM 应用特别容易忽视“系统级泄漏”:测试答案可能不在模型训练集,却被放进提示示例、知识库、缓存或调试轨迹。被评对象包括模型、提示、检索、工具和后处理,必须整体隔离。
分布变化与切片
测试集代表的是某个时间、渠道与人群。上线后输入分布可能变化,例如出现新产品、新语言、新攻击方式或新政策。即使总体平均分不变,某个关键群体也可能显著退化。
因此除总体结果外,还要按与风险相关的维度切片:
- 常见与长尾任务;
- 不同语言、地区、设备或输入格式;
- 有答案、无答案、冲突和恶意输入;
- 高影响动作与只读动作;
- 新用户与历史用户;
- 依赖正常、超时和降级状态。
切片不是越多越好。每个切片应对应一个真实失败假设,并保证样本量和隐私处理合理。
一个最小切分示例
任务:从会议记录提取行动项。现有 1,000 份会议记录,每个项目会重复使用自己的模板。
不可靠做法:随机按段落切分。这样同一会议或同一模板的近重复内容可能同时进入训练与测试。
更合理的设计:
- 先按项目和完整会议分组;
- 用较早会议做训练/开发,较新会议做时间测试;
- 单独保留从未出现过的项目模板作为迁移切片;
- 对文本做精确与近重复检查;
- 将测试会议从提示示例、RAG 文档和人工调试记录中隔离;
- 对无行动项、冲突日期、缺负责人和注入文本分别报告结果。
这里没有给固定比例。小数据、高风险或时间序列任务需要根据可用样本与后果设计,而不是机械使用 80/10/10。
常见误区
| 误区 | 为什么不成立 | 改进 |
|---|---|---|
| “测试集从没训练模型,所以绝对独立” | 人可能反复看题调提示或规则 | 隔离测试访问并记录评测次数 |
| “随机切分最公平” | 相关样本会跨集合 | 按用户、时间、文档或实体分组 |
| “平均分高就能泛化” | 长尾和高风险切片可能失败 | 报告切片与最坏合理情形 |
| “线上反馈都是真实标签” | 点赞、接受和修改都有选择偏差 | 经过审核后再形成标签 |
| “新版本只需跑几个冒烟题” | 可能改变格式、延迟和边界行为 | 运行冻结回归集与关键风险切片 |
练习
为“客服邮件升级分类”设计三种切分:随机行切分、按用户切分、按时间切分。说明每种会估计什么、可能泄漏什么,并选择最符合上线情境的一种。再列出 5 个关键切片和一个不应进入日志的敏感字段。
自测
- 过拟合为什么也会发生在提示和规则上?
- 同一文档相邻 chunk 跨训练/测试为什么危险?
- 目标泄漏和时间泄漏有什么区别?
- 测试集看过很多次后应怎样报告?
- 分布变化为什么需要线上监控,而不能只靠离线测试?
相关概念与下一步
参考资料
获取日期:2026-07-22。