第四讲 — 被卡住时怎么办
L01 > L02 > L03 > [ L04 ] L05 > L06 | L07 > L08 > L09 > L10 > L11 > L12
"连续失败不是坏运气,是信号。" — 卡住检测让 agent 主动换策略,而不是把预算烧在死路上。
本讲核心:三级转向策略——从保守调整到范式转移——以及如何用
noise_runs防止误判。
代码示例:code/
配套项目:项目二 — 从基准到最优
问题
每个研究循环最终都会停滞。指标停止改进,agent 一次又一次地尝试变体却毫无进展。如果没有应对策略,它将把剩余的全部预算浪费在死胡同的细微调整上。
连续 3 次未改进不是坏运气——它是一个信号:当前方向已经耗尽了。
解决方案
迭代中…
|
v
连续未改进次数?
|
+-- < 3 次 → 继续当前方向
|
+-- 3 次 → L1 转向(策略切换)
| 在当前范式内换个方向
|
+-- 5 次 → L2 转向(范式转移)
| 质疑根本假设
|
+-- 预算耗尽 → L3 终止
写 final_report.md
下个会话从它开始工作原理
转向前:先做"更深层思考"
在切换策略之前,agent 强制执行结构化历史分析:
1. 重读完整实验历史
2. 找出最佳 3 次实验的共同规律
3. 找出最差 3 次实验的共同规律
4. 生成 5 个尚未尝试的假设
5. 按预期影响力排序
→ 然后才执行转向这是"更深层思考"——结构性反思,而非随机探索。
L1 转向 — 策略切换(3次未改进触发)
当前方向: 优化 QuickSort 的 pivot 选择策略
↓ 连续3次未改进
L1 转向: 切换到完全不同的算法族
"从基于比较的排序 → 尝试基数排序"在当前范式内换方向,不质疑范式本身。
L2 转向 — 范式转移(5次未改进触发)
当前方向: 让排序更快
↓ 连续5次未改进
L2 转向: 质疑根本假设
"是否可以完全避免排序?
数据结构改变是否能让排序变得不必要?"L3 终止 — max_iterations 耗尽
markdown
<!-- final_report.md 自动生成 -->
## 最佳结果
median_time_s: 0.31(基准: 0.89,改进 65%)
## 成功路径
随机 pivot → 三路划分 → 内省排序
## 失败原因
基数排序:数据分布不适合桶化
## 下次会话推荐假设
1. 尝试混合排序(小数组用插入排序)
2. 探索并行排序final_report.md 是下一个会话的起点,不是终点。
处理噪声指标
噪声指标会导致卡住检测过早触发:
markdown
# research.md 中添加
- Noise runs: 3 # 测量3次取中位数,消除计时抖动
- Min delta: 0.005 # 只有改进 > 0.5% 才算真正进步变更内容
| 情况 | 没有卡住检测 | 有三级转向策略 |
|---|---|---|
| 连续3次失败 | 继续死磕同方向 | L1:切换策略 |
| 连续5次失败 | 继续浪费预算 | L2:质疑范式 |
| 预算耗尽 | 无记录,重来 | L3:final_report.md,下次继续 |
| 噪声指标 | 频繁误判停滞 | noise_runs + min_delta 过滤 |
试一试
运行转向检测器,观察三个级别何时触发:
sh
cd docs/zh/lectures/lecture-04-what-to-do-when-stuck/code
python pivot_detector.py思考题:
- 找到 L1 转向触发的那一轮。在它之前,连续失败了几次?
- 把
stuck_threshold_l1 = 3改成stuck_threshold_l1 = 1,循环行为有什么变化? - 在你自己的研究场景里,L2 范式转移意味着什么?举一个具体例子。
- 如果指标有很大噪声(比如网络延迟测试),你会把
noise_runs设成几?
下一讲:第五讲 — 科学方法调试