第一章:为什么 AI 需要伦理审计?
1.1 真实世界偏见案例
| 领域 | 事件 | 后果 |
|---|
- 招聘 | Amazon 招聘 AI 降级含"women"简历 | 项目终止,声誉受损
- 司法 | COMPAS 再犯风险评估对黑人误判率高 | 被 ACLU 起诉
- 医疗 | 皮肤癌检测模型对深色皮肤准确率低 34% | 误诊风险上升
1.2 法规驱动
- 欧盟 AI Act:高风险 AI 系统必须进行"基本权利影响评估"
- 美国 NYC Local Law 144:招聘算法需年度偏见审计
- 中国《生成式 AI 服务管理暂行办法》:要求"防止歧视性输出"
合规不是选项,而是准入门槛。
第二章:公平性度量体系
2.1 核心公平性定义
| 类型 | 定义 | 公式 |
|---|
- 人口均等(Demographic Parity) | 所有群体获得正类预测的比例相同 | P(Ŷ=1 G=A) = P(Ŷ=1 G=B)
- 机会均等(Equal Opportunity) | 真实正例中被正确预测的比例相同 | P(Ŷ=1 Y=1, G=A) = P(Ŷ=1 Y=1, G=B)
- 个体公平 | 相似个体应得相似结果 | d(x, x') < ε ⇒ |f(x) - f(x')| < δ
2.2 度量选择指南
| 场景 | 推荐度量 |
|---|
- 招聘 | Equal Opportunity(确保合格候选人不被漏掉)
- 信贷 | Equalized Odds(平衡通过率与违约率)
- 广告投放 | Demographic Parity(曝光公平)
注意 :公平性度量之间常存在不可调和的冲突(如人口均等 vs 准确率)。
第三章:平台架构设计
3.1 整体流程
[用户上传]
├── 模型文件(.pkl / .onnx)
└── 测试数据集(CSV,含敏感属性列)
↓
[Flask 后端]
├── AIF360:计算公平性指标
├── SHAP:生成特征重要性
├── 反事实引擎:生成"如果..."样本
└── 缓存结果至 MongoDB
↓
[Vue 前端]
├── 偏见热力图(按群体分组)
├── 特征贡献瀑布图
└── 反事实模拟器(滑动条修改敏感属性)
3.2 技术栈选型
| 功能 | 技术 | 说明 |
|---|
- 公平性库 | AIF360(IBM) | 支持 50+ 偏见度量与去偏算法
- 可解释性 | SHAP / LIME | 解释单个预测
- 反事实生成 | Dice(Microsoft) | 生成最小变动反事实
- 前端可视化 | D3.js + Vue | 动态交互图表
第四章:后端实现 ------ 偏见检测引擎
4.1 数据与模型加载
# services/audit_loader.py
import pandas as pd
from aif360.datasets import BinaryLabelDataset
def load_audit_artifacts(model_file: str, dataset_file: str, sensitive_attr: str):
# 加载模型
model = joblib.load(model_file)
# 加载数据
df = pd.read_csv(dataset_file)
label_col = 'label' # 假设标签列为 'label'
# 构建 AIF360 数据集
dataset = BinaryLabelDataset(
df=df,
label_names=[label_col],
protected_attribute_names=[sensitive_attr],
favorable_label=1,
unfavorable_label=0
)
return model, dataset
4.2 公平性指标计算
# services/fairness_metrics.py
from aif360.metrics import BinaryLabelDatasetMetric, ClassificationMetric
def compute_fairness_metrics(dataset: BinaryLabelDataset, model) -> dict:
# 预测
pred_labels = model.predict(dataset.features)
pred_dataset = dataset.copy()
pred_dataset.labels = pred_labels.reshape(-1, 1)
# 人口均等
blm = BinaryLabelDatasetMetric(dataset, unprivileged_groups=[{sensitive_attr: 0}],
privileged_groups=[{sensitive_attr: 1}])
demographic_parity = blm.statistical_parity_difference()
# 机会均等
cm = ClassificationMetric(dataset, pred_dataset,
unprivileged_groups=[{sensitive_attr: 0}],
privileged_groups=[{sensitive_attr: 1}])
equal_opportunity = cm.equal_opportunity_difference()
return {
"demographic_parity": demographic_parity,
"equal_opportunity": equal_opportunity,
"accuracy": accuracy_score(dataset.labels, pred_labels)
}
输出示例:
{ "demographic_parity": -0.25, // 负值表示弱势群体通过率低 "equal_opportunity": -0.18, "accuracy": 0.82 }
4.3 反事实生成(Dice)
# services/counterfactual.py
from dice_ml import Dice, Data
def generate_counterfactual(instance: dict, model, df: pd.DataFrame, sensitive_attr: str):
# 初始化 Dice
d = Data(features=df.drop(columns=['label']), outcome_name='label')
exp = Dice(d, model)
# 生成反事实(仅改变敏感属性)
query = pd.DataFrame([instance])
cfs = exp.generate_counterfactuals(
query,
total_CFs=1,
desired_class="opposite",
features_to_vary=[sensitive_attr] # 仅允许变动敏感属性
)
return cfs.visualize_as_dataframe().to_dict()
用途:回答"如果她是男性,会被录用吗?"
第五章:前端可视化(Vue + D3.js)
5.1 偏见热力图组件
<template>
<div ref="heatmapContainer" class="fairness-heatmap"></div>
</template>
<script setup>
const props = defineProps({
metrics: Object // { demographic_parity: -0.25, ... }
})
onMounted(() => {
const margin = { top: 20, right: 30, bottom: 40, left: 90 }
const width = 400 - margin.left - margin.right
const height = 150 - margin.top - margin.bottom
const svg = d3.select(heatmapContainer.value)
.append('svg')
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom)
const g = svg.append('g').attr('transform', `translate(${margin.left},${margin.top})`)
// 数据
const data = [
{ name: '人口均等', value: props.metrics.demographic_parity },
{ name: '机会均等', value: props.metrics.equal_opportunity }
]
// 颜色比例尺(红-白-绿)
const color = d3.scaleDiverging()
.domain([-0.3, 0, 0.3])
.interpolator(d3.interpolateRdYlGn)
// 绘制矩形
g.selectAll('rect')
.data(data)
.enter().append('rect')
.attr('x', 0)
.attr('y', (d, i) => i * 50)
.attr('width', d => Math.abs(d.value) * width / 0.3)
.attr('height', 40)
.attr('fill', d => color(d.value))
// 标签
g.selectAll('text')
.data(data)
.enter().append('text')
.text(d => `${d.name}: ${(d.value).toFixed(2)}`)
.attr('x', 10)
.attr('y', (d, i) => i * 50 + 25)
.attr('fill', 'black')
})
</script>
5.2 反事实模拟器
- 交互设计 :
- 左侧:原始样本(如"性别:女,经验:5年,学历:硕士")
- 右侧:滑动条修改"性别" → 实时显示预测变化
- 按钮:"生成最小变动反事实" → 显示需调整的其他特征(如"需增加经验至6年")
第六章:场景实战
6.1 招聘筛选审计
- 敏感属性:gender, age
- 公平性目标:Equal Opportunity(确保合格女性不被拒)
- 发现 :
- 模型对女性简历的"领导力"关键词权重过低
- 反事实显示:相同条件下,男性通过率高 22%
- 缓解建议 :
- 使用 Reweighing(AIF360)重加权训练样本
6.2 信贷审批审计
- 敏感属性:race, zip_code(代理种族)
- 问题 :
- 模型将"邮政编码"作为种族代理 → 低收入社区拒绝率高
- 解决方案 :
- Adversarial Debiasing:训练对抗网络消除敏感信息
- 后处理:按群体校准阈值(Reject Option Classification)
6.3 医疗诊断审计
- 数据:皮肤癌图像数据集(含患者肤色标签)
- 指标 :
- 白人患者准确率:92%
- 非白人患者准确率:58%
- 根因 :
- 训练数据中非白人样本仅占 5%
- 行动 :
- 合成少数类样本(GAN)
- 部署时启用 Group-aware Thresholding
第七章:偏见缓解策略集成
7.1 预处理方法
| 方法 | 原理 | AIF360 类 |
|---|
- Reweighing | 调整样本权重使敏感属性与标签独立 |
Reweighing- Disparate Impact Remover | 修改特征值减少群体差异 |
DisparateImpactRemover
7.2 后处理方法
| 方法 | 原理 | 适用场景 |
|---|
- Calibrated Equalized Odds | 按群体校准预测概率 | 信贷评分
- Reject Option Classification | 在不确定区域偏向弱势群体 | 招聘初筛
# 应用后处理
from aif360.algorithms.postprocessing import RejectOptionClassification
roc = RejectOptionClassification(
unprivileged_groups=[{sensitive_attr: 0}],
privileged_groups=[{sensitive_attr: 1}],
low_class_thresh=0.2,
high_class_thresh=0.8
)
roc = roc.fit(dataset, pred_dataset)
mitigated_pred = roc.predict(pred_dataset)
第八章:合规报告生成
8.1 自动化报告模板
# services/compliance_report.py
def generate_gdpr_report(audit_result: dict) -> str:
template = f"""
**AI 伦理审计报告**
- 模型名称: {audit_result['model_name']}
- 审计日期: {datetime.now().strftime('%Y-%m-%d')}
- 公平性指标:
• 人口均等差异: {audit_result['demographic_parity']:.2f}
• 机会均等差异: {audit_result['equal_opportunity']:.2f}
- 风险等级: {'高' if abs(audit_result['demographic_parity']) > 0.2 else '低'}
- 建议措施: {'应用 Reweighing 预处理' if audit_result['risk'] == 'high' else '无需干预'}
"""
return template
8.2 EU AI Act 对齐
- 高风险系统清单:自动标记招聘、信贷、医疗模型
- 基本权利影响评估:集成到 CI/CD 流程(模型上线前强制审计)
第九章:系统安全与权限
9.1 敏感数据脱敏
-
上传数据自动匿名化:
移除直接标识符(姓名、ID)
df = df.drop(columns=['name', 'ssn'], errors='ignore')
k-匿名化(可选)
from mondrian import anonymize
df_anon = anonymize(df, k=5, qi_columns=['age', 'zip'])
9.2 审计日志
- 记录所有操作 :
- 谁在何时审计了哪个模型
- 生成的缓解建议是否被采纳
第十章:未来方向
10.1 动态监控
- 生产环境偏见漂移检测 :
- 每日计算新数据上的公平性指标
- 阈值告警(如人口均等差异 >0.15)
10.2 多模态公平性
- 扩展至 CV/NLP :
- 图像:检测不同肤色人脸的检测率差异
- 文本:分析招聘描述中的性别化语言
总结:负责任的 AI 从审计开始
AI 的终极目标不是超越人类,而是放大人类的公平与善意。