第二十章 数据的背面
排课系统上线两周,林知行收到了第一个好消息。
刘主管在工作群里发了一段话:"城东、城中、城东南三个片区反馈,上周排课零冲突,教务老师省了至少四十个小时。张总很高兴,说后面几个片区也赶紧推。"后面跟了一串竖大拇指的表情。
方小满从上铺探下头来:"看到没?零冲突!四十个小时!"
林知行嗯了一声,手指还停在键盘上。他在看另一个数据——系统日志显示,过去两周里,人工干预次数从最初每次排课平均十二次降到了四次。模型在收敛,约束权重在自动调整,那些他花两周写进去的规则正在被验证。
他把数据截图保存,文件名打了日期:20240128_运行数据。
"你怎么一点反应都没有?"方小满翻身坐起来,"零冲突啊哥们儿,张老板的三十七个校区!"
"不是零冲突。"林知行说,"是零报错。冲突检测还在跑,只是没有触发阈值而已。"
方小满翻了个白眼:"你这人真没意思。"
林知行没接话。他盯着屏幕上的数据看了几秒钟,然后打开了"风险评估模块_v1"文档。上次写的五条规则还在,第五条是"怀孕教师排高强度课程:风险+5"。但他记得,后面打了一个问号——因为系统里根本没有这个字段。
他把文档关了。
没什么事发生。数据在变好。一切都在往好的方向走。
至少在那个电话响之前。
张老板的电话是周四下午四点十七分打来的。
林知行刚从图书馆出来,走在回宿舍的路上。冬天的阳光很薄,铺在路面上像一层稀释过的金色颜料。他背着书包,脑子里还在想怎么优化调整阶段的约束权重,手机就响了。
他看了一眼来电显示——张老板。
"张总好。"他接起来。
电话那头没有寒暄。
"小林,你现在方便说话吗?"
张老板的声音不对。不是上次那种带着疲惫的低沉,是一种压着火气的紧绷,像一根拧到极限的弹簧。
"方便,您说。"
"城北、城南、城西三个校区,今天下午四十三个老师联名投诉,说排课系统有问题。"
林知行的脚步停了。
"什么问题?"
"你自己去看看系统排出来的课表。"张老板的声音提高了一个度,"城北校区的张老师,怀孕七个月,你们的系统给她排了周一到周五满课,每天六节。城西校区的李老师,怀孕五个月,同样的情况。还有城南校区的王老师,刚做完阑尾炎手术不到一个月,也被排了高强度课表。"
林知行的手开始发凉。
"这些老师的身体状况,系统里没有。"张老板继续说,声音里的弹簧越拧越紧,"三个校区的教务主管说,他们的教师信息表里有健康状况备注,但系统从来没要求填过。"
林知行站在路中间,旁边有人走过,他没注意。
"张总,"他说,声音比平时低了半度,"我马上查。"
"你查什么查?"弹簧断了。张老板的声音突然拔高,"你告诉我,一个怀孕七个月的女老师,被排了满课,如果她出了事,谁负责?你负责还是我负责?"
林知行没说话。
"小林,我上次跟你说过什么?"张老板的声音又压下来了,但那种压比刚才的高声更让人难受,"我说我不是要最优解,我是要不出事。你做的这个系统,是不是出事了?"
"是。"林知行说。
电话那头沉默了两秒。
"你和小方今晚来一趟。三个校区,挨个去。数据补上,老师道歉。明天上午我要看到整改方案。"
电话挂了。
林知行站在路边,手机贴在耳朵上,过了好几秒才放下来。
阳光还是那么薄,但照在身上没有温度了。
方小满听完情况,脸色也变了。
"怀孕的老师排满课?"他从床上跳下来,"这要是出了事——"
"别说了。"林知行已经在收拾东西了。他把笔记本电脑装进书包,又拿了一个移动硬盘,"走,先去城北校区。"
"现在?"
"现在。"
方小满没再多问,抓了件外套就跟上了。
去城北校区的公交车上,林知行打开笔记本电脑,登录排课系统的后台。
他调出城北校区的教师数据库,逐条查看。
张老师的记录里,"备注"字段是空的。"健康信息"字段——根本没有这个字段。
他切到城南校区。一样。李老师的记录里,"备注"字段写着"已婚",没有怀孕信息。
他切到城西校区。王老师的记录里,"备注"字段写着"教龄12年",没有手术信息。
三个校区的教师数据库,结构和总部不一样。总部的数据库是刘主管提供的完整版,字段齐全。但三个校区的数据库是各校区教务主管自己维护的,格式不同,字段也不同。林知行在做系统对接的时候,只取了"教师姓名""授课科目""时间段偏好""资质限制"四个字段,其他的——包括那些不规范的备注——他没看。
不是故意忽略。是他根本没想到那里会有东西。
他靠在公交车的座椅上,闭上眼睛。
脑子里浮现出第19章那天他写的第五条规则:怀孕教师排高强度课程:风险+5。
他写了这条规则,然后发现系统里没有健康信息字段,然后他把文档关了。
他当时想的是:后面再补。
后面。
他没有等到后面。
城北校区在城北三路,是一栋三层的旧楼,外墙贴着白色瓷砖,有几块已经脱落了。林知行和方小满到的时候,天已经黑透了。
校区的教务主管姓赵,四十出头,短头发,说话很快。她把他们领到二楼的一间小会议室,桌上放着一叠课表打印件。
"你们自己看。"赵主管把打印件推过来。
林知行翻开了第一页。
城北校区,张老师的课表。周一:第一节到第六节,全是满的。周二:第一节到第五节。周三:第一节到第六节。周四第一节到第四节,周五第一节到第五节。
一周二十八节课。
他记得张老板说过,正常情况下,一个老师一周的课时量是十六到十八节。
"张老师怀孕七个月。"赵主管说,"你们系统排完课表之后,她来找我,没说话,就把课表放在桌上。我一看,吓了一跳。"
林知行没抬头。
"她没发火,也没哭,就是站在那里。"赵主管的声音有点硬,"她说,赵主管,我知道系统是机器排的,但机器不知道我怀孕了吗?"
林知行把打印件合上。
"赵主管,"他说,"是我们的错。系统对接的时候,我没有要求各校区统一教师信息的字段,也没有做数据完整性检查。"
赵主管看着他,没有接话。
方小满在旁边说:"赵主管,我们今晚来就是补数据的。您把三位老师的信息表给我们,我们连夜录进系统,明天重新排课。"
赵主管的表情松了一点,但还是没笑。
"课表可以重排,"她说,"但老师们的心里怎么想,你们排不了。"
林知行点头:"我知道。我想当面向张老师和李老师道歉。"
赵主管看了他一会儿,站起来:"张老师今天早走了。李老师在三楼的办公室。我带你们去。"
李老师的办公室在三楼走廊尽头。门半开着,里面亮着灯。
林知行站在门口,看到一个三十岁左右的女人坐在办公桌前批改作业。她穿着一件宽大的灰色卫衣,头发扎成马尾,脸上没什么表情。
"李老师,"赵主管敲了敲门,"这两位是排课系统的技术人员,来跟你道歉的。"
李老师抬起头,看了林知行一眼。
林知行走进去,在她对面站定。
"李老师,对不起。"他说,"排课系统出了问题,给您排了不合理的课表。是我的技术失误,责任在我。"
李老师放下手里的红笔。
"你多大?"她问。
"二十二。"林知行说。
"在哪儿上学?"
"省内一所大专,计算机专业。"
李老师点了点头,没有继续问。
她沉默了几秒钟,然后说:"你知道我为什么没有第一时间去找赵主管吗?"
林知行摇头。
"因为我拿到课表的时候,以为是系统在优化。"李老师说,"我以为系统觉得我这个老师不够好,所以用更多的课来补。我想了一整天,是不是我教得不行,是不是学校想换人。"
林知行的喉咙发紧。
"后来我去问赵主管,赵主管说是系统的问题,不是我的问题。"李老师说,"但我那一整天都在想,如果我是一个更优秀的老师,系统会不会少给我排几节课?"
"不会。"林知行说,"系统根本不知道您怀孕了。它没有任何关于您身体状况的数据。它排课的依据只有时间段、科目、资质,没有其他。"
李老师看着他,眼睛里有一种他看不懂的东西。不是愤怒,也不是委屈,是一种更复杂的东西,像一层被压得很薄的透明薄膜,随时可能碎掉。
"你们做的系统,"她说,声音很轻,"只看效率,不看人。"
林知行站在那里,没有说话。
他不知道该说什么。
这句话不是指责。如果是指责,他可以解释,可以说"我们已经在做风险评估模块了",可以说"数据源头的问题我们会修"。但这句话不是指责。它是一个陈述。
你们做的系统,只看效率,不看人。
这是一个事实。
"李老师,"他说,"我们会把您的身体状况录入系统,重新排课。以后不会再出现这种情况。"
李老师点了一下头,没有再说话。
林知行和方小满走出办公室。走廊很长,日光灯管嗡嗡响,有两根是坏的,忽明忽暗。
方小满在后面跟着,也没说话。
城南和城西两个校区的情况差不多。
城西校区的李老师,怀孕五个月,课表同样被排得满满当当。她没请假,怕被扣绩效,但同事们发现她上课时频繁停下来扶着讲台歇气。
城南校区的王老师,阑尾炎手术后第三周就被排了满课。她拿到课表的第二天请了假,但不是主动的——是上课时突然弯下腰,站不起来了。
林知行和方小满在三个校区之间跑,一直到晚上十一点才结束。每个校区的教务主管都把教师信息表给了他们,上面有手写的备注:某某老师怀孕几周、某某老师刚做完手术、某某老师腰椎间盘突出、某某老师家里有病人需要照顾。
这些信息,从来没有被录入系统。
林知行把每一条都录进了数据库。新建了一个字段,叫"特殊状况",数据类型是文本,没有长度限制。
他录到最后一条的时候,手停住了。
那条备注写着:陈老师,抑郁症,正在服药,不宜排晚课。
他盯着这行字看了很久。
然后他把这条也录了进去。
回学校的公交车已经没有了。林知行和方小满打了辆车,花了一百二十块。上车后方小满靠在座椅上,闭着眼睛,没说话。
车开了十分钟,方小满突然开口:"你还做不做这个项目?"
林知行看着窗外。路灯一盏一盏地往后退,光打在他脸上,明暗交替。
"做。"他说。
方小满睁开眼睛看他。
"但得改。"林知行说。
他打开书包,拿出笔记本电脑,开机。屏幕的蓝光照亮了他的脸。
他打开了排课系统的架构图——那张他花了两个周末画的、密密麻麻的流程图。输入层、数据清洗层、约束建模层、初排引擎、调整引擎、评价引擎、输出层。
他在输出层和用户之间,画了一个新的方框。
他在方框里写了四个字:人工审核层。
然后他在下面写了一行注释:
"在AI做决策之前,必须有人类检查数据的完整性。这不是技术问题,是伦理问题。"
他盯着这行注释看了几秒钟。
这是他第一次把"人"写进架构图里。
以前他的架构图里只有数据、算法、约束、输出。输入是数据,输出是结果,中间是算法。他从来没有想过,在输出和用户之间,应该有一个人。
一个能检查数据是否完整的人。一个能判断结果是否合理的人。一个能替那些算法感知不到的东西——怀孕、手术、抑郁、家庭变故——把最后一道关的人。
出租车在红灯前停下。司机打开了收音机,里面在放一首老歌,调子很慢。
方小满探过头来看了一眼屏幕,没说话。
绿灯亮了。车继续往前开。
林知行没有关电脑。他把架构图缩到最小,看到整个系统的全貌——输入、清洗、建模、排课、评价、输出、审核。
七个模块。
以前是六个。
新加的那个,排在最后,也排在最前面。
因为它不是用来优化算法的。它是用来兜底的。
兜那些算法兜不住的东西。