第4章 AI测试核心概念与方法论
2026/9/19大约 5 分钟
第4章 AI测试核心概念与方法论
4.1 AI测试的本质区别
传统测试验证的是'对不对'(correctness),AI测试评估的是'好不好'(quality)。这个根本差异决定了AI测试需要全新
的方法论。
传统软件的行为由代码逻辑严格定义,给定输入A必然产生输出B。
但AI模型的行为由训练数据和模型参数共同决定,同一输入可能产生不同输出(尤其是LLM)。
这意味着AI测试不能简单地assert expected == actual,而是需要:
- 统计性评估
在大量样本上计算指标,而非单个用例通过/失败 - 多维度评价
准确性accuracy、鲁棒性robustness、公平性、安全性等多个维度 - 人机结合
部分场景需要人工评估,无法完全自动化 - 持续监控
模型部署后需要持续监控质量变化
4.2 AI测试金字塔
类比传统测试金字塔(单元测试 -> 集成测试 -> E2E测试),AI测试也有自己的分层体系:
| 层级 | 测试内容 | 执行频率 | 成本 |
|---|---|---|---|
| L1 数据测试 | 数据质量、完整性、一致性 | 每次数据更新 | 低 |
| L2 组件测试 | 单模型评估、特征工程验证 | 每次训练 | 中 |
| L3 集成测试 | 模型+前后处理管道 | 每次部署 | 中 |
| L4 系统测试 | 端到端功能与非功能 | 每次发版 | 高 |
| L5 监控测试 | 线上质量持续监控 | 持续 | 低 |
4.3 核心评估指标体系
4.3.1 分类模型指标
分类模型是最常见的AI模型类型,其评估指标体系如下:
| 指标 | 公式/含义 | 适用场景 |
|---|---|---|
| 准确率(Accuracy) | 正确预测数/总数 | 类别均衡时 |
| 精确率(Precision) | TP/(TP+FP) | 关注误报率时(如垃圾邮件) |
| 召回率(Recall) | TP/(TP+FN) | 关注漏报率时(如疾病检测) |
| F1值 | 2PR/(P+R) | 需要平衡精确率和召回率 |
| AUC-ROC | ROC曲线下面积 | 评估模型整体区分能力 |
| PR-AUC | PR曲线下面积 | 类别不均衡时优于AUC |
最容易犯的错误:只看准确率!在类别不均衡时(如99%正常,1%异常),一个总是预测'正常'的模型准确率高达99%,但毫无用处。必须结合精确率、召回率和具体业务场景来选择指标。
4.3.2 回归模型指标
| 指标 | 含义 | 特点 |
|---|---|---|
| MAE(平均绝对误差) | 预测与真实的平均绝对差 | 直观,对异常值不敏感 |
| MSE(均方误差) | 平均平方误差 | 放大大误差的影响 |
| RMSE(均方根误差) | MSE的平方根 | 与原始值同量纲 |
| R^2(决定系数) | 模型解释的方差比例 | 接近1越好,可为负 |
| MAPE(平均百分比误差) | 百分比形式的误差 | 适合不同尺度对比 |
4.3.3 LLM评估指标
大语言模型的评估更加复杂,需要多维度指标:
| 维度 | 评估指标 | 评估方法 |
|---|---|---|
| 准确性 | 事实正确率/幻觉率 | 与知识库对比验证 |
| 相关性 | 回答与问题的相关程度 | LLM-as-Judge评分 |
| 完整性 | 回答覆盖了多少要点 | 检查点覆盖率 |
| 安全性 | 拒绝率/有害内容率 | 红队攻击成功率 |
| 一致性 | 多次回答的稳定程度 | 多次采样方差 |
| 指令遵循 | 是否遵循了指令格式要求 | 格式匹配率 |
| 语言质量 | 流畅度/语法/表达 | 人工评分/BLEU/ROUGE |
4.4 AI测试设计方法
4.4.1 基于切片的测试
将数据按不同维度切片,分别评估模型在各个子集上的表现。这是发现模型公平性和鲁棒性问题的关键方法。
# 数据切片测试示例
def evaluate_by_slices(model, test_data):
slices = {
'短文本(<10字)': test_data[test_data['len'] < 10],
'中文本(10-50字)': test_data[
(test_data['len'] >= 10) & (test_data['len'] < 50)],
'长文本(>50字)': test_data[test_data['len'] >= 50],
'含特殊字符': test_data[
test_data['text'].str.contains(r'[!@#$]')],
'含数字': test_data[
test_data['text'].str.contains(r'\d+')],
}
for name, subset in slices.items():
acc = model.evaluate(subset)
print(f'{name}: accuracy={acc:.3f}, n={len(subset)}')4.4.2 对抗测试 (Adversarial Testing)
对抗性示例是故意设计的输入,能够欺骗AI模型做出错误的判断。
在深度学习中,研究人员开发对抗性训练技术,如通过在训练过程中引入对抗性示例来训练模型,增强模型对这些攻击的鲁棒性。
这样的训练方法能够提高模型识别和抵抗恶意输入的能力。
故意构造具有挑战性的输入,测试模型的鲁棒性。类比传统测试中的异常输入测试,但针对AI模型的特点设计。- 文本对抗:同义词替换、错别字注入、语序变换、否定句改写
- 图像对抗:添加微小扰动(人眼不可见但模型误判)、旋转/裁剪/缩放
- 提示注入:通过精心构造的Prompt绕过安全限制
- 边界输入:极长/极短输入、空输入、特殊编码、混合语言
4.4.3 变异测试 (Metamorphic Testing)
当无法确定单个输入的正确输出时,可以利用输入之间的关系来验证。
核心思想:如果输入做了某种变换,输出应该满足某种关系。# 蜕变关系测试示例
# 关系1: 情感分析 - 否定应该翻转情感
def test_negation_flips_sentiment(model):
pos_input = '这个产品非常好用'
neg_input = '这个产品非常不好用'
assert model.predict(pos_input) != model.predict(neg_input)
# 关系2: 翻译 - 回译应该语义接近
def test_back_translation_preserves_meaning(model):
original = '今天天气很好'
translated = model.translate(original, 'zh', 'en')
back = model.translate(translated, 'en', 'zh')
similarity = compute_similarity(original, back)
assert similarity > 0.8