Skip to content

第七十八章 七十万条

林知行在周三下午发现了问题。

孙雯的用户反馈数据还没给他,但他不能干等。周二他搭好了微调模型的训练框架,周三上午写完了数据加载的接口。下午两点,他决定先看看灵犀教育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%是人工标注的资产。

输出:?

没有输出。

这是一个无解的算法。

不是因为他算不出来,是因为答案不在计算里。

答案在流程里,在所有权里,在"做事的方式"里。

这些东西,他还没有学会。

(本章完)