Skip to content

第九章 迭代

周五下午,林知行盯着屏幕上的测试报告,眉头拧成了一个结。

计算校验模块跑了一百道题,正确识别出六十三道错题。听起来不错,但漏掉的三十七道里,有十一道是明显的逻辑错误——比如一元二次方程的判别式符号搞反,或者三角函数的周期算错。

六成。

这个准确率拿给张老板看,跟上次没区别。

他靠在椅背上,摘下眼镜揉了揉鼻梁。宿舍里很安静,方小满不知道跑哪去了,隔壁床的室友在打游戏,键盘声噼里啪啦的。

六成。

林知行重新戴上眼镜,开始复盘那十一道漏网之鱼。

第一道题:已知方程x²-5x+6=0,求方程的两根之和。

AI生成的答案是5。计算校验模块用韦达定理验算:x₁+x₂=5,对了。但这道题被标记为“正确”放过了。

问题在哪?

林知行仔细看了看题目。两根之和,韦达定理直接能算。但题目没说方程有两个实数根。如果判别式Δ<0,方程没有实数根,也就不存在“两根之和”。

他的规则校验模块只检查了二次项系数不为零,没检查判别式的符号。

漏洞。

第二道题更隐蔽。已知sinα=3/5,求cosα。AI生成的答案是4/5。计算校验模块用公式sin²α+cos²α=1验算,(3/5)²+(4/5)²=1,对了。

但这道题被放过了。

问题在哪?

林知行盯着题目看了三分钟,突然明白了。

α的象限没给。

如果α在第一象限,cosα=4/5;如果α在第二象限,cosα=-4/5。题目没说α的范围,答案不唯一。

他的规则校验模块里,没有“三角函数需要考虑象限”这条规则。

又一个漏洞。

林知行打开一个新文档,开始列清单。

一元二次方程的规则:二次项系数不为零、判别式决定根的情况、韦达定理的使用条件、求根公式的适用范围……

三角函数的规则:象限决定符号、周期性、诱导公式……

概率统计的规则:独立事件和互斥事件的区别、排列组合的前提条件……

他列了两个小时,写满了三页纸。

然后他意识到,他不可能把所有数学规则都写进代码里。高中数学的知识点有几百个,每个知识点下面有十几条规则,排列组合一下,规则库的复杂度是O(n²)甚至O(n³)。

他的时间只有两周。

他需要换一个思路。


方小满推门进来的时候,林知行正趴在桌上睡着了。

“喂。”方小满推了推他的肩膀,“吃饭没?”

林知行抬起头,眼睛布满血丝。他看了一眼手机,晚上九点。

“几点了?”

“九点。你睡了多久?”

“不知道。”林知行活动了一下脖子,咔咔响,“可能两三个小时。”

方小满把一盒炒饭放在他桌上。“先吃饭。你这样搞下去,没等演示自己先垮了。”

林知行打开饭盒,扒了两口。炒饭是学校后门那家小馆子的,油放多了,但他饿了,吃得很香。

“校验模块搞怎么样了?”方小满坐到自己床上,点了一根烟。

“六成准确率。”

“六成?”方小满皱了皱眉,“上次不也差不多?”

“不一样。上次是生成层的问题,这次是校验层的问题。”林知行咽下一口饭,“上次AI生成的题目就是错的,这次AI生成的题目大部分是对的,但校验模块没把错题全拦住。”

“那不还是六成?”

“性质不一样。”林知行放下筷子,拿出那张写满规则的纸,“你看,我列了这么多规则,但写不进代码里。太多了,而且有些规则是隐性的,比如三角函数要考虑象限,教材上可能一句话带过,但做题的时候必须考虑。”

方小满看了一眼那张纸,密密麻麻的字,他看不懂。

“那怎么办?”

林知行沉默了一会儿。

“我想加一个人工校验层。”

“人工?”

“对。AI生成题目,规则引擎校验,计算引擎校验,最后再加一层人工校验。”林知行比划着,“前三层能拦住大部分错题,但剩下的,让人工来检查。”

“人工怎么检查?你一个人能检查多少?”

“不是我。”林知行说,“是老师。”

方小满愣了一下。“张老板?”

“对。系统生成题目后,老师可以在线审阅,标记错题,修改题目。老师改过的题目会进入一个题库,以后生成题目的时候,优先从题库里抽题,而不是每次都让AI重新生成。”

方小满听懂了。“你的意思是,让老师帮你训练这个系统?”

“不是训练,是校准。”林知行说,“AI生成的题目有错误率,但老师改过的题目就是准确的。系统会学习老师的修改模式,下次生成的时候,尽量避免类似的错误。”

“这能行吗?”

“不知道。”林知行诚实地说,“但这是目前最好的办法。我一个人写不完所有规则,但几十个老师加起来,他们的经验就是规则库。”

方小满想了一会儿。“那张老板会同意吗?他本来是想省时间,你让他人工检查,不是多此一举?”

“不一样。”林知行说,“以前老师是从零开始出题,现在是从一堆题里挑错题、改错题。工作量少很多,而且有AI打底,出题效率能提高好几倍。”

方小满点了点头。“你跟张老板说的时候,得把这个好处讲清楚。”

“我知道。”

林知行继续吃饭。炒饭有点凉了,但他不在乎。

“还有一个问题。”他咽下最后一口,“规则校验的准确率上不去,是因为我的规则库太小。我想加一个东西。”

“什么?”

“学科知识图谱。”

方小满皱眉。“啥玩意儿?”

林知行打开电脑,调出一张图。图上有很多节点,每个节点代表一个知识点,节点之间有连线,代表知识点之间的关系。

“你看,这是一元二次方程的知识图谱。”他指着屏幕,“这个节点是‘一元二次方程’,它下面有几个子节点:‘定义’‘解法’‘判别式’‘韦达定理’。每个子节点下面还有更细的知识点。”

“这有什么用?”

“用处大了。”林知行说,“比如AI生成一道题,题目里用到了韦达定理。系统会自动检查这道题有没有覆盖韦达定理的所有前提条件——比如方程必须有实数根、二次项系数不为零。如果漏了某个条件,规则校验就会拦截。”

“你的意思是,用这个图谱来检查题目?”

“对。图谱是静态的,规则是动态的。图谱告诉系统‘这个知识点有哪些规则’,规则引擎检查‘题目有没有违反这些规则’。”林知行越说越兴奋,“这样我就不需要手动写所有规则了。只要把知识图谱建好,规则可以自动生成。”

方小满听了个大概。“听起来挺牛逼的。但你两周能搞完吗?”

林知行沉默了。

他也不知道。


接下来的两周,林知行几乎没出过宿舍楼。

他把课全逃了,辅导员发消息问他怎么回事,他回了一句“在做项目”,辅导员没再追问。

方小满每天给他带饭,有时候是炒饭,有时候是面条,有时候是食堂的盒饭。林知行吃得很快,吃完就继续写代码。

第一周,他搭了知识图谱的框架。

他从网上爬取了高中数学的教材目录,把每个章节的知识点提取出来,建立节点。然后他查阅了大量的教案和习题集,分析知识点之间的依赖关系,建立连线。

这个过程比他想象的复杂。有些知识点是并列的,比如一元二次方程和一元一次方程;有些是递进的,比如函数的概念、函数的性质、函数的图像;有些是交叉的,比如三角函数和向量。

他画了几十张图,反复调整,才把数学必修一的知识图谱搭好。

第二周,他开始写人工校验层的界面。

他做了一个后台管理系统,老师登录后,可以看到系统生成的所有题目。每道题旁边有三个按钮:通过、修改、删除。老师点“修改”,可以在线编辑题目和答案;点“删除”,题目会被移出题库。

他还加了一个统计功能,记录每个老师的修改频率和修改类型。比如张老师经常修改三角函数题的象限条件,李老师经常修改概率题的独立性假设。这些数据会被用来优化规则引擎,让系统逐渐学习老师的出题习惯。

第二周的周三,他终于把整个系统跑通了。

他测试了一百道题。

AI生成一百道题,规则校验拦下三十二道,计算校验拦下十九道,剩下四十九道进入人工校验。他模拟老师的角色,检查了这四十九道题,又发现了七道错题。

最后输出四十二道题。

四十二道题,他逐一检查,全部正确。

准确率百分之百。

当然,这是在他自己检查的前提下。如果换一个老师,可能会漏掉一些错误。但至少,系统的框架是对的。

他靠在椅背上,盯着屏幕上的四十二道题,心跳得很快。

他给方小满发了一条消息:“搞定了。”

方小满秒回:“牛逼。明天去演示?”

“明天去。”


第二天下午两点,林知行和方小满再次走进了蓝天教育的办公楼。

楼梯还是那么窄,墙壁还是有点发黄,但林知行的心情和上次完全不同。

上次他是忐忑的,这次他是紧张的。

紧张和忐忑不一样。忐忑是不知道结果会怎样,紧张是知道结果很重要,但不确定自己能不能做到。

张老板还是在三楼的办公室等他们,还是那件深蓝色的polo衫,还是那盆绿萝。

“小林,坐。”张老板笑着招呼他,“这两周辛苦了吧?”

“还好。”林知行把笔记本电脑放在茶几上,手指有点发抖。

“我听小方说,你加了不少新东西?”

“对。”林知行深吸了一口气,打开系统,“张总,我重新做了整个系统。上次您提的问题,我都解决了。”

张老板点点头,示意他继续。

“上次的主要问题是题目不准确。原因有两个:第一,AI生成的题目本身有错误;第二,我没有校验机制。”林知行说,“这次我加了三层校验。”

他在屏幕上展示流程图。

“第一层,规则校验。系统会检查题目是否符合数学定义和定理。比如一元二次方程,系统会检查二次项系数是否为零、判别式的符号是否正确。”

“第二层,计算校验。系统会把题目里的数值代入公式,重新计算答案,看是否和AI生成的答案一致。”

“第三层,人工校验。”林知行顿了一下,“这是新加的。前两层校验通过的题目,会进入一个后台系统,老师可以在线审阅,标记错题,修改题目。”

张老板的眉毛挑了一下。“人工校验?”

“对。”林知行说,“我算过了,前两层校验能拦住百分之八十的错题。剩下的百分之二十,由老师来把关。老师改过的题目会进入题库,以后系统生成题目的时候,优先从题库里抽题。”

“那不是还得老师自己检查?”张老板说。

“不一样。”林知行说,“以前老师是从零开始出题,现在是从一堆题里挑错题、改错题。工作量少很多,而且有AI打底,出题效率能提高好几倍。”

张老板没说话,盯着屏幕看了一会儿。

“你演示一下。”

林知行输入“一元二次方程”,点击生成。

屏幕上出现了五道题。

第一题:已知方程x²-5x+6=0,求方程的两个根。

第二题:若一元二次方程ax²+bx+c=0有两个相等的实数根,则判别式Δ=____。

第三题:已知关于x的方程(m-1)x²+2mx+m+3=0有两个不相等的实数根,且m≠1,求m的取值范围。

第四题:若方程x²-2x+k=0的两根x₁、x₂满足x₁²+x₂²=10,求k的值。

第五题:已知方程2x²-3x-2=0的两根为x₁、x₂,求x₁²+x₂²的值。

张老板弯下腰,仔细看每一道题。

第一题,没问题。

第二题,没问题。

第三题,他多看了一眼。“这个m≠1是你们加的?”

“对。”林知行说,“这是规则校验自动加的。一元二次方程要求二次项系数不为零,所以m-1≠0,也就是m≠1。”

张老板点了点头。

第四题,他看了一会儿。“答案是多少?”

林知行点开答案区域。k=-3。

张老板心算了一下。“对的。”

第五题,答案是4.25。张老板也算了一下,点了点头。

“再试试三角函数。”

林知行输入“三角函数”,生成五道题。

第一题:已知sinα=3/5,α∈(0,π),求cosα。

张老板看着题目,眉头舒展开来。“这个α∈(0,π)是你们加的?”

“对。”林知行说,“这是知识图谱自动加的。三角函数题必须给定角的范围,否则答案不唯一。系统检测到题目里没有给定范围,就自动补了一个常见范围。”

“不错。”张老板说,“再试试困难的。”

林知行把难度调到“困难”,重新生成。

新的题目出来了。第一题是一道综合题,涉及一元二次方程和三角函数的交叉。

已知关于x的方程x²-2x·sinα+1=0有两个实数根,且α∈(0,π/2),求α的取值范围。

张老板盯着题目看了很久。

林知行的心跳得很快。这道题是他手动设计的测试用例,专门用来测试系统处理交叉知识点的能力。

“这道题……”张老板抬起头,看着林知行,“是你们系统生成的?”

“是。”林知行说,“系统检测到题目涉及两个知识点,就自动调用了两个知识图谱,确保题目的条件完整。”

张老板又看了一会儿,突然笑了。

“小林,”他说,“你这个系统,比我想象的好。”

林知行的心跳漏了一拍。

“上次我跟你说差火候,这次……”张老板顿了一下,“不差了。”

林知行的喉咙发紧,说不出话。

“人工校验这个想法很好。”张老板说,“老师不需要从零开始出题,只需要在AI的基础上修改。这样效率高,而且有AI打底,出题的质量也有保障。”

他站起来,走到办公桌前,拿出一份合同。

“这是我们的合作协议,你看看。”

林知行接过合同,手有点抖。

合同很简单,一页纸。甲方是蓝天教育咨询有限公司,乙方是林知行。合作内容是“智能题库系统定制开发”,合作期限一年,总费用五千元。

五千元。

林知行盯着那个数字,感觉有点不真实。

“有问题吗?”张老板问。

“没有。”林知行说,“没问题。”

“那就签吧。”张老板递过来一支笔。

林知行接过笔,在乙方签名处写下自己的名字。笔尖在纸上划过,发出轻微的沙沙声。

签完字,张老板从抽屉里拿出一个信封,放在茶几上。

“这是现金,你数数。”

林知行打开信封。里面是五十张百元钞票,崭新的,带着油墨的味道。

他数了两遍,五千块。

“没问题。”他说。

“好。”张老板伸出手,“合作愉快。”

林知行握了握他的手。手心还是那么粗糙,但这次,他感觉那粗糙里有一种温度。

“合作愉快。”


走出蓝天教育的办公楼,林知行的手一直在发抖。

方小满在旁边说着什么,他没听清。他满脑子都是那个信封,那五十张钞票,那五千块钱。

五千块。

他父亲跑一趟长途,四天,两千八百块。

他花了两周,五千块。

他站在人行道上,低头看着手里的信封。阳光照在信封上,反射出刺眼的白光。

“喂,你没事吧?”方小满拍了拍他的肩膀。

林知行抬起头。“没事。”

“你手在抖。”

林知行看了看自己的手。确实在抖。

“可能是……太激动了。”他说。

方小满笑了。“第一次赚这么多钱,正常。我第一次拿提成的时候,手也抖。”

林知行没说话。他把信封塞进裤兜里,用手按住。

“走吧,回学校。”

“不吃饭庆祝一下?”

“先回学校。”林知行说,“我得给家里打个钱。”

方小满愣了一下,然后点了点头。“行。”


回到宿舍,林知行打开手机银行。

他看着余额:1247.32元。

他输入转账金额:500。

收款人:林建国。

他盯着那个数字看了很久。

500。

他父亲一个月给他转1500生活费。500是他生活费的三分之一。

他点了确认。

转账成功。

他放下手机,坐在床边,盯着地面。

方小满去洗澡了,宿舍里很安静。窗外传来篮球场的声音,有人在打球,球鞋摩擦地面的声音很刺耳。

他拿起手机,给父亲发了一条消息:“爸,我赚钱了,给你转了500。”

发送。

他等了十分钟,父亲没回消息。

他放下手机,去洗脸刷牙。

回来的时候,手机有一条新消息。

是父亲的语音。

他点开。

父亲的声音从听筒里传出来,有点沙哑,带着长途驾驶后的疲惫。

“别乱花钱。”

四个字。

但林知行听出来了。

父亲的声音里,有一丝停顿。

很短,可能只有半秒钟。

但那半秒钟里,有什么东西不一样了。

他说不清那是什么。

是惊讶?是欣慰?是心疼?

还是别的什么。

他把语音又放了一遍。

“别乱花钱。”

还是那四个字,还是那一丝停顿。

林知行放下手机,躺在床上,盯着天花板。

天花板上有一道裂缝,从墙角一直延伸到灯座旁边。他以前没注意过。

他闭上眼睛。

五千块。

他赚了五千块。

他给父亲转了五百。

父亲说,别乱花钱。

但父亲的声音里,有一丝停顿。

林知行翻了个身,把脸埋进枕头里。

枕头有点潮,带着宿舍特有的霉味。

他深吸了一口气,然后慢慢吐出来。

他想起两周前,张老板说的那句话:差火候。

现在呢?

不差了。

他攥紧了枕头的一角。

不差了。