案例二

学情分析

考完试只有分数,看不出孩子卡在哪。这套系统要把"卡在哪"回答出来。

它解决什么问题

每次考完试,成绩表发下来:这个孩子 78 分,那个 63 分。

然后呢?78 分说明他会了什么、不会什么?下次该先补哪一块?——成绩表回答不了。老师凭经验猜,家长只能着急。

这套系统要回答的就是这一层:把分数拆开,落到具体的知识点上,让"下一步补什么"有依据。

最初要的是什么

开工之前,需求被写成了三条,加上一条数据来源的约定:

  1. 根据学生试卷题目的得分做学情分析(不是只看总分)
  2. 分析要包括:知识点分析、班级排名、以及知识点掌握对比——把同一个知识点在这次和上次考试里的表现放在一起比
  3. 按角色出不同侧重的报告:给老师一份,给家长一份

数据从哪来,当时也定好了:先做 Excel 导入,拍照识别放到第三期。

需求方当场还补了一句很关键的话:拍照识别不只是认出分数,还要能自动认出试卷的结构——题号、每题多少分、这道题考的是什么知识点。

这句话其实决定了整个系统的样子。如果只知道分数,这就是个算平均分的工具;要知道每道题考什么知识点,才可能回答"这个孩子卡在哪"。所以这一层从一开始就在需求里——最早那版 Excel 表格就带着「题号 / 知识点 / 满分」这几列。

它怎么运转

第一步:数据从哪来

这一点很现实,也很容易被忽略:学校和机构的数据,都躺在 Excel 和 Word 里。

成绩是 Excel 表格,试卷是 Word 文档。没有谁会替你整理成标准格式再交给你。

所以这套系统专门做了两个"导入"的部件:一个读 Excel 的成绩表,一个读 Word 的试卷。数据进不来,后面分析得再好也没用。

这是很多系统真正卡住的地方。不是分析做不出来,是数据进不来、或者进来的时候格式千奇百怪。谁把"导入"这一头做扎实,谁的系统才能真的用起来。

第二步:把题目和知识点连起来

为什么它算得出"卡在哪个知识点"?因为它在题目和知识点之间建了一层关联。

知识本身是分层的——一个大知识点下面挂着若干小知识点。每道题、每份试卷,都关联到具体的知识点上。

试卷↔ 题目↔ 知识点(分层)

有了这层关联,才可能算出:这个学生在"分数的四则运算"上错了 4 题、在"应用题理解"上错了 1 题——而不是只知道他考了 63 分。

换句话说:不能只看总分,得知道每道题考的是什么。这一步不做,系统就只是个算平均分的工具。

它做出来的东西长什么样

下面是这套系统跑出来的一份真实输出。数据是虚拟的(用的是系统自带的演示数据),但计算过程和分析结构是真的。

先看一场考试的整体情况

2026年06月平行班阶段练习 满分 60
25 人参加 平均 31.9 最高 47.4 最低 16.7
分数段人数
40–494████████
30–3911██████████████████████
20–298████████████████
10–192████

这一步只说明"全班考得怎么样"。要回答"某个孩子卡在哪",得往下看。

同一个孩子,分数就变成了信息

这位学生这场考了 16.7 分。单看这个数字,你只知道他考得不好。

系统把它拆到知识点上之后:

知识点题数得分率
阅读理解525.4%← 最弱
完形填空425.5%
书面表达526.6%
听力理解528.8%
词汇语法130.0%
这就是这套系统存在的理由。「16.7 分」没法行动;「阅读理解和完形填空最弱,得分率只有 25% 左右」才能行动——家长知道该补什么,老师知道上课该多讲哪一块。

而且这个结论是算出来的,不是猜的:每道题考什么知识点是提前关联好的,学生每道题得多少分是有记录的。把两者一对,就得出了上面这张表。

三类报告,给三种人看

同一批数据,三种人关心的事完全不同。给家长的报里塞满全班排名,家长看不懂也没用。

除了报告,它还会盯着两件事

还有一项专门的数据体检:检查数据质量、试卷有没有按统一模板出、知识点覆盖率够不够。分析之前先确认底下的数据靠不靠得住——这一步不做,报告越漂亮越危险。

落地情况

这套系统已在客户公司落地试点过。

它不是在开发者自己电脑上跑跑的样品——完整的网页、背后的处理程序、数据库都装到了服务器上,有一个正式的访问地址,学校的人打开就能用。

上面那次「班」的改造,正因为它真的在客户那里跑,才会暴露出来。如果它只是个没人用的样品,数据长什么样都没人在意,也不会有人打开班级列表去看那一行。

它现在没有公开入口了(相关内容已从公网撤下)。这一页展示的,是它当时真实跑出来的东西。

里面的数据

这一页展示的示例数据是虚拟的——系统自带的演示数据,学生姓名由程序从姓氏表与名字表随机组合生成,不对应任何真人。

但这套系统的用途,是处理真实的学生信息:档案、成绩、家长报告、排名,家长报告里还会写明孩子的短板和波动。这类数据天生敏感。

所以一套会上真实数据的系统,在接真数据之前就得先回答:谁能看、能看多少、看的时候留不留痕迹、离职的人还能不能进得去。

这不是"以后再补"的功能,是动手时就要划的边界。等系统跑起来、数据进来了再想这件事,通常已经晚了。

它是怎么做出来的

这套系统的开发过程也留下了记录。下面是它真实的生长轨迹——从六月五日到六月二十五日,二十天。

六月五日:先跑通一条最短的路

第一天做完的是"能从 Excel 导入成绩、能算出知识点分析、能出老师和家长两份报告"。数据只有八类,够用就行。

同一天还把做网页的那套工具换了一次——原本用的一套发现不合适,改成了另一种。第一版就换,比做到一半再换便宜得多。

六月十一日:家长报告从"汇报结果"改成"给出洞察"

原来的家长报告是把结果念一遍:考了多少分、排第几、哪几题错了。改完之后要回答的是——这说明什么、下一步该做什么。

同一个改动里还有个细节:家长报告不暴露班里其他孩子的分数,只说区间排名。这份报告是给家长看的,不是给他去比别人的。

六月十五日:需求整个扩大了一次

这一天需求被重新规划了一遍——从「给老师和家长看成绩分析」,扩成老板视角的六个场景:全局总览、教师效能对比、退学预警、家长满意度、招生数据支撑、标准化管理。

六个场景被分成五期做,这一轮只做前两个。落到具体改动上:校区和教师也成了数据里的一等公民,「自动找出需要关注的学生」从这里开始做。

这是这套系统最重要的一次转折。在此之前它服务两个角色——老师和家长;之后要服务第三个角色:校长。而这个角色关心的东西完全不一样:他不看某个学生考了多少分,他看哪个校区、哪个老师、哪个班出了问题。

六月十六日到十八日:造演示数据时,「班」一步步长歪

系统里的「班」只是一个名字——「七年级火箭班」「八年级平行班」,不带科目。而考试是带科目的。

造演示数据时,这个缺口直接长成了数据。先是六月十六日:脚本里的原话是"每个班先给数学考试,八年级九年级再随机加物理或化学"——一个「八年级火箭班」,数学和物理的考试混在了一起。

然后六月十八日,又给同一批班名补了别的科目:「七年级火箭班」名下,既有英语,又有数学,还有语文。

(这两天另一条线的工作:考试详情页加了班级对比表和 AI 评语。)

六月二十四日:把语文和英语加了进来

这一天语文和英语作为完整的科目补了进来——老师、班级、试卷、考试、成绩,一整套。

值得注意的是:这一批新加的班,名字里是带科目的——「七年级英语A班」「七年级语文A班」。也就是说,人已经知道英语班和语文班是两个班了。

但老的那批班(七年级火箭班、八年级平行班)还是老样子:一个名字,挂着好几门课的考试。

六月二十五日:一次彻底的结构重构

转折点出现在这里。业务方打开班级列表,看到了一个问题:「八年级平行C班」名下同时挂着数学、英语、语文三门课的考试。

可现实里不会这样——英语班和语文班是两个不同的班。

问题不在于谁不懂业务,而在于:「英语班和语文班是两个班」这句话,在培训机构的日常里根本不需要说(排课的人心里门儿清,特意说一句反倒奇怪)。但系统里的「班」只是一个名字,你不说,它就当它们是同一个。

当时摆在面前的是两个选择:

选了后者。因为只改名字的话,底下的数据还是"一班多科目",下次做任何一张新报表,都会再撞上同一个问题。

代价是真实的:当时库里有 12 个班,每一个都挂着不止一门课的考试,这些都要拆开重排。而且那个用来搬迁数据的程序,第一次还没写成就失败了,得重写一遍才跑起来。

拆完之后,班级变成了这样——名字里带科目,一个班只考一门课:

拆之前拆之后
八年级平行C班
(挂着数学、英语、语文的考试)
八年级数学平行C班 / 八年级英语平行C班 / 八年级语文平行C班
(各考各的,共 48 个班)
这件事的教训,比技术本身重要得多:「英语班和语文班是两个不同的班」这件事,在培训机构做久了的人看来根本不需要提;可对系统来说,它是一条地基假设。这条假设没写下来,要动的是整个数据底座。而且——这件事是怎么被记下来的?只有那几个用来搬迁数据的程序还躺在文件夹里。没有一份文档写清"当初为什么这么设计、后来为什么要改"。

这就是为什么"改主意要留记录"不是形式主义。不留,你今天看得懂是因为那几个程序还在;人一走、程序一删,就没有人说得清了。

还有一个小 bug,很典型

学生档案页上曾经出现过一个荒唐的数字:某个学生的成绩显示为 "-3849% vs 班级"。

查下来原因很简单:两个数单位不一样——一个是"百分比"(43.7),另一个是"原始分数"(38.93),公式把它们直接减了一下。换成同一个单位,结果就正常了。

看到荒谬的数字,第一反应不该是"数据错了",而是"这两个数是不是一个口径"。

我是怎么和 AI 对话的

这套系统是我和 AI 一起做出来的。回头看,我跟它说话的方式其实很固定,能归成几条——这几条比任何技巧都管用。

一、说"给谁用、他要做什么决定",不说"我要什么功能"

需求扩大到管理端那一次,我没有列功能,而是把老板关心的六件事直接摆出来:全局总览、教师效能对比、退学预警、家长满意度、招生数据支撑、标准化管理。

这六个场景不是我"想要的功能",是使用者真实要做的判断。AI 拿到这个,就能自己推出该做什么页面、该算什么数。

这是最省时间的一条。你给判断标准,它想实现方式。反过来——你去想实现方式,它猜你要什么——两边都慢。

二、把自己的行内知识倒进去

AI 不知道你们这一行的规矩。所以每次都要把你知道的喂给它:

最后那条我说得太晚。你不说的,它不会知道。

三、只描述现象,不猜原因

有一天学生档案页上出现一个荒唐的数字,某个学生的成绩显示成 -3849%。

我就把这一行发给它。

我没猜为什么,也没让它"检查一下代码"。我说我看到了什么,它去查根因——最后查出来是两个数单位不一致:一个是百分比,一个是原始分数,公式把它们直接减了一下。

为什么不要自己猜原因:猜错了会把 AI 带偏到错误的方向,白跑一轮。你的强项是"看出哪里不对",不是"判断代码哪里错"。

四、指令可以很短——只要前面说清楚了

要把做网页的那套工具换掉,我只回了三个字:

按 Next。

它就把整个前端换掉了。

短指令能生效,不是因为它聪明,是因为前面已经把上下文铺够了。没有前面的铺垫,三个字只会换来一句"您指的是什么"。

五、在岔路口,自己拍板

有几处它把选择摆到我面前,我没有让它"你自己决定":

这些是业务判断,不是技术判断。它给选项,我做选择,这才是它该干的活。

六、动手之前,先让它把方案写出来

这个项目有几轮是先规划、再动手的:它先交一份方案,我确认,它才开始改。

看起来慢,其实快——因为返工的成本远高于多写一份方案。上面那次「班」的重构就吃过这个教训:动手前没把"一个班到底是什么"问清楚,最后要动的是整个数据底座。

六条归成一句:你负责"要什么、什么算对、走哪条路",AI 负责"怎么实现"。这个分工一旦反过来,两边都累。

AI 对话里的几个词

和 AI 打交道,会反复听到下面这些词。它们是这门"语言"的基本词汇,弄懂了就能听懂它在说什么。

词其实是什么意思
提示词你打给 AI 的那段话。整段都算,不只是第一句
上下文AI 此刻能看见的全部内容——你说过的话、它读过的文件、它自己刚做过的事
上下文窗口它一次最多能看多少。超过就得丢掉一些,这就是长对话里它会"忘事"的原因
tokenAI 读写的计量单位,按它算长度和费用。中文一句话通常是十几个到几十个
幻觉AI 一本正经地说出不存在的事——而且说假话的语气和说真话一模一样,这才是它危险的地方
会话一次对话。关掉再开,它默认不记得上次说过什么
智能体不只会说、还会动手的 AI——能读文件、跑命令、改东西。"AI 编程"靠的就是这个
工具调用它动手的那一下:读一个文件、执行一条命令、查一次网页
计划模式先出方案,等你点头再动手。适合改动大的活——免得它埋头做了一堆不是你要的

从这个案例能学到什么

← 回到「业务系统搭建教学」