原创:苹果果 | 2026-06-28 基于项目源码 (
~51K 后端+~47K 前端+~5.4K 测试) 全面审查
一句话: 个人 AI 伴学系统,覆盖自学全生命周期。
| 阶段 | 功能 | 技术深度 |
|---|---|---|
| 课前 | 知识图谱导航、前置诊断、学习规划 | CognitiveNode 5 层级 + ZPD 调度 |
| 课中 | 多模态对话、自适应练习、苏格拉底追问 | LLM 流式 + SM-2 间隔重复 |
| 课后 | 学情追踪、行为分析、遗忘曲线 | 15 子系统 + 22 方程 |
| 全程 | 心理陪伴、习惯养成、成就系统 | 情绪分析 + 12 成就 × 3 级 |
这是一个人从零写到 v8.4.2的项目——16 个 Phase + 4 轮重构,几百个文件、近百页文档。
它的真实身份更像一个个人技术实验场——每个”先进教育理论”都被实现成了代码:ACT-R 激活、Beta 信念、SM-2 间隔重复、Vygotsky ZPD、Bloom 分类法、情绪检测、行为分析……理论上几乎覆盖了所有主流学习科学模型。
1. 架构设计有自觉性 - 从 v4.0 到
v8.0,经历了清晰的架构演进:DDD 分层、领域/服务/基础设施三层分离 -
shared/protocols + DI 容器实现依赖倒置 -
独立认证网关(与业务完全解耦)
2. 代码质量持续治理 - v4.0 重构净删 ~2500 行(-72% 对话状态、-84% 分析模块) - v0.9.3 熵值治理:静默 except 从 31→0,console.log 从 66→17 - 有 ADR(架构决策记录)体系,22 条决策有案可查
3. 认知引擎够深 - 15 个子系统:激活、信念、预测编码、认知负荷、趋势、调度、元认知、投入度、深度处理…… - 22 个方程:Beta 后验更新、ACT-R 基水平衰减、EWMA 趋势、Bloom 分类映射 - 不是”套壳 ChatGPT”,有真实的认知建模
4. 文档体系完整 - docs/
有架构总览、模块设计、spec 规格、ADR 记录 - MAINTENANCE.md
维护指南 694 行 - CHANGELOG.md 1219
行,每次变更都有记录
1. 测试覆盖率严重不足(⛔ 核心问题)
后端 + 前端 ≈ 98,000 行 | 测试 ≈ 5,474 行
测试覆盖率 ≈ 5.5%
2. 认知模型的落地深度不足
| 模型 | 实现程度 | 实际使用 |
|---|---|---|
| Beta 信念 | ⭐⭐⭐ 方程完整 | 练习更新、掌握度计算有使用 |
| ACT-R 激活 | ⭐⭐ 模型定义完整 | 节点排序有使用,但参数未自动调优 |
| SM-2 间隔重复 | ⭐⭐⭐ 完整实现 | 练习调度核心 |
| 预测编码 | ⭐ 模型定义 | 几乎未被下游使用 |
| 元认知/深度处理 | ⭐ 字段定义 | 存储了但不查询 |
很多子系统定义得很好但没有被真正用起来——代码中有字段、有 schema,但后续查询、决策链路中并没有引用它们。
3. pgvector 未真正部署
记忆中提到
pgvector not installed,向量搜索是应用层手写余弦距离 +
DOUBLE PRECISION[]。数据量小的时候可以工作,但: - 没有索引,搜索是 O(n)
全表扫描 - 没有 HNSW/IVFFlat 加速 -
当题库/素材量到万级时性能会急剧下降
4. 前端 State Management 有碎片化风险
conversation/、explain/、agent/、notification/
等多个 store5. LLM 强耦合,无离线回退
6. God File 残留
虽然 v0.9.3 治理将 8 个 god file 降到了 4 个,但: -
conversation_routes.py 770 行 -
practice_service.py 738 行 - tree_crud.py 560
行
超过 500 行的文件仍然存在,说明部分模块边界还不够干净。
| 维度 | 苹果果 | Khan Academy + Khanmigo | Quizlet + Q-Chat | Duolingo Max |
|---|---|---|---|---|
| 认知诊断深度 | ⭐⭐⭐ 15 子系统 | ⭐ 简单知识状态 | ⭐ 无 | ⭐⭐ 间隔重复 |
| 自适应练习 | ⭐⭐⭐ SM-2+ZPD | ⭐⭐ 掌握度分级 | ⭐ 闪卡 | ⭐⭐⭐ 精细间隔 |
| 知识图谱 | ⭐⭐⭐ 5 层力导向 | ⭐⭐ 课程树 | ❌ 无 | ❌ 无 |
| 情绪分析 | ⭐⭐⭐ 11 类检测 | ❌ 无 | ❌ 无 | ❌ 无 |
| 多模态输入 | ⭐⭐ OCR+语音+图片 | ⭐ 图片 | ❌ | ⭐⭐ |
| 内容库规模 | ❌ 无 | ⭐⭐⭐⭐⭐ 10K+课程 | ⭐⭐⭐⭐ 用户生成 | ⭐⭐⭐ 高投入 |
| 用户基数验证 | ❌ 无 | ⭐⭐⭐⭐⭐ 亿级 | ⭐⭐⭐⭐⭐ 亿级 | ⭐⭐⭐⭐⭐ 亿级 |
| A/B 测试能力 | ❌ 无 | ⭐⭐⭐⭐ 有 | ⭐⭐⭐ 有 | ⭐⭐⭐⭐⭐ 有 |
苹果果的核心竞争力在认知引擎深度——它比任何主流产品都更认真地对待”学生到底知道多少”这个问题的数学建模。但最大短板是没有任何真实用户数据来验证这些模型是否真的有效。
现状: 使用 Beta 信念(经典 BKT 贝叶斯版本)+ 22 个手写方程
升级路线:
Phase 1: BKT → DKT(Deep Knowledge Tracing)
- 用 transformer 替代 Beta 分布作为掌握度估计器
- 输入:学生答题序列 (question_id, correct, timestamp, time_spent)
- 输出:每个知识点的 p(correct) 预测值
- 优势:不依赖手动设计的动力学方程,数据驱动
Phase 2: DKT + IRT 联合建模
- 引入题目参数(难度、区分度、猜测率)
- 3PL IRT 模型参数通过 LLM 自动估计
- DKT 输出作为能力 θ,IRT 映射到具体题目正确率
Phase 3: 个性化认知架构搜索
- Neural Architecture Search 找到最适合该学生的认知模型结构
- 每个学生有自己的"认知架构参数"
现状: 简单向量相似度搜索 + cosine distance
升级方案:
┌────────────────────────┐
│ 学生问:"导数定义" │
└────────┬───────────────┘
▼
┌────────────────────────┐
│ 1. 向量检索 top-5 节点 │
│ 2. 图谱 BFS 展开 2 层 │
│ 3. 关联节点(先修/后修/ │
│ 类比)加权融合 │
│ 4. LLM 合成上下文 │
└────────────────────────┘
现状: 经典 SM-2 算法(SuperMemo 1987)
升级: - FSRS(Free Spaced Repetition Scheduler):现代替代算法,精度高 2-3x - 每个知识点独立学习 FSRS 参数 - 引入 retention 预测:不只”该复习了”,还能预测”明天的掌握度会降到多少”
现状: 一个 LLM 角色处理所有对话
升级:
┌── 学生 ──┐
│
├── 苏格拉底智能体 ── 追问式教学
├── 陪练智能体 ── 大量练习 + 即时反馈
├── 鼓励师智能体 ── 心理支持 + 习惯养成
├── 诊断智能体 ── 评估掌握度 + 定位薄弱点
└── 规划智能体 ── 制定学习路径 + 调度复习
每个智能体有独立的 prompt、知识库、交互风格,通过协调器(orchestrator)决定谁出场。
现状: 选择题自动判对错,开放题无评估
升级: - 用 LLM 评估开放题答案质量(0-4 分 + 具体反馈) - 自动标注错误类型(概念混淆、计算错误、表达不清) - 错误簇分析升级:不只看”做错了”,还看”为什么错” - 生成长期错误模式报告
这是《ZhiHuArchive 高效自学》系列文章的核心洞见:
功能模块:
├── 学习策略诊断:你现在的学习方式是什么?
│ ├── 被动听课型 vs 主动检索型
│ ├── 死记硬背 vs 理解构建
│ └── 集中突击 vs 间隔复习
├── 策略建议引擎
│ ├── 针对当前知识点的推荐学习方法
│ ├── 费曼技巧 / 康奈尔笔记 / 思维导图建议
│ └── 学习策略切换时机检测
└── 学习方式进化追踪
├── "上周你用了 80% 被动学习,本周降到 60%"
├── "尝试费曼技巧讲解双曲函数"
└── 策略变换前后的掌握度增速对比
苹果果目前是一个技术展示品——它有所有零件,但还没有考虑”怎么让学生愿意用它”这个关键问题。
Day 1 流程:
1. "你在学什么?" → 选学科(数学/物理/化学/……)
2. "你的目标是什么?" → 考试/竞赛/兴趣/预习
3. "你现在什么水平?" → 自评 + 几道快速诊断题
4. "你每天能花多久?" → 15min / 30min / 1h+
5. → 系统自动生成第一周计划
不要让学生自己配。当前系统需要学生理解”知识树”、“分区”、“认知节点”这些概念才能用——这对任何学生都是门槛。
┌─────────────────────────────────────┐
│ Day 1-3: 只用对话 + 自动记录 │
│ "像 ChatGPT 一样聊天,但系统在背后" │
│ 自动识别知识点,自动追踪掌握度 │
│ 学生完全无感 │
├─────────────────────────────────────┤
│ Day 4-7: 第一次复习提醒 │
│ "你昨天学了导数定义,来做个快速检查" │
│ 3-5 道题,< 5 分钟 │
│ 反馈:掌握度 + 建议 │
├─────────────────────────────────────┤
│ Week 2+: 主动学习模式 │
│ 学习计划、知识图谱、自适应练习 │
│ 所有高级功能逐步解锁 │
└─────────────────────────────────────┘
苹果果的”认知追踪”太学术化,学生只关心一件事:期末考试能考多少分。
考试模式:
├── 选择目标(期中/期末/高考/竞赛)
├── 输入考纲(或自动识别知识点)
├── 系统诊断 → 每个考点掌握度百分比
├── 优先级排序:离考试越近 × 提分空间越大
├── 生成备考路线:每周重点、每日任务
└── 考前冲刺:模拟考 + 时间分配训练
基于”投入产出比 + 对学生直接价值”排序
1. 考试模式(考试驱动设计)
── 大部分学生用教育产品的第一动机
── 现有认知追踪模型 + SM-2 已经够用
2. 轻量 onboarding
── 去掉所有概念门槛
── 5 步引导,零配置开始学习
3. FSRS 替换 SM-2
── 现代间隔重复算法,代码量不大
── 复习效率提升 2-3x
4. 测试覆盖核心链路(对话→练习→认知更新→复习)
── 没有测试就不敢重构
── 先用 pytest 覆盖关键路径
5. pgvector 安装 + HNSW 索引
── 向量搜索加速 10-100x
── 为知识图谱 + 素材搜索打基础
6. LLM-as-Judge 开放题评估
── 极大拓宽可支持的题型
── 错误分析升级
7. 元认知教学模块
── 教学生"怎么学",而不是只教"学什么"
── 这是苹果果真正的差异化竞争力
8. GraphRAG 升级
9. DKT 替代经典 BKT
10. 多智能体学习伙伴
11. 社交功能(学习小组 + 排名)
12. 学习报告分享卡片
13. 移动端 App(React Native)
14. 离线模式(本地小模型)
15. 多人协同学习
16. 课程市场(共享题库/学习路径)
17. A/B 测试框架 → 数据驱动优化认知模型
苹果果是我见过的认知引擎最深度的个人教育项目。15 个认知子系统和 22 个方程不是凑数——它们确实对应了学习科学的主流理论(ACT-R、BKT、SM-2、ZPD、Bloom)。
但它现在的问题是:
它是一台精密但无人驾驶的 F1 赛车。 每个零件都很认真,但没有考虑谁坐在驾驶座上。
核心缺失不是技术能力,而是真实用户反馈循环和从学生视角出发的设计。
最值得立即投入的方向不是加更多理论模型,而是: 1. 用考试模式给学生一个使用动机 2. 用轻量 onboarding 降低使用门槛 3. 用元认知教学建立真正差异化的教育价值
当学生真正用它学习并获得更好的考试成绩,认知引擎的精确度才有意义。