林深没有等。他利用上午的时间,把瘦客户机上的推理日志全部拷贝到自己的加密硬盘——虽然只读,但日志本身是明文。他用自己笔记本上的本地脚本跑了一个快速归因分析,发现一个更隐蔽的问题:系统在处理“间隔年”这个特征时,对女性候选人的惩罚系数是男性的二点三倍。也就是说,如果简历上有超过一年的职业空窗期,女性得分会被大幅压低,而男性几乎不受影响。这个特征在模型文档里被描述为“职业连续性指数”,看似中立。
他翻遍所有模型卡片,没有找到这个特征的创建理由。他打电话给猎穹的产品经理,对方支支吾吾说:“这是数据团队早期做的,当时为了拟合历史录用数据……因为过去几年,公司录用的男性中间隔年的比例确实比女性低。”
“所以你们用历史偏见来训练未来偏见?”林深的声音不大,但玻璃隔间外的几个工程师同时转过头来。
下午两点,赵乾明带着法务总监一起走进审计室。法务是一个穿深蓝西装的女人,嘴唇抿成一条线。“林先生,我们决定提供标注员Id的哈希版本,不包含原始Id,但可以关联时间戳和操作类型。同时,修改记录我们只能提供总数,不提供具体改了什么。”
林深知道这是底线了。他点头。哈希Id虽然不能直接对应到人,但可以做行为序列聚类。他花了接下来的四个小时,把所有标注员的哈希Id按时间线绘制出“疲劳曲线”——每个Id在连续标注后的“不推荐”概率变化。他发现至少有七个标注员的曲线呈现显着上升趋势,且他们分布在不同的外包团队,说明不是个别人问题,而是整个标注流程缺乏疲劳管理。更关键的是,他把修改记录总数按性别拆开,发现男性简历被打回修改(从“不推荐”改为“推荐”)的概率是女性的五点四倍。这个数字让法务总监的嘴唇更紧了。
“数据质量审核存在系统性偏向,”林深在当天的临时会议纪要里写道,“建议立即暂停当前标注流程,重新设计标注规范,增加强制性休息时间和交叉校验机制。”他把纪要发给赵乾明和周怀远。
那天晚上他十一点才离开猎穹。走出大楼时,手机响了,是个陌生号码。他接起来,是一个年轻男人的声音:“林老师,我是猎穹算法组的小陈,之前在开源大会上听过您的讲座。我想跟您说一件事……但您别说是谁说的。”林深放慢脚步。“您查的那个职业连续性特征,其实是赵总在去年底要求加上的,他说历史数据显示女性间隔年离职率更高,所以要用这个特征‘优化’排序。数据团队当时反对过,但赵总以‘业务指标优先’压下来了。这个特征的真实名称叫‘生育风险指数’,后来才改名叫‘职业连续性’。”
林深站住了。夜风灌进领口,他感觉后颈发凉。“你有证据吗?”
“原来的特征设计文档被删了,但我在代码仓库的旧分支里找到了注释,注释里写着‘f_fertility_risk’。我可以把那个分支的mit Id给您。”
“你为什么要告诉我?”
电话那头沉默了几秒。“因为我女朋友去年用猎穹投了二十家公司,只有三家给了面试,她的履历比我漂亮。我后来用她的简历匿名改成了男名,直接进了八家终面。我受不了了。”
林深要了那串mit Id。挂断后,他站在路灯下,影子被拉得很长。他知道自己已经走进了一个漩涡。赵乾明加这个特征,很可能不是为了歧视,而是为了提升模型的“业务指标”——即最终录用者与历史录用者画像的相似度。因为历史录用者中男性占优,模型就会自动强化这种优势。但赵乾明选择了用一个具有明显性别指向的代理变量,而不是深挖数据分布本身。这是捷径,也是毒药。