> query logbook_
第五章 · 复现 —— 能跑起来的东西才算数
5.1 Ralph loop:最简的自循环
方法是什么。 Ralph loop 源自 Geoffrey Huntley 2025 年 7 月的文章(ghuntley.com/ralph):把 agent 放进一个 bash 自循环,用外部的完成信号(不是 agent 自己宣称"我做完了")当闸门,迭代到它输出约定的完成标记。Anthropic 在 2025-12 把它做成官方插件(anthropics/claude-plugins-official,plugins/ralph-loop):同 session 内循环、上下文保留,stop hook 从输出里提取 `<promise>…</promise>`,与可配置的字符串(如 DONE)做精确匹配。注意 DONE 只是示例,字符串可配置,不是固定协议。社区版更糙:每次迭代都是 fresh session(全新会话),状态只存在文件和 git 里。
为什么这样做。 单次调用的 agent 经常"差不多就停"。循环加外部闸门,把"做到什么程度算完"的定义权从 agent 手里拿走,交给可程序化检测的信号。关键在"外部"两个字:如果完成标准由 agent 自己宣称("我觉得做完了"),循环只会把"自我感觉良好"迭代到极致。这是第二章规则 1(评估器在循环之外)在个人工作流上的最小实现——连 bash 脚本这一层都不例外。
怎么演进。 从 Huntley 的 bash 一行循环,到 Anthropic 的官方插件(session 内循环、stop hook 机制),再到社区各种变体。形态在变,不变的是三件套:冻结的目标、可检测的完成信号、硬性的迭代上限。两个版本的区别值得记下来:官方插件在同 session 内循环,上下文保留,适合长任务的连续推进;社区版每次迭代都是 fresh session,状态只存在文件和 git 里,适合"每轮都从干净状态开始"的场景。选哪个,看你的任务更怕上下文污染还是更怕状态丢失。
最小可运行示例。
#!/usr/bin/env bash
# ralph.sh — 最小可用 Ralph loop
# 完成信号从外部读取(不是 agent 自我宣称),iteration cap 是硬闸门。
MAX_ITER=20
for ((i=1; i<=MAX_ITER; i++)); do
echo "[ralph] iteration $i/$MAX_ITER"
OUTPUT=$(cat PROMPT.md | claude-code 2>&1) # 或你的 coding agent
echo "$OUTPUT" | tee -a log.txt
git add -A && git commit -qm "ralph iter $i" # 存档即 lineage(第二章规则 2)
if echo "$OUTPUT" | grep -q "<promise>DONE</promise>"; then
echo "[ralph] done after $i iterations"; exit 0
fi
done
echo "[ralph] hit iteration cap"; exit 1跑起来之前写好三件套:PROMPT.md(冻结的目标与约束)、PRD.md(需求基线)、完成信号(必须可程序化检测:测试集全绿、benchmark 达标;"看起来不错"不算信号)。先跑起来,再谈优化:第一个 Ralph loop 不需要完美,它只需要转起来、记下来、停得住。guardrails(护栏)三件:iteration cap(默认 20)、token 预算上限、任何外部副作用隔进 sandbox。三件缺一不可:没有 iteration cap,死循环烧穿预算;没有 token 预算,单轮失控的长输出照样烧穿;没有 sandbox,循环里一个"删库试试"就能酿成事故。护栏是写给循环看的,不是写给人看的。完成信号字符串可配置,DONE 只是示例。
证据等级开源可复现。
5.2 GEPA 流程:一张表
| 阶段 | 做什么 | 输入 → 输出 |
|---|---|---|
| Reflect(反射) | 把失败的执行轨迹转成文字反思 | trajectory → 诊断 |
| Mutate / Merge(变异/合并) | LLM 提出新 prompt,基因式合并 | 候选 → 候选 |
| Pareto select(选择) | 在 Pareto 前沿保留互补策略 | 候选 → 前沿 |
| Validate(校验) | 验证集上复测,防止过拟合 | 前沿 → 胜出 |
适用条件:系统里有可改的 prompt,且能定义出 metric(什么算好)和 feedback(错在哪)两个函数——任何带 prompt 的复合 AI 系统都能套用。缺任何一个,GEPA 无从下手。详细算法见第一章 1.5 的论文链接。
证据等级论文实验可复现。
5.3 EvoSkill:从失败轨迹里蒸馏 skill
方法是什么。 EvoSkill(arXiv:2603.02766,Sentient AGI + Virginia Tech)是"智能体自己给自己写 skills"的工程化路线:分析失败的执行轨迹,提炼可复用的 skill 文件(SKILL.md + helper scripts),用 held-out(留出)任务当闸门决定去留,底层模型全程冻结。
为什么这样做。 重复任务里,失败轨迹是最值钱的原材料。一次写好的 skill 可以处处复用,而手写 skill 库的问题是人类写不全、更新不及时。底层模型冻结是关键设计:skill 的改进必须来自 skill 本身,不能靠"模型变强了"混过去——否则你分不清进步来自 skill 库还是来自基座模型升级。
证据到哪一步。 OfficeQA 从 60.6% 到 67.9%(+7.3pp);SealQA 从 26.6% 到 38.7%(+12.1pp);SealQA 上学到的 skill 零样本迁移到 BrowseComp 还有 +5.3pp。第三个数字最有信息量:它说明蒸馏出来的 skill 不是只记住了一套题的答案,而是抓住了可迁移的做事方法——虽然迁移幅度不大,但方向是对的。注意它的改进形态是 benchmark-aware(认基准的):公开结论依赖 OfficeQA/SealQA 的信度,对照第二章规则 5 使用。
证据等级论文实验可复现。
5.4 成本:一笔实话账
Ralph loop 的成本与迭代次数和模型强度基本线性相关。一个典型 10–20 轮的循环,用便宜模型跑收紧的内环、大模型只做顶层规划,单次 session 的花费可以压在几美分到两美元的量级。以上是按 2026 年公开 API 价格估算的量级,具体数字以实测为准。本书对"跑不跑得起"只认两个数字:你自己的账单,和 benchmark 成绩。估算和实测之间永远有落差:同一个循环,换一版计费方式不同的模型,成本结构就全变。所以成本章节不给精确数字——给精确数字才是误导。省钱的通用策略只有三条:便宜模型做大批量筛选,贵模型只做最后拍板;iteration cap 宁设低不设高;所有中间产物进缓存,同一测试不跑第二遍。这三条和第二章规则 3(分阶段门控)是同一回事——个人工作流和论文里的 80 代进化,花的都是同一本账。示例脚本默认 MAX_ITER=20:账算清楚,是复现的最后一道门。
证据等级估算值,以实测为准。