外观
AI 学习框架与数据集划分
目录
- 1. 学习目标
- 2. 面试结论
- 3. 面试官为什么问
- 4. 概念与边界
- 5. 原理剖析
- 6. 实现与代码
- 7. 实际项目案例
- 8. 方案权衡与常见误区
- 9. 面试题与参考答案
- 10. 递进追问
- 11. 实践任务
- 12. 相关知识与参考资料
- 13. 简明总结
1. 学习目标
- 理解 AI、机器学习(Machine Learning,ML)、深度学习(Deep Learning,DL)、生成式 AI、LLM、RAG 与 Agent 的关系和边界;
- 能够解释训练集、验证集、测试集各自回答的问题,以及为什么测试集不能参与调参;
- 能够根据独立同分布、类别不平衡、用户分组和时间依赖选择合理的切分策略;
- 能够实现一个可复现的分层三路切分,并检查样本重叠;
- 能够排查目标泄漏、预处理泄漏、时间穿越、同源样本泄漏和反复查看测试集等问题。
2. 面试结论
2.1 30 秒回答
AI 是让机器执行感知、推理、决策或生成任务的总称;机器学习是从数据中学习规律的一类方法,深度学习又是以多层神经网络为核心的机器学习方法。LLM 是深度学习模型,RAG 是给模型接入外部检索证据的系统方案,Agent 则在模型外增加状态、工具和循环控制。训练集用于拟合参数,验证集用于选模型、超参数和阈值,测试集只用于方案冻结后的独立最终评估;只有测试样本能代表目标分布、切分独立且测试集未参与选择时,估计才有可信泛化意义。切分边界必须匹配真实上线边界,否则再高的离线分数也可能只是数据泄漏。
2.2 一分钟复述版
我会先把问题分成模型层和系统层:ML、DL、LLM 描述学习方法或模型,RAG 与 Agent 更多描述应用系统如何组织模型、数据和工具。一个可靠的机器学习实验从业务目标和评价指标开始,在任何会“学习数据”的处理之前确定训练、验证、测试边界。训练集拟合权重和预处理统计量;验证集选择特征、模型、超参数、阈值并做早停;测试集在方案冻结后做一次最终评估。随机切分只适合近似独立同分布的数据;同一用户、同一视频衍生片段或时间序列要分别使用分组切分或时间切分。工程上还要保存数据版本、切分规则、随机种子和样本 ID,才能复现结果并定位线上分布漂移。
3. 面试官为什么问
- 核心考察点:候选人是否有完整 AI 知识地图,是否理解“泛化评估”而非只会调用训练 API;
- 对应岗位与级别:初级岗位看术语和基本流程,中高级岗位看切分边界、泄漏识别、实验治理和线上闭环;
- 优秀回答的区分度:能主动指出随机切分的前提,结合时间、用户、设备或内容来源说明 Group/Time Split,并把预处理放进训练折内部;
- 项目追问信号:如果项目只报一个测试分数,却说不清测试集何时冻结、阈值在哪里选择,通常说明评测证据不足。
4. 概念与边界
小白先这样理解:三只上锁的试卷箱
想象老师把资料分进三只箱子:第一只是练习册,你可以反复做题、订正,它对应训练集,模型靠它学习参数;第二只是模拟卷,只公布成绩供你选择复习方法,它对应验证集,用来选模型、超参数和阈值;第三只是封存的期末卷,要等复习方案完全确定后才拆封,它对应测试集,只负责独立终评。若提前偷看期末题再改复习计划,就是数据泄漏。毕业后真正遇到的工作题,则像不断变化的线上数据。
类比边界: 数据集不是人工编写的固定试卷,而是对目标分布的有限抽样;“分箱”也不能保证天然独立。同一用户、同一视频或带时间顺序的数据还要按组或按时间切分,测试集更不能永久代表发生漂移的线上世界。
4.1 AI 知识地图
| 层次 | 是什么 | 典型输入与输出 | 不应混淆为 |
|---|---|---|---|
| 人工智能(AI) | 感知、推理、决策、生成等机器能力的总称 | 环境或数据 → 行为、判断、内容 | 单一算法或仅指聊天模型 |
| 机器学习(ML) | 从样本中估计规律或决策函数 | 特征与标签/无标签数据 → 模型 | 所有 AI;规则系统也可以属于 AI |
| 深度学习(DL) | 以多层可微神经网络学习表示和任务映射 | 张量 → 神经网络输出 | 任何“层数很多”的普通程序 |
| 生成式 AI | 学习数据分布并生成文本、图像、音频或视频 | 条件/提示 → 新内容 | 只做分类或回归的判别模型 |
| 大语言模型(LLM) | 以大规模语料训练的语言生成模型 | Token 序列 → 下一个 Token 概率/文本 | 完整知识库、Agent 或业务系统 |
| 检索增强生成(RAG) | 检索外部证据后再让模型生成的系统模式 | 查询与知识库 → 证据与回答 | 修改模型权重的微调方法 |
| Agent | 让模型在状态和约束下循环选择工具与行动的系统 | 目标、状态、工具结果 → 多步行动 | 任意一次 Function Calling |
这些概念不是一条严格的包含链。LLM 属于深度学习模型;RAG 和 Agent 通常使用 LLM,但它们主要是系统架构模式,可以替换底层模型或接入非 LLM 组件。
4.2 训练、验证、测试与线上数据
| 数据角色 | 可以做什么 | 不能做什么 | 回答的问题 |
|---|---|---|---|
| 训练集(train) | 拟合模型参数、词表、标准化统计量、特征选择器 | 代替泛化评估 | 模型能否从已知样本学到规律? |
| 验证集(validation) | 选模型、超参数、阈值、早停轮次 | 反复调优后仍宣称是最终无偏结果 | 哪个候选方案更好? |
| 测试集(test) | 方案冻结后做最终评估 | 参与模型或阈值选择 | 冻结方案对未见数据的表现如何? |
| 线上数据(production) | 监控真实业务质量、漂移和反馈 | 被测试集完全代表 | 模型在当前真实流量上是否仍有效? |
验证集不是“第二个训练集”:它不参与梯度更新,但反复根据验证结果修改方案会使方案逐渐适配验证集。测试集也不是永久可靠;测试数据被团队长期查看和针对性优化后,应重新建立严格隔离的评测集。
4.3 输入、输出与前置条件
- 输入:带唯一标识的原始样本、标签、时间、用户/实体分组键、数据来源和目标分布;
- 输出:互斥的数据子集、可复现的切分清单、各子集分布报告和数据版本;
- 前置条件:先定义预测时刻、可用特征、业务代价和评测单元,再决定切分;
- 关键边界:切分单位应与上线推理的独立单位一致。例如多个镜头来自同一视频时,按镜头随机切分会把同源信息分散到不同集合中。
4.4 常见学习范式
- 监督学习:给定输入与目标标签,学习分类、回归或排序映射;
- 无监督学习:没有任务标签,学习聚类、密度或表示结构;
- 自监督学习:从数据本身构造监督信号,例如遮盖 Token 或预测下一个 Token;
- 强化学习:智能体通过状态、行动和奖励学习策略;
- 生成建模:学习数据分布或条件分布,用于采样新内容。
“有无人工标签”不能单独区分全部范式:自监督学习也有训练目标,只是目标由原始数据自动构造。
5. 原理剖析
5.1 为什么必须留出未见数据
训练的直接目标通常是最小化训练经验风险:
其中,
训练误差低只说明模型适配了当前训练样本,不能证明
5.2 正确的数据与实验流程
图 1:从业务问题到线上监控的数据闭环(替代文本:数据先按真实业务边界切成训练、验证和测试集,训练集拟合预处理与模型,验证集选择方案,测试集只评估冻结方案,部署后通过线上监控发现漂移并进入下一版数据,而不是回头调当前测试集。)
图表加载中…
读图结论: 切分不是训练结束后的附加动作,而是防止信息穿越的第一道实验边界;测试集只连接到冻结后的方案。
5.3 常见切分策略及假设
设总样本数为
比例没有适用于所有项目的固定答案。应先保证各集合覆盖业务关键切片,再结合数据量、分布变化速度和评测置信度决定规模。
| 策略 | 核心假设 | 适用场景 | 主要风险 |
|---|---|---|---|
| 随机切分 | 样本近似独立同分布(i.i.d.) | 独立图片、无明显时间/实体关联的表格数据 | 同源样本或未来信息穿越 |
| 分层切分(stratified) | 各类别在集合中应保持近似比例 | 类别不平衡的分类任务 | 只保标签比例,不能解决实体相关性 |
| 分组切分(group-wise) | 同一实体的样本高度相关 | 同一用户、多镜头视频、同一患者、多设备记录 | 组数太少导致评估方差大 |
| 时间切分(time-based) | 线上预测只可使用过去信息 | 推荐、风控、需求预测、持续变化内容 | 季节性或制度变化导致区间不可比 |
| 交叉验证(cross-validation) | 多次重采样可降低单次划分偶然性 | 样本较少、模型选择 | 训练成本高;仍需最终隔离测试集 |
当同时存在类别、实体和时间约束时,优先保护最接近上线的边界。例如先按时间留出未来测试区间,再在过去区间按实体分组做验证;不能为了标签比例破坏时间因果顺序。
教学插图:随机打散、实体分组与时间切分

替代文本: 左栏展示同一用户或近重复内容跨训练、验证和测试,以及测试结果回流调参;中栏将用户 A、B、C 分别完整放入不同集合,用于评估新实体泛化;右栏沿时间轴以过去训练、较晚数据验证、未来数据测试,并禁止未来信息和测试结果回流。
读图结论: 数据切分没有通用固定比例或唯一策略,必须先定义上线时真正独立的单位:新实体泛化优先保护组边界,未来预测优先保护时间因果,必要时再组合约束。
实体分组和时间切分是两种不同评测目标,不应机械要求所有任务同时采用;无论选择哪种边界,预处理都只能在训练数据上拟合,测试集只能评估冻结方案。
5.4 数据泄漏的五种典型形式
- 目标泄漏:特征直接或间接包含预测后才产生的结果,例如用“审核最终处置码”预测审核结论;
- 预处理泄漏:在全量数据上计算均值、词表、缺失值填充值或做特征选择,然后再切分;
- 时间穿越:训练特征引用预测时刻之后的数据,或用未来样本训练后评估过去;
- 同源样本泄漏:同一用户、同一原视频的裁剪片段或近重复内容进入不同集合;
- 测试集适配:根据测试结果反复换特征、模型或阈值,使测试集事实上承担验证集角色。
泄漏排查不能只比较列名。需要为每个特征记录“事件时间、生成时间、可用时间”,检查样本血缘和近重复内容,并审计训练流水线中每个 fit 操作只接触训练折。
5.5 复杂度与可复现性
- 单次洗牌和桶式分层切分通常需要
时间与 索引空间; 折交叉验证大约训练 次,训练成本近似增加为单次的 倍,但具体取决于算法和缓存; - 随机种子只能复现伪随机选择,不能替代数据快照、代码版本、依赖版本和确定性算子;
- 生产级切分清单应保存
sample_id、group_id、时间范围、规则版本和数据校验摘要,而不只是一个比例参数。
6. 实现与代码
6.1 最小可运行示例:分层三路切分
运行环境:Python 3.10+,仅使用标准库。示例演示标签分层和样本互斥,不适用于含用户分组或时间依赖的数据。
python
from collections import Counter, defaultdict
import random
def stratified_three_way_split(rows, train_ratio=0.6, valid_ratio=0.2, seed=42):
if not (0 < train_ratio < 1 and 0 < valid_ratio < 1):
raise ValueError("train_ratio 和 valid_ratio 必须位于 (0, 1)")
if train_ratio + valid_ratio >= 1:
raise ValueError("必须为测试集保留正比例")
by_label = defaultdict(list)
for row in rows:
by_label[row["label"]].append(row)
rng = random.Random(seed)
train, valid, test = [], [], []
for label, group in sorted(by_label.items(), key=lambda item: str(item[0])):
group = group.copy()
rng.shuffle(group)
n_train = int(len(group) * train_ratio)
n_valid = int(len(group) * valid_ratio)
train.extend(group[:n_train])
valid.extend(group[n_train:n_train + n_valid])
test.extend(group[n_train + n_valid:])
# 再次打乱只改变集合内部顺序,不改变集合归属。
for split in (train, valid, test):
rng.shuffle(split)
return train, valid, test
rows = [
{"sample_id": f"video-{i:03d}", "label": 0 if i < 30 else 1}
for i in range(45)
]
train, valid, test = stratified_three_way_split(rows)
id_sets = [{row["sample_id"] for row in split} for split in (train, valid, test)]
assert id_sets[0].isdisjoint(id_sets[1])
assert id_sets[0].isdisjoint(id_sets[2])
assert id_sets[1].isdisjoint(id_sets[2])
assert set.union(*id_sets) == {row["sample_id"] for row in rows}
for name, split in (("train", train), ("valid", valid), ("test", test)):
print(name, "size=", len(split), "labels=", dict(Counter(r["label"] for r in split)))6.2 关键实现说明
- 使用局部
random.Random(seed),避免修改进程全局随机状态; - 先按标签建桶、桶内洗牌再切分,尽量保留各类别比例;
- 使用
sample_id断言检查集合两两互斥和全集覆盖; - 建桶、洗牌和分配合计为
,按 个标签桶排序还需 ,所以总时间为 ;只有类别数较少并视为常量时才可近似写成 ,额外空间为 ; - 代码没有处理小类别最少样本数。若某类别只有一两个样本,应先重新定义评测策略,而不是让整数取整悄悄产生空验证集。
6.3 生产环境差异与验证
- 同一
group_id的样本必须整体进入一个集合,可先按组聚合再分配; - 时间切分不能先洗牌,应显式记录训练截止时间、验证区间和测试区间;
- 数据预处理器必须只在训练集
fit,然后对验证集、测试集执行transform; - 切分前后应检查类别、来源、设备、语言、地域和时间分布,并记录差异而非强行让所有分布相同;
- 若数据会回补或标签会修正,必须对数据快照做版本化,防止同一实验名对应不同内容。
6.4 技术清单与证据边界
数据切分原则本身不绑定某个框架。下表中的标准库、scikit-learn 和清单式实现是参考验证栈;除文中可运行的 Python 标准库示例外,不代表本仓库已经安装或在生产使用对应依赖。
| 技术点 ID | 技术点/环节 | 类型 | 采用方案 | 链路职责 | 版本/证据边界 |
|---|---|---|---|---|---|
| TP-01 | 标签分层的三路切分 | 数据处理算法 | 教学示例采用 Python 标准库 random 与 collections | 按标签建桶并生成互斥的训练、验证、测试集合 | 文中代码要求 Python 3.10+;算法不绑定框架,生产依赖版本需由项目锁文件确认 |
| TP-02 | 分组或时间边界切分 | 评测边界组件 | 参考采用显式 group_id/时间清单与断言;可由 scikit-learn splitter 实现 | 防止同一实体跨集合,并让测试窗口模拟真实上线时间 | 当前仓库没有第三方依赖和实测证据;具体 splitter 能力需按所用版本官方文档复核 |
| TP-03 | 切分结果与泄漏门禁 | 数据质量组件 | 采用不可变样本清单、集合交集检查和特征可用时间校验 | 固化样本归属,阻断同源、预处理和时间穿越泄漏 | 文中给出集合断言和工程约束;数据版本平台属于参考方案,不代表已经落地 |
6.5 横向对比与选型
| 技术点 ID | 候选方案 | 优点 | 缺点/代价 | 适用场景 | 不适用场景 | 选择结论与依据 |
|---|---|---|---|---|---|---|
| TP-01 | Python 标准库手写分层切分 | 依赖少、过程透明、便于解释互斥断言 | 小类别、分组和多标签边界需要自行补齐 | 教学、算法验证、小型受控数据 | 规则复杂、需要成熟参数校验和交叉验证的生产流水线 | 本文采用它展示最小机制,因为每一步可直接审计;生产应补完边界测试 |
| TP-01 | scikit-learn train_test_split / StratifiedShuffleSplit | API 成熟,随机状态、分层和参数校验更完整 | 仍不能自动解决实体泄漏、时间穿越和数据版本问题 | 常规独立同分布分类数据与快速基线 | 同一用户/内容族相关或存在严格时间因果的数据 | 当数据满足独立性假设且项目已锁定依赖时优先使用,不能用 API 名替代泄漏证明 |
| TP-02 | 显式分组/时间清单的自定义分配 | 可表达业务实体、禁配关系、时间窗口和审计字段 | 实现与测试成本高,平衡标签分布更困难 | 复杂内容族、用户、会话或滚动时间窗口 | 只需简单随机抽样且没有业务分组的探索实验 | 生产默认优先,因为业务边界通常比通用比例参数更重要 |
| TP-02 | scikit-learn GroupShuffleSplit / TimeSeriesSplit | 通用接口便于复现和接入交叉验证 | 单一 group 或时间索引未必覆盖禁配、多实体和延迟标签语义 | 单一分组键或规则稳定的时序验证 | 多重实体约束、标签回补或非等间隔业务窗口需要定制时 | 约束可由内置 splitter 准确表达时采用,否则输出清单后追加业务校验 |
| TP-03 | 样本清单 + 集合/SQL 断言 | 简单可定位,能直接保存 sample_id、group 和时间证据 | 规则分散时维护成本上升,跨团队复用较弱 | 中小规模流水线、规则明确、需要快速阻断 | 大量数据源和质量规则需集中治理的组织 | 本文采用其作为最低门禁,因为证据可追溯且不依赖特定平台 |
| TP-03 | 数据版本/质量平台统一门禁 | 能集中管理快照、血缘、规则运行和审计结果 | 引入平台成本,错误规则仍可能稳定地产生错误结论 | 多团队、多数据源、频繁回补和严格合规场景 | 小型一次性实验或没有平台运维能力时 | 规模与协作复杂度达到阈值后再引入;仍需保留核心集合与时间断言 |
6.6 参考实现架构
图:架构|数据快照、切分策略与泄漏门禁的职责边界
替代文本: 原始数据先冻结为带版本快照,切分策略读取标签、实体和事件时间生成样本清单;泄漏门禁验证互斥、时间和预处理边界,通过后才把三个集合交给训练、选型和终评,所有结果进入实验记录。
图表加载中…
读图结论: 切分不是训练脚本里的随机一步,而是位于数据快照与模型评测之间的独立质量边界;任何集合交叉或时间穿越都应在训练前阻断。
架构图强调静态职责:切分器决定归属,门禁验证归属是否合法,训练、选型和终评分别只能消费自己的集合,实验记录负责把数据和结果绑定到同一版本。
6.7 技术调用流程
图:技术调用流程|从冻结快照到测试集终评的正常与异常分支
替代文本: 实验编排器请求快照和切分清单,泄漏门禁先检查集合交集、实体完整性和事件时间;异常时返回证据并终止,正常时只在训练集拟合、验证集选型,冻结方案后才允许测试集终评。
图表加载中…
读图结论: 正常链路必须遵守“先门禁、再训练、后验证选型、最后一次测试终评”;异常分支不能降级为带病继续训练。
调用流程图补足动态顺序:测试集在方案冻结前不可见,预处理器只从训练集拟合,门禁失败必须携带可定位的样本和规则证据返回。
7. 实际项目案例
示例项目:AI 视频发布前的内容风险分类基线。 下述内容用于说明工程方法,不代表仓库中已存在的实现,也不包含实测规模、性能或业务收益。
7.1 背景、目标与约束
- 目标:根据上传时可获得的视频元数据、抽帧特征和语音转写,输出风险概率,供人工审核排序;
- 预测时刻:视频上传完成、人工审核开始之前;
- 标签:以经过复核的审核结果为准,同时保留标签版本和复核时间;
- 约束:同一原视频可能产生多个转码版本与镜头片段,同一创作者内容高度相关,且策略会随时间变化;
- 非目标:模型不能代替最终合规决策,也不能使用审核结束后产生的处置字段。
7.2 架构与数据流
- 原始视频服务产生
video_id、creator_id、上传时间和内容版本; - 特征流水线只读取预测时刻之前可用的信息;
- 先按时间保留较新的测试窗口,再在历史区间按
creator_id或原视频族分组产生训练/验证集; - 训练集拟合特征统计量和模型,验证集选择阈值,测试集评估冻结方案;
- 模型发布时绑定代码、特征、标签、切分清单和模型版本;
- 线上记录分布漂移、缺失特征、分切片质量和人工覆核反馈。
7.3 方案选择与未采用方案
- 不直接按镜头随机切分:同一视频的相邻镜头高度相似,容易形成同源泄漏;
- 不按单一标签比例强制拆散创作者组:优先保持真实上线边界,再报告各切片不确定性;
- 不把所有历史数据随机打散:审核策略和内容趋势随时间变化,未来窗口更接近上线验证;
- 样本较少时,可在历史训练区间做分组交叉验证,但仍保留最终未来测试窗口。
7.4 异常处理、监控与测试
| 现象 | 根因 | 解决 | 验证 |
|---|---|---|---|
| 同一原视频的镜头同时出现在训练与测试集合 | 以镜头而非原内容族为独立切分单元 | 建立 content_family_id,按族分组切分 | 对源文件 ID、感知哈希和镜头血缘做跨集合查询,交集应为空 |
| 同一实验在不同日期得到不同标签统计 | 标签回补直接覆盖历史值,缺少快照语义 | 保存标签快照、版本、生效时间和查询截止时间 | 使用固定截止时间重放,样本 ID、标签和分布摘要应一致 |
| 离线指标异常升高,删除某字段后明显回落 | 特征使用了人工审核结束后才生成的处置信息 | 删除泄漏特征,建立事件时间/可用时间契约和自动门禁 | 模拟预测时刻重放特征,任何字段的可用时间不得晚于预测时刻 |
| 线上错误集中在新创作者或新内容类型 | 创作者与内容分布变化,训练数据不再代表当前流量 | 触发再评估;必要时重建时间窗口、补充复核数据并再训练 | 按时间、创作者和内容类型比较输入与错误切片,灰度通过后再扩量 |
| 团队每次看测试结果后继续调参,测试分数持续上升 | 测试集被反复适配,已事实上承担验证集角色 | 冻结测试权限,建立新的隔离评测集并审计访问 | 方案在新隔离集上只执行一次终评,并保存冻结配置和访问记录 |
7.4.1 故障演练:测试集被反复调参污染
- 现象与影响:排行榜分数持续提高,但新时间窗口和真实流量没有同步改善,团队无法再用原测试集估计泛化能力。
- 定位证据:对齐实验记录、测试集访问日志、阈值与超参数修改时间,检查每次查看测试结果后是否继续修改方案。
- 根因:测试集没有访问门禁,评测结果参与了模型、特征、阈值或 Prompt 选择,导致测试集事实上变成验证集。
- 临时止损:停止引用被污染分数,冻结该测试集及相关榜单,不再用它决定发布。
- 长期修复:按真实上线边界建立新的隔离测试集;调参只使用训练/验证区,终评通过独立任务一次性执行并保存版本清单。
- 回归验证:候选方案冻结后在新测试集只运行一次,同时报告按时间、实体和关键业务类型切片的指标及置信区间。
- 防复发:测试集权限、访问次数和发布门禁进入审计;每次评测绑定数据、代码、特征、阈值和环境指纹。
测试至少包含:切分互斥测试、同源组完整性测试、时间顺序测试、预处理拟合边界测试、特征可用时间测试和历史版本可复现测试。
7.5 结果与复盘
本示例不预设任何指标结果。真实项目应记录:数据版本、集合时间范围、组数量、标签分布、主要业务指标及置信区间、分切片表现、失败样本和阈值选择依据。面试时应说清“如何保证评测可信”,再讨论模型效果。
8. 方案权衡与常见误区
8.1 适用与不适用场景
- 分层随机切分适合样本近似独立、类别比例重要的静态分类任务;
- 分组切分适合用户、患者、设备、文档或视频族内相关的数据;
- 时间切分适合存在因果时间顺序或分布演进的任务;
- 数据极少时可用交叉验证降低单次切分偶然性,但不能用它证明生产分布不漂移;
- 无监督学习也要留出评测数据或下游任务,不能因为没有标签就忽略泛化验证。
8.2 关键权衡
| 选择 | 收益 | 代价或限制 |
|---|---|---|
| 固定验证集 | 快速、便于迭代比较 | 小数据下受一次划分影响大 |
| 交叉验证 | 更充分利用训练数据、估计更稳健 | 训练成本高,时间/组约束更复杂 |
| 严格未来测试窗口 | 更接近真实部署 | 可能混入策略变化,需解释分布差异 |
| 大测试集 | 指标不确定性通常更小 | 压缩可用于训练的数据 |
| 多切片评测 | 暴露少数群体和长尾问题 | 需要足够样本并处理多重比较 |
8.3 常见错误回答
- “训练集训练,测试集调参,验证集最后看”——验证和测试职责颠倒;
- “按 8:1:1 随机切分一定正确”——比例和策略都取决于业务边界;
- “固定随机种子就可复现”——还缺数据、代码、依赖和算子版本;
- “特征工程不是模型,所以可以在全量数据上做”——任何从数据估计的处理都可能泄漏;
- “测试分数高就能上线”——还要验证业务代价、切片、公平性、稳定性和线上分布。
8.4 生产故障与解决顺序
当离线很好、线上明显下降时,先按以下顺序排查:
- 口径:线上标签、阈值、过滤规则是否与离线一致;
- 数据:特征缺失、单位、时间窗口、数据版本是否一致;
- 泄漏:离线是否使用未来字段、同源样本或全量预处理;
- 漂移:输入、标签先验和条件关系是否变化;
- 服务:模型版本、特征顺序、序列化和降级路径是否正确;
- 模型:最后才判断模型容量或优化是否不足。
9. 面试题与参考答案
问题 1:AI、ML、DL、LLM、RAG 和 Agent 是什么关系?
- 难度:基础;
- 考察点:概念层级与模型/系统边界;
- 合格答案要点:AI 是总称,ML 是一类实现方法,DL 是 ML 子类,LLM 是 DL 模型;RAG 与 Agent 是围绕模型构建的系统方案;
- 优秀答案加分项:指出 RAG 不改权重、Agent 需要状态/工具/循环与安全边界,Function Calling 不自动等于 Agent;
- 常见错误:把 RAG、Agent 当成新的模型架构,或把所有 AI 等同于 LLM;
- 可继续追问:不用 LLM 能否构建 Agent?什么情况下固定工作流更合适?
问题 2:为什么验证集可以调参,测试集不可以?
- 难度:基础;
- 考察点:泛化估计与选择偏差;
- 合格答案要点:根据验证集比较候选方案;方案冻结后才用测试集估计未见数据表现;
- 优秀答案加分项:说明反复看测试集会使方案间接拟合测试集,并提出重新隔离评测集与访问审计;
- 常见错误:认为“测试集不反向传播”就不会泄漏;
- 可继续追问:验证集被反复使用是否也会过拟合?如何缓解?
问题 3:何时不能使用普通随机切分?
- 难度:中级;
- 考察点:业务独立单元、时间因果与同源数据;
- 合格答案要点:时间序列、同一用户多记录、同一内容衍生样本、地理或设备分组时不能简单随机切分;
- 优秀答案加分项:能根据上线边界设计“未来窗口 + 历史分组验证”,并说明分层不能修复组泄漏;
- 常见错误:只要打乱顺序就默认 i.i.d.;
- 可继续追问:同一用户既有训练期又有测试期数据时如何定义冷启动与老用户两种评测?
问题 4:如何系统排查数据泄漏?
- 难度:中高级;
- 考察点:数据血缘、事件时间和工程验证;
- 合格答案要点:检查目标相关字段、预处理拟合范围、时间穿越、样本 ID/同源组重叠和测试集访问;
- 优秀答案加分项:为特征建立事件时间/可用时间契约,用 Pipeline 保证折内拟合,增加近重复检测和自动化泄漏测试;
- 常见错误:只删除与标签同名的列;
- 可继续追问:离线指标异常升高但代码没有改动时,优先检查哪些数据变化?
10. 递进追问
10.1 追问清单
- 基础概念:为什么训练误差不能直接代表泛化误差?
- 原理细节:反复根据验证集选择方案,验证集为什么也会产生选择偏差?
- 实现边界:正样本占比很低时,怎样同时满足分层、分组和时间约束?
- 工程权衡:数据量有限时,扩大测试集与扩大训练集如何取舍?
- 系统设计:怎样设计数据、特征、切分和模型版本的可追溯链路?
- 项目复盘:离线测试正常而上线一周后下降,如何设计排查树和防回归措施?
10.2 回答检查点
- 从有限样本经验风险与真实分布期望风险的差异解释;
- 指出“选择本身也是拟合”,可用嵌套验证、独立测试和减少人工窥视缓解;
- 优先保护时间和实体边界,报告类别不确定性,必要时调整窗口而非拆组;
- 结合学习曲线、指标置信区间和业务关键切片决定,不背固定比例;
- 保存数据快照、特征定义、切分清单、代码/依赖、随机种子、模型和阈值版本;
- 先查口径和数据链路,再查泄漏/漂移/服务版本,最终将事故样本加入固定回归集。
11. 实践任务
- [ ] 知识图谱:不看本文,画出 AI、ML、DL、生成式 AI、LLM、RAG、Agent 的关系并解释每条边;
- [ ] 最小实现:运行第 6 节代码,修改类别比例和随机种子,比较各集合分布;
- [ ] 对比实验:构造同一用户多条样本,分别做随机切分和按用户分组切分,检查用户交集;
- [ ] 故障注入:先用全量数据计算标准化均值,再改为只用训练集,说明前者为何泄漏;
- [ ] 数据审计:为一个示例任务列出每个特征的事件时间、生成时间和预测时可用时间;
- [ ] 面试口述:分别录制 30 秒和 1 分钟回答,确认包含概念关系、三类集合职责和非随机切分边界。
验收标准:代码可重复运行,集合无样本重叠;能够在不背固定比例的前提下,为一个包含时间与实体关联的任务解释切分方案。
12. 相关知识与参考资料
12.1 相关知识
12.2 参考资料
以下仅使用官方规范、官方文档、原始论文或作者公开教材,访问日期均为 2026-07-10:
- NIST, Artificial Intelligence Risk Management Framework (AI RMF 1.0),官方规范;
- scikit-learn, Cross-validation: evaluating estimator performance,官方文档;
- scikit-learn, Common pitfalls and recommended practices,官方文档;
- Goodfellow, Bengio, Courville, Deep Learning,作者公开教材;
- Vaswani et al., Attention Is All You Need,原始论文;
- Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,原始论文;
- Yao et al., ReAct: Synergizing Reasoning and Acting in Language Models,原始论文。
本次技术栈横评另核对 scikit-learn GroupShuffleSplit 与 TimeSeriesSplit 官方文档,访问日期为 2026-07-11。
13. 简明总结
一句话记忆: 模型层回答“如何学习”,RAG/Agent 回答“如何组织系统”,可信评测则从符合上线边界的数据切分开始。
- AI 是总称,ML、DL、LLM 是逐步具体的方法或模型,RAG 与 Agent 主要是系统模式;
- 训练集拟合、验证集选择、测试集终评,任何测试信息参与选择都会削弱无偏性;
- 随机切分依赖 i.i.d. 假设,实体相关或时间依赖数据应使用分组或时间切分;
- 生产最常见陷阱是目标、预处理、时间、同源样本和测试适配泄漏;
- 面试时先讲集合职责,再用真实业务独立单元说明切分策略和可追溯证据。