第九章 迭代
周五下午,林知行盯着屏幕上的测试报告,眉头拧成了一个结。
计算校验模块跑了一百道题,正确识别出六十三道错题。听起来不错,但漏掉的三十七道里,有十一道是明显的逻辑错误——比如一元二次方程的判别式符号搞反,或者三角函数的周期算错。
六成。
这个准确率拿给张老板看,跟上次没区别。
他靠在椅背上,摘下眼镜揉了揉鼻梁。宿舍里很安静,方小满不知道跑哪去了,隔壁床的室友在打游戏,键盘声噼里啪啦的。
六成。
林知行重新戴上眼镜,开始复盘那十一道漏网之鱼。
第一道题:已知方程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。”
发送。
他等了十分钟,父亲没回消息。
他放下手机,去洗脸刷牙。
回来的时候,手机有一条新消息。
是父亲的语音。
他点开。
父亲的声音从听筒里传出来,有点沙哑,带着长途驾驶后的疲惫。
“别乱花钱。”
四个字。
但林知行听出来了。
父亲的声音里,有一丝停顿。
很短,可能只有半秒钟。
但那半秒钟里,有什么东西不一样了。
他说不清那是什么。
是惊讶?是欣慰?是心疼?
还是别的什么。
他把语音又放了一遍。
“别乱花钱。”
还是那四个字,还是那一丝停顿。
林知行放下手机,躺在床上,盯着天花板。
天花板上有一道裂缝,从墙角一直延伸到灯座旁边。他以前没注意过。
他闭上眼睛。
五千块。
他赚了五千块。
他给父亲转了五百。
父亲说,别乱花钱。
但父亲的声音里,有一丝停顿。
林知行翻了个身,把脸埋进枕头里。
枕头有点潮,带着宿舍特有的霉味。
他深吸了一口气,然后慢慢吐出来。
他想起两周前,张老板说的那句话:差火候。
现在呢?
不差了。
他攥紧了枕头的一角。
不差了。