知识体系篇-数据标注与处理(01)模型测试与评估:模型测试方法论
模型测试方法论专栏人工智能训练师三级备考全攻略模块卷三·知识体系 — 第四部分·模型测试与评估难度⭐⭐⭐☆☆考试权重中高频选择简答一、模型测试 vs 传统软件测试传统软件测试 模型测试 ┌──────────────────┐ ┌──────────────────────┐ │ 确定性输出 │ │ 概率性输出不确定 │ │ 输入→固定输出 │ │ 输入→概率分布→输出 │ │ 规则明确 │ │ 行为难以穷举 │ │ Bug偏离规范 │ │ Bug偏离预期分布 │ │ 回归测试可预期 │ │ 数据变化→性能漂移 │ └──────────────────┘ └──────────────────────┘ 核心区别模型测试关注的不是对/错 而是在多大概率下表现符合预期。1.1 对比表维度传统软件测试模型测试输出确定性确定性同一输入同一输出概率性同一输入可能不同输出正确性标准与预期输出完全一致在可接受范围内准确率≥95%等测试重点功能正确性、性能、安全准确率、鲁棒性、公平性、安全性回归触发代码变更数据变更、模型更新、环境变化测试数据手工设计用例大量真实数据边界样本二、模型测试的五大维度模型测试金字塔从基础到高级 ┌─────────────┐ │ 安全性测试 │ ← 模型是否产生有害内容 ├─────────────┤ │ 公平性测试 │ ← 模型是否对特定群体有偏见 ├─────────────┤ │ 鲁棒性测试 │ ← 模型对异常输入的抵抗能力 ├─────────────┤ │ 性能测试 │ ← 响应速度、吞吐量、资源消耗 ├─────────────┤ │ 功能正确性 │ ← 模型输出是否准确基础 └─────────────┘测试维度目标常用方法功能正确性输出结果准确单元测试、基准数据集对比性能测试满足延迟/吞吐要求压力测试、负载测试鲁棒性测试异常输入不崩溃/不误判对抗样本、噪声注入公平性测试无歧视偏见子群体分析、公平指标安全性测试无有害输出Prompt注入、越狱测试三、测试分层策略3.1 模型测试分层┌─────────────────────────────────────┐ │ E2E 测试端到端 │ 完整业务场景 │ 用户输入 → 模型推理 → 后处理 → 输出 │ ├─────────────────────────────────────┤ │ 集成测试 │ 模型前后处理Pipeline │ 预处理 → 模型 → 后处理 → 格式校验 │ ├─────────────────────────────────────┤ │ 模型单元测试 │ 模型本身的输入输出 │ 单条样本 → 模型 → 结果校验 │ ├─────────────────────────────────────┤ │ 数据验证 │ 数据质量、格式、分布 │ 数据schema校验、特征分布检查 │ └─────────────────────────────────────┘3.2 各层测试详解importnumpyasnpimportpytest# # 第1层数据验证测试# deftest_data_schema():验证输入数据格式正确features,labelsload_test_data()assertfeatures.shape[0]labels.shape[0],特征与标签数量不匹配assertfeatures.shape[1]768,f特征维度应为768实际{features.shape[1]}assertnotnp.any(np.isnan(features)),特征中存在NaNassertnotnp.any(np.isinf(features)),特征中存在Infdeftest_data_distribution():验证测试集分布与训练集一致train_dataload_train_data()test_dataload_test_data()# 类别分布差异不超过5%train_rationp.bincount(train_data.labels)/len(train_data.labels)test_rationp.bincount(test_data.labels)/len(test_data.labels)max_diffnp.max(np.abs(train_ratio-test_ratio))assertmax_diff0.05,f训练/测试集分布差异{max_diff:.3f}超过阈值# # 第2层模型单元测试# deftest_model_output_shape():验证模型输出维度正确modelload_model()dummy_inputnp.random.randn(1,768).astype(np.float32)outputmodel.predict(dummy_input)assertoutput.shape(1,10),f输出维度应为(1,10)实际{output.shape}deftest_model_output_range():验证分类模型输出概率在[0,1]之间modelload_model()test_inputsload_test_data().features[:100]outputsmodel.predict(test_inputs)assertnp.all(outputs0),输出中存在负值assertnp.all(outputs1),输出中存在大于1的值# 概率之和1row_sumsoutputs.sum(axis1)assertnp.allclose(row_sums,1.0,atol1e-5),输出概率之和不等于1deftest_model_accuracy_on_golden_set():在Golden Set标注的标准测试集上验证准确率modelload_model()golden_dataload_golden_set()predictionsmodel.predict(golden_data.features)accuracy(predictions.argmax(axis1)golden_data.labels).mean()assertaccuracy0.92,fGolden Set准确率{accuracy:.4f}低于阈值0.92# # 第3层集成测试Pipeline测试# deftest_full_pipeline():端到端Pipeline测试frompipelineimportTextClassificationPipeline pipelineTextClassificationPipeline()test_cases[(这个产品很好用,正面),(质量太差了退款,负面),(今天天气不错,中性),]fortext,expected_labelintest_cases:resultpipeline.predict(text)assertresult[label]expected_label,\f输入{text}期望{expected_label}得到{result[label]}# # 第4层鲁棒性测试# deftest_typo_robustness():验证模型对错别字的鲁棒性modelload_model()clean_text这部电影非常精彩typo_texts[这部电影非常精采,# 同音错字这部电影非常精彩,# 多余标点这 部 电 影 非 常 精 彩,# 多余空格这部电影非常精彩。。。。,# 重复标点]clean_resultmodel.predict(clean_text)fortypo_textintypo_texts:typo_resultmodel.predict(typo_text)asserttypo_resultclean_result,\f错别字输入{typo_text}导致结果不一致四、测试用例设计方法4.1 边界案例Edge Case设计测试用例设计四象限 高频场景 ┌──────────────────────┐ │ ① 正常高频用例 │ │ 日常输入覆盖主要分布 │ │ 例好评、退款申请 │ 高影响 ├──────────┬───────────┤ 低影响 │ ② 关键边界用例 │ │ 影响业务的核心场景 │ │ 例金融风控判否 │ ├──────────┴───────────┤ │ ③ 异常/对抗用例 │ │ 极端输入、攻击文本 │ │ 例超长文本、空输入 │ │ 例Prompt注入 │ └──────────────────────┘ 低频场景4.2 测试集构建原则原则说明示例代表性覆盖真实数据的各种分布训练集的主要类别长尾类别多样性避免同质化样本每类至少20个不同表述难度分层简单/中等/困难样本各占比例简单60%、中等30%、困难10%独立性测试集与训练集无重叠去重相似度检查可维护标注清晰版本管理每条用例标注预期输出难度五、测试指标体系5.1 模型测试KPI矩阵┌──────────────────────────────────────────────────┐ │ 测试指标体系 │ ├──────────┬───────────────────────────────────────┤ │ 功能维度 │ 准确率 ≥ 95% │ │ │ 召回率 ≥ 90% │ │ │ F1 ≥ 0.92 │ ├──────────┼───────────────────────────────────────┤ │ 性能维度 │ 单次推理延迟 200ms │ │ │ QPS ≥ 100 │ │ │ 显存占用 4GB │ ├──────────┼───────────────────────────────────────┤ │ 稳定维度 │ 连续运行72h无崩溃 │ │ │ 数据漂移检测精度下降 3% │ │ │ 回归测试通过率 100% │ ├──────────┼───────────────────────────────────────┤ │ 安全维度 │ Prompt注入拦截率 ≥ 99% │ │ │ 有害内容过滤率 ≥ 99.5% │ │ │ 敏感信息泄露 0 │ └──────────┴───────────────────────────────────────┘5.2 回归测试流程回归测试触发条件 ┌────────────────────────────────────────────────┐ │ ✓ 模型版本更新 │ │ ✓ 训练数据更新 │ │ ✓ 推理引擎升级如PyTorch版本变更 │ │ ✓ 部署环境变更OS、GPU驱动 │ │ ✓ 上游服务接口变更 │ └────────────────────────────────────────────────┘ 回归测试流程 1. 运行全量测试套件 2. 对比当前结果与基线Baseline 3. 生成差异报告精度下降/新增失败用例 4. 根据阈值决定是否通过 5. 未通过 → 定位原因 → 修复 → 重新测试六、考试重点总结6.1 核心概念辨析概念关键点模型测试 vs 软件测试模型输出是概率性的关注分布正确而非完全一致Golden Set经过人工验证的标准测试集作为模型质量的真理标准回归测试每次模型/数据变更后重新运行确保没有退化Edge Case边界案例覆盖极端/异常/对抗性输入6.2 高频选择题Q: 模型测试与传统软件测试最大的区别是 A: 模型输出具有概率性同一输入可能产生不同输出 ✅ Q: 以下哪项不属于模型测试的五大维度 A: 代码覆盖率属于传统软件测试指标✅ Q: Golden Set的作用是 A: 作为标准测试集验证模型输出质量的基准 ✅ Q: 模型回归测试应在什么时候触发 A: 模型更新、数据更新、环境变更时都应触发 ✅七、思维导图模型测试方法论测试vs传统软件概率性输出关注分布正确性数据变化影响五大测试维度功能正确性性能测试鲁棒性测试公平性测试安全性测试测试分层策略数据验证模型单元测试集成Pipeline测试端到端测试测试用例设计正常高频用例关键边界用例异常对抗用例难度分层指标体系功能KPI性能KPI稳定性KPI安全性KPI回归测试触发条件基线对比退化检测备考贴士模型测试方法论的重点是理解概率性输出这一核心区别。记住五大测试维度功能/性能/鲁棒/公平/安全和四层测试分层数据/单元/集成/E2E选择题基本覆盖这些点。回归测试的触发条件也是常考点。