演化
评估结束不等于活干完了。演化拿评估里发现的问题去改 Seed,再跑一遍。关键不在于它会重跑,而在于它什么时候停。
1. 跑起来
ooo evolve "待办应用:刷新之后要保留已完成状态"
预期结果:一份反映评估结果的 Seed 修改提案、运行结果,以及一个 lineage_id。只想看 Seed 会怎么改、不想重建代码,加 --no-execute。之后用 ooo evolve --status <lineage_id> 看后续。
2. 一代都经过什么
代码里的世代阶段是这几个:wondering(先找还有什么没搞清楚)→ reflecting(起草改动)→ seeding(生成新 Seed)→ executing → evaluating,终态是 completed / failed / cancelled。
同一份工作的 Seed 修订链叫 lineage,其中一次「新 Seed + 一次运行」叫一 代(generation)。
3. 停止条件是四选一,不是一条
这一节值得看仔细:收敛的判定是 ANY-of,命中任意一条就停。
| 条件 | 判定 |
|---|---|
| 本体稳定 | 最近两代的本体相似度 ≥ 0.95 |
| 停滞 | 相似度在 3 代里连续保持在阈值以上——这是「没进展」,不是「做好了」 |
| 反复反馈 | 同类的疑问在世代之间反复出现 |
| 预算耗尽 | 达到 30 代上限,强制终止 |
还有一个振荡检测:结构在两代之前的样子和现在之间来回跳,也会停。至少要跑满 2 代才开始看前三条信号。
0.95 常被写成「达到这个数就算收敛」的必要条件,那是误读。它是四条路里的一条。
4. 光是相似不够,还得有通过的评估
相似度到了 0.95 也不一定收敛。代码里有一道闸:在期望有评估的模式下,如果最新一代没有评估结果、或者评估是被拒绝的,就不会因为「稳定」而收敛。
理由很直接:两代长得一样,可能是稳定了,也可能是两代都一样地做错了。没有通过的评估作证,相似只是相似。
5. 下一代会重做哪些验收标准
演化时工作会集中到没通过的标准上:代码里把 Seed 的验收标准切成 active 和 frozen 两组,两组互不重叠、并起来正好是全部(evolution/frugality.py)。
但有一点要说清楚,免得读成比实际更强的保证:「冻结」是把力气集中到该做的地方,不是「已经过的从此不会再挂」。代码里另有一个回归检测器,专门看上一代通过、这一代却挂掉的验收标准(evolution/regression.py)。如果冻结真能保证不回退,这个检测器就没有存在的必要。另外还有一个不冻结任何标准的 full_graph 对照组。
6. 记住这个 ID
ooo evolve 会打印 lineage_id(lin_…),修订历史查询和 ooo ralph 都要用它。
这一页的数字都对着当前源码核过:0.95、3 代停滞窗口、最少 2 代、上限 30 代、振荡检测默认开启,都在 evolution/convergence.py 的 ConvergenceCriteria 里;第 4 节那道评估闸也在同一个文件里。第 5 节的说法比英文版和韩文版更保守——它们没有提回归检测器和对照组。有对不上的地方,欢迎到 GitHub Issues 说一声。
