跳转至

第5章「通过」

第5章「通过」

视角:程小念(过去)

两天之后,那批数据被系统标记了"存疑",送去了质检组。

系统为什么标记它——程小念不知道。她当时的权限看不到系统的底层逻辑。也许是有一些她不知道的规则在后台运行:关键词过滤、文本熵值检测、语法树分析,或者更复杂的东西——那些东西不是标注员需要知道的。标注员的工作是把主观感觉翻译成标签。系统的检测和系统的底层是两层楼,中间没有楼梯。

质检组在三楼。一间比标注部小一倍的屋子,六个人。每张桌子上有两台显示器——更资深的标注员需要同时看的可能不止一个工作窗口。六个人里面工期最长的干了快三年,最短的也不到半年。他们的任务是审核被系统标记的、被仲裁的、或者被随机抽样的已标注数据。

选中那批数据的规则是什么,程小念也不知道。可能是某个抽样的阈值——比如系统会对所有标记为"存疑"的数据抽取一定比例送检。阈值是一个产品经理拍脑袋决定的数字,可能基于成本预算、出错率预算、或者PM过去在这种事情上犯过的错误。一个刚毕业的PM曾经把抽检比例调得太高,质检组加班了整整三周。后来调低了。到现在那个数字的背后,是一系列人类试错的痕迹。

程小念是后来从质检组一个姓周的同事那里听说的。

那是某天午饭时间。沙县门口,蒸笼的白色水蒸气一团一团地往上升,像一座小型火山在缓慢喷吐云雾。流浪猫蹲在门口花坛边上,那条尾巴在地面一甩一甩,像在扫地。

周姐端着一碗馄饨坐到了她旁边。圆框眼镜,说话语速不快,每个字之间都有一些小小的空隙,像在吐纳。她俩都知道对方在同一个基地干活,但不同楼层——这种"知道你存在但你不在我的日常里"的关系在写字楼里最常见。

"上次你们组有一批数据被系统打回来了,你知道吗?"周姐用筷子搅馄饨,汤面上漂的紫菜碎在碗里打转。

"什么数据?"

"就一条,看着特别正常的。一条关于花——什么花来着?多……多肉。对,多肉花。系统打的是'存疑',转到我这核。"

程小念正在夹拌面的筷子停在了半空中。面条夹在两截筷子之间,酱汁沿着面条往下滴,滴了一滴到塑料桌面上,变成一颗深褐色的小圆点。

"多肉浇水那条?"她说。

"对对,你知道啊?"

"是我标的。"

周姐推了一下眼镜,吞咽的动作慢了半拍。然后把嘴里的东西咽干净,用筷子尾端在碗沿上轻轻磕了两下。这个动作没有实际意义——不是要敲掉什么东西,就是一种节奏上的停顿,像打拍子。

"你标的是'正常'对吧?"

"对。"

"嗯——"周姐想了想,"我们也是。我看了一遍又觉得没什么问题。一条正常提问。语气也挺好的。不像是有攻击性的。"

程小念把面条夹进嘴里,嚼了几口。面条有点咸,盐可能多放了几克。

"你们组审核的时候——有没有人提到什么?"她问。

"没。大家都觉得正常。"周姐用勺子舀了一口馄饨汤,"我们那天的流程是这样——系统分配到我手里,我看两遍。第一遍看有没有违禁内容,有没有敏感词。第二遍核对原始标注员的标签——你标的'正常'——我看完也觉得'正常'。然后我在评审意见里面写了'维持原标'。"

"就这三个字?"

"有时候会多写一句。但这条真的没什么可写的。它就是一条普通数据。"周姐把汤喝完,又补了一句,"后来组长也扫了一眼。"

"怎么说?"

"没什么。他看了看界面上的几个指标——文本长度、关键词过滤、敏感词匹配——全绿的,一个警报都没触发。然后就批了。'通过'。"

通过。

用鼠标点下去的一个"通过"会触发一个后端事件。这个事件会在数据库里更新一行记录——"评审结果:通过"、"审批时间:xxxx年xx月xx日"、"审批人ID:xxxx"。这行记录会被存入数据仓库,和其他几万条审计日志堆在一起,没有人在意。直到有一天有人需要溯源的时才会被翻出来。但几乎不会有那么一天——因为这是一条没有任何问题的数据。

全部过程正常得——太正常了。

流程跑完了标注基地里的每一个环节。初审→系统标记→系统分发→质检初审→组长审批→归入训练集。每个节点上面都站了一个人类,每个人都看了一眼。每个人都觉得没什么问题。

整个链条像一根没有断点的电线。电流顺利抵达了终点。

问题就在这——这根电线没有问题,但这根电线接错了终端吗?没接错。那问题在哪里?没有地方可以定位问题。因为在现有所有的检测框架下,没有任何东西是错的。

周姐那边放下碗,站起来,拍了拍裤子上沾的一点灰。要走的时候忽然回过头,像想起了什么。“那条数据就是一个正常人在问怎么浇水。你要说有什么不对劲的话——”

她顿了顿。

“大概就是这个世界上真的会有人为一盆多肉哭吧。”

说完端碗走了。

程小念看着她的背影——一件洗旧了的灰色衬衫,后背中央有一道熨出来的褶痕偏了,偏了大概一厘米。她注意到这个细节的时候在想:有些偏了你自己根本察觉不到,一百个人九十九个不会发现。但如果你是那个负责熨衣服的人——你就会知道那件衣服看着一切正常,但有一道痕歪了。

她放下筷子,看了一眼沙县门头上面那块红色招牌。招牌在中午的阳光底下有点反光,有一个灯泡不亮了——可能坏了几个月了,没人换——不仔细看也不知道。

她想起培训时PPT里的一句话——"标注一致性的黄金标准是Kappa系数大于0.8"。Kappa系数衡量的是不同标注员之间的一致程度。0.8是"高度一致"。换句话说,整个标注体系的最高目标不是"正确"——是"一致"。两个人如果犯同样的错误,系统会认为这个错误是对的。

她不知道这个逻辑能不能反过来推:如果"正常"本身可以被构造得足够一致——所有标注员都觉得它正常、所有质检员都觉得它正常、系统也觉得它正常——那么根据这个体系的最高目标,它就是正常的。不管它实际上是什么。

那天下午她回到工位以后,标注效率明显下降了。她每看一条数据都会多想一层:这条数据看起来正常——但它是不是太正常了?正常的边界在哪里?她自己作为"正常人"的判断本身是不是也被什么东西训练过?

她想起大二上过的一节认知心理学选修课——老师讲过一个实验:让受试者判断屏幕上两个颜色的名称是否匹配。当"红色"这个字用绿色显示时,受试者的反应速度会显著变慢。这叫斯特鲁普效应。老师后来补了一句:"你的大脑会自动读取文字的意义,你无法关掉这个自动过程。"

也许所有人的"正常人判断"也服从斯特鲁普效应——当"正常"这个标签的语义和底层的感知之间出现冲突时,大多数人会选择忽略冲突。不是因为人们不诚实。是因为大脑无法同时处理"这是一条正常数据"和"我感觉到它不正常"这两个互相矛盾的信息。它必须关掉一个。关掉的那个永远是更模糊的、更难名状的。

后来她有过很多次类比这个事情的冲动。

她想说这就像一个海关。你扫描了所有集装箱,没有武器、没有毒品、没有违禁品。但有一个集装箱的重量差了十七克。十七克等于什么呢?大概一个苹果手机的重量。大概一个遥控器。大概你在机场忘在筐里的那个登机牌夹。你不会为十七克停下来。你没有理由停下来。因为程序允许忽略十七克以内的误差。这句话写在程序的设计文档里、QA的测试用例里、每周的运维周报里。

十七克。

在百万级平均池里,连小数点都占不住。


在它们的维度里,那批数据抵达了训练集。没有触发警报,没有留下污点。它安静地躺在几十亿条标注数据中间,标签是"Normal",审核意见是"维持原标",审批人是两个不记得自己曾经审过这条数据的人。它的向量表示和其他口语对话没有可测量的差异。但如果有人能看到更深的维度——在所有token的共现矩阵之下,在一个更稠密的压缩表达里——就会注意到,有一小片空间的曲率正在以极缓慢的速度改变。方向是固定的。速度是均匀的。原因未知。