Product Portfolio · 可见课堂 / Teacher OS

老师说一句话,
拿到一份能直接印的卷子

面向 A-Level / IB / AP 国际课程独立老师的微信小程序。它把备课出卷、作业批改、和向家长交代这三件反复消耗老师的事,收成一条能沉淀下来的产线。
后端已上线,六科题库已开放,整条组卷链路真实跑通。

api.teacheros.cn 后端已上线 6 科 · 5,239 一句话 → PDF 全流程真实产出
小程序中的自然语言组卷对话界面:老师用一句话描述出卷需求
The Problem · 问题

老师要的东西,题库听不懂

独立老师给一个学生出一份针对性的练习,真实动作是这样的:翻出十几份历年真题 PDF → 一页页找符合这个知识点的题 → 截图 → 贴进 Word → 再去另一份文件里找对应答案 → 排版 → 导出。走完这一整套,才换来四道题。而下一个学生要练别的知识点,整套重来。

老师脑子里的句子
"我要一套 P1 的积分,别太难也别太简单,30 分钟能做完。" —— 这是产品里真实被输入的一句话
题库里的组织方式

WMA11/01 · Unit P1 · 9709 Paper 3 · 章节编码 · 考季代号

这套编码是考试局视角——它为命题和评分服务,按考纲归档。老师是教学视角——按"这类题怎么讲、常用哪个方法、学生一般卡在哪"来组织。

结论 两套语言错位,结果很直接:让老师用考纲编码去检索,他就不会用。所以这个产品的入口不是筛选器,是一句话。
Live Replay · 真实回放

那一句话,到那份 PDF,中间发生了什么

下面是 2026-07-30 那次真实组卷的逐帧回放。左边是系统在做的事,右边是老师看到的界面,最后打开的是那一次真正生成出来的 PDF

Session Replay 真实会话回放 · 非实时调用 · 2026-07-30 13:39 UTC
回放中的小程序界面

注意第二组里的 difficulty → 中等(unit 内分位):难度不是靠题号猜的,是同一 unit 内的分位数,同一句需求两次生成,难度分布一致。这一条后面还会再提,因为它有个诚实的尾巴。

这次回放跑的是学生账号 本页所有截图和那两份 PDF,都来自一个学生身份的真实会话——生成的 PDF 页脚里那个 student 就是这么来的,我没有把它 P 掉。 组卷是同一套引擎、两个入口:老师用它出卷并「布置给学生」(预览页上就有这个按钮),学生用它按章节自主练习。 产品定位仍然在老师侧,学生端的自主练习是同一能力的复用——一套检索约束,两种使用场景,这也是我当初决定把组卷做成独立能力、而不是塞进作业流的原因。
Try It · 试玩

你自己敲一句试试

这不是玩具——它就是产品里那条解析漏斗的第 1–2 级:意图词表 + 目录解析 + 正则,完全不调用大模型。产品中约七成的对话轮次到这里就结束了,一个 token 都不花。

Slot Filling · 槽位解析 前端规则演示,不连真实题库
The Flow · 完整流程

九屏,一条完整链路

全部是真机截图。手机屏幕跟着你往下读换屏——每一步下面那条黄色的旁注,是这一屏背后的产品判断。

STEP 01

入口放在最显眼的位置

底部导航正中央那颗凸起的黄色「组卷」按钮,是整个 App 唯一一个跳出 tab 栏的元素。

判断:这是用户每天都会做的动作,不能藏在二级页里。入口的层级,就是你对使用频率的判断。
STEP 02

两条路,不强迫任何人说话

「自然语言组卷(推荐)」和「章节组卷」并列。后者是老老实实的三级筛选器:考试局 → 科目 → 单元。

判断:不是所有人都习惯对着 App 说需求。把老方法完整保留,新方法标成推荐——让用户自己迁移,而不是逼他迁移。
STEP 03

一句话,然后系统把它读回来

系统没有直接生成,而是复述了一遍理解:"爱德思数学 P1 的积分练习题,难度适中,30 分钟内可完成",并告诉你这个范围一共 30 题可选。

判断:复述是把责任交还给人。AI 理解错了,老师在这一步就能拦住,而不是拿到一份废卷子才发现。
STEP 04

每一道题都可以被推翻

换一道、上移、下移、删除。每题带完整来源:原题 2023 年 1 月考季 · Pure Mathematics P1 (WMA11) · 第 3 题

判断:AI 出的卷子必须可以被逐题否决,否则老师不敢把它发给学生。「可推翻」比「更准」更重要。
STEP 05

印之前,先看清楚考了什么

章节分布条:Integration 积分 4 题 27 分 100%。加上题目数、满分、预估时长、覆盖章节。

判断:老师需要向学生和家长解释"这份卷子练的是什么"。这张分布图不是给系统看的,是给他转述用的。
STEP 06

慢操作必须有可见的进度

合成 PDF 要几秒到十几秒,页面给了一条实时进度条。

判断:没有进度条的等待,用户会认为是卡死然后退出。这类地方省不得。
STEP 07

题目卷和答案卷,必须是两个文件

生成完成后是两个独立入口:查看题目卷 PDF / 查看答案卷 PDF。还有「生成平行卷」和「布置给学生」。

判断:合在一个文件里,老师发给学生时会连答案一起发出去。这是个只有真用过的人才会踩到的坑。
STEP 08

产出物本身要经得起看

标准试卷版式:TIME / PAPER REFERENCE(S) / QUESTIONS / TOTAL MARKS,每题上方标来源考季与原题号,通页水印,页脚带溯源信息。

判断:老师会把这份 PDF 直接打印发给学生。它不能看起来像"某个工具导出的东西",得看起来像一份卷子。
STEP 09

出过的卷子沉淀下来

组卷列表区分「草稿 / 已生成」,可复制、可删除。复制一份改两道题,就是下一个学生的卷子。

判断:一次性工具不产生复利。让产出物可复用,用户的第二次使用成本才会低于第一次。
学生端首页,底部中央为组卷入口 选择组卷方式:自然语言组卷或章节组卷 真题小助手对话,系统复述需求并给出可选题量 编辑组卷,逐题可换可删可排序并标注来源 组卷预览,章节分布与试卷主题色 正在合成 PDF 的进度条 生成完成,题目卷与答案卷两个独立入口 生成的题目卷 PDF 第一页 组卷列表,区分草稿与已生成
Design Decision · 一个产品决定

库里只有 3 道,就不能假装能出 10 道

回放里那句 "这个范围一共 30 题可选" 看着不起眼,它是我在这个产品里最坚持的一条设计。

系统在抽题之前会先查库存,并把真实数字告诉老师。如果某个知识点只有 3 道题,它不会凑数、不会拿相邻知识点顶上、更不会重复用同一道题填满,而是直接说"只有 3 道",然后给出替代方案。

这条规则会让产品在某些时候显得"不够强"。但它换来的是:老师可以相信卷子里的每一道题都是他要的

为什么这必须是产品来定

凑够题数在工程上更容易实现,指标上也更好看——生成成功率 100%。

但老师只要发现一次卷子里混进了不相干的题,就再也不会用这个功能了。这个取舍不是技术问题,是一个只有理解使用场景的人才会做的决定。

The Artefact · 真实产出

这是那次生成出来的两份文件

不是示意图,是真机点「生成试卷 PDF」之后拿到的东西。可以直接打开翻页。

题目卷 PDF 第一页

题目卷 · Question Paper

2 页 · 4 题 · 27 marks · 35 min
新窗口
答案卷 PDF 第一页与评分表

答案卷 · Mark Scheme

7 页 · 官方评分点 B1 / M1 / A1
新窗口
PDF 若浏览器不内嵌显示,请点上方「新窗口」
逐题来源每题上方标 Jan 2023 · WMA11/01 · Q3 · 5 marks。老师能立刻判断这题的来路和分量。
通页水印水印被拉平进页面,不可被简单去除——题库内容不该无痕流出去。
页脚溯源页脚记录使用者、卷子编号、构建号与 UTC 时间。哪份卷子从哪里流出去,可以查。
重新编号原卷里的题号(第 3 题、第 1 题、第 10 题)在新卷里重排为 1–4,但原题号仍在来源行里保留。
版式统一TIME / PAPER REFERENCE(S) / QUESTIONS / TOTAL MARKS 四栏,对齐真实考卷的信息结构。
答案分离题目卷与答案卷是两个文件,避免老师转发时连答案一起发出去。
Scale · 规模

这些题不是接口买来的

题库是我自己从历年真题 PDF 里切出来、逐题分类、逐题质检之后灌进去的。六科目前全部开放,基本每道题都带原始题图。

0已上线题量(六科合计)
0已开放科目
0基本 100% 带原始题图 %

六科分布

数学 Math2,649
化学 Chem1,056
物理 Phys556
经济 Econ353
生物 Bio317
心理 Psy308

数学的单元级颗粒度

检索是到单元的,不是到科目的。下面的数字直接来自产品内的选单元页。

P1227 题
P2208 题
P3173 题
P4171 题
FP1230 题
FP2152 题
FP3152 题
S1225 题
S2209 题
S3144 题
M1–M3力学
D1决策
章节组卷页:选考试局、科目、单元,每个单元后面直接标着题量
上面那组单元题量不是我另外统计的,就是产品「章节组卷」页里直接显示的——选单元的时候,每个单元后面跟着的就是它现在有多少题。
诚实说明 当前只有 Edexcel 爱德思是完整开放的。产品里 CIE / AQA 明确标着「建设中」(左图第一行就能看到),我没有把它们做成灰色可点的假入口——用户点进去发现是空的,比一开始就说"还没有"更伤。
为什么题量要直接摆在选项上 老师选单元的时候最想知道的是"这里面有多少题可挑"。把库存直接印在选项上,他不用点进去试。这和对话里那句"这个范围共 30 题可选"是同一条原则的两次落地:让人在做决定之前就看见约束。
What I Cut · 减法

我砍掉的东西,比我加上的更能说明判断

下面每一条都是从最初构想里主动删掉的,不是"没做完"。

AI 生成学生反馈 → AI 复核 → 发布 老师直接编写并发布
教育是信任敏感场景。让 AI 直接对学生和家长开口,风险远大于省下的时间。我把 AI 从「替老师说话」退回到「帮老师干活」——它留在出卷、录屏总结这类省时间且出错有兜底的环节,退出代替人对用户表态的环节。这是能力边界的判断,不是技术做不到。
双向消息 IM + 订阅提醒 单向系统通知
微信小程序对社交、私信、订阅消息有资质与能力限制。与其做一个随时可能被平台掐掉、还要用户背未读焦虑的 IM,不如只保证"该知道的事送达"。在平台约束下做减法,比对着约束硬做划算。
本地录屏上传 + 托管转写 外链记录
大视频托管加转写成本极高,而"录屏总结到底有多少老师会用"还没被验证。先用外链把闭环跑通、拿到使用数据,再决定要不要投这笔钱。
按题号推断难度 unit 内确定性分位数
"题号越大越难"是个没验证过的假设,而且同一句需求两次生成结果会漂。改成分位数之后难度可复现、可解释——老师追问"你凭什么说这题偏难",我答得出来。
社区 / 内容广场 砍掉,只留占位页
MVP 阶段只留核心闭环。一个没有内容供给的社区,做出来就是一片空白页。
Limits · 边界

现在还不成立的部分

放在正文里,不藏在页脚小字里。

难度标注还没跑完

上面「编辑组卷」那张截图里,每道题右上角写着「难度未标」——我没有 P 掉它。难度口径(unit 内分位数)是定好的,但标注是分批回填的,这批 P1 的题还没轮到。功能设计和数据覆盖是两件事,不该混着说。

没有组卷结果的评测集

题库分类质量有一整套质检流程;但"这份卷子是不是老师真正想要的那份",目前只靠约束满足和人工复核,没有正式评测集。下一步就是建它——哪怕只是 20 份由教师打分的卷子。

教师访谈样本小

"官方分类不好用"这个判断来自与一线教师的协作和按教师标准重建分类的过程,但我没有把它做成体系化的访谈,样本量小。

还没提交微信审核

后端已上线并稳定运行,小程序目前是体验版。另外只有组卷侧接了真实对话式 AI,作业与报告类生成仍走默认 mock;增长完全没做。