Compare commits

...
8 Commits
21 changed files with 603 additions and 31 deletions
+1
View File
@@ -0,0 +1 @@
.idea/
+4 -3
View File
@@ -1,6 +1,6 @@
# LPT 概念与设计文档
> 更新日期:2026-08-05
> 更新日期:2026-09-19
本项目只维护 LPTLearning Progress Tracker)的系统概念与设计思路,不保存开发记录、系统中间态或开发过程中的中间产物。
@@ -14,8 +14,9 @@
## 阅读路径
1. 从 [系统总览](docs/concepts/overview.md) 了解系统要解决的问题和核心闭环。
2. 从 [术语表](docs/concepts/README.md) 查找具体概念
3. 需要理解“为什么这样设计”时阅读 `docs/design/` 下的文档
2. 从 [系统结构](docs/design/system-structure.md) 了解组织轴、闭环、记忆机制与取舍准则
3. 从 [术语表](docs/concepts/README.md) 查找具体概念
4. 需要理解“为什么这样设计”时阅读 `docs/design/` 下的文档。
## 维护规则
+12 -2
View File
@@ -8,11 +8,21 @@
| 学习会话 | 针对某个学习任务的一次连续学习过程;误操作开启时可零数据关闭 | [学习会话](study-session.md) |
| 学习预期 | 开始学习前对本次学习目标的描述 | [学习预期](learning-expectation.md) |
| 知识碎片 | 学习中随手记录的不完整内容,也称“学习报告残片” | [知识碎片](knowledge-fragment.md) |
| 学习报告 | 一次学习结束后汇总出的完整学习结果 | [学习报告](learning-report.md) |
| 内容归属 | 一条知识碎片在知识结构上属于哪个学习任务 | [内容归属](knowledge-ownership.md) |
| 记录上下文 | 碎片产生于哪次学习会话或复习行为,不可变且不可为空 | [内容归属](knowledge-ownership.md) |
| 标记 | 附加在对象上的轻量元信息(来源、标签等),统一存放 | [标记](marker.md) |
| 待归类 | 尚未确定内容归属的碎片状态 | [内容归属](knowledge-ownership.md) |
| 学习报告 | 一次学习结束后汇总出的结构化学习结果 | [学习报告](learning-report.md) |
| 有效学习时间 | 学习会话中未暂停的实际投入时间 | [时间与效率](time-and-efficiency.md) |
| 复习耗时 | 复习行为(回忆对比、学习引导)的耗时,独立于学习时间 | [时间与效率](time-and-efficiency.md) |
| 任务优先级 | 由多个维度综合计算出的学习任务排序依据 | [任务优先级](priority.md) |
| 应用场景 | 学到的知识可以被使用到什么地方 | [应用场景](application-scenario.md) |
| 复习 Feed | 滚动展示知识碎片和学习报告的记忆触发物 | [复习 Feed](review-feed.md) |
| 复习总览 | 按任务汇总可复习内容、掌握度与最近复习时间的入口 | [复习总览](review-overview.md) |
| 复习 Feed | 滚动展示知识碎片的记忆触发物,只显示摘要 | [复习 Feed](review-feed.md) |
| 标准思维导图 | 每个学习任务对应的知识结构基准 | [标准思维导图](standard-mind-map.md) |
| 回忆对比 | 用户凭记忆重建知识结构并与标准导图比较 | [回忆对比](recall-review.md) |
| 回忆记录 | 一次回忆对比的存档,含起点、三类节点与覆盖率 | [回忆对比](recall-review.md) |
| 覆盖率 | 本次对比命中节点占参与对比节点的比例 | [回忆对比](recall-review.md) |
| 复习起点 | 用户指定的对比起始节点,只复习该子树 | [回忆对比](recall-review.md) |
| 学习引导 | 用开放式问题引出回答、由 AI 纠正概念边界的复习行为 | [学习引导](learning-guidance.md) |
| AI 任务 | 系统借助 AI 完成报告聚合、导图生成和语义对比 | [AI 任务](ai-task.md) |
+8 -4
View File
@@ -2,26 +2,30 @@
## 定义
AI 任务是系统使用 AI 完成的三类学习处理能力:
AI 任务是系统使用 AI 完成的学习处理能力:
- 聚合报告:把知识碎片整理成学习报告草稿。
- 聚合报告:把知识碎片整理成结构化学习报告草稿——会话摘要、预期达成判断、按归属分组的碎片,以及自由总结草稿
- 生成导图:从报告、碎片和应用场景中提取标准思维导图。
- 回忆对比:对用户回忆与标准导图进行语义层面的比较。
- 学习引导:用一个开放式问题引出用户的回答,检查回答里隐含的概念边界问题并纠正,产出交用户确认后记成知识碎片。
## 设计意图
AI 用于降低用户的书写和整理负担:
- 报告不必从零开始写,AI 先给草稿,用户再修改。
- 报告不必从零开始写,AI 先给结构化草稿(含碎片分组建议),用户再修改。
- 导图不必用户手工搭建,AI 可以先提取结构。
- 回忆对比可以容忍同义表达,而不只是机械文字匹配。
## 设计思路
AI 是增强能力,而不是单点依赖。AI 不可用时,系统应能用内置规则继续完成报告拼接、导图生成和字符串匹配,保证核心学习流程不中断。
AI 是增强能力,而不是单点依赖。AI 不可用时,系统应能用内置规则继续完成报告拼接、导图生成和字符串匹配,保证核心学习流程不中断:报告降级为按内容归属分组碎片并生成摘要,自由总结留空由用户填写
例外:学习引导不提供降级形态。它不属于核心闭环,AI 不可用时该功能整体不可用。
## 相关概念
- 学习报告:AI 聚合碎片的产出。
- 标准思维导图:AI 生成或增量更新的对象。
- 回忆对比:AI 负责语义匹配的环节。
- 学习引导:允许完全依赖 AI 的能力。
+6
View File
@@ -20,7 +20,13 @@
- 学习报告:碎片被聚合、整理成完整报告。
- 复习 Feed:碎片是滚动展示的核心内容。
- 标准思维导图:碎片参与导图生成,并可追溯到原文。
- 内容归属:碎片产生于某个会话,但它可以归属到另一个学习任务。
- 记录上下文:碎片产生于哪次学习会话与任务,不可变且不可为空。
## 设计思路
碎片不应被要求“整理得非常完美”。它是学习过程的原料,后续由用户或 AI 汇总成更结构化的内容。
碎片“产生于某个任务”只说明它出现在哪里,不代表它只能属于那里:记录上下文不可变,内容归属可以调整,尚未确定的内容进入待归类状态。区分两者后,旁支知识不会污染原任务的知识结构。
碎片一定产生于某次学习会话,不存在脱离会话的碎片:待归类只表示内容归属尚未确定,记录上下文始终存在。
+99
View File
@@ -0,0 +1,99 @@
# 内容归属
> 状态:**设计已确认,实现待安排**。三个待决问题已于 2026-09-19 由维护者确认,结论见文末。
## 定义
**内容归属**描述一条知识碎片(以及由它聚合出的内容)属于哪个学习任务。
它与**记录上下文**是两件事:
- **记录上下文**:这条碎片是在哪次学习会话或哪次复习行为、哪个任务下产生的。不可变,由系统确定。
- **内容归属**:这条碎片在知识结构上属于哪个任务。可变,由用户确定。
系统允许两者不一致。典型场景:在学习 AI 的过程中记下"1B 是 one billion 的缩写",它的记录上下文是 AI 任务,内容归属是英语任务。
**待归类**是没有确定归属的状态。处于待归类的内容不会消失,也不阻塞任何流程,只是暂时不进入任何任务的知识结构。
碎片一定产生于某次学习会话或某次复习行为,不存在没有记录上下文的碎片:待归类只表示内容归属尚未确定,记录上下文始终存在。
## 要解决的问题
在只有记录上下文的情况下,系统会强制把"记录地点"当成"内容归属",由此产生三个后果:
1. **污染原任务的知识结构**。旁支知识进入原任务的标准思维导图,回忆对比的基准随之失真——用户明明掌握了 AI 的内容,却因为导图里混着英语词条而覆盖率偏低。
2. **旁支知识无处复习**。用户想按英语复习这块内容时找不到它,它沉在 AI 任务下。
3. **不成体系的内容无家可归**。既不属于任何现有任务,也不值得为它单独建任务的内容,只能硬塞或干脆不记。
## 三个维度
| 维度 | 数量 | 可变性 | 由谁决定 | 影响 |
|------|------|--------|---------|------|
| 记录上下文 | 一个 | 不可变 | 系统 | 时间统计(学习时间按会话、复习耗时按复习行为)、学习报告 |
| 内容归属 | 一个,可为空 | 可变 | 用户(AI 只建议) | 标准思维导图、复习内容、检索 |
| 标签 | 多个,可为空 | 可变 | 用户 | 只影响检索,不影响聚合与统计 |
归属保持**单一**是有意的:多归属会让同一条内容出现在多张导图里、被回忆对比重复计数,聚合与统计都会出现歧义。一条内容确实横跨两个领域时(例如"1B"同时属于英语与 AI),用标签表达弱关联即可。
标签与来源标记等弱信息统一由[标记](marker.md)承载,不在碎片表里各自加字段。
## 核心原则
**时间按真实发生的行为统计,内容按内容归属聚合。**
这条原则把两条轴彻底分开:
- 学习时间、有效性、番茄钟、遗忘判定——全部按学习会话,不受归属影响。一次会话实际投入的时间不会因为碎片被归类到别处而改变。
- 复习耗时——按复习行为(回忆对比、学习引导)统计,与学习时间独立,不合并也不换算。
- 标准思维导图的素材、复习内容、按任务的检索——全部按归属,不受产生地点影响。
推论:**学习报告按会话生成**(它是"这次学习产出了什么"的事实记录),而**标准思维导图按归属聚合**。同一份数据因此有两种视角,这是设计意图,不是重复。
## 配套机制
### 待归类优先,不打断记录
记录一条碎片时,归属默认就是当前任务,用户不需要做任何额外操作。只有在用户主动改归属时才会离开默认值。未确定归属的内容进入**待归类**视图,长期不处理也不影响任何流程——低阻力优先于分类整齐。
### 归类挂在复习里,而不是单独做整理流程
用户很少专门花时间整理历史记录,但会经常刷复习 Feed。因此在复习 Feed 中看到一条内容时提供轻量的归类动作,是成本最低的归类时机。归类不应该成为一个独立的"整理任务"。
### AI 只给建议
系统可以在记录或归类时给出建议归属,一键接受即可。AI 不可用时降级为规则建议(关键词、历史归属),再不可用时不做建议,不影响记录与复习。
### 零散知识可以升格为学习任务
待归类内容积累到一定量时,系统可以提示用户将这些同类内容立为一个学习任务。这让体系从已有内容中长出来,而不是要求用户在记录之前就规划好体系。
升格后的内容归属到新任务,记录上下文保持不变——学习时间仍然记在当初真实发生的那次会话上。
### 报告保持真实,旁支内容单独呈现
一次会话产生的碎片可能归属不同任务。学习报告的摘要、预期达成判断与正文推演只使用归属当前任务的碎片;旁支碎片仍留在本次报告中,单独分组呈现并标注其归属,不参与正文推演。这样既保住报告的真实性,也避免报告与导图被无关内容带偏。
## 修改归属的后果
内容归属可以被修改,但修改会产生两个后果,需要系统显式处理:
- 原任务与新任务的知识结构都需要重新整理。导图是快照式的,必须标记为待更新,否则用户会以为内容丢失。
- 复习 Feed 的排序权重按任务掌握度计算,归属改变后自动跟随,不需要单独处理。
## 相关概念
- 知识碎片:内容归属的作用对象,也是待归类的单位。
- 学习任务:内容归属的目标容器。任务不必在记录前存在,可以由待归类内容升格而来。
- 标准思维导图:按归属聚合的核心消费者。
- 学习报告:按会话生成,与归属口径不同。
- 复习 Feed:归类动作的最低成本落点,也是旁支内容的复习入口。
- 复习行为(回忆对比、学习引导):另一类记录上下文;学习引导产生的碎片默认归属被引导概念所属的学习任务。
- AI 任务:只提供归属建议,不作为判定依据。
## 已确认的结论
以下三点于 2026-09-19 由维护者确认:
1. **碎片不可脱离记录上下文。** 不存在没有记录上下文的内容:每一条碎片都产生于某次学习会话或某次复习行为(回忆对比、学习引导),因此一定有可追溯的产生场景。代价是系统不向可以随手记录的通用笔记工具演进,这是有意的边界。
2. **学习报告改为结构化呈现。** 报告由会话摘要、预期达成判断、按归属分组的碎片和自由总结组成;旁支碎片仍留在本次报告中,只单独标注归属、不参与正文推演。自由总结必须保留,否则卡点与下一步无处表达。
3. **内容归属保持单一,跨领域关联由标签承担。** 学习内容很少只属于一个领域:一份侧重 A 领域的材料仍会带来 B 领域的碎片,但它仍归属 A,与 B 的关联用标签表达。如果用户持续在同一领域积累旁支碎片,说明该领域已值得作为独立学习任务,此时走“待归类内容升格为学习任务”的路径,而不是给它第二个归属。
+50
View File
@@ -0,0 +1,50 @@
# 学习引导
## 定义
学习引导是复习中的一种主动提取:系统用一个开放式问题引出用户自己的回答,AI 在对话中检查回答里隐含的概念边界问题并及时纠正,最终由用户确认把这次对话的收获记成一条知识碎片。
例子:对「大模型参数量」这个概念,系统问“1B 参数量的 LLM 模型,会占用多少磁盘空间?”要回答它,用户必须先意识到参数量并不能决定模型在磁盘上的大小,从而把「参数量」与「硬件占用」这两个容易混淆的概念分开。
## 设计意图
- 复习的另外两种机制回答的是“有没有接触到”和“记不记得住结构”,捕捉不到概念边界上的误解:节点都在、结构也在,但把 A 当成了能决定 B 的东西。
- 开放式问题不设标准答案:系统要确认的是“用户是否分清了边界”,而不是“答案是否与范文一致”。
- 纠正的对象是回答里隐含的假设,而不是答案本身的对错。对话因此是引导,不是判卷。
## 产出
- 对话的产出是一条**知识碎片**,不是新的数据实体:它走碎片的全部既有逻辑(内容归属、待归类、归属调整、导图取材、复习 Feed 回收)。
- 碎片由**用户确认后**记录:AI 的纠正也可能是错的,未经确认就入库会把错误边界固化进以后的复习基准。没有确认,就等于这次引导没有产出。
- 碎片带一个「来自学习引导」的[标记](marker.md)。标记只说明来源,不改变碎片的任何处理逻辑。
- 记录上下文是这次复习行为;耗时计入[复习耗时](time-and-efficiency.md);不进入任何学习报告——报告按学习会话生成,学习引导不是会话。
- 默认内容归属:被引导概念所属的学习任务。
## 入口
- 复习 Feed 的卡片。
- 标准思维导图的节点。
两个入口都对应“用户已经看到某段内容”的时刻,系统据此就近发问,用户不需要先想清楚该复习哪个概念。
## 对话不设轮数上限
引导对话以“用户想结束”为终点,不限制轮数,也不要求必须产出碎片。系统不统计“引导做了多少次”“还有多少没引导”。
## 与 AI 的关系
学习引导是系统里唯一允许完全依赖 AI 的能力:它不属于核心闭环,AI 不可用时该功能整体不可用,也不提供降级形态。核心闭环(报告聚合、导图生成、回忆对比)仍然必须能靠内置规则独立完成。
## 相关概念
- 知识碎片:引导产出的落点。
- 内容归属:默认归属被引导概念所属的学习任务。
- 标准思维导图:入口之一,也是引导产出的延伸概念进入的地方。
- 回忆对比:另一种主动提取,测的是结构是否记得住。
- 复习 Feed:入口之一,也是引导产出被再次遇到的地方。
- 标记:承载“来自学习引导”这类附加信息。
- AI 任务:承担引导对话与边界纠正。
## 设计思路
引导的目标不是把概念讲一遍,而是让用户先说出自己的理解,再针对那句话纠正。因此系统不预设问题清单,也不把引导做成待办:它和复习的其他机制一样,只在用户已经看到内容时就地发生。
+17 -3
View File
@@ -4,6 +4,15 @@
学习报告是一次学习会话结束后的完整学习结果汇总。它由本次会话产生的知识碎片综合而来,而不是要求用户从零开始写一篇长文。
报告由四部分组成:
- **会话摘要**:这次实际学了什么。
- **预期达成判断**:对照学习预期,判断目标是否达成。
- **按归属分组的碎片**:碎片按内容归属分组呈现;旁支碎片单独列出并标注其归属。
- **自由总结**:用户对本次学习的叙述,包括卡点、疑问和下一步打算。
报告一定属于产生它的那次会话。会话中产生的碎片无论最终归属哪个任务,都会出现在本次报告中,只是分组不同。复习行为(回忆对比、学习引导)产生的碎片不进入任何报告:报告按会话生成,复习行为不是会话。
## 设计意图
学习报告的价值在于:
@@ -12,13 +21,18 @@
2. 与学习预期对照,判断学习目标是否达成。
3. 作为复习材料和标准思维导图的输入。
结构化不是为了形式整齐,而是让前两项可以直接被读取:预期与达成判断本来就是一组对照,不必藏在正文里做隐含比较;按归属分组则让报告与标准导图的取材口径一致。
自由总结必须保留:报告同时承担叙述职责,卡点、疑问和下一步打算没有字段可以承载,取消它就失去了复盘的表达位。
## 相关概念
- 知识碎片:报告的主要来源。
- 知识碎片:报告的主要来源,按内容归属分组
- 学习预期:报告中回答“实际学了什么”。
- 内容归属:决定碎片在报告中的分组,也决定它进入哪份标准思维导图。
- 标准思维导图:报告参与导图生成。
- 复习 Feed报告也参与碎片化展示
- 复习 FeedFeed 的条目单位是碎片;报告以会话完整结果的形态从任务记录进入回顾
## 设计思路
降低报告的仪式感:用户的主要书写单元是知识碎片,报告允许先由系统根据碎片生成草稿,再由用户修改确认
降低报告的仪式感:用户的主要书写单元是知识碎片,报告允许先由系统根据碎片生成结构化草稿(摘要、达成判断、分组建议、总结草稿),再由用户修改确认。AI 不可用时降级为规则拼接:按内容归属分组碎片并生成摘要,自由总结留给用户填写
+3 -1
View File
@@ -20,7 +20,7 @@
## 相关概念
- 学习会话:属于某个学习任务。
- 知识碎片与学习报告:在一次会话中产生,最终属于该任务。
- 知识碎片与学习报告:都在某次学习会话中产生;碎片按内容归属、报告按会话所属指向该任务。
- 标准思维导图:每个学习任务对应一份知识结构基准。
- 应用场景:挂在学习任务下,表示该任务最终能用来做什么。
- 任务优先级:决定多个学习任务之间的先后顺序。
@@ -28,3 +28,5 @@
## 当前系统体现
学习任务拥有可配置的多维度优先级权重,用户可以调整权重后让系统重新排序。应用场景被设计为任务级能力,而不是复习模块的一部分。
学习任务不必在记录之前就存在:待归类内容积累到一定量后可以升格为一个学习任务,体系从已有内容中长出来。
+46
View File
@@ -0,0 +1,46 @@
# 标记
## 定义
标记是附加在系统对象上的一段轻量元信息,用来表达对象的来源、性质或用户自己的分类。所有标记统一存放,而不是在碎片等表结构里为每一种标记各加一个字段。
一条标记至少包含:
- **对象**:对象类型与对象标识(例如某条知识碎片、某个学习任务)。
- **标记名与标记值**:例如「来源 = 学习引导」「标签 = 英语」。
- **种类**:系统标记或用户标签。
- **建立信息**:建立者(系统或用户)与建立时间。
## 设计意图
- 新增一种标记时不需要改动各功能表结构,避免碎片、报告等表被标记字段逐渐撑开。
- 跨功能检索统一:按标记找对象只查一处。
- 让「来源」「标签」这类弱信息有唯一的存放位置,语义清晰,不再散落在各功能里。
## 边界
标记不是状态,也不是归属:
- 会话状态、报告能否修订、导图是否待更新这类会影响流程判断的信息,留在各自主体上,不进标记表。用标记表达状态会让流程判断变得不可枚举。
- 标记只被读取和展示,不参与聚合口径,也不改变内容归属。
- 内容归属是唯一的结构归属,标记不能用来表达第二归属。
## 现有与预期的标记
- **标签**(用户标签):用户自由建立的分类,多个、可为空、可变,只影响检索。
- **来源标记**:例如「来自学习引导」。系统标记,由系统在产出时写入,用户不可编辑。
## 相关概念
- 知识碎片:最常见的标记对象。
- 内容归属:与标签互补——归属是唯一结构归属,标签是弱关联。
- 学习引导:产出的碎片带来源标记。
- 学习任务:标签也可以挂在任务上用于检索。
## 待决问题
1. 标记可以挂在哪些对象上(知识碎片 / 学习报告 / 学习任务 / 学习会话)?
2. 标记名的受控方式:系统标记用固定词表、用户标签自由输入;是否允许用户在系统标记上叠加自己的值。
3. 标记值是否只在需要时使用(布尔开关 / 枚举 / 自由文本)。
4. 是否需要按标记检索的入口(例如“找出所有来自学习引导的碎片”),以及需要哪些索引。
5. 标记名如何治理(能否重命名或废弃),以及哪些标记对用户展示。
+24 -6
View File
@@ -6,24 +6,42 @@
系统使用五个维度:
- 主观判断:用户对任务重要性的直觉。
- 未来价值:这项知识对长期目标的价值。
- 内容难度:学习这项内容的困难程度。
- 必要性:这项内容是否是其他学习的基础。
- 紧急性:是否存在时间压力。
- 重要性:这项内容对当前目标的权重。
- 内容难度:学习这项内容的困难程度。
- 未来价值:这项知识对长期目标的价值。
- 主观优先级:用户对任务先学顺序的直觉判断。
重要性针对当前目标,未来价值面向长期目标,两者是不同维度。
## 设计意图
优先级不能只靠用户“拍脑门”。多个维度可以暴露用户容易忽略的方面,例如:
- 要性高的内容往往是其他学习的基础,应该提前学。
- 要性高的内容对当前目标贡献更大,应该提前学。
- 紧急性负责兜底,避免真正临近截止的学习内容被长期忽略。
- 主观判断和未来价值反映兴趣与长期方向。
- 主观优先级和未来价值反映兴趣与长期方向。
## 设计思路
不同维度的权重可以配置。系统提供默认权重,但用户可以通过界面调整,使排序更符合个人偏好。设计上倾向于“重要但不紧急”的任务优先,紧急性作为安全网而不是唯一决定因素。
## 默认权重
系统在没有用户自定义配置时使用一组默认权重:
| 维度 | 默认权重 |
|------|---------|
| 紧急性 | 35% |
| 重要性 | 25% |
| 内容难度 | 20% |
| 未来价值 | 10% |
| 主观优先级 | 10% |
默认值体现了权重之间的相对关系:紧急性负责兜底,重要性次之,主观优先级和未来价值只占很小比例,避免排序完全被当下情绪或模糊预期主导。
权重按用户整体配置,各维度之和需要归一(总和为 1)。权重改变后,所有任务的综合优先级需要重新计算,而不是只影响之后新建的任务。
## 相关概念
- 学习任务:优先级作用于任务。
+38
View File
@@ -10,6 +10,42 @@
- 遗漏:标准导图中有、用户没有回忆出来的内容。
- 额外:用户回忆起但标准导图中没有明确出现的内容。
## 复习起点
用户可以指定一个节点作为复习起点,只对比该节点及其子树。起点让“只想巩固一小块”成为可能,不必每次面对整棵树。
不指定起点时,对比覆盖整棵标准导图。起点会记录在回忆记录中,便于之后回看“上次是从哪里复习的”。
## 回忆记录
每一次回忆对比都会留下一条回忆记录,包含:
- 发生时间。
- 复习起点(或整棵树)。
- 命中、遗漏、额外的节点集合。
- 覆盖率。
- 本次耗时(见[时间与效率](time-and-efficiency.md)的复习耗时)。
回忆记录有三个用途:
- 让用户看到掌握程度的变化,而不是只有一次结论。
- 为复习排序提供任务级掌握度:最近一条记录的覆盖率。
- 让遗漏项在下一次复习时仍然可以被定位。
## 覆盖率
覆盖率是本次对比的命中节点数占参与对比的节点数的比例。
它衡量的是“这次回忆起了多少结构”,不是“学了多久”,也不是“学得好不好”。因此它只作为事实呈现:覆盖率低表示这次漏得多,不表示用户落后。
覆盖率按任务聚合成**掌握度**,是复习排序的输入之一;单条碎片不单独计算覆盖率,避免把碎片变成需要逐个处理的对象。
## 遗漏项回溯
遗漏项是标准导图中有、用户没有回忆出来的节点。每个遗漏项都能回看它的来源(学习报告、知识碎片或应用场景),并在标准导图上定位。
遗漏项是本次对比的快照,不是跨次累计的待办集合:系统不提供“处理完所有遗漏项”的流程,也不统计还有多少条没处理。
## 设计意图
回忆对比把“是否记住了”变成可见的结构差异:
@@ -23,6 +59,8 @@
- 标准思维导图:对比的基准。
- 复习起点:用户可以选择从某个节点开始,只复习该子树。
- 知识碎片与学习报告:遗漏项可追溯回原文。
- 复习总览:消费覆盖率形成的任务级掌握度。
- 复习 Feed:排序权重按任务掌握度计算。
- AI 任务:语义对比可以由 AI 完成,也可降级到文本相似度匹配。
## 设计思路
+12 -2
View File
@@ -2,7 +2,9 @@
## 定义
复习 Feed 是滚动展示用户自己写过的知识碎片和学习报告的轻量复习入口。它只显示内容摘要,用户看到后可以回想上下文,也可以点击进入详情。
复习 Feed 是滚动展示用户自己写过的知识碎片的轻量复习入口。它只显示内容摘要,用户看到后可以回想上下文,也可以点击进入详情。
Feed 的条目单位是知识碎片。学习报告不以条目形式出现在 Feed 中:报告是“一次会话的完整结果”,从学习任务的记录进入回顾,避免同一段内容以两种形态重复出现。
## 设计意图
@@ -14,10 +16,18 @@
## 相关概念
- 知识碎片与学习报告Feed 的内容来源。
- 知识碎片:Feed 的唯一内容来源。
- 内容归属:Feed 里的归类动作改变碎片的归属。
- 复习总览:任务级入口,与 Feed 的条目级展示互补。
- 回忆卡片:点击 Feed 内容后,先让用户尝试回忆再展开原文。
- 回忆对比:Feed 是进入深度复习的入口之一。
- 学习引导:Feed 卡片是它的入口之一。
- 复习排序:合并“多久没接触”与任务掌握度两个信号,只影响出现概率。
## 设计思路
滚动展示适合“播种”记忆,主动回忆适合“巩固”记忆。系统把两者结合:先低门槛展示,再在用户点击时引导回忆。
Feed 只给摘要,全文在详情里按需展开:滚动场景下全文既拖慢浏览,也让用户跳过“先尝试回忆”这一步。
Feed 同时是归类成本最低的位置:看到一条内容时顺手确认它属于哪个任务,不需要额外的整理流程。归类动作与复习动作放在一起的原因见[模块边界](../design/module-boundaries.md)。
+36
View File
@@ -0,0 +1,36 @@
# 复习总览
## 定义
复习总览是复习的任务级入口。它把用户的学习任务按“有什么可复习、掌握到什么程度、多久没复习过”列出来,让用户决定从哪个任务开始。
它不展示单条内容:单条内容的偶遇式回顾发生在[复习 Feed](review-feed.md) 里。
## 总览呈现什么
- **可复习内容的规模**:该任务下有多少知识碎片。学习报告不以报告为单位重复计数,它包含的碎片已经在碎片里各出现过一次。
- **掌握度**:该任务最近一次回忆对比的覆盖率。
- **复习耗时**:该任务上回忆对比与学习引导累计的耗时,与学习时长并列展示。
- **最近复习时间**:距上次回忆对比过去了多久。
- **待归类内容**:尚未确定内容归属的碎片,见[内容归属](knowledge-ownership.md)。
## 设计意图
- 用户主动想复习时,需要一个“从哪里开始”的列表。总览只是入口选择,不是必须完成的清单:不产生到期、逾期、落后等压力信号。
- 任务级聚合让复习聚焦在有知识结构的对象上,碎片不单独成为待办项。
- 学习时长与复习耗时并列呈现:让用户看到投入的分布,而不是只有一个总数。
- 待归类内容必须在这里被看见:否则用户不知道有哪些内容还没有归属,归类也就无从发生。
## 相关概念
- 学习任务:总览的行单位。
- 内容归属:决定内容进入哪个任务,也决定待归类内容是否出现在这里。
- 标准思维导图:从任务进入深度复习的对象。
- 回忆记录与覆盖率:掌握度的来源。
- 复习耗时:与学习时长并列的投入口径。
- 学习引导:复习行为之一,产出的碎片默认归属被引导概念所在任务。
- 复习 Feed:条目级的偶遇展示,与总览互补。
## 设计思路
总览只呈现事实——数量、覆盖率、时间,不给“你该复习了”的判断,也不做风险等级。掌握度低、久未复习的任务可以自然排在前面,但不被标记为落后。
+18 -1
View File
@@ -2,7 +2,7 @@
## 定义
标准思维导图是每个学习任务对应的知识结构基准,由系统从该任务的学习报告、知识碎片和应用场景中提取整理而成。用户可以查看、编辑它,也可以用它作为复习的对照对象。
标准思维导图是每个学习任务对应的知识结构基准,由系统从**归属为该任务**的学习报告、知识碎片和应用场景中提取整理而成。用户可以查看、编辑它,也可以用它作为复习的对照对象。
## 设计意图
@@ -15,10 +15,27 @@
## 相关概念
- 学习报告与知识碎片:导图的生成素材。
- 内容归属:决定哪些碎片进入本导图;素材按归属取材,而不是按产生于哪个学习会话。
- 应用场景:作为独立分支进入导图。
- 回忆对比:标准导图是用户回忆结果的对照基准。
- 节点溯源:导图节点可以关联回原始报告、碎片或应用场景。
- 学习引导:从导图节点发起,产出的碎片按归属进入本导图。
## 生成来源
标准导图区分四种来源,用于说明当前这份导图是怎么来的:
- 内置规则:不依赖 AI,按学习会话分组,对报告、碎片和应用场景做去重与合并。
- AI 生成:由 AI 从学习材料中提取缩进大纲后解析成树。
- 用户编辑:用户直接修改导图内容。
- 用户合并:增量生成时保留用户已编辑的内容,再追加新产生的学习内容。
重新生成导图时不覆盖用户的手工编辑,而是把新内容合并进来。
## 设计思路
标准导图应同时适合人工编辑和机器处理。它既可以用缩进大纲的形式让用户直接修改,也可以用树结构参与算法比较。
内置规则和 AI 是两条并行的生成路径:AI 提升结构质量,内置规则保证 AI 不可用时导图仍能生成。
取材按内容归属而不是产生地点:其他任务中顺手记下、但归属本任务的内容同样会进入本导图;反之,在本任务中产生的旁支内容不会混入。内容归属发生变更时,原任务与新任务的导图都应标记为待更新。
+15 -2
View File
@@ -8,6 +8,8 @@
- 有效学习时间:会话中真正处于学习状态的时间,即扣除暂停时间后的投入。
- 有效时间比:有效学习时间占实际使用时间的比例,用于观察学习是否被频繁中断。
复习行为另用「复习耗时」计量,它与上述学习时间独立统计,见下文。
## 设计意图
时间数据帮助用户建立对学习投入的感知,而不是用来评判用户。用户看到一次学习真正投入了多久,可以更合理地估计完成一个任务需要多长时间。
@@ -18,7 +20,18 @@
- 番茄钟等时间刻度只是辅助参考,不是强制约束。
- 系统记录数据,不把“效率低”当成错误,而是让用户看到实际情况。
## 复习耗时
复习耗时是一次复习行为的耗时。它与学习时间分属两条轴,不合并、不换算、不互相比较。
- **覆盖范围**:回忆对比与学习引导。滚动浏览内容不计时。
- **计时边界**:从行为开始到结束;超过 5 分钟没有任何交互,则把耗时截断到上一次交互时间。复习没有“暂停”动作,这条截断规则用来替代暂停。
- **不叫“有效复习时间”,也不套用 10 分钟最小阈值**:复习行为天然是分钟级,套用会话口径会把几乎所有复习耗时清零。
- **用途**:在复习总览中按任务与学习时长并列展示,回答“我在这块内容上复习了多少”。不设目标、不做提醒、不参与“该复习什么”的排序。
## 相关概念
- 学习会话:时间数据记录在会话上。
- 学习任务:任务层面的累计学习时间来自多次会话
- 学习会话:学习时间数据记录在会话上。
- 复习行为:回忆对比与学习引导,复习耗时的来源
- 复习总览:按任务并列展示学习时长与复习耗时。
- 学习任务:任务层面的累计学习时间来自多次会话,累计复习耗时来自多次复习行为。
+1 -1
View File
@@ -36,7 +36,7 @@
### 学习报告
报告把碎片收敛成一次学习的完整结果。它可以由系统先聚合,再由用户修正,避免把完整报告变成书写压力。
报告把碎片收敛成一次学习的完整结果:会话摘要、预期达成判断、按归属分组的碎片与自由总结。它可以由系统先生成结构化草稿,再由用户修正,避免把完整报告变成书写压力;旁支碎片留在本次报告中单独呈现,不参与正文推演
### 复习与应用
+9 -4
View File
@@ -15,17 +15,21 @@
- 汇总学习报告。
- 追踪时间与状态。
学习执行产生学习过程中的原始材料。
学习执行产生学习过程中的原始材料。学习执行只按会话记录发生了什么,不决定内容最终属于哪个知识结构(见 [内容归属](../concepts/knowledge-ownership.md))。
## 复习
负责消费学习执行产生的材料:
- 滚动展示知识碎片和学习报告
- 按任务汇总复习状态(复习总览)
- 滚动展示知识碎片(复习 Feed)。
- 维护标准思维导图。
- 提供回忆对比和遗漏项回溯。
- 提供回忆对比、回忆记录和遗漏项回溯。
- 提供学习引导(开放式问题与概念边界纠正)。
- 记录复习耗时(回忆对比与学习引导)。
- 承接内容归属的调整动作与待归类内容的处理入口。
复习模块不要求用户逐条整理学习材料,材料是自动整理和对照分析的数据来源。
复习模块不要求用户逐条整理学习材料,材料是自动整理和对照分析的数据来源。复习按内容归属聚合,而不是按内容产生于哪次会话:这是归类动作与复习动作放在一起的原因。复习不做调度:不生成到期清单,只影响内容的出现概率。
## 应用场景
@@ -46,4 +50,5 @@ AI 能力可替换、可降级,不影响学习执行和复习的基本流程
- 执行模块产生数据。
- 复习模块消费数据并形成反馈。
- 应用场景定义学习目标。
- 时间轴与内容轴分离:时间按行为统计(学习会话→学习时间,复习行为→复习耗时),内容按内容归属聚合。
- AI 模块增强整理与对比,但不承担核心闭环的完整性。
+2
View File
@@ -30,6 +30,8 @@ LPT 是辅助学习与生活的工具。系统可以量化、提醒、建议,
随机展示是为了制造偶然接触,智能排序是为了让偶然接触更接近真正需要复习的内容。两者结合,而不是互相替代。
因此复习不做到期清单:系统只调整出现概率,不生成必须完成的队列,也不因为长期未复习而判定用户落后。
## AI 增强,但不依赖
AI 负责降低书写负担、提取知识结构和进行语义比较。核心学习流程必须在 AI 不可用时仍然可用,通过内置规则继续完成基本功能。
+96 -2
View File
@@ -1,11 +1,50 @@
# 复习回路
## 复习系统的立场
复习是记忆机制,不是任务清单。系统只做两件事:
- 让学过的内容以低阻力反复出现在用户眼前,为记忆播种。
- 在用户愿意的时候提供主动提取的机会,让记忆被巩固。
明确不做的事:
- 不做间隔重复调度:系统不计算“下次复习日期”,不生成到期队列,也不做逾期提醒。
- 不做打卡与连续天数,不统计“复习完成率”。
- 不做评分与等级:覆盖率是事实,不是成绩。
- 不要求用户处理完所有遗漏项。
任何让复习变成“必须完成的清单”的改动,都违背这条立场。复习可以影响“什么更容易被看到”,但不能制造“欠下的债”。
## 复习的两种机制
系统把两种记忆机制组合在一起:
1. 偶然接触:通过滚动 Feed 让用户无意识看到自己写过的内容,为记忆“播种”。
2. 主动回忆:用户点击内容后先尝试回忆,再展开原文,通过提取练习巩固记忆。
2. 主动提取:用户主动付出回忆努力,让记忆被巩固。它有两种形态:
- **回忆对比**:重建知识结构,看漏了哪些节点。
- **学习引导**:回答一个开放式问题,暴露概念边界上的误解,产出由用户确认后记成知识碎片。
## 复习内容来源
| 来源 | 在复习中的角色 |
|------|----------------|
| 知识碎片 | 复习的基本单位,也是 Feed 的条目 |
| 学习报告 | 一次会话的完整结果,从任务记录进入回顾 |
| 标准思维导图 | 深度复习的对照基准与结构来源 |
| 应用场景 | 复习的现实语境,参与导图 |
| 回忆记录 | 复习产生的历史,用于展示掌握变化与计算任务掌握度 |
学习时间与复习耗时都不进入复习内容:它们回答的是投入了多少,而不是记得怎么样。复习耗时只在复习总览里与学习时长并列呈现。
## 复习的两个层级
- **任务级**:复习总览回答“从哪个任务开始复习”,见 [复习总览](../concepts/review-overview.md)。
- **内容级**:复习 Feed 回答“这次遇到哪条内容”,见 [复习 Feed](../concepts/review-feed.md)。
## 复习耗时
复习行为(回忆对比、学习引导)会记录耗时,与学习时间独立统计:不合并、不换算,也不参与“该复习什么”的排序。口径、截断规则与展示方式见[时间与效率](../concepts/time-and-efficiency.md)与[复习总览](../concepts/review-overview.md)。
## 从轻量复习到深度复习
@@ -41,6 +80,61 @@
- 遗漏的内容直接指出需要回看哪里。
- 额外回忆的内容可能是用户自己的联想,也值得保留。
每次对比都会留下一条[回忆记录](../concepts/recall-review.md),记录这次回忆的起点、三类节点与覆盖率。覆盖率按任务聚合成掌握度,是复习排序的输入之一。
## 学习引导的作用
学习引导处理的是另一种失效:结构记住、概念边界却没分清。系统用开放式问题引出用户的回答,AI 针对回答里隐含的假设纠正边界,用户确认后把收获记成一条知识碎片,之后走碎片的全部既有逻辑(归属、待归类、导图取材、Feed 回收)。完整定义见[学习引导](../concepts/learning-guidance.md)。
## 进入回忆对比的入口
回忆对比不应该只有一个入口。系统提供三种入口,它们对应不同的复习心态:
- 从复习总览进入:用户主动想复习某个学习任务,此时默认面对整棵标准导图,可以选择任意节点作为起点。
- 从某条知识碎片或学习报告详情进入:用户在看具体内容时想深挖,系统根据这段内容定位到最相关的节点,直接以该节点为复习起点。
- 从首页回忆卡片进入:用户在滚动 Feed 上随手回忆后想继续,同样自动定位到对应节点。
后两种入口的设计意图是:用户不需要先想清楚“该复习哪个知识点”,系统根据当前看到的内容替他缩小范围。
## 智能排序与随机性
复习内容不应完全随机,也不应被强制排序。系统可以综合“多久没复习”和“上次回忆覆盖率”让更需要复习的内容更常出现,同时保留随机感。
复习内容不应完全随机,也不应被强制排序。系统综合两个信号调整内容的出现概率:
- **多久没接触**:距内容产生(或最近一次出现)越久,权重越高;时间效应在到达上限后不再增长。
- **任务掌握度**:最近一次回忆对比的覆盖率越低,权重越高;从未回忆过的任务视为最需要复习。
两个信号只影响“出现的概率”,不产生到期、逾期、优先级标记。随机性被保留:每条内容都有机会出现,包括刚刚复习过的内容。信号强度可配置,默认值按“时间效应为主、掌握度为辅”设定。
## 复习中的归类
复习是内容归类的最低成本时机:用户已经看到这条内容,此时决定它属于哪个任务不需要额外整理流程。
- 待归类内容在复习总览中可见,在 Feed 中可归类。
- 归类动作就近提供,一次交互完成;AI 只给建议,用户可一键接受或忽略。
- 归属改变后,内容进入新任务的导图取材范围,原任务与新任务的导图都标记为待更新;复习排序权重按任务掌握度自动跟随,不需要单独处理。
## 复习中的反馈动作
复习目前只有“看到 → 展开 → 深入”的路径,用户不能表达“这条我已经很熟”或“这条我要再看看”。设计上区分两种反馈:
- **无需记录的反馈**:展开查看、进入回忆对比,本身就是复习行为,不产生额外数据。
- **需要记录的反馈**:用户主动标记“已掌握”或“稍后再看”,用于调整出现概率。
反馈动作的存在方式列入待决问题:它既可能帮助系统更准地安排内容,也可能把复习拖回清单模式。
## AI 在复习中的边界
- 回忆对比的语义匹配由 AI 增强,AI 不可用时降级为文本相似度匹配。
- 归类建议由 AI 增强,AI 不可用时降级为关键词与历史归属的规则建议;规则也不可用时不做建议,不影响复习流程。
- AI 不参与“该复习什么”的判定:排序信号来自时间与回忆记录,AI 只影响匹配与建议。
## 待决问题
以下问题需要维护者确认后再进入实现:
1. **Feed 是否包含学习报告?** 本文档的取向是:Feed 只出知识碎片,报告以“会话完整结果”的形态从任务记录进入,不与碎片并列成条目,避免同一段内容以两种形态重复出现。
2. **复习反馈动作的形态。** 可选:只读(现状)/加“已掌握 / 稍后再看”轻反馈并参与权重/只提供“稍后再看”而不提供“已掌握”。轻反馈是否会演变成清单,是本项的核心顾虑。
3. **覆盖率口径。** 本文档暂按“最近一次回忆对比”计算;另一种做法是取最近若干次的加权结果,代价是变化被平滑、遗忘的征兆出现得更晚。
4. **待归类内容的呈现方式。** 在复习总览中独立成一类“待归类”,还是在 Feed 中与其他内容混排并打标;以及归类动作是否必须在卡片上可完成。
5. **遗漏项的语义。** 本文档按“每次对比的快照 + 可回看原文”设计,不做跨次累计的待处理集合。若改为累计,需要重新论证它不会变成待办清单。
6. **排序信号是否可配置。** 掌握度与时间效应的强度是否像任务优先级权重那样对用户开放,还是固定为默认值。
+106
View File
@@ -0,0 +1,106 @@
# 系统结构
## 本文档的用途
`concepts/overview.md` 回答"系统要解决什么问题",本文档回答"系统是靠什么结构解决问题的"。理解以下三条结构后,判断某个功能该不该做、改动会不会动摇设计目标,都会变得直接。
## 一、系统要回答的三个问题
LPT 的全部能力最终只服务于三个问题:
1. **我学过什么?** —— 需要真实、不可篡改的学习记录。
2. **我学到什么程度?** —— 需要可对照的知识结构和暴露缺口的机制。
3. **下一步该学什么?** —— 需要可比较的任务优先级。
任何一个功能,如果对这三个问题都没有贡献,就不应该进入系统。
## 二、骨架:一个组织轴、一个闭环、一个记忆机制
### 组织轴
```text
学习任务 → 学习会话 → 知识碎片 → 学习报告
```
组织轴决定"内容存放在哪里、被谁聚合"。系统里所有围绕内容的聚合(知识结构、复习内容、检索)都从这条轴派生。
组织轴的每一层含义不同:
- **学习任务**:长期目标,可管理、可排序。
- **学习会话**:一次真实发生的学习,不可变、时间可计量。
- **知识碎片**:学习过程中的原始记录,粒度最小。
- **学习报告**:一次会话的收敛结果。
### 闭环
```text
学习预期 → 学习执行(碎片) → 报告收敛 → 复习 → 应用场景
```
闭环决定"一次学习如何被完整地走完"。闭环的完整性依赖两件事:
- 会话记录不可篡改,量化结果才可信。
- 碎片记录成本足够低,闭环才不会在中途断掉。
### 记忆机制
```text
偶遇(滚动 Feed) → 主动提取(回忆对比) → 缺口暴露(遗漏项) → 回看原文
```
记忆机制是系统区别于普通笔记工具的部分。笔记工具能"存",能"检索",但不会告诉用户"你以为你记得,其实漏了这三个点"。
## 三、三条主线与痛点的对应
| 原始痛点 | 设计主线 | 主要概念 |
|---------|---------|---------|
| 没有时间观,不知道自己的能力水平在哪 | 量化学习过程 | 学习会话、学习预期、知识碎片、学习报告、时间与效率 |
| 没有计划,想学什么学什么 | 合理安排优先级 | 学习任务、任务优先级、应用场景 |
| 没有复习习惯,学过就忘 | 让复习自然发生 | 复习 Feed、标准思维导图、回忆对比 |
三条主线共享同一条组织轴,因此组织轴的任何变化都会同时影响三条主线;反之,三条主线各自的机制变化通常互不干扰。
## 四、取舍准则
新增功能时按以下顺序判断:
1. **是否服务于三个问题之一**(见第一节)。不服务就不做。
2. **是否增加记录或整理成本**。增加成本的方案必须证明收益大于成本损失。
3. **是否让 AI 变成必需品**。AI 只能增强,不能成为流程能否走通的前提。
这三条准则解释了系统已有的一些取舍:不做强制复习清单、不做打卡与连续天数、短会话不计入总时长、AI 能力全部可降级。
## 五、支点:不轻易改动的六条
以下六条是设计目标的支点。改动它们属于设计变更,必须先改文档再改实现:
1. **时间按真实发生的行为统计**。学习时间来自学习会话,复习耗时来自复习行为(回忆对比、学习引导),两者独立统计、不合并。
2. **一次学习会话只属于一个学习任务**
3. **三类时间规则**:番茄钟长度(单个学习段落的上限)、遗忘判定阈值(判断用户是否忘记暂停或结束)、不计入总时长的最小值。这三条只用于学习会话;复习耗时的挂机截断窗口不属于它们。
4. **学习报告是会话产出的真实记录**,形态为会话摘要、预期达成判断、按归属分组的碎片与自由总结。碎片是原料,报告是收敛,报告不做美化;旁支碎片留在本次报告中单独呈现,不参与正文推演。
5. **复习是偶遇加主动提取**,不是清单、不是打卡、不是必须完成的任务。
6. **AI 只增强不依赖**。报告聚合、导图生成、回忆对比都必须有内置规则可独立完成;学习引导是唯一例外——它不属于核心闭环,允许完全依赖 AI,AI 不可用时整体不可用。
## 六、两条轴的分工原则
系统正在形成两条互不干扰的轴:
- **时间轴**:按真实发生的行为统计投入——学习会话贡献学习时间,复习行为贡献复习耗时。回答“我花了多少时间、复习投入了多少”。
- **内容轴**:按内容归属聚合知识。回答"这块知识属于哪里、我掌握到什么程度"。
两条轴的分工是:**时间按行为,内容按归属**。这解释了一个看起来矛盾的现象——一次会话产生的知识碎片不一定属于这次会话的学习任务(旁支碎片仍在该报告中单独呈现),而一份学习报告一定属于这次会话。细节见 [内容归属](../concepts/knowledge-ownership.md)。
## 七、判断改动是否触及设计目标
用三个提问自查:
1. 改动是否改变了支点之一(第五节六条)?如果改变,属于设计变更。
2. 改动是否引入了第二套聚合口径(同一内容在两处归属不同)?如果引入,必须先把口径统一到唯一的聚合入口。
3. 改动是否依赖了某个尚不存在的概念?如果是,先补概念文档再谈实现。
## 相关文档
- [系统总览](../concepts/overview.md):三个痛点与核心闭环的简述。
- [设计原则](principles.md):量化但不评判、低阻力优先等具体原则。
- [模块边界](module-boundaries.md):各模块负责什么、不负责什么。
- [内容归属](../concepts/knowledge-ownership.md):内容轴的定义与设计。