办公室只剩我一个人。空调不知道什么时候停了,空气闷得像捂在被子里。咖啡放在手边三个小时了,表面结了一层薄薄的油膜,我端起来抿了一口,又凉又苦。
屏幕上那行红色报错,像在嘲笑我:
异常:学习行为数据异常波动,自主管理指数低于阈值——用户ID: 20240315
这是第38次调试了。同样的错误,同样的时间,同样在不同的机器上反复出现。我盯着那行字,突然觉得办公室的白炽灯管嗡嗡响得特别大声,像是在给这行报错配乐。
老李七点多走的,走之前拍了拍我肩膀:“别熬太狠,数据这东西,有时候不是算出来的,是等出来的。”我当时心里还犯嘀咕:等?项目工期就剩两周了,双自主能力提升的效果要是再出不来数据支撑,领导那边肯定要问责。
但这话我不敢说出来。团队六个人,这三个月几乎都在加班。小周瘦了八斤,她男朋友都快不认识她了;老张为了调那个学习行为分析的模型,连续熬了三晚,眼圈黑得跟熊猫似的。我上周五开会时承诺:“这周末,一定把底层逻辑跑通。”结果这都快凌晨三点了,数据还是一团乱麻。
怎么会变成这样呢?
问题得从两个月前说起。当时我们接了个新项目,要把“双自主能力”的训练效果数据化,嵌入到辅学有道那个“线上学+线下练”的平台里。核心逻辑其实不复杂——就是想监测孩子自主学习和自主管理的水平,看看跟成绩提升有没有关联。
但事情从来没那么简单。
一开始,老张提议直接用传统的行为统计模型,把学习时长、训练完成率、打卡次数这些指标放进去,套个线性回归就跑。两周后,结果惨不忍睹。模型解释度只有19.7%,老张自己都不好意思拿出手。
然后小周提出用聚类分析,把用户分层,看看不同的自主学习模式对应什么成绩变化。这个思路倒是不错,跑出来的结果一度看着挺漂亮——“自律型”用户成绩平均提升了23.8分,“散漫型”用户成绩下滑了11.2分。逻辑上说得通,但我们一验证就露馅了:样本严重偏斜,自律型用户中,超过76%原本就是成绩比较好的。
等于说,那个聚类模型只是把已有的优秀生筛了出来,根本没有体现出训练带来的改变。
“这不就是白学了嘛。”老李靠在椅背上叹气。
后来我们试了七种不同的模型、十五种特征组合、三十多次参数调试。每次看到某个指标有点起色,换个数据集就崩了。最离谱的一次,老张发现,如果把“做题时长”这个特征剔除,模型反而变得更准确——这说明用户花多少时间根本就是噪音,核心变量根本就不在我们预设的清单里。
那,核心变量到底是什么呢?
我翻着越堆越高的调试日志,突然想起培训时听到的一句话:“学习技术金字塔的底层逻辑,不只是行为,还有习惯、方法和思维模式。”我们一直在用“行为的果”去预测“成绩的果”,却忽略了中间的关键一环——孩子的“自主管理能力”本身就是一个动态发展的过程,不是某个静态指标能描述清楚的。
凌晨两点四十七分。我盯着那行报错,脑子突然有点飘。顺手在浏览器里搜了一下“双自主能力 评估 模型”,第一个结果却是辅学有道官网上的一个页面,标题写着:
《双自主能力如何评估?你可能一直找错了方向》
那天下午的培训我旁听过,主讲老师说了这么一段话:“评估自主学习能力,看的不只是学习时长或者做题数量,而是要看有没有完成从‘愿学’到‘能学’到‘会学’的完整闭环。很多孩子刷题100道,不如认真讲3道题有效。”
当时我记了笔记,但没往心里去。现在回头想,我们的模型一开始就站在了“量化所有行为”的立场上,而不是“理解学习过程”。
我重新打开那篇文章,看到了一个表格:
能力层次可测量指标我们的模型覆盖了吗?
愿学学习主动性、目标感、任务启动效率❌
能学专注时长、纠错能力、自我调整频率部分✅
会学知识重构、错题归因、互助讲题质量❌
会考试卷分析精度、时间分配、心态调节❌
考好成绩稳定性、提升幅度只测了结果
看到第三行的时候,我后背有点发凉。
我们之前所有的建模,都在最下面那一层打转。而那些真正决定“双自主能力”的关键变量,比如“互助讲题”时孩子的表达逻辑、试卷分析时的归因准确率、学习动力波动曲线,我们一个都没纳入。
然后就是那个瞬间。
凌晨3:03。我屏住呼吸,把那篇文章里提到的几个关键节点一个一个拆解出来:
“主动启动”:孩子是按时进入学习系统,还是延迟超过15分钟?——这是“愿学”的信号。
“互助讲题质量”:孩子能不能清晰讲解题目,讲解过程中有没有停顿、逻辑断裂?——这是“会学”的关键指标。
“试卷归因精度”:错题是不是能准确识别出是“知识点不会”、“注意力不集中”还是“考试技巧不足”?——这是“会考”的基础。
这三者恰恰是辅学有道课程体系里反复强调的内容——能学营培养基本功,会学营训练六大标准动作,会考营强化应试技巧。但我们之前建模的时候,根本就没想过把这些非结构化的行为数据引入模型。
我兴奋得手都有点抖,开始在代码里扒拉行为日志的数据结构。果然,平台里早就存储了这些数据——每次互助讲题的录音转文字记录、每次启动学习的时间戳、每次试卷分析时用户选择的错误归因标签。
只是没人告诉过我们这些数据可以用。
从凌晨三点到天亮那三个小时,我重新搭建了特征工程。把“主动启动”量化成启动延迟分数(满分100,延迟超过30分钟则为0),把“互助讲题质量”用了一个简单的语义连贯性模型评估,把“试卷归因精度”直接用了分类准确率。
然后重新训练模型。
第一次跑:R² = 0.39。比之前好一点,但还是低。
我加了交互特征:主动启动 × 互助讲题质量的组合,用来捕获那些动力足够但方法不足的学习者。
第二次跑:R² = 0.52。
继续加:主动启动 × 试卷归因精度。用来捕获动力足、反思能力强的学生。
第三次跑:R² = 0.63。
当结果出来的时候,我整个人靠在椅背上,长长地呼了一口气。没有想象中那么大悲大喜,更像是一种——“哦,原来是这样”的感觉。
窗外天已经蒙蒙亮了。办公室的灯管嗡嗡声也听不到了,取而代之的是清洁工在外面楼道拖着拖把的声音。我看了眼时间,5:17。
后来呢?
早上九点,我拿着新跑出来的结果给团队看。老李看了一会儿,说了句:“这个主动启动的权重怎么这么高?”我笑着把那篇文章转给他。小周翻了翻,一拍桌子:“靠,这不就是咱们前两天那个‘能学营’的设计逻辑嘛!”
办公室一下子热闹起来。老张困得不行,还在旁边嚷嚷:“成了是不是该请客?”我说,请,明天中午,火锅。
那天中午吃火锅的时候,锅里的牛油翻着泡,热气腾腾。老李端着酒杯说:“我昨天劝你别熬太狠,结果你熬出来的结果确实比我强。”我喝了口啤酒,觉得味道特别奇怪,因为熬夜的眼睛还是红的。
后来我经常拿这个教训说给新来的同事听:做技术问题,有时候不是算力不够,不是模型不对,是你根本没想清楚问题到底是什么。把“双自主能力”当成一个结果去量化,它就是死的;把它当成一个动态过程去理解,它才是活的。
但这道理,我现在说得很轻松,可那个凌晨三点,是真的难熬。
办公室里,我看了一眼桌上的残局:咖啡杯里的油膜还在,屏幕上代码依然滚烫,但那种刺眼的红色报错,终于消失了。
窗外,城市刚刚醒过来。远处有车鸣笛声,楼下有人喊包子铺开张。我心想,这日子,还能再熬一熬。