我们怎样才能最大化学习速度?
我最初对这个问题产生兴趣,源于我做后端启蒙直播课的经历。在教学过程中,我发现自己对于不管是对于自身的学习,还是对于教学,都乐在其中。后来,在跟随我的导师学习“信号与系统”这门通常被认为难度较高的工科基础课时,我的一些观察得到了进一步印证。
我在学校基本不上课,期末才速通,但信号与系统是真的黔驴技穷。我的导师通过引入算子理论和希尔伯特空间,以通过考试为目标,重新构造了给我定制的教学路径,教学顺序和学校课程有非常大差异。结果,一门通常需要学习一学期还不一定能过的课程,在这一教学路径下我只用了 3 天的学习时间,从什么是信号都不知道的程度,最后实现了在期末考试中考到了 60 分的水平,最终成绩 71 分。
记忆犹新的是,我甚至拿到试卷才知道信号与系统用英语考,最后五分钟才发现试卷有一整面没被我搓开,那两道大题只写了五分钟,几乎只拿了前几步的分。
更令人惊讶的是,在他进一步改进教学线路,以集合论为起点之后,另一位有一定数学和理论物理基础的同学仅用半天就建立了对这门课主干理论的整体理解,并能够进入后续实践。这套“集合论版本”的教程实实在在地以集合论为起点,逐步推演到算子谱定理,再把卷积、微分等运算理解为在另一组基下的乘法,由此统一理解信号与系统中的各种变换。他并不以通过考试为目标,短短时间后已经能够在团队中编写高效的硬件优化算法。
这些经历让我得出一个暂时性的结论:学习路径才是学习速度的关键因素。它的影响可能远大于个人能力、同一学习路径上的教师教学能力、或其他的什么因素。学习路径才是学习过程中的主要矛盾。
我在上一篇相关文章《逃离应试教育,重新学会怎么思考》里提出,学习一个知识体系,本质上是在寻找它的“最小生成元 + 生成规则”。但那个说法仍然停留在方法论层面。这篇文章想再向前走一步:能否把学习路径变成一个可以被建模、计算和优化的问题?
基于这一观察,我最终构思了一个核心问题:
我们如何从学习者已经掌握的概念出发,找到能够推出目标概念定义的最低成本学习路线?
如果将概念视为点、概念之间的推导视为边,那么:
- 给定学习者已掌握的概念和目标概念,可以计算一张满足全部必要条件的最低成本推导子图。
- 当知识图中加入新的概念和有效推导时,可以重新计算可选路线,进一步压缩学习成本。
这篇文章将围绕这一核心逻辑展开,尝试讨论如何通过数据建模和路径优化,实现学习效率的飞跃。
目前它仍处于理论思考阶段,本人也并非有专业的数学素养,有许多定义尚不严密,也有待读者批评。下面我们进入正文。
我想做的产品
上面提出的问题并不只是这篇文章中的理论假设。我正在尝试把这套思路做成一个产品,目前仍处于开发初期。后文从 v0 到 v5 的模型演进,正是这个产品核心数据模型的演进。
我想做的是一套让知识能够被共同建模、共同教学、共同验证的基础设施。它首先要同时降低三件事的成本:
- 帮助有教学意愿的人,用更低的成本写出更好的教程。 教程作者不必从一页空白文档开始线性写作,而可以复用已有概念,以及推导边所携带的理解材料,把精力放在真正缺失或高成本的推导上。
- 帮助学习者用更低的成本学习一个目标概念。 系统根据学习者已经掌握的概念,即时生成通向目标概念的最低成本学习路线,而不是让所有人从同一份固定教程的第一页开始。
- 帮助任何人在记录和梳理知识时,同时创作教程。 一个人写下概念的定义、它解决的问题以及自己如何从旧概念抵达它时,实际上已经在贡献教程节点和推导边,而不只是在保存一份私人笔记。
这三件事可以形成一个闭环:
flowchart TB
A[记录和梳理个人知识] --> B[形成概念与推导]
B --> C[按学习者状态生成路线]
C --> D[学习者沿路线学习]
D --> E[产生理解与验证证据]
E --> F[发现缺失或高成本的边]
F --> B
如果这个闭环能够实现,学习者面对的教程就不再是传统教学方式中写死的教纲内容。我们可以随时根据整个知识体系,针对学生的当前理解状态以及学习目标,生成一条定制化的路线。学习者的卡点、回答和实践结果会成为反馈,系统需要据此识别哪些边经常失败、哪些概念缺少前置条件、哪些新路线确实降低了学习成本,再让作者、学习者或 Agent 继续补充和优化。
在我最终的愿景中,它能形成一种新一代的教育体系:教程的生产能力不再被少数教育机构垄断,而是分布给社会中所有愿意学习、解释、记录和验证知识的人。群众消费教程的同时,也在使用教程的过程中共同生产和改进教程。
要让这个闭环成立,个人的笔记、知识导图,和教程所使用的学习路线、章节划分,就不能继续使用彼此割裂的数据结构。它们必须能够被同一个模型表达。这是我最近总结出的模型的出发点。
万物皆概念
只有一种对象:概念
要计算学习路径,首先必须回答什么是知识体系里的“点”。
我最初仍然沿用了课程、章节、概念、问题等传统层级。但继续推演后会发现,这种分层并不自洽:
- 一门课程可以被拆成若干章节;
- 一个章节可以被拆成若干概念;
- 一个足够大的概念同样需要一整套教程;
- 一门课程本身也可以被视作一个更大的概念。
既然“课程”“章节”和“概念”都可以继续拆分,也都可以作为更大讨论对象的一部分,那么它们在数据结构上并没有本质区别。因此,与其维护一套固定层级,不如只保留一种对象:概念。
这里的概念不是一个术语或标签,而是一条客观的、默认成立的定义或陈述。例如“傅里叶变换”是一个概念,“信号与系统”也是一个概念;后者可以继续展开为一张以自身定义为目标、由多个子概念及其推导关系构成的知识图。
任何概念都同时具有两种性质:
- 它可以和其他概念组合,在满足封装条件时形成一个更大的概念。
- 它可以被继续展开,记录一张以它为目标、包含一条或多条有效推导路线的有向无环图。
因此,“万物皆概念”并不是说所有东西都要被塞进同一个扁平列表,而是说:知识体系中的每一层都使用同一种递归结构。
| |
这里唯一的知识节点类型仍然是概念。Derivation 是概念之间的关系,derivation_plans 则是对若干条边的组合,不是另一种知识节点。
子概念应当使用引用,而不是直接内嵌。为了让每个概念在所属知识体系中拥有确定的递归位置,本文暂时增加一条强约束:同一知识体系内,递归概念之间禁止部分交集;除父概念完整包含子概念的情况外,不同递归分支必须彼此分离。如果两个递归结构必须发生交集,暂时把它们放进不同的知识体系。这是一条为了换取结构稳定性而引入的模型公理,不是知识天然满足的事实;它的收益和代价将在文末继续讨论。
理解材料明确属于推导边,而不属于概念节点。概念陈述“是什么”,材料则服务于“如何从一个概念推导到另一个概念”;同一个目标概念可以由不同路线抵达,每条路线需要的解释和证据也可能不同。
边是概念之间的推导
如果节点是概念,那么边是什么?
我最初把边称为 Prompt,也就是“进入下一个概念的问题引入”。但这一定义并不完整。如果边只提出问题,却不包含如何回答问题,那么它仍然没有说明两个概念之间为什么能够连接。
因此,一条从 $a$ 指向 $b$ 的边,应当表示概念 $a$ 对推导概念 $b$ 所作的贡献。当它单独构成一套推导方案时,这条边承载从 $a$ 到 $b$ 的完整过程;当它属于一个 AND 方案时,多条边共同构成推出 $b$ 的完整过程。每条边至少包含三部分:
- 问题引入:旧概念遇到了什么局限,或者现实中出现了什么新问题?
- 问题解答:通过什么论证、构造或抽象,可以从旧概念得到新概念?
- 理解材料:为了完成这一步推导,可以阅读、观察、操作或验证什么?
例如,“行列式”不应该通过“把这一串运算命名为什么”来引入。这只是在复述定义,没有推进认识。更合理的边可能是:
我们需要判断一个线性变换是否把空间压扁,也就是它是否可逆。能否构造一个在行变换下行为明确、又能表示有向体积缩放的标量?由这一需求构造出行列式。
一条合理的边通常至少满足以下一种条件:
- 解决前一个概念的局限;
- 触碰前一个概念的表达边界;
- 回答现实中遇到的具体问题;
- 将若干重复出现的推理压缩为一个可复用概念。
这也为“新增边”设置了约束。我们不能为了让图上的距离变短,就画一条没有论证的直线。边的长度可以短,但边所承载的推导不能被省略。
把学习成本写成有效推导子图的成本
设学习者已经掌握的概念集合为 $S$,目标概念为 $t$。记 $\mathcal{R}(S,t)$ 为所有能够从 $S$ 推出 $t$ 的有效推导子图集合。每个 $R \in \mathcal{R}(S,t)$ 都必须递归选择一套 OR 方案,并完整包含该方案内的全部 AND 边;递归遇到 $S$ 中已经掌握的概念时停止。
在无权模型中,可以先把一条路线的结构成本定义为其中包含的推导边数:
$$ C_0(R) = |E_R| $$
于是当前知识图中的最低结构成本为:
$$ C_0^*(S,t) = \min_{R \in \mathcal{R}(S,t)} |E_R| $$
若每条边有不同成本,则可以把边权定义为完成该推导所需的时间、认知负荷或材料长度:
$$ C_u^*(S,t) = \min_{R \in \mathcal{R}(S,t)} \sum_{e \in E_R} w_u(e) $$
这里的 $w_u(e)$ 是学习者 $u$ 完成推导边 $e$ 的成本,共享的前置推导在同一子图中只计算一次。当所有推导方案都只有一条边时,有效推导子图退化成普通路径,这个公式也就退化成通常的最短路径问题。
因此,本文继续使用“最短学习路径”这个直观说法,但严格的求解对象应当是最低成本有效推导子图。它的任意拓扑序都可以形成一种合法讲述顺序;尤其对于同一个 AND 方案中的独立前置分支,先学习哪一个不会改变路线的成立性和总成本。
一个概念可以被理解多次
同一个定义可能由多条不同路线推出,理解并不必在第一次抵达后停止。
本文把理解的最终判据定义为:学习者完成一张有效推导子图后,能够重新推出目标概念的定义。但“能够推出”仍然需要证据,不能由图上的可达性直接替代。对知识的深度理解,是解决真实问题的前提;而能否解决真实问题,才是本文所讨论的学习路径最终要优化的目标。
一个可能的处理方式,是为每个概念维护置信度 $m_u(c) \in [0,1]$,并根据回答、实践、遗忘和迁移表现不断更新。已掌握集合 $S$ 不再是固定集合,而是从连续状态中按当前任务要求投影出来的结果。
在理论模型之外,或许可以把每完成一条不同的有效路线视为增加 $100\%$ 的理解倍率;如果学习者完整掌握两条路线,又完成第三条路线的一半,就可以记作 $250\%$。这里的百分比不是概念本体的一部分,也不是传统意义上封顶于 $100\%$ 的完成度,只是对“能够从多少条路线重新生成同一概念”的一种投影。这样可能看起来会更有成就感(x
存在 AND 条件时,这里说的“一条路线”指一张完整的有效推导子图,而不是任取一条忽略其他必要前提的简单路径。同一张推导子图的不同拓扑序只改变一个概念的独立前置条件学习先后顺序,不会增加理解倍率。
此外,两张有效推导子图可能只相差一条边,也可能使用完全不同的生成规则。前者是否足以在现实意义上算作一条新的理解路线,不能只靠“边集合不相等”来判断。
这也会影响前文的理解倍率:如果对知识图中的每条简单路径机械计数,少量分支就可能组合出指数级路线,重复或近似相同的推导也会虚增理解程度。这实际上是知识图谱的构建存在问题,最终可能只能靠真正理解知识的人类来评估实际知识图谱的质量如何。更合理的如何判定两条路线的重合度,可能需要进一步讨论。
通过新增点和边压缩学习路径
在已有图中寻找最低成本有效路线,解决的是“如何使用现有知识结构”。更重要的问题是:能不能改造知识图本身?
新的路线不一定来自一条直连目标的边。我们也可以引入一个压缩率更高的中间概念,再建立它与已有概念和目标概念之间的推导边。只要所有路线的并集仍然无环,旧路线和新路线就可以同时保留,成为可随时选择的不同 OR 方案。
一个高度抽象的统一理论确实能缩短后续路线,但学习这个统一理论本身也需要成本。如果为了少学五条边,先引入一个成本相当于二十条边的新概念,整体上反而更慢。
因此增加新的点和边时必须计算整张有效推导子图的总成本,而不能只比较边数。所谓“更短路线”必须经过实际学习结果验证,而不能只在图形上看起来更短。
假设当前最低成本路线包含 18 条边。加入新的概念和推导方案后,另一张有效推导子图只包含 3 条边。现实中的意义就是:学习者不必再依次记忆 18 个彼此松散的终态,而可以通过 3 个高压缩率的生成规则推出同一目标。
优化过程可以写成一个循环:
- 根据学习者已掌握的概念集合 $S$ 和目标 $t$,计算当前最低成本有效推导子图。
- 检查其中成本最高、跳跃最大或重复推理最多的位置。
- 尝试寻找或构造新的中间概念,并补充相应的推导边与推导方案。
- 验证新增推导包含完整论证,AND/OR 关系明确,并且整张图仍然无环。
- 将新的点和边加入知识图,重新计算 $C_u^*(S,t)$。
- 比较优化前后的学习成本,并通过实际学习结果修正边权。
flowchart TD
A[给定已掌握概念 S] --> B[选择目标概念 t]
B --> C[计算最低成本有效推导子图]
C --> D{成本是否过高}
D -- 否 --> E[输出一种合法拓扑序]
D -- 是 --> F[定位高成本推导]
F --> G[寻找或构造新的点和边]
G --> H{推导有效且整图无环}
H -- 否 --> F
H -- 是 --> I[加入知识图并更新方案]
I --> C
这也证明了一条优秀的学习路线用更少的生成规则覆盖更多结论。它减少的是重复、悬空和无法复用的认知工作。
每个概念都可以展开为一张 DAG
设全体概念构成集合 $C$。对任意概念 $c \in C$,它拥有一个直接子概念集合:
$$ \operatorname{children}(c) \subseteq C $$
这些子概念、目标概念本身以及它们之间的推导关系,构成概念 $c$ 的内部图:
$$ G_c = (V_c, E_c), \qquad V_c = \operatorname{children}(c) \cup {c} $$
这里的 $c$ 是整张内部图最终要推出的目标,而不是它自己的子概念。我暂时要求 $G_c$ 是一张有向无环图,也就是 DAG。
有向,意味着推导有方向:“已知 A,如何得到 B”和“已知 B,如何得到 A”不是同一个过程。
无环,意味着不能用待学习的概念反过来证明它自己的前提。一个环通常代表循环论证,或者说明当前概念边界划分得不合理。
DAG 至少存在一个入度为 0 的节点,因此每个知识图都存在学习入口。但“存在一条指向目标的边”还不足以描述真实推导,因为一个概念可能需要多个前置条件共同推出。
对任意目标节点 $v$,记它的入边集合为 $\operatorname{In}(v)$。概念 v 的推导方案集合,是它所有非空入边组合中的一部分。因此再定义推导方案集合:
$$ \mathcal{P}(v) \subseteq 2^{\operatorname{In}(v)} \setminus {\varnothing} $$
每个 $P \in \mathcal{P}(v)$ 都是一套能够推出 $v$ 的完整方案:
- 同一个 $P$ 内的所有边是 AND,必须全部完成;
- 不同的 $P$ 之间是 OR,只需完成其中一套;
- 一条边可以同时属于多套方案,因此推导方案与边是多对多关系;
- 不需要合取条件的单条入边,可以自然地构成一个只包含自身的方案。
例如,若 $v$ 可以由“$A$ 与 $B$ 共同推出”,也可以单独由 $C$ 推出,那么:
$$ P_1 = \lbrace A \to v, B \to v \rbrace, \qquad P_2 = \lbrace C \to v \rbrace $$
$$ \mathcal{P}(v) = \lbrace P_1, P_2 \rbrace $$
这对应 $(A \land B) \lor C \Rightarrow v$。AND 和 OR 不需要变成新的概念类型,它们只是推导边之间的组合语义。
当学习者选择一个 AND 方案时,方案内各个前置分支的先后顺序没有语义上的影响。只要各分支分别满足自身依赖,先理解 $A$ 再理解 $B$,或者先理解 $B$ 再理解 $A$,最终都完成同一套推导方案。DAG 的拓扑序只给出合法顺序,不规定独立前置条件之间唯一的学习次序。
因此,从已有概念到目标概念的一条有效学习路线,在一般情况下并不是图论中的单条简单路径,而是一张递归选择 OR 方案、同时展开其中全部 AND 条件的推导子图。它可以存在多种等价的拓扑排序,并被线性地讲述,但其底层结构仍然可能分叉。
这里也不再需要预先固定一份教程。给定学习者已掌握的概念和目标概念之后,才从完整知识图中选择一张有效推导子图。真正理解目标概念的判据,是学习者完成其中的必要推导,并最终能够重新推出 $\operatorname{definition}(c)$。
递归展开必须满足约束。这里所说的“展开”并不是把概念当成一个集合,再声称它在本体上等于所有子概念之和。内部 DAG 表达的是怎样从若干入口重新生成这个概念。
设 $I$ 是内部图 $G_c$ 声明的入口条件,$F_{G_c}(I)$ 表示按照图中的 AND/OR 方案完成一张有效推导子图。一次有效展开首先只承诺:
$$ F_{G_c}(I) \Rightarrow \operatorname{definition}(c) $$
也就是说,完成这张图足以推出概念 $c$。反方向不必成立:$c$ 还可以存在其他尚未记录或属于其他知识体系的推导路线。因此,$G_c$ 是一组充分推导,而不是对概念全部含义和全部理解方式的穷尽。
为了让递归展开不制造错误路线,本文暂时要求它满足以下约束:
- 目标固定:展开前先有概念 $c$ 及其定义,$c$ 是内部图唯一要推出的目标;不能先框选一批相关知识,再倒过来假定它们自然定义了某个概念。
- 节点相关:每个内部节点都必须位于某条通向 $c$ 的有效推导中。只与主题相关却不参与推导的材料,不应仅凭相关性成为子概念。
- 方案完整:任何被选中的 AND 方案都必须包含全部必要边,不能通过拆分概念省略一半前提。
- 内部闭包:除明确声明的入口外,每个内部节点都必须至少拥有一套完整的内部推导方案;所有外部假设都必须通过入口暴露出来。
- 推导可靠:每张被声明为有效的内部推导子图,都必须真的足以重新推出 $\operatorname{definition}(c)$,而不只是让学习者记住同一个结论。
- 不要求穷尽:一张内部图可以只记录目前已知的若干充分路线。以后发现的新路线可以作为新的 OR 方案加入,而不意味着旧展开曾经定义了概念的全部本质。
- 掌握关系单向:沿某张有效内部子图完成推导,可以成为掌握 $c$ 的证据;但已经掌握 $c$,不代表学习者掌握了图中所有子概念和所有替代路线:
$$ \operatorname{mastered}(c) \not\Rightarrow \bigwedge_{v \in \operatorname{children}(c)} \operatorname{mastered}(v) $$
- 内部细节不自动导出:外部关系仍然以 $c$ 明确承诺的定义为准。不能因为某个内部节点出现在 $G_c$ 中,就假定掌握 $c$ 的人必然能够使用这个内部节点的全部外部关系。
- 成本不会因折叠消失:当学习者需要沿内部图推出 $c$ 时,实际完成的边仍然计入学习成本;把整张图显示成一个概念节点,不会把多步理解变成一步。
- 递归结构仍须合法:展开后的整张推导图必须保持无环,并继续满足本文暂定的禁止部分交集约束。
用自然语言来说,这些条件是在避免几种看似“拆开了”、实际却不成立的解释:不能把一串相关名词当成概念的组成;不能把隐藏的基础知识留在图外;不能少学一个必要前提却得到同一个结论;不能把目前记录的一条路线冒充概念唯一的本质;也不能因为一个人会使用父概念,就宣称他已经理解其内部每一种理论细节。
这也解释了展开与封装为什么不完全对称。展开已有概念时,父概念 $c$ 和它原有的外部关系仍然存在,新增内部图只需要证明一条单向的充分推导 $F_{G_c}(I)\Rightarrow c$。封装则要创造一个新父概念,并让它在外部替代整张子图;这要求更强的边界对应,接近证明父概念与内部条件在允许的查询范围内能够双向替代。展开同样会出错,只是当它被限制为增加充分推导而非重写概念本体时,影响范围更容易被约束。
把一段 DAG 封装成更大的概念
前文说概念既可以被继续拆分,也可以和其他概念组合。这两个性质结合起来还有一个重要设想:当一段 DAG 满足必要的封装条件时,可以把它封装成一个新的父概念。原来从外部指向子图边缘节点的关系,可以投影为指向父概念的关系;原来从边缘节点指向外部的关系,也可以投影为从父概念出发的关系。父概念展开时仍然保留原来的内部推导,折叠时则成为一个可以继续参与更大 DAG 的普通节点。
flowchart LR
subgraph EXPANDED[展开视图]
direction LR
X1[外部概念 X]
Z1[外部概念 Z]
subgraph MODULE[可封装推导模块 H]
direction TB
A[入口 A] --> B[内部概念 B]
C[入口 C]
B -->|方案 Q1| D[唯一目标 r_H<br/>Q1:B AND C]
C -->|方案 Q1| D
end
Y1[外部概念 Y]
X1 --> A
Z1 --> C
D --> Y1
end
subgraph FOLDED[折叠视图]
direction TB
X2[外部概念 X] -->|方案 QP| P[父概念 P<br/>F_H = X AND Z]
Z2[外部概念 Z] -->|方案 QP| P
P --> Y2[外部概念 Y]
end
D -. 封装映射 pi_H .-> P
style MODULE fill:#eff6ff,stroke:#1d4ed8,stroke-width:2px
style P fill:#f0fdf4,stroke:#15803d,stroke-width:2px
style D fill:#fff7ed,stroke:#c2410c,stroke-width:2px
图中两条标为 $Q_1$ 的入边属于同一套 AND 方案,因此只有 $B$ 与 $C$ 都完成,才能推出唯一目标 $r_H$。折叠后,两条标为 $Q_P$ 的边仍属于同一套 AND 方案,父概念保留边界条件 $F_H=X\land Z$;虚线 $\pi_H$ 表示封装映射,不是新的推导边。这样,展开和折叠表达的是同一个推导条件,而不是两张碰巧长得相似的图。
但不是任意框选的一段 DAG 都能成为概念。设候选子图为 $H=(V_H,E_H)$,本文暂时把能够封装的子图限制为一种可封装推导模块。它必须满足以下条件:
- 单一目标:$H$ 有且只有一个代表其结论的目标节点 $r_H$,并且每个内部节点都位于某条通向 $r_H$ 的路径上。若干节点之间不存在共同目标,它们只能构成一个集合或视图,不能仅凭被同时框选就成为概念。
- 推导方案完整:任何被 $H$ 使用的 AND 方案都必须被完整包含,不能只截取其中一部分边;不同完整方案仍然可以作为 OR 方案同时存在。
- 内部推导闭包:除明确声明的入口节点外,每个参与内部推导的节点都必须至少拥有一套完全位于 $H$ 内部的有效推导方案,不能暗中依赖未被接口表达的外部条件。
- 入口明确:所有从外部进入 $H$ 的边只能抵达声明过的入口节点;这些边之间原有的 AND/OR 组合必须作为整体保留,不能在投影后被拆成若干互相独立的单边方案。
- 单一出口:所有从 $H$ 指向外部的推导边都必须从 $r_H$ 出发。若外部推导必须直接使用某个内部节点,那么这个节点仍然属于模块的外部接口,当前子图还不能被完整封装成一个概念。
- 边界条件可表达:从外部前提推出 $r_H$ 的条件必须能够汇总为一个关于入口的 AND/OR 公式 $F_H$。例如 $F_H=(I_1 \land I_2)\lor I_3$,封装后的父概念必须保留这套组合语义,而不是只保留三条扁平入边。
- 成本语义可保持:父概念必须能够表示从不同入口组合完成内部有效推导的最低成本,以及共享前置是否重复计费。若无法定义这种对应关系,父概念就不能替代原子图参与最低成本路线计算。
- 不产生部分交集:$V_H$ 与已有递归概念的范围必须完整包含或完全分离,不能只重叠其中一部分。这沿用本文暂时采用的“禁止递归交集”公理。
- 存在统一定义:图结构只能说明 $H$ 在形式上可以被收拢,不能自动证明它在语义上构成一个概念。新的父概念还必须拥有明确的定义或焦点问题,并说明内部 DAG 为什么恰好生成这个定义。
因此,本文所说的可封装概念,暂时是指一张推导方案完整、内部依赖闭合、具有显式入口和单一语义出口的有根子 DAG。这些是为了避免明显语义错误而采用的一组保守条件,不代表所有条件都已经被证明为必要。
用自然语言来说,这些限制是在避免几种现实意义上显然不合理的“概念”:
- 不能把一堆恰好放在一起、却没有共同结论的知识命名成一个新概念。 单一目标和统一定义要求这个概念最终必须说清楚“它究竟是什么”。
- 不能省略一半必要条件,然后宣称完整概念已经被推出。 方案完整和内部闭包要求所有必要前提都真实存在;如果一个结论需要 $A$ 与 $B$,只框选 $A$ 不能算完成封装。
- 不能在展开时要求多个条件共同成立,折叠后却变成满足任意一个条件都可以。 显式入口和边界公式要求 AND/OR 语义在封装前后保持一致。上图中只知道 $X$ 或只知道 $Z$,都不能宣称已经掌握 $P$。
- 不能说自己掌握了父概念,就默认掌握了它内部任意一个没有被导出的细节。 单一出口要求外部只能使用父概念真正承诺的结论;如果后续推导必须直接依赖内部细节,这个细节就不能被藏起来。
- 不能通过把十步推导折叠成一个节点,就假装学习成本从十步变成一步。 封装改变的是抽象尺度,不会让内部推导成本凭空消失。
- 不能让两个概念各自只包含同一结构的一半,却都声称完整拥有这段知识。 禁止部分交集要求递归边界清楚;否则展开其中一个概念时,很难判断另一半究竟属于哪里。
- 不能只因为图形上可以收拢,就断言它在语义上是一个概念。 最终仍然需要一个能够被解释、推导和检验的定义。
如果边界投影能够在这些约束下保持原图中的可推导性和成本语义,知识图就可以在不同抽象尺度之间切换:封装一个子图时,可以根据原边界得到它与外部概念的关系;这个新父概念还可以继续和其他概念组合,递归形成更大的 DAG。图中只展示了边的直观投影,这些条件是否已经足够、哪些条件还可以放宽,将在文末继续讨论。
用信号与系统验证路径优化
有了上面的模型之后,我们再回头看开头的信号与系统案例。这里把三条教学路线视为三张近似线性的有效推导子图,观察新增概念和推导如何改变路线成本。x
传统教学很容易把学习速度归因于某种固定的个人属性:聪明、记忆力好、数学基础强,或者足够努力。这些因素当然存在,但它们并不能解释一个现象:同一个人面对同一个知识体系,仅仅更换概念的引入顺序和推导方式,学习速度就可能发生数量级的变化。
我学习信号与系统的经历就是如此。我把三天内形成的理解记录在尚未完成的《信号与系统速通:现代视角下的信号与系统理论体系》中。它并不是一份严格完成的教材,但可以还原当时实际走过的学习线路。
学校课程往往按照公式和题型平铺展开:先给出若干信号,再介绍系统性质,然后依次学习卷积、傅里叶变换、拉普拉斯变换和 Z 变换。每一种变换看起来都像一套新的公式,需要分别记忆。学校教纲本身并不涉及函数空间、内积或算子理论。
我最初三天走过的路线从系统与微分方程逐步向上抽象:
- 先把系统理解成从输入信号到输出信号的映射;
- 追问为什么微分方程适合描述一类连续时间系统,并把问题限制到 LTI 系统;
- 从常系数微分方程中发现 $e^{st}$ 是微分算子的特征函数;
- 用冲激响应与冲激分解理解卷积为什么能够描述 LTI 系统;
- 再引入函数空间、内积和希尔伯特空间的视角,把信号理解成函数空间中的向量;
- 最后回到傅里叶、拉普拉斯和 Z 变换,理解它们如何在各自适用的条件下,把卷积、微分或差分等运算转化为更容易处理的代数运算。
导师后来构造的“集合论版本”并不是我三天内实际走过的路线。它从集合论出发,建立集合、映射、空间与基,再推演到算子谱定理;得到谱与特征方向的视角后,把原本复杂的卷积、微分等运算理解为在另一组基下的乘法,最后将各种变换放回同一个模型中。
因此,从学校教纲到我的三天路线,就已经不是单纯调整顺序,而是为知识图引入函数空间、内积、希尔伯特空间和算子理论等新点,并建立它们与原有内容之间的新边。后来的集合论版本又在这张图上继续引入“集合论”“空间与基”“算子谱定理”等高压缩率中间节点;从这些节点建立到各种变换的新推导边后,原本需要逐个抵达的结论可以从统一结构中生成。
这样一来,许多原本彼此孤立的公式,变成了同一个生成规则在不同条件下的结果。需要记忆的终态变少了,可以从已有概念重新生成的内容变多了。
三条学习路线的长度对比
flowchart LR
subgraph T[常见教材路线]
direction TB
T1[公式与题型] --> T2[卷积]
T2 --> T3[傅里叶变换]
T3 --> T4[拉普拉斯与 Z 变换]
end
subgraph P1[我的三天路线:20 个节点 / 19 条边]
direction TB
A0[已有数学基础] --> A1[系统]
A1 --> A2[输入输出映射]
A2 --> A3[微分方程]
A3 --> A4[线性化]
A4 --> A5[时不变性]
A5 --> A6[LTI 系统]
A6 --> A7[特征方程]
A7 --> A8[e^st 特征函数]
A8 --> A9[冲激函数]
A9 --> A10[冲激响应的线性组合]
A10 --> A11[卷积]
A11 --> A12[函数空间]
A12 --> A13[内积]
A13 --> A14[希尔伯特空间]
A14 --> A15[傅里叶变换]
A15 --> A16[拉普拉斯变换]
A16 --> A17[算子视角]
A17 --> A18[算子谱]
A18 --> A19[统一理解各种变换]
end
subgraph P2[集合论版本:6 个节点 / 5 条边]
direction TB
B0[已有数学基础] --> B1[集合论]
B1 --> B2[空间与基]
B2 --> B3[算子谱定理]
B3 --> B4[运算在另一组基下变成乘法]
B4 --> B5[统一理解各种变换]
end
T -. 新增点与边 ① .-> P1
P1 -. 新增点与边 ② .-> P2
style T fill:#fff7ed,stroke:#c2410c,stroke-width:2px
style P1 fill:#eff6ff,stroke:#1d4ed8,stroke-width:2px
style P2 fill:#f0fdf4,stroke:#15803d,stroke-width:2px
这三条线路展示了两次连续发生的学习路线优化,也就是两次对图结构本身的改造。图中只保留了各条线性路线主干上的概念和推导边。
需要说明的是,这仍然是一张示意图。尤其是集合论版本,我没有亲自沿这条路线学习,节点可能存在遗漏或表述偏差;这里能够确定的是,它事实上使用了比我的路线更短的主干路径。
第一次改造从学校教纲出发,引入函数空间、内积、希尔伯特空间和算子理论,并建立这些新概念与微分方程、LTI、冲激、卷积和各种变换之间的推导边。这次改造形成了我的三天路线。
为了让两条路线能够直接比较,图中为它们设置了相同的起点“已有数学基础”和相同的目标“统一理解各种变换”。按照当前的抽象粒度,我的路线包含 20 个节点和 19 条推导边;集合论版本由 6 个高压缩率节点和 5 条推导边组成。由于两者在示意图中都是线性特例,所以结构成本与路径距离相同:
$$ C_0(R_{\text{我的路线}}) = d_{\text{我的路线}} = 19 $$
$$ C_0(R_{\text{集合论版本}}) = d_{\text{集合论版本}} = 5 $$
$$ \Delta C_0 = 5 - 19 = -14 $$
也就是说,在这张无权示意图上,重构后的路线减少了 14 条边,结构成本约为原路线的 $26%$。另一位同学半天内建立整体理解,可以被看作第二次图结构改造的一次实际教学结果。
这里比较的是当前建模粒度下的无权结构成本,并不意味着学习时间一定与边数线性对应。每条边的真实成本仍可能不同,因此上文进一步给出了加权模型。但如果不把节点和推导边拆开,连结构成本的变化都无法被观察,更不可能进一步估计边权。
在不改变图时,模型仍然可以从现有 OR 方案中寻找最低成本有效路线;但这里的两次教学改进都不是单纯换一个拓扑顺序,而是同时引入了新的点、边和推导方案。
这并不意味着微分方程、卷积等概念不再需要学习,而是它们不再作为互不相干的终点被依次灌输。统一模型提供了更高压缩率的索引,使具体结论能够在需要时被推导出来。
这个模型是怎样演进出来的
上文先给出了当前的 v5 模型,但“万物皆概念”并不是它的起点。它是我在不断尝试定义课程、章节、概念和问题时,被前一版模型的矛盾逐步逼出来的结果。
这里回过头保留从 v0 到 v5 的推理链。每一版都不是简单增加字段,而是在回答上一版无法回答的问题。
flowchart LR
V0[v0 词条罗列] -->|对象之间是什么关系| V1[v1 分层对象]
V1 -->|概念是否属于章节| V2[v2 全局概念与子图]
V2 -->|三类边无法统一| V3[v3 Prompt 唯一边]
V3 -->|教学顺序从哪里来| V4[v4 DAG 与拓扑序]
V4 -->|章节与概念并不同构| V5[v5 递归概念模型]
v0:把所有东西列成词条
最初的模型只是在罗列产品里可能存在的对象:Course、Chapter、Concept、Prompt、Misconception、Interaction、Evidence 和 UserWikiGraph。每个对象都有一张字段表,但对象之间没有统一结构。
在这个版本中,Course 拥有 Chapter,Chapter 拥有一个线性的 problem_chain,Concept 则是另一种独立对象。教程知识和用户自己的 Wiki 甚至使用两套模型。
v0 解决的是“系统里有什么”,却没有回答“这些东西为什么以这种方式连接”。概念与章节是什么关系、问题怎样推进概念、不同知识之间如何复用,都还是空白。
v1:从字段表进入分层对象
v1 开始为对象补充业务语义和生命周期。章节被定义为围绕目标概念形成过程的学习单元;概念被定义为对一类问题解决路径的封装;Prompt 也被区分为诊断、推进、纠偏、检验和总结等教学意图。
这一步让模型从“有什么字段”进入“对象是什么、如何流转”,但整体仍然是 Course → Chapter → Concept 的固定层级,学习过程仍被默认成章节内部的线性流程。
问题随之暴露出来:概念学习并没有唯一顺序。学习信号与系统时,欧拉公式只需要在第一次使用前掌握,并不天然属于某一章的固定位置。同时,Prompt 被分成过多类型,各类型边界模糊,因为我还没有回答 Prompt 的本质是什么。
v2:全局概念、章节子图与三类边
为了解决“概念是否属于章节”,v2 把 Concept 提升为全局实体:同一个概念可以被多个章节引用,Chapter 则被改写为整张教程图谱中的一个子图。problem_chain 也从列表变成了允许分支和跳转的图。
这一版第一次明确引入三类边:
requires:依赖关系,有向;contains:包含关系,有向;relates:相关关系,无向。
v2 的进步是终于开始用图表达知识,但三种边并不属于同一种语义:依赖、包含和相关无法用统一规则解释,也很难回答一条边究竟承载了什么教学内容。图虽然出现了,边的本质仍然没有被找到。
v3:Prompt 成为唯一的有向边
v3 的关键收敛是:概念之间真正值得存储的关系只有推导问题本身,Prompt 就是有向边。
一条边从 source concept 指向 target concept,表达“A 遇到了什么局限,为什么需要 B”。requires 不再作为独立边存储:如果存在从 A 到 B 的有向路径,就可以推导出 B 依赖 A;relates 同样可以由可达性投影出来。
Chapter 此时被定义为概念图中的连通子图,教程与用户 Wiki 也开始使用同一模型。这一步用“一种基础关系 + 图算法推导”取代了边类型枚举。
但新的问题也出现了:如果 Chapter 仍要保存一条显式教学路径,那么它和图本身给出的顺序是什么关系?既然已经有一张有向图,为什么还需要另一份容易冲突的 problem_chain?
v4:顺序完全由 DAG 推导
v4 删除了 Chapter 中显式保存的教学路径。概念的先后顺序不再由作者手写,而由 DAG 的拓扑序给出。只要一个概念所需的前置条件已经满足,它就可以被学习,不需要所有人走同一条线性目录。
无环也在这一版成为强制约束:环意味着循环论证。v4 只确定了依赖关系应当组成 DAG,并由拓扑序给出合法学习顺序;多条入边究竟是必须同时满足的前置条件,还是可以任选的不同推导,当时还没有被区分。直到 v5,我才通过推导方案补全这层语义:同一方案内是 AND,不同方案之间是 OR。
为了继续保留传统教学结构,v4 曾把 Chapter 定义成概念集合的划分:每个概念属于且仅属于一章,章节之间不重叠。但这恰好暴露了最后一个根本矛盾:如果一个章节可以被封装成一个节点,它本身就是概念;如果一个概念足够复杂,需要单独展开成教程,它又和章节没有区别。
Chapter 的“划分”只是人为施加的语义,并不是知识结构本身的要求。
v5:取消层级,万物皆概念
因此,我进一步演进出了上文我提出的模型。
不只优化学习路径
这个模型最初来自学习方式问题,但它真正描述的对象也许更一般:从已有状态出发,通过一系列需要付出成本并接受验证的推导,到达目标状态。只要一个领域能够被近似表示成这样的有向图,路径优化就可能有意义。
硬件设计是一个对路径长度尤其敏感的例子。假设我们把一次设计过程抽象成一张迭代 DAG:
- 节点是已经被明确提出并实现的设计概念,例如一种数据通路、缓存结构或时钟方案;
- 边是从当前设计到下一设计的工程推导,包括为什么要修改、修改了什么,以及预期解决什么约束;
- 验证结果是边成立的证据,包括功能仿真、时序分析、功耗评估,乃至上板和流片结果;
- 边权是完成实现、仿真、定位失败和返工所需的综合成本。
flowchart LR
A[已有设计] --> B[设计概念 v1]
B --> C[实现 RTL v1]
C --> D[仿真验证 v1]
D -->|满足约束| E[已验证设计 v1]
D -->|不满足约束| F[失败证据]
F --> H[修订设计概念 v2]
H --> I[实现 RTL v2]
I --> J[仿真验证 v2]
E --> G[目标设计]
J -->|满足约束| G
为了达到目标设计,每提出一个新的设计概念,通常都需要至少一次实现与仿真验证。路径越长,需要经历的迭代和验证通常越多,工程成本也越高。若一条设计路径为 $p$,可以先把它的成本粗略写成:
$$ C(p) = \sum_{e \in p} \left(C_{\mathrm{design}}(e) + C_{\mathrm{simulation}}(e) + C_{\mathrm{rework}}(e)\right) $$
此时,优化设计路径并不是跳过验证,而是寻找或构造更高价值的中间设计概念,让更少的有效迭代排除更大的设计空间。工程师或 Agent 可以优先选择信息增益更高、验证成本更低、通向目标约束概率更大的下一条边,并把每次仿真的结果反过来更新图和边权。
当然,真实硬件研发不总是一张预先已知的 DAG。目标可能变化,失败分支会大量出现,不同方案也可能并行收敛。因此更完整的模型可能是一张随验证结果动态生长的设计图,甚至需要概率图、决策过程或搜索树。但核心问题没有改变:不要只优化单次设计,而要优化从当前设计抵达目标设计的整条验证路径。
同样的抽象也可能进入软件架构、科学研究、药物筛选等领域。它们的共同点不是“都有概念”,而是中间步骤昂贵、每次推进都需要证据,并且路径选择会显著改变到达目标的总成本。
尚未解决的问题
这套模型并不是从零开始的猜想,它的若干组成部分已经在不同领域分别出现。已有研究不能证明本文提出的完整组合正确,也没有直接“认可”一篇尚未发表和验证的博客;但它们能够说明,这个方向与一些成熟理论相容,并为其中若干结构提供独立依据。
哪些部分已有理论依据
知识空间理论(Knowledge Space Theory)把一个领域表示为知识项目及其可行知识状态,并根据学习者当前状态进行自适应评估。它支持“学习者不是都从同一个固定起点出发”和“知识存在可计算的前置结构”这两个基本方向,但它的知识项目不等于本文携带定义的递归概念,也没有直接规定推导边应当怎样承载解释材料。
经典 AND/OR 图研究为本文的推导方案和最低成本有效推导子图提供了最直接的形式基础:AND 节点要求所有子问题共同解决,OR 节点从替代方案中选择,解不一定是一条路径,而可以是一张具有最低成本的解图。当所有方案都只含一个前置条件时,问题才退化为普通最短路径。因此,本文从“最短路径”转向“最低成本有效推导子图”,不是单纯创造了一套新说法,而是在知识建模场景中重新使用了已有的求解结构。不过,共享前置子图如何计费、路线规模扩大后如何求解,仍然不能直接套用最短路径算法。
Novak 和 Cañas 的概念图理论支持用概念节点和带明确语义的关系组织知识,也强调层级结构取决于当前试图回答的焦点问题。这为“概念之间的关系不能只是无意义连线”提供了依据,但概念图会区分概念和命题,也没有要求每个概念都能递归展开为同构 DAG。因此,“万物皆概念”仍然是本文自己的统一建模选择。
Merrill 的教学首要原理强调围绕真实问题组织学习,并经历激活已有知识、示范、应用和整合。它支持本文从已有概念出发、通过问题推进、最终回到实际应用的教学方向;但它是一套教学设计原则,不会自动推出本文的图数据结构。美国国家研究委员会关于深层学习与迁移的综述进一步把迁移视为深层学习的定义性特征。这意味着“能够重新推出定义”可以作为理解证据之一,却不足以单独证明模型达到了最终目标;学习者还应当能够把底层原理迁移到新的问题中。
所以,目前可以较强地获得外部支持的是:用有向结构表达前置关系、用 AND/OR 表达共同条件与替代方案、寻找最低成本解图,以及把解决真实问题和迁移作为最终检验。只有部分理论支持的是递归概念和带语义的关系。仍然缺乏直接依据的,则包括把全部教学材料只放在推导边上、任意子图的自动封装、理解倍率,以及“禁止递归交集”是否应当成为普遍约束。已有理论支持的是这些组成部分,而不是整套模型已经被证明。
子图封装怎样才能不改变语义
前文关于封装的示意图隐藏了一个关键问题:图论中的“把若干节点缩成一个节点”,不等于教学语义上的无损封装。普通边的可达性也许仍然存在,但 AND/OR 方案可能已经被改变。
上图中的目标必须由 $B$ 和 $C$ 共同推出:外部概念 $X$ 通过入口 $A$ 支持 $B$ 分支,$Z$ 通过入口 $C$ 支持另一条分支。如果折叠后只是机械地生成 $X \to P$ 和 $Z \to P$ 两条普通入边,并分别把它们当成单边方案,原来的 $X \land Z$ 就会被错误地改写成 $X \lor Z$。同理,一条从内部节点出发的边,也未必意味着只要“理解了父概念”就一定拥有使用这条出边所需的具体内部结论。
图的模块分解理论提供了一个严格但很强的参考条件:在通常的无向图定义中,如果一个节点集合是 module,那么每个外部节点要么连接它的全部节点,要么一个也不连接;模块内各节点从外部看来无法区分,因此可以被一个商图节点替代。对应到本文的有向推导图,还必须分别保持外部入邻接和出邻接的一致。本文希望封装的任意子 DAG 通常不满足这种一致邻接条件,所以不能直接声称它在图论意义上天然无损。
因此,上文已经把可封装对象限制为有根、方案完整、内部闭合、入口明确、单一出口且不与已有范围部分重叠的子 DAG,并要求父概念继续保存入口的 AND/OR 公式和内部成本语义。这些限制能够排除上面的直接反例,但它们目前仍然只是一组保守的候选充分条件,还需要一个更严格的语义保持定义来检验。
设被封装的子图为 $H$,折叠映射为 $\pi_H$。至少对于模型允许查询的外部已知集合 $S$ 和目标 $t$,封装前后应当保持可推导性:
$$ \mathcal{R}(G;S,t) \neq \varnothing \quad \Longleftrightarrow \quad \mathcal{R}(G/H;\pi_H(S),\pi_H(t)) \neq \varnothing $$
如果还声称封装不影响路径优化,就要进一步证明封装前后的最低成本如何对应。即使可推导性保持不变,边界公式在展开时是否产生指数级方案、共享前置在折叠后是否仍然只计费一次,也可能要求更强的限制。只有满足这些语义保持条件,边界关系才适合自动投影;否则,封装后的节点不能替代原子图参与严谨的路线计算。
这里仍然没有解决两个问题:上文九项限制是否真的足以保证这种等价,以及其中哪些只是方便定义边界的强约束而非必要条件。未来也许可以允许多个显式出口、多个父概念或更一般的接口公式,但每放宽一项,都必须重新证明它不会改变有效推导子图的集合与成本。
禁止递归交集换来了什么,又失去了什么
本文暂时要求同一知识体系中的递归分支只能完整包含或完全分离。若用 $A$、$B$ 表示两个概念所包含的后代集合,这条公理要求:
$$ A \cap B \in \lbrace \varnothing, A, B \rbrace $$
它使递归包含关系成为一种层状结构。这样做的收益很具体:每个概念拥有唯一位置和唯一父级链;展开、折叠、版本管理、缓存和权限边界更容易定义;封装时也不会出现同一个内部节点只被两个父概念各自包住一部分的情况。对于需要稳定编辑和计算的产品数据模型,这些都是真实的工程收益。
代价也同样明显。现实知识经常允许一个概念同时属于多个分类,或者让多个知识域共享同一段子结构。Stanford 的本体工程指南指出,多数知识表示系统允许一个类拥有多个父类;Novak 和 Cañas 则把不同知识域之间的 cross-links 视为理解关系、甚至产生创造性认识的重要结构。严格禁止交集会迫使建模者复制共享概念,或者把存在交集的分支拆到不同知识体系。前者可能带来身份、版本和证据同步问题,后者则可能把本来重要的跨域关系藏到体系边界之外。
这里必须区分递归包含与推导关系。即使继续要求包含结构彼此分离,不同分支之间也应当允许建立推导边;否则模型会失去描述跨领域迁移的能力。真正尚未决定的是:共享概念能否被多个父概念同时包含。如果坚持唯一父级,就应当把“层状包含 + 跨分支推导”明确为一项有意的工程取舍;如果允许多个父级,就需要把包含关系从层状结构放宽为 DAG,并重新解决节点身份、局部展开和子图封装的歧义。
因此,禁止递归交集不能被表述成知识本身的普遍规律。它更适合被视为当前模型为了换取可计算性和稳定边界而采用的公理,并通过真实知识体系的建模实践检验:它究竟消除了多少复杂度,又制造了多少重复和割裂。
还需要继续回答的问题
- 什么才是稳定、可判定的概念边界?“概念”与命题、任务、技能和证据之间是否需要更明确的区分?
- 如何判断一条新边或一套新方案是真正的推导,而不是省略了关键步骤?解释一组 AND 条件如何共同起作用的材料,是否还需要属于整套方案,而不只属于其中某一条边?
- 无环是否应当是所有知识关系的全局约束?面对互相定义、反馈系统和迭代理解时,应该重新划分概念,还是把强连通部分封装为一个更大的概念?
- 什么证据足以说明学习者不但能够重新推出定义,还能够把知识迁移到新问题并解决真实问题?
- 共享前置子图、个体边权和大量替代方案同时存在时,最低成本解图能否在可接受时间内算出?需要精确算法、启发式搜索,还是近似解?
- 如何处理学习后的遗忘、复习,以及概念在不同任务之间的迁移?
如果我们能够把概念、推导方案、验证证据和主体状态放进同一个可计算模型,那么“怎样更快地学习”,或者说,“怎样更快认知到目标概念”就不必永远停留在经验和方法论口号上。我们可以寻找现有的最低成本有效推导子图,也可以构造新的概念、边和方案,再用真实结果检验它是否真的降低了成本。
最后还有一件很有意思的事:如果把 v0 到 v5 的每一个版本都视为一个概念,那么这篇文章本身也在使用它所描述的理论组织我的认知。
v0 暴露“对象之间没有结构”的局限,于是推导出 v1;v1 暴露“固定层级和线性流程”的局限,于是推导出 v2。此后的每一次演进也都由一个明确问题引入,并由对这个问题的回答抵达下一个版本。每一版是节点,版本之间“问题 + 解答”的演进过程是边,整条建模史就是一张认知 DAG。
而写下这篇博客,又是在把这张图递归地封装成一个更大的概念。它既记录模型的结论,也记录结论如何从旧模型中生长出来;既在解释“万物皆概念”,又把自己作为这个理论的一个实例。
这也许才是“万物皆概念”最终有价值的地方:它不仅试图描述知识是什么,也试图描述认知如何演进,以及我们应该怎样以更低成本抵达下一个可验证的概念。
2026.8.19 修正:推导载荷属于 AND 组,而不是单条边
上文把问题引入、推导解答和理解材料都放在推导边上。在把这套模型整理成最终版本时,我发现这个归属在 AND 方案下并不成立。它不改变模型的主体结构,但改变了“推导的最小单元究竟是什么”,所以这里补一处修正。
问题出在 AND 方案。如果推出 $v$ 需要 $A$ 与 $B$ 共同成立,那么单独一条 $A \to v$ 并不足以证成 $v$;“旧概念遇到了什么局限、为什么需要 $v$”只有对整组前提才有意义。把它写在某一条边上,另一条边就会显得没有动机,或者被迫复述同一段话。
更严重的是边与方案是多对多的。若载荷挂在边上,一方面同一方案内各边必须给出同一个问题引入,另一方面同一条边又可能属于两套动机完全不同的方案,于是这两套方案也被迫共享同一个问题引入。把这两条约束的传递闭包展开,结论是:**只要两套方案共享一条边,它们就必须共用同一个“为什么”。**这显然不是知识的实际形态。
因此正确的归属是方案本身。问题引入、推导解答和理解材料都是定义在推导方案上的函数,而不是定义在边上的函数:
| |
这样一来,模型正好变成一张 AND/OR 超图:一套方案就是一条超边,前提集合是尾、目标是头;推导边退化为超边在有向图上的投影,只用来判断无环、给出拓扑序和可达性。回过头看,我在 v3 得到的那个结论——“Prompt 就是有向边”——只在每套方案都只有一个前提时才成立。
这处修正是保守的。单前提方案下方案与边一一对应,所以上文关于有效推导子图、无环性、拓扑序、递归展开约束和子图封装条件的结论全部不变,信号与系统案例中的 19 条边、5 条边、$\Delta C_0 = -14$ 和 $26%$ 也不变。
唯一的实质变化是成本口径:结构成本应当数的是需要完成的推导方案数,也就是推导步数,而不是边数。
$$ C_0(R) = |\operatorname{sel}(R)|, \qquad C_u^*(S,t) = \min_{R \in \mathcal{R}(S,t)} \sum_{P \in \operatorname{sel}(R)} w_u(P) $$
其中 $\operatorname{sel}(R)$ 是这张有效推导子图所选中的方案集合,$w_u(P)$ 是完成整套方案的成本;$|E_R|$ 退居为“前提总数”这个辅助指标。当所有方案都只有一个前提时,$|\operatorname{sel}(R)| = |E_R|$,两种口径重合。另外还有一个附带好处:$R$ 本身就是一组方案,不必再从边集合反推当初选了哪套方案。
这也顺带回答了上一节遗留问题中的一半:解释一组 AND 条件如何共同起作用的材料,确实属于整套方案,而不属于其中某一条边。剩下没有解决的是,方案成本 $w_u(P)$ 应该用什么可观测量来度量,以及封装前后方案成本如何对应。
最后,这处修正本身也是一条边:v5 暴露出“载荷归属与 AND 语义冲突”的局限,由此推导出 v5.1。按照本文的说法,它同样是一次“问题引入 + 解答”,并被记录进了那张仍在生长的认知 DAG。