简介:ISTQB认证测试工程师人工智能测试中文大纲(CT-AI-1.0-CN-1.0)面向希望系统掌握AI系统质量保障与测试方法的测试工程师、质量人员及备考认证者,围绕人工智能、深度学习测试与模型测试建立从概念到实践的知识框架。资源为1个PDF文件,约4.03MB,共90页,按认证大纲体例编排,包含学习目标、认知水平与考试要求等说明。正文十一章依次覆盖人工智能介绍、AI系统质量特征、机器学习总览、数据准备与预处理、功能表现度量、神经网络与测试,以及AI系统测试总览、专属质量特征测试、方法与技术、测试环境和用AI辅助测试。已有1190人学习,适合据此梳理准确性、可靠性、可解释性、公平性与鲁棒性等测试要点,也可对照数据质量、模型评估指标和测试环境搭建查漏补缺,形成可落地的AI测试思路。
1. 概率正确性:为什么同一个输入两次跑出不同结果
如果你拿一份传统软件的测试报告去审一个模型系统,最容易翻车的地方在于:同一条用例,上午跑是通的,下午跑挂了,晚上再跑又通了;日志里没有任何异常,代码一行没改。很多团队第一反应是环境不稳,查了半天容器、缓存、依赖版本,最后发现是模型本身在“抖”。
这就是这份《认证测试工程师 人工智能测试大纲》要回答的起点问题:当被测对象的“正确性”本身变成一个概率分布,测试的对象就不再是代码分支,而是数据分布、训练过程和运行环境三者叠加出来的行为面。大纲用十一章、九十页把这件事拆开讲:从人工智能效应、机器学习工作流,到功能表现度量、蜕变测试、对抗攻击,再到测试环境与概念漂移监控。它解决的不是“怎么写一条测试用例”,而是“当预期结果没法硬编码时,测试凭什么说系统合格”。搞懂这套框架,你才能理解模型测试、深度学习测试为什么不能照搬传统测试那套等价类加边界值的思路。
2. 质量特征的变形:为什么把传统质量模型套上去会失效
传统软件的质量模型里,功能性、可靠性、性能效率这些特征有明确的判定口径:功能对不对看需求,可靠性看平均无故障时间,性能看响应曲线。但大纲第二章列出的那组特征——灵活性与适应性、自治、进化、偏差、行为准则、副作用与奖励黑客、透明度与可解释性、安全性——每一个都在挑战这套口径。核心原因是:AI系统的行为不是被完全指定的,而是被训练出来的,训练目标和你真正想要的东西之间永远隔着一条缝。
2.1 灵活性与适应性:预期结果本身在漂移
灵活性指的是系统面对没见过的输入仍能给出合理反应,适应性指的是它能随环境变化调整行为。听起来是优点,放到测试里就是麻烦:你没法用一组固定的输入输出对来定义“正确”。一份图像分类系统,同一张图加了一点亮度扰动,人眼看还是同一类,系统可能给出完全不同的置信度分布。传统测试里这叫缺陷,在AI测试里这要先判断扰动幅度是否落在允许范围内。
常见的判定思路是引入“行为域”而不是“预期值”:先定义输入空间中哪些变换应当保持输出语义不变(比如旋转、缩放、光照变化),再用 metamorphic testing(蜕变测试)的方式生成衍生用例,检查关系是否成立。大纲把这条思路放在第九章的蜕变测试里,和对抗攻击、数据中毒并列,用意是让读者意识到:测AI系统的第一件事是重新定义“什么叫对”,而不是急着跑用例。
2.2 自治与进化:测试基线会自己移动
自治性越高,系统自己做的决策越多;进化性越强,系统在部署后还会继续从数据里学。这两条合在一起,意味着测试基线不是发布时冻结的,而是随时间漂移的。一份推荐系统上线时点击率达标,三个月后用户兴趣迁移,同一套测试用例的通过率会自然下滑,但这不一定是缺陷。
大纲在第七章专门讲了概念漂移的测试:需要把“模型精度下降”拆成两类,一类是输入数据分布变了(协变量漂移),一类是输入和标签之间的关系变了(概念漂移)。前者可以通过监控输入特征分布发现,后者必须靠带标签的新样本回采。实测里比较稳妥的做法是保留一条固定不变的“锚定测试集”,每次模型更新都跑一遍,同时维护一条滚动更新的“现实测试集”,两个结果之间的差值才是漂移信号。这一步如果没有在测试计划里写清楚,后面所有指标都会变成玄学。
2.3 偏差、副作用与奖励黑客:优化目标本身就是缺陷来源
偏差(bias)在这份大纲里不是指统计学里的偏差-方差,而是指系统输出对某些群体、场景的系统性偏离。副作用和奖励黑客是同一枚硬币的两面:你给模型一个奖励函数,它会找到让奖励最大化的捷径,而这条捷径往往不是你想要的。典型的例子是游戏AI学会卡bug刷分,或者内容推荐模型学会用标题党拉点击。
注意:奖励黑客不是模型“学坏了”,而是奖励函数没写全。测试要做的是在设计阶段就把奖励函数的漏洞当作缺陷去攻击。
测试侧的做法在大纲第九章有落点:对抗攻击提供了一套系统化构造边界输入的方法,数据中毒则模拟训练数据被污染后的表现。把这两类技术和偏差测试结合,能覆盖“模型在正常分布上表现良好、但在特定子群上系统性出错”的情况。实践中我一般会把子群切分做得比业务方要求的更细,至少按关键属性交叉切两到三层,否则偏差问题在总体指标上会被平均掉。
2.4 可解释性:它是测试对象,不是文档附件
大纲把透明度和可解释性拆成整体可解释性与单一可解释性两层。整体层面回答“这个模型大致怎么决策”,单一层面回答“这一条预测为什么是这个结果”。很多团队把可解释性当成上线前补的一份模型说明文档,这是典型的踩坑姿势:可解释性本身是可以被测试的质量特征,比如检查特征归因是否稳定、局部解释是否随输入微小扰动而剧烈跳变。
比较务实的做法是选一批业务上必须能解释的样本,对其做局部解释,再对输入做小幅度扰动,看解释结果是否保持一致。如果解释自己都不稳定,那这份解释对测试结论没有支撑价值。大纲在第八章把可解释性测试和自治系统测试、概率系统测试放在一起,逻辑是:越是难解释的系统,越需要把解释能力本身变成可验证项。
3. 从机器学习工作流反推测试点:数据在哪一步决定了结果
大纲第三章到第五章是一条完整链路:机器学习形式 → 工作流 → 数据 → 度量。很多人读大纲只记住有监督、无监督、强化学习三个名词,真正有用的信息在工作流那张图里:数据准备、特征工程、训练、验证、测试、部署、监控,每一步都对应一类测试活动。测试工程师如果只盯着模型评估那一步,前面数据环节埋的雷最后都会在线上爆。
3.1 三种学习范式对应三套测试假设
有监督学习的测试假设是“标签可信”,所以测试重点在标签质量和分布覆盖;无监督学习没有标签,测试假设变成“结构合理”,重点在聚类结果是否稳定、异常检测的阈值是否合理;强化学习的测试假设是“环境可复现”,重点在奖励函数设计和策略在边界状态下的行为。
这份大纲把三种范式的测试差异放在工作流之后讲,顺序是有讲究的:先理解工作流,再理解范式,才知道每种范式该在哪个环节加测试。以强化学习为例,同样是训练一个策略,环境随机种子不同会得到差异极大的策略,测试如果不在固定种子下做对比,结论完全没有可比性。常见实现思路是把种子、环境版本、依赖库版本一起写进测试基线,任何一项变动都视为需要重新建立基线的事件。
3.2 训练集、验证集、测试集的切分是测试设计的一部分
大纲第四章明确把“工作流中的训练、验证和测试集”单列一节,这不是复习机器学习常识,而是在强调:数据切分方式直接决定测试结论的有效性。如果切分时没有考虑时间顺序,用未来数据训练、用过去数据测试,指标会虚高;如果切分时没有做分组,同一个用户的行为同时出现在训练集和测试集里,模型相当于提前看过答案。
一个可复现的检查清单长这样:
| 检查项 | 不合格表现 | 后果 |
|---|---|---|
| 时间切分 | 随机切分代替时序切分 | 线上指标明显低于离线指标 |
| 分组切分 | 同一实体跨集出现 | 测试集精度虚高 |
| 类别分布 | 测试集类别比例严重偏离真实分布 | 少数类缺陷被掩盖 |
| 去重 | 近重复样本跨集 | 变相数据泄漏 |
我一般会要求数据切分的脚本和模型训练脚本分开评审,切分逻辑一旦写错,后面所有调参都是在错误基础上做的。
3.3 过拟合与欠拟合:模型测试的黑匣子时刻
大纲把过拟合、欠拟合和配套的动手练习放在第三章末尾,是因为这是测试工程师第一次需要脱离代码看模型行为。过拟合在测试上的表现是:训练集指标很好,测试集指标明显掉下来;欠拟合是两边都差。但真正难判的是中间态——测试集指标还行,但在某些子群上崩了。
提示:判断过拟合不要只看训练集和测试集的总体差距,要按子群拆开看。总体差距小不代表没有过拟合,可能只是过拟合发生在少数子群上被平均掉了。
比较实用的做法是画学习曲线:横轴训练样本量,纵轴训练误差和验证误差。两条曲线如果收敛后仍有明显间隙,说明模型容量相对数据量偏大;如果两条曲线都很高且贴近,说明欠拟合。大纲配套的动手练习就是用简单数据集演示这两种形态,目的是让测试人员对曲线形状建立直觉,而不是背定义。
3.4 数据标注的质量就是测试的基准线
大纲第四章最后一节讲数据标注方式和错误标注数据。核心结论很直白:如果测试集的标注有错,那所有基于这个测试集算出来的指标都不可信。有监督学习里标注错误分两类,一类是随机错误,表现为指标轻微下降;一类是系统性错误,比如某个类别整体标错,表现为该类别指标异常低但总体指标看不出问题。
常见的排查手段是抽样人工复核加一致性检查:同一批样本让两个标注员独立标,算一致率,一致率低的子集重点复查。大纲里还提到预训练模型和迁移学习的风险,逻辑类似——预训练模型自带的偏差会顺着微调过程传导到下游任务,测试时不能只测微调后的表现,还要测预训练特征在目标域上的基本可分性。
4. 度量与方法的耦合:混淆矩阵之后才是真正的测试设计
大纲第五章讲功能表现度量,第九章讲测试方法与技术,两章隔了几十页,但实际工作中它们是连着的:你选什么度量,决定了你该用什么方法去构造用例;你用什么方法,决定了度量结果该怎么解读。把这两章分开看,很容易变成背公式;合起来看,才是一套完整的判定链路。
4.1 混淆矩阵不是一张表,是测试决策的坐标系
混淆矩阵把预测结果分成真正例、假正例、真负例、假负例四格。大纲把它放在度量章开头,原因是后面所有指标都是这四格的组合。但测试人员真正要关注的是:这四格里哪一格的错误代价最高,这个判断来自业务而不是来自数学。
比如医疗筛查场景,假负例(有病判成没病)的代价远高于假正例,那度量就应该偏向召回率;反垃圾邮件场景,假正例(正常邮件判成垃圾)的代价更高,度量就应该偏向精确率。如果业务方说不清哪类错误更严重,那测试方案就没法定验收准则,这时候应该先把这个问题抛回去,而不是自己拍一个 F1 分数当目标。
4.2 精确率、召回率、F1 与 AUC 的取舍逻辑
这几个指标的关系在大纲里是并列给出的,实际选型时有一套朴素的判断顺序:先看正负样本是否均衡,再看业务更怕哪类错误,最后看需不需要一个与阈值无关的总体排序能力指标。
| 指标 | 适用场景 | 容易被误用的地方 |
|---|---|---|
| 准确率 | 类别均衡、错误代价对称 | 类别极不均衡时严重虚高 |
| 精确率 | 假正例代价高 | 忽略漏判 |
| 召回率 | 假负例代价高 | 忽略误报 |
| F1 | 需要平衡两者 | 隐含假设两类错误同等重要 |
| AUC | 需要评估排序能力 | 对类别不均衡不敏感,可能掩盖子群问题 |
AUC 特别值得单独说一句:它衡量的是模型把正例排在负例前面的能力,和具体阈值无关,所以在阈值还没定的时候常被拿来当总体指标。但 AUC 高不代表每个子群都高,也不代表校准良好。实践中我一般会把 AUC 和分群召回率放在一起看,只报一个 AUC 的评估报告基本没有决策价值。
4.3 度量的局限性:基准套件也会骗人
大纲在度量章末尾专门写了“机器学习功能表现度量的局限性”和“基准套件”。局限性这部分讲的是:任何单一度量都是对模型行为的降维,降维就会丢信息。基准套件的问题是另一层:公开基准上的高分可能来自对基准分布的过拟合,换到真实场景未必成立。
注意:基准套件适合做模型选型的初筛,不适合做验收依据。验收必须用业务场景里采出来的、带时间戳的、经过标注质量检查的数据集。
一个可操作的验证方法是构造“对抗性基准”:在标准测试集之外,单独维护一份包含边界样本、少数类样本、近期新增类别的集合,每次评估都同时跑标准集和这份集合,两个结果的差距就是模型对基准过拟合程度的粗略估计。
4.4 蜕变测试:没有预期结果时怎么判对错
大纲第九章把蜕变测试和结对测试、背靠背测试、A/B测试并列,这一组方法的共同点是:它们都不依赖逐条用例的预期输出。蜕变测试的核心是找“输入变换和输出变换之间的关系”,比如“给图像加一层不影响语义的噪声,分类结果应当不变”或者“搜索词加一个同义词,返回结果集合不应显著缩小”。
下面这段伪代码描述的是蜕变关系的检查逻辑,不是某个具体框架的 API:
# 蜕变关系检查:对输入施加保持语义的变换,断言输出关系成立 def check_metamorphic_relation(model, inputs, transform, relation): violations = [] for x in inputs: y_base = model.predict(x) x_new = transform(x) # 保持语义的输入变换 y_new = model.predict(x_new) if not relation(y_base, y_new): # 断言输出间的关系 violations.append((x, y_base, y_new)) return violations # relation 示例:分类标签不变 # relation 示例:回归输出差值在容忍范围内这段代码里transform必须是对语义无损的变换,relation是把“预期输出”降级成“输出间关系”的断言函数。参数设计的难点在容忍度:关系太严会把正常波动判成缺陷,太松会漏掉真实问题。我的经验是先在一个已知正常的模型上跑一遍,用违反率的分布定阈值,而不是拍一个固定数字。
4.5 对抗攻击与数据中毒:把攻击者当成用例生成器
对抗攻击是通过对输入做微小扰动让模型判错,数据中毒是在训练数据里注入恶意样本。大纲把这两者放在测试技术章而不是安全章,用意是:它们首先是构造测试输入的方法,其次才是安全威胁。对抗样本能高效暴露模型决策边界的脆弱位置,数据中毒能测试训练流程对异常样本的鲁棒性。
实际使用时要注意对抗样本的迁移性:在一个模型上生成的对抗样本,换一个模型未必有效。所以对抗测试的结论要写清楚是在哪个模型、哪个扰动预算下得到的,不能笼统写成“模型存在对抗脆弱性”。
5. 避坑与排查:AI测试里最容易翻车的五个地方
这一章不是理论,是我在实际项目里反复见到的翻车现场。每一条都按现象、原因、解决三段写,能对上号的直接抄排查顺序。
5.1 离线指标全绿,上线一周就崩
现象:模型在测试集上各项指标达标,部署后一周内业务指标明显下滑,日志里没有报错。
原因:测试集和线上数据的分布不一致,且测试集没有按时间切分,训练时用了未来信息。另一层原因是线上输入经过了不同的预处理链路,训练时的特征和推理时的特征计算口径有细微差异。
解决:先做特征一致性核对,把线上一条真实请求的原始输入和预处理后特征打印出来,和训练管线同一条样本对一遍;再把测试集按时间重新切分,用最近一段时间的数据做一次回溯评估。这两步做完,大部分“上线就崩”能定位到具体环节。
5.2 同一个模型两次评估结果差很多
现象:同一个模型文件、同一份测试集,两次评估的准确率差了几个百分点。
原因:评估脚本里混入了随机性,比如数据加载顺序影响批归一化统计、 dropout 没关、或者测试时做了随机数据增强。还有一种情况是测试集本身在两次评估之间被改动过但没有记录版本。
解决:评估脚本固定随机种子,模型切到推理模式,关闭所有训练期才用的随机操作;测试集打上内容哈希,评估报告里带上哈希值。这属于血泪经验,看起来是小事,排查起来能耗掉一整天。
5.3 总体指标正常,某个子群系统性出错
现象:总体召回率达标,但按用户群体、设备类型或时间段拆开看,某个子群的召回率明显偏低。
原因:测试集的子群样本量不足,或者训练数据里该子群样本占比过低导致模型没学好。也有可能是标注标准在该子群上不一致。
解决:评估报告强制按关键维度分群输出,子群样本量低于阈值的标注“样本不足,结论不可靠”;对低表现子群做标注质量抽检,排除标注问题后再判断是否属于模型偏差。这一步不做,偏差问题会一直藏在平均值里。
5.4 蜕变测试关系写得太宽或太严
现象:蜕变测试要么一条违反都报不出来,要么报出大量违反但人工复核全是误报。
原因:关系函数里的容忍度是拍脑袋定的,没有在已知正常的模型上做校准。
解决:先在基线模型上跑一遍蜕变关系,统计违反率分布,用分位数定阈值;再把关系按语义强度分层,强关系(标签不变)和弱关系(置信度变化在区间内)分开统计。校准这一步省不得,否则蜕变测试会变成噪音发生器。
5.5 把可解释性输出当结论用
现象:模型给出局部解释,业务方直接拿解释去对外说明,后来发现解释和模型实际行为对不上。
原因:可解释性方法本身有近似误差,特征归因结果不稳定,且不同解释方法可能给出矛盾结论。
解决:把解释稳定性作为独立测试项,对同一批样本做输入微扰,检查解释结果是否一致;对外使用解释结论前,必须经过测试侧确认解释与模型行为的一致性。解释是辅助判断工具,不是模型行为的权威描述。
6. 设计取舍:测试环境、仿真度与用AI测AI的循环依赖
大纲第十章讲测试环境,第十一章讲用人工智能进行测试,这两章放在最后不是凑数,它们对应两个绕不开的取舍。
第一个取舍是仿真度。AI系统的测试环境很难做到完全真实,自动驾驶类系统要在仿真里跑百万公里,推荐系统要用回放日志模拟线上流量。仿真度越高,测试成本越高,而且高仿真环境本身可能引入新的偏差。我的判断标准是:仿真环境只需要在“影响被测质量特征的维度”上保真,其他维度可以降级。比如测感知模块,光照和天气要保真,交通参与者的行为模型可以简化;测决策模块,交通流分布要保真,渲染画质可以降级。这个取舍必须在测试计划里写清楚,否则评审时会被问“仿真环境凭什么代表真实世界”而答不上来。
第二个取舍是用AI测AI的循环依赖。用模型生成测试用例、用模型做结果判定、用模型做缺陷预测,这些手段能提升效率,但会引入一层新的不确定性:判定器本身也可能出错,而且它的错误模式和被测系统可能相关。比较稳妥的结构是让判定器和被测系统在数据来源、模型架构或训练目标上保持差异,形成背靠背的关系。大纲第九章的背靠背测试讲的就是这个思路,只是很多人只把它用在两个被测系统之间,忘了判定器也需要被背靠背校验。
还有一个容易被忽略的点是测试环境的版本管理。模型、数据、依赖库、仿真器任何一项版本变动,测试结论的可比性就断了。我后来养成的习惯是:每次评估前先打印一份环境指纹,包含模型哈希、测试集哈希、关键库版本和随机种子,附在评估报告首页。这个习惯来自一次排查了三天才发现是仿真器小版本升级导致行为差异的经历——从那以后我每次建基线都强制走一遍环境指纹核对,不管多小的改动。希望帮到你。
本文还有配套的精品资源,点击获取