Skip to content

第四讲 — 被卡住时怎么办

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

思考题:

  1. 找到 L1 转向触发的那一轮。在它之前,连续失败了几次?
  2. stuck_threshold_l1 = 3 改成 stuck_threshold_l1 = 1,循环行为有什么变化?
  3. 在你自己的研究场景里,L2 范式转移意味着什么?举一个具体例子。
  4. 如果指标有很大噪声(比如网络延迟测试),你会把 noise_runs 设成几?

下一讲第五讲 — 科学方法调试