第七十八章 七十万条
林知行在周三下午发现了问题。
孙雯的用户反馈数据还没给他,但他不能干等。周二他搭好了微调模型的训练框架,周三上午写完了数据加载的接口。下午两点,他决定先看看灵犀教育AI产品的原始数据长什么样。
他打开内部数据平台,点进"教育AI交互日志"的数据库。
页面跳出来一个表格,行数显示:703,842。
七十万条。
林知行盯着这个数字看了两秒。七十万条用户交互数据,时间跨度两年,覆盖十几个产品模块。如果用这些数据训练可信度评分模型,效果应该不错。
他点开第一条记录。
字段很全:用户ID、时间戳、查询内容、AI回答、用户反馈(如果有)、会话时长、模块来源。他往下翻了几条,数据格式一致,结构清晰。
看起来没问题。
他写了一段SQL,按模块来源分组统计。结果出来的时候,他愣住了。
"智能题库"模块:287,431条。
"学习路径推荐"模块:156,892条。
"错题分析"模块:98,764条。
剩下十几个模块加起来,不到二十万条。
智能题库模块的数据量占了四成。他点开这个模块的数据,随机抽了十条看。
第一条:查询内容是"初中数学二次函数",AI回答是一道例题,用户反馈是"有帮助"。
第二条:查询内容是"test123",AI回答是"抱歉,我无法理解您的问题",用户反馈是空。
第三条:查询内容是"今天天气怎么样",AI回答是"抱歉,我是教育AI助手,无法回答天气问题",用户反馈是空。
第四条:查询内容是"初中数学二次函数",和第一条一模一样。时间戳差了三分钟。用户ID也一样。
林知行皱了皱眉。
他继续往下翻。十条里有三条是测试数据——"test123"、"hello"、"请问1+1等于几"。有两条是重复查询——同一个用户在短时间内问了同样的问题。有一条是系统自动生成的校验数据——查询内容是"系统测试请忽略"。
十条里,只有四条是真实的用户交互。
他写了一段脚本,按规则筛了一遍。结果出来的时候,他的手指停在键盘上。
七十万条数据里,测试输入占12%,重复查询占8%,系统校验数据占5%,无效反馈(用户直接关闭页面没有产生任何反馈)占15%。
加起来,四十万条是噪声。
只剩下三十万条是有效数据。
但林知行觉得这个数字还是不对。他点开那些"有效数据",一条一条看。看了二十条之后,他发现了一个更隐蔽的问题——很多查询看起来是真实的,但AI的回答质量很低。比如用户问"高一物理力学怎么学",AI回答的是一段通用的学习建议,没有针对力学的具体内容。
这种回答,用户不会给反馈,因为没什么用,但也没什么错。
他需要一个更精细的筛选标准。
林知行花了一下午写数据质量评分脚本。
思路是这样的:每条数据给一个0到100的分数,分数越高表示数据质量越高。评分维度有五个——
第一,查询的有效性。测试输入、无意义字符、重复查询,直接扣到0分。
第二,回答的相关性。用余弦相似度计算查询和回答的语义相似度,低于阈值的扣分。
第三,用户反馈的存在性。有明确反馈(好评或差评)的加分,无反馈的减分。
第四,会话时长的合理性。太短(用户立刻关闭)或太长(可能卡住了)的减分。
第五,时间戳的连续性。短时间内大量重复查询的,可能是系统刷数据,减分。
五个维度加权求和,得到最终分数。
他设定的阈值是60分。低于60分的数据,他认为不适合用来训练模型。
脚本写完,他跑了一遍。
进度条走到100%的时候,结果出来了。
有效数据:231,847条。
从七十万到二十三万。
林知行盯着这个数字,心情复杂。
一方面,他觉得自己做了一件正确的事——把噪声数据筛掉,模型训练的效果会更好。另一方面,他删掉了四十七万条数据。
四十七万条。
他忽然想起沈渡说过的话——"在大厂里,数据是资产。"
资产。
他删掉了四十七万条资产。
第二天上午,林知行在项目群里发了消息:"数据预处理完成,原始数据70万条,筛选后23万条。详见附件。"
附件是一个Excel表格,列出了筛选规则、各维度的分布、以及被筛掉数据的分类统计。
发完之后,他等了一会儿。
孙雯回了一个"收到"。
赵远没有回复。
程浩没有回复。
林知行觉得有点奇怪。按流程,他应该先跟程浩汇报,再由程浩决定是否同步给周睿。但他昨天下午写完脚本的时候已经七点多了,程浩早就下班了。他不想等到今天上午再汇报,因为数据预处理是今天下午模型训练的前置步骤。
他想了想,又在群里补了一句:"程哥,数据筛选的事我直接跟周总汇报一下?"
程浩秒回:"不用,我来。"
林知行愣了一下。
"好。"他回了一个字。
下午两点,林知行在工位上写模型训练的代码。
程浩从周睿的办公室出来,走到他旁边。
"小林,"程浩的声音压得很低,"周总让你去他办公室一趟。"
林知行抬头,看到程浩的表情——眉头微皱,嘴唇抿着,没有平时那种客气的微笑。
"现在?"
"现在。"
林知行保存了代码,站起来。
他路过开放工位区的时候,感觉到几道目光落在他身上。他没有回头,但脊背有点发紧。
周睿的办公室在走廊尽头,门半开着。
林知行敲了敲门。
"进来。"
周睿坐在办公桌后面,面前摊着一份打印出来的Excel表格。林知行认出来了——那是他发的数据筛选报告。
"坐。"周睿指了指对面的椅子。
林知行坐下。
周睿没有马上说话。他低头看着那份表格,手指在纸面上点了点。
"小林,"周睿抬头,"这个数据筛选,是你做的?"
"是。"
"用了多长时间?"
"一天半。"
周睿点了点头。
"效率很高。"他说。
林知行没有接话。他听出来了,"效率很高"不是表扬。
"但是,"周睿顿了顿,"你做这件事之前,跟谁报备了?"
林知行愣住了。
"我……"他想了想,"我在项目群里发了消息。"
"发消息不等于报备。"周睿说,"数据预处理涉及到数据资产的变更,按流程需要先提交申请,经过数据治理委员会审批,然后才能执行。你知道这个流程吗?"
林知行不知道。
他入职以来,做过数据清洗、写过测试用例、整理过技术文档,但从来没有碰过"数据资产变更"这个概念。在他的认知里,数据预处理是技术工作的一部分,就像写代码一样——写完提交就行。
"我不知道。"他说。
周睿看着他,没有说话。
沉默了大概五秒钟。
"小林,"周睿的声音放低了一点,"你筛掉的那四十七万条数据里,有十二万条是王总团队标注的。"
林知行的脑子嗡了一下。
"王总团队?"
"对。"周睿说,"智能题库模块的数据,有一部分是王总团队花了三个月人工标注的。他们标注的是'题目质量评分'——每道题的难度、知识点、适用年级。你把那些数据当成噪声筛掉了。"
林知行的后背开始出汗。
他想起昨天下午看数据的时候,确实看到过一些带有"标注"字段的记录。他当时以为那是系统自动生成的元数据,没有细看。
"我不知道那些是人工标注的。"他说。
"你应该知道。"周睿说,"数据平台有一个元数据文档,里面列出了每个字段的来源和含义。你看过吗?"
林知行没有看过。
他昨天下午写脚本的时候,直接根据自己的判断设定了筛选规则。他没有去查元数据文档,因为在他的经验里,数据预处理就是根据数据本身的特征来筛选,不需要额外的背景信息。
"我没有。"他说。
周睿靠在椅背上,双手交叉放在胸前。
"小林,"他说,"你的技术能力我不怀疑。但做事的方式,你要学。"
他顿了顿。
"王总那边我已经打了电话,他很不高兴。三个月的标注工作,十二万条数据,你一句话就给人删了。你觉得他会怎么想?"
林知行没有说话。
他不知道该说什么。道歉?解释?都不对。道歉显得他知道自己错了,但他昨天做的时候确实不知道那是人工标注的数据。解释显得他在推卸责任,但他的确没有看过元数据文档。
"我来处理吧。"周睿说,"你先回去。数据筛选的事先停一下,等王总那边的气消了再说。"
林知行站起来。
"周总,"他说,"那些数据能恢复吗?"
周睿看了他一眼。
"能。"他说,"数据平台有版本控制,可以回滚。但回滚需要王总那边同意,因为那些数据的'所有权'在他手里。"
所有权。
林知行第一次听到这个词用在数据上。
"我明白了。"他说。
他转身走出办公室。
回到工位的时候,林知行发现程浩站在他的工位旁边,手里拿着一杯咖啡。
"怎么样?"程浩问。
林知行坐下来,盯着屏幕。
"周总说我做事的方式有问题。"他说。
程浩沉默了几秒。
"数据的事,"程浩说,"你应该先跟我说。"
"我发了群消息。"
"发群消息不是流程。"程浩说,"你应该先跟我口头汇报,我再去找周总。周总同意了,你才能做。"
林知行转过头看着程浩。
"你觉得我应该等一天?"他问。
程浩没有回答。
他喝了一口咖啡,然后说:"小林,我知道你觉得这是浪费时间。但公司的流程就是这样。你绕过流程做事,就算结果是好的,也会得罪人。"
林知行没有说话。
他知道程浩说得对。但他也知道,如果他等一天,今天下午的模型训练就会推迟。而模型训练是下周三中期评审的前置步骤。如果中期评审的时候模型还没训练好,周睿会更不高兴。
这是一个没有最优解的算法。
他打开代码编辑器,光标停在昨天写的数据预处理脚本上。
脚本还开着,第三十七行是他设定的评分阈值:60分。
他盯着那个数字,忽然觉得它很刺眼。
六十。
他设定了一个阈值,把四十七万条数据筛掉了。其中十二万条是别人三个月的工作量。
他以为自己在做正确的事。
但在大厂里,"正确"不是由技术指标定义的,是由流程和所有权定义的。
他关掉脚本,打开了一个新的Python文件。
光标在第一行闪烁。
他没有写任何代码。
傍晚六点,林知行收拾东西准备走。
路过赵鸣岐工位的时候,他看到赵鸣岐还在。
"赵哥,"林知行停下脚步。
赵鸣岐抬头,看到他,点了点头。
"听说你被周总叫去谈话了?"赵鸣岐说。
林知行愣了一下:"你也知道了?"
"公司就这么大,"赵鸣岐说,"你删了王总团队的标注数据,他下午在部门群里发了一通火。"
林知行的脸有点热。
"我不知道那是人工标注的。"他说。
赵鸣岐看着他,没有评价。
沉默了几秒。
"你看过元数据文档吗?"赵鸣岐问。
"没有。"
"那你应该看看。"赵鸣岐说,"灵犀的数据平台有一个专门的元数据管理系统,每个数据库、每张表、每个字段都有文档。文档里写明了数据的来源、含义、所有权归属、以及使用限制。"
他顿了顿。
"你昨天写脚本的时候,直接根据数据本身的特征做了判断。这在小公司可以,在大厂不行。大厂的数据不是'数据',是'资产'。每一条数据都有主人。你动了别人的数据,就是动了别人的资产。"
林知行没有说话。
他知道赵鸣岐说得对。
"谢谢。"他说。
赵鸣岐摆了摆手。
"你那个数据质量评分脚本,"赵鸣岐忽然说,"思路是对的。但你漏了一个维度——数据的'血缘关系'。"
"血缘关系?"
"对。"赵鸣岐说,"每一条数据都不是孤立的。它可能是某个标注任务的产出,可能是某个模型的训练数据,可能是某个报表的数据源。你删掉一条数据,可能会影响下游的很多东西。这个关系链,叫'数据血缘'。"
他打开自己的屏幕,点开一个内部工具的界面。
"这是灵犀的数据血缘图谱工具,"他说,"你可以用它查每条数据的上下游关系。下次做数据预处理之前,先查一下血缘关系,就知道哪些数据不能动了。"
林知行看着那个工具界面。
他从来没有见过这个工具。
"这个工具在哪?"他问。
"内网搜'数据血缘'就能找到。"赵鸣岐说,"文档在知识库里,你搜'数据治理规范'。"
林知行点了点头。
"谢了。"他又说了一遍。
赵鸣岐转回去继续敲代码。
林知行走出写字楼,站在门口。
天已经黑了,路灯亮着。他低头看了看手机,没有新消息。
方小满今天没有找他。
他忽然有点想打电话给方小满,说说今天发生的事。但他想了想,没有打。
方小满在小城守着商户盘子,每天白天上班晚上盯数据,已经够累了。他不想再给方小满添堵。
他打开微信,看到姜意的朋友圈更新了一条——一张办公桌的照片,桌上摊着一堆文件,配文是"又是加班的一天"。
他盯着那张照片看了几秒,然后锁上屏幕。
回到青旅,林知行躺在床上,盯着上铺的床板。
他想起今天下午周睿说的那句话——"你筛掉的那四十七万条里,有十二万条是王总团队标注的。你把人家三个月的活给删了。"
三个月。
十二万条数据。
一个人一天能标注多少条?一百条?两百条?就算一天三百条,十二万条也要四百天。三个人做三个月,刚好差不多。
他删掉的是三个人三个月的工作量。
他以为自己在优化数据集,但在别人眼里,他是在毁掉他们的劳动成果。
他打开手机,看了看内网的数据血缘工具。
他查了一下那些被他筛掉的标注数据。
结果出来了。
十二万条标注数据的下游,有三个报表、两个模型训练任务、一个季度分析报告。
他删掉那些数据,不只是删掉了王总团队的工作量,还影响了下游的很多东西。
他关掉手机,闭上眼睛。
黑暗里,他想起沈渡说过的话——"在大厂里,看懂问题和说出来是两件完全不同的事。"
他今天看懂了一个问题:数据不是数据,是资产。
但他不知道该怎么说出来。
如果他说"我错了",那等于承认他不懂流程。如果他说"我不知道",那等于承认他没有看过文档。如果他说"我是为了优化数据集",那等于在推卸责任。
他不知道该怎么说。
他翻了个身,面朝墙壁。
墙壁是白色的,有一点发黄。
他盯着墙壁上的一个污点,盯了很久。
然后他闭上眼睛,强迫自己睡觉。
但睡不着。
他脑子里一直在跑一个算法——
输入:七十万条数据,噪声率47%,其中12%是人工标注的资产。
输出:?
没有输出。
这是一个无解的算法。
不是因为他算不出来,是因为答案不在计算里。
答案在流程里,在所有权里,在"做事的方式"里。
这些东西,他还没有学会。
(本章完)