e3f4af9c0c
- 总体架构:新增打印/图像预处理/双飞轮/三环境部署 - 技术选型:调整决策理由(Coze沙盒自动化测试),新增Sharp+PDFKit - 数据模型:新增code/role/question_type+print_tasks+audit_logs,ID+code并存 - 模块设计:新增Image/Print模块,推荐两阶段匹配(关键词粗筛→AI精排) - PRD:目标用户扩展为学生+家长,新增PDF打印,年级聚焦小初,图像预处理流程 - ADR-010:题库抽象层Adapter Pattern Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
473 lines
18 KiB
Markdown
473 lines
18 KiB
Markdown
# ErrLens 产品需求文档
|
||
|
||
> 版本: v0.4.0 | 状态: 已锁定 | 作者: Arch AI | 最后更新: 2026-05-26(旧架构合并)
|
||
|
||
---
|
||
|
||
## 1. 产品定位
|
||
|
||
### 1.1 一句话描述
|
||
|
||
ErrLens 是一款面向小学初中学生的 **AI 错题本**,帮助学生或家长拍照录入错题、自动归类分析、输出 PDF 练习、获得针对性练习推荐。
|
||
|
||
### 1.2 核心价值
|
||
|
||
传统错题本需要学生手动抄题、自己分类、凭感觉复习。ErrLens 将这些步骤交给 AI:
|
||
|
||
- **录入**: 拍照即可,AI 自动识别题目、答案、学科
|
||
- **分析**: AI 诊断错误原因(知识点欠缺/粗心/审题偏差),汇总薄弱点
|
||
- **推荐**: 基于错题模式,从题库中匹配同类题目,针对性巩固
|
||
|
||
### 1.3 核心飞轮(人机协同版)
|
||
|
||
AI 识别不可能 100% 准确(尤其手写体),飞轮不能建立在"AI 完美识别"的假设上。正确模型是:
|
||
|
||
```
|
||
拍照录入错题
|
||
→ AI 识别 + 置信度评估(识别、分类、知识点标注各带分数)
|
||
→ 高置信度字段自动填充,低置信度字段高亮提示用户确认
|
||
→ 用户修正/确认后入库(人工校验过的数据才是"干净数据")
|
||
→ 干净数据 → AI 分析错误原因 → 识别薄弱知识点
|
||
→ 推荐同类练习 → 更多错题数据 → 修正记录积累
|
||
→ 反馈训练(P02 阶段:用"AI 识别 vs 用户修正"的 delta 微调模型)
|
||
```
|
||
|
||
**关键认知**:
|
||
- AI 识别结果不是"答案",是"草稿"——用户确认前不进入分析管道
|
||
- 用户每一次修正都是**免费的标注数据**,是训练 P02 自有模型的核心资产
|
||
- 飞轮飞起来靠的不是 AI 一开始有多准,而是用户修正成本有多低
|
||
|
||
### 1.4 竞品差异化
|
||
|
||
| 维度 | 传统错题本 App | ErrLens |
|
||
|------|---------------|---------|
|
||
| 录入方式 | 手动输入/拍照 OCR | AI 识别 + 置信度标注 + 用户修正 |
|
||
| 分析深度 | 按学科/章节归类 | 知识点粒度 + 错误原因诊断 |
|
||
| 推荐逻辑 | 随机/按章节 | 基于错题模式的个性化推荐 |
|
||
| 数据飞轮 | 无 | 用户修正数据反哺模型训练 |
|
||
|
||
---
|
||
|
||
## 2. 目标用户
|
||
|
||
### 2.1 核心用户画像
|
||
|
||
| 画像 | 描述 | 核心需求 |
|
||
|------|------|----------|
|
||
| **小初高学生** | 10-18 岁,有日常作业和考试,可自己操作也可家长代操作 | 快速录入、自动整理、考前针对性复习 |
|
||
| **家长** | 关注孩子学习状况,代孩子拍照整理、打印练习题 | 查看分析报告、了解进步轨迹、错题打印 |
|
||
| **老师(扩展)** | 管理班级,了解全班错题分布 | 班级错题统计、教学重点调整 |
|
||
|
||
### 2.2 MVP 阶段聚焦
|
||
|
||
- **P0**: 小初高学生 + 家长(均可操作,交互低门槛年轻化)
|
||
- **P1**: 学习报告、练习推荐
|
||
- **Phase 3+**: 老师端
|
||
|
||
---
|
||
|
||
## 3. 功能需求
|
||
|
||
### 3.1 MVP 功能清单 (Phase 2)
|
||
|
||
| 模块 | 功能 | 优先级 | 说明 |
|
||
|------|------|--------|------|
|
||
| **错题录入** | 拍照录入 | P0 | 拍照 → 图像预处理 → AI 识别题目+答案+学科 |
|
||
| | 手动录入 | P0 | 文字输入兜底方案 |
|
||
| | 批量导入 | P2 | 从试卷照片一次识别多道题 |
|
||
| **错题管理** | 错题列表 | P0 | 按时间/学科/知识点筛选 |
|
||
| | 错题详情 | P0 | 题目、错误答案、正确答案、分析 |
|
||
| | 错题编辑 | P1 | 修正 AI 识别结果 |
|
||
| **AI 分析** | 错误原因诊断 | P0 | 标注错误类型(知识点/粗心/审题) |
|
||
| | 薄弱点汇总 | P0 | 按知识点统计薄弱程度 |
|
||
| | 学习报告 | P1 | 周/月度错题趋势报告 |
|
||
| **练习推荐** | 同类题推荐 | P1 | 关键词+Jaccard 粗筛 → AI 精排 |
|
||
| | 智能组卷 | P2 | 自动生成针对性练习卷 |
|
||
| **错题打印** | PDF 输出 | P0 | 选题 → 生成 PDF → 下载(24h 有效) |
|
||
| **用户系统** | 注册/登录 | P0 | 微信授权登录 |
|
||
| | 个人资料 | P1 | 年级(小初)、学科设置 |
|
||
| | 学科管理 | P1 | 添加/切换学科 |
|
||
|
||
### 3.2 功能详情
|
||
|
||
#### 3.2.1 拍照录入(P0 核心流程)
|
||
|
||
```
|
||
拍照 → 裁剪/确认 → 图像预处理 → AI 识别 → 置信度评估 → 确认/修正 → 保存
|
||
│
|
||
├─ 透视校正(手动框4角)
|
||
├─ CLAHE 增强(光照归一化)
|
||
└─ 笔迹去除(红/蓝笔HSV自动去除)
|
||
↓
|
||
提取: 题目文本、学科、知识点、错误答案
|
||
每个字段附带 confidence: 0.0-1.0
|
||
↓
|
||
高置信(>0.9): 绿色标记,自动采纳
|
||
中置信(0.7-0.9): 黄色标记,建议检查
|
||
低置信(<0.7): 红色标记,提示手动确认
|
||
↓
|
||
用户修正 → 修正字段记录到 correction_log
|
||
原始 AI 结果 + 用户修正值 一并入库
|
||
```
|
||
|
||
**置信度分字段展示**:
|
||
- OCR 文本置信度(手写体通常更低)
|
||
- 学科分类置信度
|
||
- 知识点标注置信度
|
||
- 错误类型诊断置信度
|
||
|
||
每个字段独立展示置信度,用户可逐个修正。低置信度字段高亮提示,不阻塞整体流程(用户可跳过修正,但数据标记为 unverified)。
|
||
|
||
**交互要点**:
|
||
- 拍照后展示识别结果,低置信度字段红色高亮
|
||
- 点击任意 AI 识别结果可进入编辑态修正
|
||
- 识别中展示 loading 动画(预期 3-5 秒)
|
||
- 支持从相册选择已有截图/照片
|
||
- "正确答案"字段独立,可留空(学生可能还不知道正确答案)
|
||
|
||
**AI 能力需求**:
|
||
- OCR 文字识别(手写体 + 印刷体)
|
||
- 学科分类(数学/语文/英语/物理/化学/生物/地理/历史/政治)
|
||
- 知识点标注(如"二次函数"、"定语从句")
|
||
- 题目结构提取(题干/选项/答案区)
|
||
|
||
#### 3.2.2 错题列表(P0)
|
||
|
||
**列表视图**:
|
||
- 默认按时间倒序
|
||
- 筛选器:学科、知识点、时间范围、错误类型
|
||
- 每项展示:题目缩略图、学科标签、知识点标签、录入日期
|
||
- 搜索:按题目关键词搜索
|
||
|
||
**分组视图**:
|
||
- 按知识点分组(展示每个知识点的错题数量和掌握度)
|
||
- 按学科分组
|
||
|
||
#### 3.2.3 AI 分析(P0)
|
||
|
||
**单题分析**:
|
||
- 错误类型分类:知识点欠缺 / 粗心失误 / 审题偏差 / 概念混淆
|
||
- 关联知识点(可能有多个)
|
||
- 难度评估:基础 / 中等 / 拔高
|
||
|
||
**汇总分析**:
|
||
- 薄弱知识点排序(按错误频率和严重程度)
|
||
- 错误类型分布饼图
|
||
- 学科间对比
|
||
|
||
#### 3.2.4 错题打印/PDF 输出(P0)
|
||
|
||
**打印流程**:
|
||
```
|
||
选题(错题列表中勾选)→ 生成 PDF → 预览 → 下载 → 自行打印
|
||
```
|
||
|
||
**PDF 排版优先级**:
|
||
1. 结构化内容(题库匹配的题目,文字+公式清晰排版)
|
||
2. 增强图片(经 CLAHE+笔迹去除处理后的图片)
|
||
3. 原始图片(无匹配时兜底)
|
||
|
||
**交互要点**:
|
||
- 错题列表页支持多选模式(勾选要打印的题目)
|
||
- PDF 生成中展示进度(预计 5-10 秒)
|
||
- 生成后预览页支持手势缩放
|
||
- 下载链接 24 小时有效,过期自动清理
|
||
- 支持分享到微信(发送 PDF 文件给家长/老师)
|
||
|
||
#### 3.2.5 练习推荐(P1)
|
||
|
||
**推荐逻辑**:
|
||
1. 基于薄弱知识点权重排序
|
||
2. 匹配题库中同知识点、同难度题目
|
||
3. 优先推荐"高频易错"题型
|
||
4. 已掌握的题目降低推荐权重
|
||
|
||
**推荐展示**:
|
||
- 每日推荐: 3-5 道针对性练习
|
||
- 自定义练习: 选择知识点 + 数量,一键生成
|
||
|
||
### 3.3 数据质量与人机协同修正
|
||
|
||
#### 3.3.1 核心设计原则
|
||
|
||
**用户每次修正都是免费的标注数据。** 这是 ErrLens 相对于纯 AI 方案的核心壁垒。
|
||
|
||
- AI 识别是"草稿",不是"答案"
|
||
- 用户确认前的数据不进入分析和推荐管道
|
||
- 修正记录(AI 输出 vs 用户修正)是 P02 自研模型的核心训练数据
|
||
|
||
#### 3.3.2 数据校验状态机
|
||
|
||
```
|
||
AI 识别完成
|
||
│
|
||
▼
|
||
┌────────────────┐
|
||
│ raw │ 原始 AI 识别结果,未确认
|
||
│ 进入错题列表 │ 仅对用户可见,不参与分析
|
||
│ 不可用于推荐 │
|
||
└───────┬────────┘
|
||
│ 用户查看/修正
|
||
▼
|
||
┌────────────────┐
|
||
│ reviewed │ 用户已确认/修正
|
||
│ 参与薄弱点分析 │ 所有字段经人工校验
|
||
│ 参与练习推荐 │
|
||
└───────┬────────┘
|
||
│ 用户再次修正
|
||
▼
|
||
┌────────────────┐
|
||
│ corrected │ 用户二次修正(覆盖上次)
|
||
│ 分析/推荐更新 │
|
||
└────────────────┘
|
||
```
|
||
|
||
**关键规则**:
|
||
- `raw` 状态的错题仅用户自己可见,不计入 AnalysisReport
|
||
- 从 `raw` → `reviewed` 的最小操作:用户至少查看一次并点击"确认"按钮(批量确认支持)
|
||
- 从 `reviewed` → `corrected`:用户主动编辑了 AI 识别的字段
|
||
- 30 天后仍为 `raw` 的错题标记为 `stale`,系统定期提醒用户确认
|
||
|
||
#### 3.3.3 置信度分字段评估
|
||
|
||
AI 对每个字段独立输出置信度 [0.0-1.0]:
|
||
|
||
| 字段 | 影响因素 | 典型置信度 |
|
||
|------|----------|-----------|
|
||
| 题目文本 (question_text) | 手写体 vs 印刷体、图片清晰度 | 印刷体 0.9+,工整手写 0.7-0.9,潦草手写 0.5-0.7 |
|
||
| 学科分类 (subject_id) | 题目文本中的关键词密度 | 数学符号明显的题 0.9+,文科主观题 0.6-0.8 |
|
||
| 知识点标注 (knowledge_points) | 知识树覆盖度、题干关键词匹配 | 主流知识点 0.8+,冷门知识点 0.5-0.7 |
|
||
| 错误类型 (error_type) | 错误答案与正确答案的对比清晰度 | 有正确答案时 0.8+,无正确答案时 0.5-0.7 |
|
||
| 正确答案 (correct_answer) | AI 是否能看到标答区域 | 扫描的试卷答案区 0.9+,纯题目照片 0.5-0.7 |
|
||
|
||
#### 3.3.4 修正记录 (Correction Log)
|
||
|
||
每次用户修正,记录原始 AI 值和用户修正值:
|
||
|
||
```json
|
||
{
|
||
"error_item_id": "uuid",
|
||
"field": "knowledge_points",
|
||
"ai_value": [1021], // AI 识别:顶点坐标
|
||
"user_value": [1022], // 用户修正:图像性质
|
||
"ai_confidence": 0.72,
|
||
"corrected_at": "2026-05-26T10:30:00Z"
|
||
}
|
||
```
|
||
|
||
**用途**:
|
||
1. **即时**: 修正后立即更新错题数据,参与分析和推荐
|
||
2. **分析**: 统计各字段修正率,识别 AI 薄弱环节(哪个学科/知识点修正率最高)
|
||
3. **训练 (P02)**: AI 识别 vs 用户修正的 delta 是微调自有模型的核心训练数据
|
||
|
||
#### 3.3.5 交互策略
|
||
|
||
**确认界面分级提示**:
|
||
|
||
| 置信度区间 | 视觉标记 | 交互行为 |
|
||
|-----------|---------|---------|
|
||
| > 0.9 | 绿色边框 | 默认展示,无需操作 |
|
||
| 0.7 - 0.9 | 黄色边框 + 虚线 | 建议点击查看 |
|
||
| < 0.7 | 红色边框 + 闪烁 | 弹提示建议手动修正 |
|
||
| — | 无 AI 结果 | 空白输入框,用户手动填写 |
|
||
|
||
**批量确认**: 多道题一起拍照后,在列表页支持批量"一键确认",降低确认摩擦。
|
||
|
||
**修正激励**: 未来(Phase 3)可引入修正积分/成就,鼓励学生认真修正(干净数据=更好的推荐=对自己有用)。
|
||
|
||
---
|
||
|
||
## 4. 非功能需求
|
||
|
||
### 4.1 性能
|
||
|
||
| 指标 | 目标值 |
|
||
|------|--------|
|
||
| 小程序首屏加载 | < 2s |
|
||
| AI 识别响应 | < 5s(拍照→结果展示) |
|
||
| 列表滚动 | 60fps,虚拟列表 |
|
||
| 图片上传 | < 3s(压缩后 < 500KB) |
|
||
| API 响应 | P95 < 200ms |
|
||
|
||
### 4.2 安全
|
||
|
||
- 微信授权登录,不存储密码
|
||
- 用户错题数据隔离,API 层鉴权
|
||
- 图片上传签名 URL,防恶意上传
|
||
- 敏感信息(姓名、学校)传输加密
|
||
|
||
### 4.3 兼容性
|
||
|
||
- 微信小程序基础库 ≥ 3.0
|
||
- iOS 14+ / Android 8+
|
||
- 屏幕适配:375-428px 逻辑宽度
|
||
|
||
### 4.4 可用性
|
||
|
||
- 核心流程(拍照→保存)不超过 3 步
|
||
- 关键操作有明确反馈(loading/成功/失败)
|
||
- 网络异常时有缓存兜底和重试提示
|
||
- 首次使用有引导(不强制)
|
||
|
||
---
|
||
|
||
## 5. 数据模型(高层)
|
||
|
||
### 5.1 核心实体
|
||
|
||
```
|
||
User (用户)
|
||
- id, nickname, avatar, grade, created_at
|
||
|
||
Subject (学科)
|
||
- id, name, icon
|
||
|
||
KnowledgePoint (知识点)
|
||
- id, name, subject_id, parent_id (树形结构)
|
||
|
||
ErrorItem (错题)
|
||
- id, user_id, subject_id
|
||
- image_url (原始图片)
|
||
- question_text (题目文本,AI 提取)
|
||
- wrong_answer (错误答案)
|
||
- correct_answer (正确答案,可选)
|
||
- knowledge_points[] (关联知识点)
|
||
- error_type (错误类型)
|
||
- difficulty (难度)
|
||
- verification_status: raw | reviewed | corrected | stale
|
||
- ai_confidence: JSONB(各字段的 AI 置信度)
|
||
- note (学生备注)
|
||
- created_at, updated_at
|
||
|
||
CorrectionLog (修正记录) [P02 训练数据]
|
||
- id, error_item_id, field_name
|
||
- ai_value (AI 原始值)
|
||
- user_value (用户修正值)
|
||
- ai_confidence (该字段置信度)
|
||
- corrected_at
|
||
|
||
AnalysisReport (分析报告)
|
||
- id, user_id
|
||
- period (week/month)
|
||
- weak_points[] (薄弱知识点+权重)
|
||
- error_type_distribution
|
||
- trend (进步/退步/持平)
|
||
- generated_at
|
||
|
||
PracticeRecommendation (练习推荐)
|
||
- id, user_id
|
||
- knowledge_points[]
|
||
- questions[] (推荐的题目)
|
||
- generated_at
|
||
|
||
PrintTask (打印任务)
|
||
- id, user_id
|
||
- error_item_ids[]
|
||
- output_mode: pdf
|
||
- file_url, expires_at
|
||
- created_at
|
||
```
|
||
|
||
### 5.2 MVP 阶段简化
|
||
|
||
- KnowledgePoint 使用预设知识树(非 AI 自动生成)
|
||
- 题库推荐初期使用外部题库 API,后续自建
|
||
- 分析报告先做单题分析,汇总报告 P1
|
||
- **CorrectionLog MVP 即入库,但 P02 阶段才用于训练**
|
||
- **AnalysisReport 仅统计 verification_status != raw 的错题**
|
||
|
||
---
|
||
|
||
## 6. 用户旅程
|
||
|
||
### 6.1 核心旅程:首次使用
|
||
|
||
```
|
||
1. 打开小程序 → 微信授权登录
|
||
2. 设置年级 + 学科(初中二年级 + 数学)
|
||
3. 进入首页 → 看到空状态:「还没有错题,拍一张吧」
|
||
4. 点击拍照按钮 → 拍摄一道错题 → AI 识别中(3-5s)
|
||
5. 确认识别结果 → 「分析完成!这道题是【二次函数-顶点坐标】没掌握」
|
||
6. 回到首页 → 错题列表出现第一条记录
|
||
7. 底部「薄弱点」tab → 看到第一个薄弱知识点标记
|
||
```
|
||
|
||
### 6.2 核心旅程:日常使用
|
||
|
||
```
|
||
1. 每天做完作业 → 打开 ErrLens
|
||
2. 拍照录入 2-3 道错题
|
||
3. 查看 AI 分析:「今天主要是计算粗心」
|
||
4. 周末 → 收到推送:「本周薄弱点是【全等三角形判定】,已生成针对性练习」
|
||
5. 完成推荐练习 → 错题本记录更新
|
||
```
|
||
|
||
---
|
||
|
||
## 7. 项目分期
|
||
|
||
| 阶段 | 范围 | 交付物 |
|
||
|------|------|--------|
|
||
| Phase 1 (当前) | 基础搭建 | 协作框架、脚手架、信息架构 |
|
||
| Phase 2 (MVP) | 核心闭环 | 拍照录入 + 错题管理 + AI 分析 + 用户系统 |
|
||
| Phase 3 | 功能完善 | 练习推荐 + 学习报告 + 家长端 + P02/P03 启动 |
|
||
| Phase 4 | 打磨发布 | 性能优化 + 安全审计 + 上线准备 |
|
||
|
||
---
|
||
|
||
## 8. MVP 验收标准 (Phase 2)
|
||
|
||
- [ ] 用户可以微信授权登录
|
||
- [ ] 用户拍照后 5 秒内看到识别结果(含置信度标注)
|
||
- [ ] 图像预处理管线完整运行(透视校正+增强+笔迹去除)
|
||
- [ ] 低置信度字段红色高亮,用户可逐字段修正
|
||
- [ ] 用户可以批量确认多道错题
|
||
- [ ] 用户可以在错题列表中按学科、校验状态筛选
|
||
- [ ] AI 可以诊断错误原因并关联知识点
|
||
- [ ] 用户可以查看薄弱点汇总(仅统计 reviewed 及以上状态)
|
||
- [ ] 用户可以勾选错题生成 PDF 并下载(24h 有效)
|
||
- [ ] PDF 排版清晰度满足打印标准(300DPI)
|
||
- [ ] 核心流程有完整的 loading/成功/失败反馈
|
||
- [ ] 置信度 UI 分级显示(绿/黄/红)正确运行
|
||
- [ ] `raw` 状态的错题不参与分析和推荐
|
||
|
||
---
|
||
|
||
## 9. 风险与假设
|
||
|
||
### 9.1 关键假设
|
||
|
||
1. AI OCR 对手写体的识别率能达到可用水平(>70% 即满足 MVP,用户修正兜底)
|
||
2. 用户愿意在拍照后花 10-20 秒确认/修正 AI 识别结果
|
||
3. 学生/家长愿意每天花 2-3 分钟录入错题
|
||
4. 微信小程序审核能通过教育类目
|
||
5. 题库资源可获取(合作或爬取)
|
||
|
||
### 9.2 主要风险
|
||
|
||
| 风险 | 影响 | 缓解措施 |
|
||
|------|------|----------|
|
||
| AI 识别准确率不足 | 用户不信任,放弃使用 | **架构层面:置信度分层 + 用户修正闭环,AI 定位为"草稿"而非"答案";MVP 优先优化印刷体 OCR** |
|
||
| 用户修正率低(不确认 raw 数据) | 飞轮无数据可用 | 批量确认降低摩擦;定期提醒 stale 数据;确认操作设计为一次点击 |
|
||
| 修正数据质量差(用户胡乱修正) | 训练数据被污染 | 修正记录对比 AI 值,异常修正(如学科从数学改体育)标记审查 |
|
||
| 图像预处理管线复杂度高 | 开发周期延长 | 模块化降级策略:任何模块失败不阻塞整体流程;Coze 沙盒中重新调优参数 |
|
||
| 题库内容不足 | 推荐功能无法上线 | 先接入第三方题库 API |
|
||
| 增长缓慢 | 飞轮无法启动 | 考虑学校/班级团购模式 |
|
||
| 小程序审核受限 | 无法发布 | 优先微信小程序,H5 兜底 |
|
||
|
||
---
|
||
|
||
## 10. 待决策事项
|
||
|
||
以下事项需要人类确认后锁定:
|
||
|
||
- [x] 题库来源:**两者都要**。自有本地题库(PDF 手动录入)提供差异化内容,作业帮 API 冷启动兜底。架构需支持多题库源抽象层。
|
||
- [x] AI 能力来源:**分层使用**。Coze SDK 做测试/验证,其他 AI 做 Coding 实现,Claude 做架构设计。各角色可交叉协作,不僵化绑定。
|
||
- [x] 用户体系:**MVP 仅微信小程序登录**。增长模式:已有用户/老师/机构通过扫码分享注册,形成用户群的**树状结构**(邀请链)。架构需支持邀请关系建模。
|
||
- [x] 商业化方向:**基础免费 + 会员**。MVP 阶段全功能免费(积累用户),会员功能在 Phase 3 设计。架构预留能力开关。
|
||
- [x] 首发学科:**数学 + 英语**。两个学科同时首发,知识树需覆盖数学和英语两套知识体系。
|
||
|
||
---
|
||
|
||
*PRD 状态: 草案 → 已锁定(v0.3.0,5 项决策已确认)*
|