它解决什么问题
每次考完试,成绩表发下来:这个孩子 78 分,那个 63 分。
然后呢?78 分说明他会了什么、不会什么?下次该先补哪一块?——成绩表回答不了。老师凭经验猜,家长只能着急。
这套系统要回答的就是这一层:把分数拆开,落到具体的知识点上,让"下一步补什么"有依据。
最初要的是什么
开工之前,需求被写成了三条,加上一条数据来源的约定:
- 根据学生试卷题目的得分做学情分析(不是只看总分)
- 分析要包括:知识点分析、班级排名、以及知识点掌握对比——把同一个知识点在这次和上次考试里的表现放在一起比
- 按角色出不同侧重的报告:给老师一份,给家长一份
数据从哪来,当时也定好了:先做 Excel 导入,拍照识别放到第三期。
需求方当场还补了一句很关键的话:拍照识别不只是认出分数,还要能自动认出试卷的结构——题号、每题多少分、这道题考的是什么知识点。
它怎么运转
第一步:数据从哪来
这一点很现实,也很容易被忽略:学校和机构的数据,都躺在 Excel 和 Word 里。
成绩是 Excel 表格,试卷是 Word 文档。没有谁会替你整理成标准格式再交给你。
所以这套系统专门做了两个"导入"的部件:一个读 Excel 的成绩表,一个读 Word 的试卷。数据进不来,后面分析得再好也没用。
第二步:把题目和知识点连起来
为什么它算得出"卡在哪个知识点"?因为它在题目和知识点之间建了一层关联。
知识本身是分层的——一个大知识点下面挂着若干小知识点。每道题、每份试卷,都关联到具体的知识点上。
有了这层关联,才可能算出:这个学生在"分数的四则运算"上错了 4 题、在"应用题理解"上错了 1 题——而不是只知道他考了 63 分。
它做出来的东西长什么样
下面是这套系统跑出来的一份真实输出。数据是虚拟的(用的是系统自带的演示数据),但计算过程和分析结构是真的。
先看一场考试的整体情况
| 分数段 | 人数 | |
|---|---|---|
| 40–49 | 4 | ████████ |
| 30–39 | 11 | ██████████████████████ |
| 20–29 | 8 | ████████████████ |
| 10–19 | 2 | ████ |
这一步只说明"全班考得怎么样"。要回答"某个孩子卡在哪",得往下看。
同一个孩子,分数就变成了信息
这位学生这场考了 16.7 分。单看这个数字,你只知道他考得不好。
系统把它拆到知识点上之后:
| 知识点 | 题数 | 得分率 | |
|---|---|---|---|
| 阅读理解 | 5 | 25.4% | ← 最弱 |
| 完形填空 | 4 | 25.5% | |
| 书面表达 | 5 | 26.6% | |
| 听力理解 | 5 | 28.8% | |
| 词汇语法 | 1 | 30.0% |
而且这个结论是算出来的,不是猜的:每道题考什么知识点是提前关联好的,学生每道题得多少分是有记录的。把两者一对,就得出了上面这张表。
三类报告,给三种人看
- 班级报告 —— 给老师看整体:这次考试全班哪里弱、哪些题错得多
- 教师报告 —— 看教学效果,哪些知识点讲了但没讲透
- 家长报告 —— 给家长看自家孩子:强在哪、弱在哪、建议先补什么
同一批数据,三种人关心的事完全不同。给家长的报里塞满全班排名,家长看不懂也没用。
除了报告,它还会盯着两件事
- 变化:同一个学生、同一个知识点,几次考试之间是在往上走还是往下掉
- 异常:自动挑出需要关注的学生——成绩下滑、偏科、波动过大
还有一项专门的数据体检:检查数据质量、试卷有没有按统一模板出、知识点覆盖率够不够。分析之前先确认底下的数据靠不靠得住——这一步不做,报告越漂亮越危险。
落地情况
这套系统已在客户公司落地试点过。
它不是在开发者自己电脑上跑跑的样品——完整的网页、背后的处理程序、数据库都装到了服务器上,有一个正式的访问地址,学校的人打开就能用。
它现在没有公开入口了(相关内容已从公网撤下)。这一页展示的,是它当时真实跑出来的东西。
里面的数据
这一页展示的示例数据是虚拟的——系统自带的演示数据,学生姓名由程序从姓氏表与名字表随机组合生成,不对应任何真人。
但这套系统的用途,是处理真实的学生信息:档案、成绩、家长报告、排名,家长报告里还会写明孩子的短板和波动。这类数据天生敏感。
所以一套会上真实数据的系统,在接真数据之前就得先回答:谁能看、能看多少、看的时候留不留痕迹、离职的人还能不能进得去。
这不是"以后再补"的功能,是动手时就要划的边界。等系统跑起来、数据进来了再想这件事,通常已经晚了。
它是怎么做出来的
这套系统的开发过程也留下了记录。下面是它真实的生长轨迹——从六月五日到六月二十五日,二十天。
六月五日:先跑通一条最短的路
第一天做完的是"能从 Excel 导入成绩、能算出知识点分析、能出老师和家长两份报告"。数据只有八类,够用就行。
同一天还把做网页的那套工具换了一次——原本用的一套发现不合适,改成了另一种。第一版就换,比做到一半再换便宜得多。
六月十一日:家长报告从"汇报结果"改成"给出洞察"
原来的家长报告是把结果念一遍:考了多少分、排第几、哪几题错了。改完之后要回答的是——这说明什么、下一步该做什么。
同一个改动里还有个细节:家长报告不暴露班里其他孩子的分数,只说区间排名。这份报告是给家长看的,不是给他去比别人的。
六月十五日:需求整个扩大了一次
这一天需求被重新规划了一遍——从「给老师和家长看成绩分析」,扩成老板视角的六个场景:全局总览、教师效能对比、退学预警、家长满意度、招生数据支撑、标准化管理。
六个场景被分成五期做,这一轮只做前两个。落到具体改动上:校区和教师也成了数据里的一等公民,「自动找出需要关注的学生」从这里开始做。
六月十六日到十八日:造演示数据时,「班」一步步长歪
系统里的「班」只是一个名字——「七年级火箭班」「八年级平行班」,不带科目。而考试是带科目的。
造演示数据时,这个缺口直接长成了数据。先是六月十六日:脚本里的原话是"每个班先给数学考试,八年级九年级再随机加物理或化学"——一个「八年级火箭班」,数学和物理的考试混在了一起。
然后六月十八日,又给同一批班名补了别的科目:「七年级火箭班」名下,既有英语,又有数学,还有语文。
(这两天另一条线的工作:考试详情页加了班级对比表和 AI 评语。)
六月二十四日:把语文和英语加了进来
这一天语文和英语作为完整的科目补了进来——老师、班级、试卷、考试、成绩,一整套。
值得注意的是:这一批新加的班,名字里是带科目的——「七年级英语A班」「七年级语文A班」。也就是说,人已经知道英语班和语文班是两个班了。
但老的那批班(七年级火箭班、八年级平行班)还是老样子:一个名字,挂着好几门课的考试。
六月二十五日:一次彻底的结构重构
转折点出现在这里。业务方打开班级列表,看到了一个问题:「八年级平行C班」名下同时挂着数学、英语、语文三门课的考试。
可现实里不会这样——英语班和语文班是两个不同的班。
问题不在于谁不懂业务,而在于:「英语班和语文班是两个班」这句话,在培训机构的日常里根本不需要说(排课的人心里门儿清,特意说一句反倒奇怪)。但系统里的「班」只是一个名字,你不说,它就当它们是同一个。
当时摆在面前的是两个选择:
- 省事的做法:只把班级名字改掉,让它看起来像单科班
- 彻底的做法:给班级加上"科目"这一列、建一张"哪个学生属于哪个班"的关联表、把每个班按科目拆成若干个、把已有的考试重新归属
选了后者。因为只改名字的话,底下的数据还是"一班多科目",下次做任何一张新报表,都会再撞上同一个问题。
代价是真实的:当时库里有 12 个班,每一个都挂着不止一门课的考试,这些都要拆开重排。而且那个用来搬迁数据的程序,第一次还没写成就失败了,得重写一遍才跑起来。
拆完之后,班级变成了这样——名字里带科目,一个班只考一门课:
| 拆之前 | 拆之后 |
|---|---|
| 八年级平行C班 (挂着数学、英语、语文的考试) |
八年级数学平行C班 / 八年级英语平行C班 / 八年级语文平行C班 (各考各的,共 48 个班) |
这就是为什么"改主意要留记录"不是形式主义。不留,你今天看得懂是因为那几个程序还在;人一走、程序一删,就没有人说得清了。
还有一个小 bug,很典型
学生档案页上曾经出现过一个荒唐的数字:某个学生的成绩显示为 "-3849% vs 班级"。
查下来原因很简单:两个数单位不一样——一个是"百分比"(43.7),另一个是"原始分数"(38.93),公式把它们直接减了一下。换成同一个单位,结果就正常了。
看到荒谬的数字,第一反应不该是"数据错了",而是"这两个数是不是一个口径"。
我是怎么和 AI 对话的
这套系统是我和 AI 一起做出来的。回头看,我跟它说话的方式其实很固定,能归成几条——这几条比任何技巧都管用。
一、说"给谁用、他要做什么决定",不说"我要什么功能"
需求扩大到管理端那一次,我没有列功能,而是把老板关心的六件事直接摆出来:全局总览、教师效能对比、退学预警、家长满意度、招生数据支撑、标准化管理。
这六个场景不是我"想要的功能",是使用者真实要做的判断。AI 拿到这个,就能自己推出该做什么页面、该算什么数。
二、把自己的行内知识倒进去
AI 不知道你们这一行的规矩。所以每次都要把你知道的喂给它:
- 拍照识别不只是认出分数,还要能认出试卷结构——题号、每题多少分、这道题考什么知识点
- 家长报告里不能出现别的孩子的分数,只能说区间排名
- 一个班只上一门课——这是行业常识
最后那条我说得太晚。你不说的,它不会知道。
三、只描述现象,不猜原因
有一天学生档案页上出现一个荒唐的数字,某个学生的成绩显示成 -3849%。
我就把这一行发给它。
我没猜为什么,也没让它"检查一下代码"。我说我看到了什么,它去查根因——最后查出来是两个数单位不一致:一个是百分比,一个是原始分数,公式把它们直接减了一下。
四、指令可以很短——只要前面说清楚了
要把做网页的那套工具换掉,我只回了三个字:
按 Next。
它就把整个前端换掉了。
短指令能生效,不是因为它聪明,是因为前面已经把上下文铺够了。没有前面的铺垫,三个字只会换来一句"您指的是什么"。
五、在岔路口,自己拍板
有几处它把选择摆到我面前,我没有让它"你自己决定":
- 只把班级名字改掉,还是把班级按科目彻底拆开——选了彻底重构
- "先做竞品调研"还是"直接出设计方案"——选了直接出方案
- "先写方案再动手"还是"边做边看"——选了先出方案,它反过来问我规模和部署方式
这些是业务判断,不是技术判断。它给选项,我做选择,这才是它该干的活。
六、动手之前,先让它把方案写出来
这个项目有几轮是先规划、再动手的:它先交一份方案,我确认,它才开始改。
看起来慢,其实快——因为返工的成本远高于多写一份方案。上面那次「班」的重构就吃过这个教训:动手前没把"一个班到底是什么"问清楚,最后要动的是整个数据底座。
AI 对话里的几个词
和 AI 打交道,会反复听到下面这些词。它们是这门"语言"的基本词汇,弄懂了就能听懂它在说什么。
| 词 | 其实是什么意思 |
|---|---|
| 提示词 | 你打给 AI 的那段话。整段都算,不只是第一句 |
| 上下文 | AI 此刻能看见的全部内容——你说过的话、它读过的文件、它自己刚做过的事 |
| 上下文窗口 | 它一次最多能看多少。超过就得丢掉一些,这就是长对话里它会"忘事"的原因 |
| token | AI 读写的计量单位,按它算长度和费用。中文一句话通常是十几个到几十个 |
| 幻觉 | AI 一本正经地说出不存在的事——而且说假话的语气和说真话一模一样,这才是它危险的地方 |
| 会话 | 一次对话。关掉再开,它默认不记得上次说过什么 |
| 智能体 | 不只会说、还会动手的 AI——能读文件、跑命令、改东西。"AI 编程"靠的就是这个 |
| 工具调用 | 它动手的那一下:读一个文件、执行一条命令、查一次网页 |
| 计划模式 | 先出方案,等你点头再动手。适合改动大的活——免得它埋头做了一堆不是你要的 |
从这个案例能学到什么
- 你眼里"这还用说"的常识,是系统最该知道、也最容易漏掉的——而"不对劲",往往也是你第一个看见
- 需求会长大——从服务两个角色,长成服务三个角色
- 改主意要留记录,否则只剩一堆没人看得懂的搬迁程序
- 数据能不能进得来,往往比分析做得好不好更决定成败
- 能回答什么问题,取决于你把数据连成了什么样;该说什么话,取决于给谁看
- 看着荒谬的数字,多半是两个数口径不一致
- 涉及真人隐私的系统,边界要在动手时就划好