一、为什么做这个
家里孩子上初中,数学练习册、试卷源源不断。错题管理的传统流程是:抄题(费时)、贴卷子(凌乱)、复习时东翻西找。市面上拍照搜题 App 只给答案,不管"这道题我错在哪、下次还会不会错"。
我想要的是一个私有错题知识库:
- 拍照就能把整页题目数字化,我来审核哪些值得入库、错因是什么
- 平时能刷题、能按知识点出卷
- 连对 3 次的题自动建议归档——真正掌握的题不再占用注意力
- 数据在我自己手里
恰好此前我做过一个出题系统( quiz-demo ),里面有一条经过实战验证的"质量链":几何图形数值校验( geocheck )→ 独立解题验伪( verify_answers )→ 矢量试卷导出( export_paper )。错题本直接把这条链复用过来——所有 AI 生成的题目都必须过三道工序,禁止裸奔。
二、完整工作流
拍照上传(可多张)
→ 视觉模型多题转录(题干 LaTeX 、选项、图形框、印刷答案、手写标记)
→ 自动按框抓取原图(权威图形,0 token )
→ [人审视图] 左原图右题目卡片,KaTeX 实时渲染
勾选入库 + 标错因(马虎/不会/其他)+ 图形可抓原图/手动框选
年级、知识点自动归类(教材知识树),可改
→ 提交入库:题库查重 → 独立解题验伪 → 章节难度知识点分析
→ 工作台(筛选/统计/详情)
→ 刷题(单题循环,自动评分)/ 做题(勾选试卷式,统一批改给分+评价)
→ 连对 3 次 → 建议归档 → 归档
→ 针对性出卷(按章节/知识点/难度占比,原题变式或原创)→ 矢量 PDF
三、功能清单( V1.0 )
1. 录入·排版机(最花功夫的模块)
- 多题转录:一张照片里所有题目一次转录,只认印刷体,手写痕迹只标记不转录
- 人审前置:转录结果必须经人审(左原图、右题目卡片对照),勾选才入库——AI 只打草稿,取舍由人
- 图形来源分层:几何题可一键生成规范矢量 SVG ( geocheck 数值校验循环);默认使用原题照片裁剪图(省 token );表格/函数图象类题只能用原图
- 图形纠正三入口:重新抓取原图、手动拖拽框选( box 存档可重放)、整单幂等重裁
- EXIF 方向统一:手机照片的旋转信息曾导致抓图转 90°、手动框选完全错位——全链路统一到"转正空间"后彻底解决
- 年级/知识点自动归类:教材(浙教版八上)用 build_kb 视觉转录成知识库( 201 页),录入时 LLM 只能在知识树内选,人审可调
2. 入库质量链
- 查重:题干归一化(去 LaTeX 命令名/标点/空白)后相似度 ≥92% 判重复,不重复录入,完成横幅里报告
- 不信任照片答案:照片里的印刷答案仅作参考,一律让另一个模型独立解题对账;冲突以审题答案为准并留痕,判题不合格进 needs_review
- 错因驱动分析:马虎 → 易错点写"易算错环节";不会 → 写"思路卡点"
3. 工作台
- 统计图(总/在库/已归档/零练习/建议归档)+ 五组分布图(默认折叠,点开查看)
- 错题列表:公式渲染、章节/难度/知识点/错因列、查看弹窗(题目全部信息+逐次练习历史)
- 筛选联动:章节/难度/错因/知识点/含已归档,搜索后统计和列表一起更新;筛选与勾选持久化,跨标签页不丢
- 行内归档/激活,勾选后可直接导出练习卷 PDF (矢量公式排版,答案附卷末可裁)
4. 刷题与做题(两种模式)
- 刷题(单题模式):自动循环在库全部题目;单选/多选/填空自动评分,问答看答案自判;答完即时反馈连对 n/3 、建议归档、重复做错,可做相似题
- 做题(试卷模式):工作台勾选 → 新标签页整卷作答 → 统一批改:得分(百分制)、评价、错题知识点汇总(直指薄弱点)
- 相似题:围绕同一知识点与易错点生成,过图形校验 + 验伪,不过关自动重生成
5. 多用户
按用户分目录存储(题库/草稿单/照片各自独立),页头切换/新建用户,存量数据自动迁移。两个孩子的错题互不干扰。
四、几个关键设计决策
1. 数据即文件,不用 SQLite
全部数据是 JSON (原子写 + .bak ),人类可读、git 可版本管理(题库本身就是重要资产)。几百题规模下,一个 git log 就是完整的演进史——后来一次测试事故把题库覆盖了,正是靠备份和 git 恢复的。
2. 向量化( SVG 生成)从默认改为按需
最初设计是"几何题都自动转成规范矢量图",但实测发现这是全链路最费 token 、最慢的一步(每题 1~3 次 LLM 调用 + geocheck 失败重试)。v0.6 反转为:转录默认用照片裁剪图( 0 token ),需要规范图形时人审期一键生成。省一半以上开销,录入速度大幅提升。
3. 不让 LLM 自由发挥知识点
知识点候选来自教材知识库(把纸质课本逐页视觉转录成结构化 JSON ),录入时 LLM 只能在树内选;而工作台筛选用的知识点候选来自题库实际标注——保证下拉框里选了就一定能搜到(教材命名和 LLM 标注命名对不上是真实的坑)。
4. 人审是产品的核心,不是过渡方案
照片转录的不确定性(多题混排、手写干扰、印刷质量)决定了全自动入库不可靠。与其追求"全自动",不如把人审界面做到顺手:对照原图逐题确认、错因标注、图形纠正都是两次点击内的事。AI 负责 80% 的体力活,人负责 20% 的判断。
五、踩坑记录(节选)
- CV 定位图形在真实照片上失效:行剖面定位在假照片上 IoU 95.9%,真实照片上把斜排文字误判为图形,两轮实测后废弃,改用视觉模型直接输出图形框
- DeepSeek 思考链烧光 max_tokens:导致 content 为空且 finish_reason=length——降级策略:json_object → 关思考重试 → plain ,实测 645s → 16s
- EXIF orientation 双坐标系:浏览器自动转正、服务端不转,抓图转 90°、手动框选完全错位。全链路统一转正空间 + 历史数据迁移工具
- 公式在列表里时渲染时不渲染:题干截断 40 字符会把
$...$配对切断,KaTeX 找不到闭合符就放弃——改返回全文 + CSS 单行截断 - 导出 PDF 显示 LaTeX 源码:导出链路不渲染 LaTeX ,加了一层 LaTeX → Unicode 数学符号转换(\triangle→△、\circ→°、\frac→(a/b)、上标转 ⁰¹²³)
- 测试覆盖了真实题库:测试 patch 路径常量但存储层重构后路径被重新绑定,种子数据覆盖了真实数据( 10 题 → 1 题)——靠 .bak 和 git 恢复,并给所有测试加了测试模式保险。这个事故再次证明了"数据即文件 + git 管理"的价值
六、后续计划
- 归档题的周期性复习提醒(错题本变复习系统)
- 移动端适配(拍照场景天然在手机)
- 教材 KB 扩展到九年级,知识点归一化到教材命名
- 错因/知识点的长期趋势分析
结语
这个项目最大的感受:AI 应用的价值不在模型本身,而在模型外围的工程——质量链、人审流程、数据管理、测试回归,这些"笨功夫"决定了它能不能真的每天用。3 天开发 + 真实使用反馈驱动的 12 轮迭代,现在它已经是我家每天在用的工具了。
项目为自用工具,未开源服务端部署;如对质量链( geocheck / verify_answers / export_paper )或错题本实现细节感兴趣,欢迎交流。