Ralph Loop 深度解读:AI Agent 持续迭代循环的来龙去脉
本文是一篇综述与交叉验证性质的解读,视角为”一个社区实践如何长成产品能力”。素材来自四条独立线索:Geoffrey Huntley 的原始博文与哲学续篇、阿里云云原生的中文综述、Anthropic 官方工程博客、以及 Claude Code / ChatGPT 的官方文档,文末附全部出处。除特别标注「」的直引外,行文均为重新组织与个人分析。
整理日期:2026-09-25
一、一个真实的问题:LLM 什么时候算”做完了”?
所有 AI 编程工具的用户都遇到过同一类尴尬:任务做到七八成,模型输出一句”任务完成”,然后停了。具体表现有四种:
- 主观收工:模型在它自己觉得”差不多了”时退出,而不是在客观标准达成时
- 单发脆弱:稍微复杂的任务,一次提示不可能做完,中间全靠人工续命
- 续命昂贵:每次人工重新引导,消耗的都是开发者的注意力
- 断档失忆:会话一旦重启,之前做了什么、为什么这么做,全部清零
把这四种现象抽象一下,根因是同一个:LLM 的自我评估不可信。它判断”完成”的依据是自己的主观感受,而不是一个可以被外部验证的事实。
社区的回应方式粗放到近乎行为艺术——一个 bash 循环:
1 | while :; do |
Geoffrey Huntley 给它起了个名字(借自《辛普森一家》里屡败屡战的角色 Ralph Wiggum),并留下一句著名的定义:“Ralph is a Bash loop”。这个循环能跑通任务的前提只有一条:提示词永远不变,变的是硬盘上的东西——代码被改了、测试跑了、git 历史长了。模型每一轮看到的”世界”都不一样,它实际上是在通过文件系统读自己的工作痕迹,形成自我修正。
这个看似玩笑的方案后来被推到了相当夸张的规模:Huntley 声称用它在 YC 黑客松一夜生成 6 个仓库、以约 $297 的 API 成本交付一份报价 $50k 的合同、历时三个月写出完整的编程语言 “cursed”(数字出自其 README,听听就好,重点是方法本身)。
二、循环的三种形态:从野路子到产品能力
同样的循环骨架,在一年左右的时间里进化出了三种实现形态。这是理解 Ralph 现象最有效的一个框架。
形态 A:外部脚本(原始形态)
就是上面的 while true。优点是零依赖、任何 CLI 工具都能套;缺点是每轮都是全新进程,退出即失去会话,状态全靠文件接力。
形态 B:Stop Hook 插件(Claude Code 官方插件 ralph-loop)
Anthropic 把这个模式收录为官方认证插件(安装量 19 万+,Apache 2.0,前身 ralph-wiggum,2026 年 1 月因商标考虑更名)。实现思路很取巧:不启动外部循环,而是拦截会话的退出动作。
hooks/stop-hook.sh注册为 Stop hook:模型每轮想结束会话时,hook 检查输出里有没有约定的完成标记(如--completion-promise "DONE")- 没有标记 → 拦截退出,把同一份提示重新注入,开始下一轮
--max-iterations设置硬上限;/cancel-ralph随时熔断
工程上有两个值得一提的坑:hook 执行器经 /bin/sh -c 启动脚本,直接执行需要可执行位,官方改用 bash 前缀调用绕开权限问题(兼容旧版本客户端);Windows 上 bash 可能解析到 WSL 的 bash 而非 Git Bash,需要手动改缓存中的 hooks.json 显式指定 Git/bin/bash.exe。
用法:
1 | /ralph-loop "任务描述" --max-iterations 10 --completion-promise "DONE" |
局限:完成标记是精确字符串匹配,不支持多条件分支(比如区分”成功”和”被阻塞”),所以迭代上限必须当作主安全阀。
形态 C:内置命令 /goal(产品化终点)
Ralph 爆火后,两家厂商先后把循环骨架内置成了官方能力。
Claude Code 的 /goal:设定一个完成条件,每轮结束后由一个独立的小型评估模型(默认 Haiku)判断条件是否成立,不成立则自动续轮。目标清除的出口有三个:条件满足、评估者判定条件不可能达成、遇到必须人工修复的错误。/goal(无参数)查看状态,/goal clear 熔断,条件文本上限 4000 字符,支持无头模式 claude -p "/goal ..." 一条命令跑完。
ChatGPT 桌面版 / Codex 的 /goal:Goal 模式下目标文本既是首条提示词也是完成标准,进度栏支持暂停/恢复/编辑/清除。官方建议目标不清晰时先走 /plan,让 AI 通过提问收敛出可衡量的成功标准再启动。
两者都强调目标三要素:预期结果 + 约束条件 + 验证方式——和 Ralph 的完成标准写作法完全同构。
三种形态对比
| 维度 | A. 外部脚本 | B. Stop Hook 插件 | C. 内置 /goal |
|---|---|---|---|
| 循环引擎 | bash while 循环 |
hook 拦截退出 + 重注入提示 | 会话内自动续轮 |
| 每轮上下文 | 近似全新会话 | 近似全新会话 | 同一会话延续 |
| 完成判定 | 脚本 grep 标记 | hook 精确字符串匹配 | 独立评估模型判断 |
| 状态载体 | 纯文件系统 | 文件系统 + git | 会话上下文(有腐烂风险) |
| 安全阀 | 循环次数变量 | --max-iterations |
轮数上限写进条件 + /goal clear |
| 通用性 | 任意 CLI 工具 | Claude Code | 官方生态内 |
一个值得单独强调的坑:/goal 的评估者只读对话内容,不会自己跑命令、翻文件。所以条件必须把”证据形态”写死——不能写”所有测试通过”(模型嘴上说通过了评估者也可能采信),要写”npm test 退出码为 0 且完整输出出现在对话记录中”。
另外 Claude Code 还有 /loop(按时间间隔触发,如 /loop 10m 跑测试并修复失败)。/goal 管”下一轮是否该开始”,/loop 管”到点要不要看一眼”,两者组合相当于验收员 + 巡逻员,适合长周期挂机任务。
三、循环能跑起来的三个支柱
形态只是壳。无论 A/B/C,一个循环要真正跑出结果而不是原地打转烧钱,靠的是三根支柱。
支柱 1:完成标准必须可机器验证
“把代码质量弄好一点”这种目标会让循环永远退不出去(评估者可以无限次说”还没好”)或者早早放水。有效的完成标准长这样:一个可度量的终态(测试通过、构建零错误、覆盖率 > 80%、队列清空)+ 一条证明方式(哪个命令、什么退出码、什么输出)+ 必要的不可变约束(”不得修改其他测试文件”)。Anthropic 的案例还提醒:标准要细到端到端可验证的步骤粒度,否则模型会自行解释范围——社区有人让 Ralph 提升测试覆盖率,它把”内部命令”自行判定为”非用户面向”直接跳过了。
支柱 2:状态外置——把记忆从上下文窗口搬进硬盘
这是 Ralph 系实践中最核心的工程洞察。长会话有”上下文腐烂”问题:轮次越多,模型对早期指令的注意力越差;而厂商的常规解法——compaction(压缩历史)——传递的信息并不总是可靠的。Anthropic 官方工程博客对此有明确结论:即使前沿模型跑在 Agent SDK 里循环跨多个上下文窗口,仅靠 compaction 和一句高层提示也建不出生产级应用。
社区给出的替代方案是把状态载体从 Token 序列换成文件系统,典型三件套:
- 任务清单(
prd.json):结构化条目,每项带passes: false字段,完成才改 true——它同时是范围定义和进度看板 - 进展日志(
progress.txt):追加式,每轮记录做了什么、踩了什么坑、发现了什么可复用的模式(置顶维护) - git 提交:每步成功即提交,给下一轮提供变更差分和回滚能力
每轮开工前的热身流程也固定下来:定位目录 → 读 git log → 读进展日志 → 读任务清单选一项 → 跑起来确认现状没坏 → 才开始干活。
值得玩味的是任务的粒度:每轮只做一个任务。这不是效率选择而是可靠性选择——一次做太多,失败时无法定位,git 历史也失去意义。社区和官方在这一点上完全一致。
支柱 3:安全阀与成本账
随机系统的无限循环是危险的,尤其无人值守时。三道保险:迭代上限(Ralph 的 --max-iterations、/goal 条件里写 or stop after 20 turns)、沙箱隔离(docker sandbox run,AFK 场景下防止 rm -rf 级事故的基本保险)、成本预算(社区经验值:小任务 5-10 轮约 $5-15,中型 20-30 轮约 $15-50,大型 30-50 轮 $50-150)。还有一条更保守的建议:先在人在回路模式下把提示词调稳,再放手无人值守。
四、两条独立证据线的收敛
整理这份资料时最有意思的发现是:社区实践和 Anthropic 官方工程在互不知情的情况下收敛到了同一套设计。
Anthropic 工程博客《Effective harnesses for long-running agents》(2025-11)全文没有出现 “Ralph” 字样,它讲的是自家 Agent SDK 上的长时任务 harness 设计:一个 Initializer Agent(首个会话专用提示,负责搭建 init.sh、进展文件、git 仓库和一份 200+ 条的 JSON 功能清单)+ 一个 Coding Agent(每会话单功能推进、自验证、提交、更新日志)。把两边的方案摆在一起:
| 设计点 | Ralph 社区实践 | Anthropic 官方 harness |
|---|---|---|
| 任务载体 | prd.json,passes: false 起步 |
feature_list.json,200+ 条,passes: false 起步 |
| 进度载体 | progress.txt 追加日志 |
claude-progress.txt |
| 粒度 | 每轮一个任务 | 每会话一个功能 |
| 记忆 | 每步 git commit | 描述性 commit + 进展摘要 |
| 防作弊 | 完成标记 + 反馈循环 | 禁止删改测试、只许改 passes 字段 |
| 验证 | 测试/Lint/类型检查 | 端到端浏览器自动化(Puppeteer MCP) |
| 开工热身 | 读状态文件 | pwd → git log → 进展 → 清单 → 基础测试 |
结构上的雷同不是抄袭——两条线的时间线和话语体系都不同——而是同一个问题(跨会话记忆)在同一技术约束(上下文窗口有限)下的必然解。这个收敛本身就是对 Ralph 方法论最有力的背书。官方版本多出来的两点增量也值得吸收:功能清单用 JSON 而非 Markdown(实测模型更不容易擅自覆写),以及验证要”像人类用户一样走一遍端到端”而不是只看单测。
五、实操建议(按时间线重组)
把散落在各处的技巧按”跑循环前 / 循环中 / 跑完后”重新组织:
跑之前——这一步决定成败的八成:
- 先人在回路跑几轮,把提示词和完成标准调稳,再转无人值守
- 写清楚完成标准和不可变约束,越具体越好;模糊目标是烧钱的最快方式
- 任务按风险排序:架构决策和集成点优先(早失败),抛光清理垫底;基础未稳前不要无人值守
循环中:
- 每轮一个任务,完成即提交;反馈循环(类型检查/测试/Lint)作为提交前置条件写进提示
- 无条件信任 Lint 和测试结果,不信任模型的”已完成”叙述
- AFK 必配沙箱;随时可以人工插话调整(HITL 和 AFK 可以混用,不必二选一)
跑完后:
- 逐个审查提交(review 是人保留的最后职责)
- 把这一轮学到的坑写回提示词或进展文件,下一轮循环质量立刻不同
- 算一笔 ROI 账:机械性任务(重构、测试迁移、补覆盖率)是循环的主场;需要设计判断的任务不要交给它
六、适用边界
适合交给循环的:TDD 循环(写到全绿)、绿地项目过夜跑、机械化重构、测试框架迁移、覆盖率/重复代码/Lint 债务清理——共同特征是有自动化手段能客观判定对错。
不适合的:需要审美和设计决策的工作、成功标准说不清的任务、整体策略规划(常规 Agent 流程更合适)、以及预算紧张又没有上限意识的场景。一个朴素的判断法:如果你写不出”怎么验证它做完了”,就别开循环。
七、争议与冷思考
Huntley 的近期表态相当激进:他宣称”软件开发已死,是我杀的”、”我现在不雇没有亲手写过 coding agent 的人”,并把 Ralph 上升为一种通用世界观——“一切皆 Ralph 循环”。他的路线图是 Weaving Loom 项目(自称”演化式软件”基础设施):让循环不仅完成任务,还自动为营收目标演化产品,对标 Steve Yegge 的 Gas Town(他称之为 level 8,自己要做 level 9)。他还晒出过一次”演化式软件自愈”:循环自动发现功能缺陷、学习代码库、修复、部署、验证通过。
这些说法建议打对折再消化。可以确定的部分:循环 + 状态外置 + 外部验证这套工程方法已被官方文档和实践反复验证,值得每个人掌握。需要保留的部分:”软件开发已死”是修辞不是事实陈述——循环擅长的是目标可验证的收敛型工作,而”定义什么是好的”这件事目前仍然完全依赖人。倒是他有个观点我完全认同:亲手写一个 coding agent(约 300 行循环代码)是理解这套范式最快的路径——理解了循环,你才知道什么时候该用它,什么时候该关掉它。
八、参考资料
- Geoffrey Huntley — Ralph 技术起源:https://ghuntley.com/ralph/
- Geoffrey Huntley — Everything is a Ralph Loop(哲学续篇,2026-01-17):https://ghuntley.com/loop/
- The Weaving Loom:https://github.com/ghuntley/loom
- 丹坤(阿里云云原生)—《从 ReAct 到 Ralph Loop:AI Agent 的持续迭代范式》(2026-01-27):https://www.cnblogs.com/alisystemsoftware/p/19540015
- Justin Young(Anthropic Engineering)— Effective harnesses for long-running agents(2025-11-26):https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents
- Claude Marketplace — Ralph Loop 插件页:https://claude.com/marketplace/plugins/ralph-loop
- Anthropic — claude-plugins-official 仓库(ralph-loop 源码):https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-loop
- Claude Code 官方文档 — Keep Claude working toward a goal(/goal):https://code.claude.com/docs/en/goal
- OpenAI — Long-running work(ChatGPT/Codex Goal 模式):https://learn.chatgpt.com/codex/long-running-work
- Steve Yegge — Welcome to Gas Town:https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04
- Ralph 循环最佳实践(英文原典):https://www.aihero.dev/tips-for-ai-coding-with-ralph-wiggum
- 生态实现:DeepAgents ralph_mode(https://github.com/langchain-ai/deepagents/tree/master/examples/ralph_mode)、ralph-loop-agent for AI SDK(https://github.com/vercel-labs/ralph-loop-agent)、Ralph Orchestrator(https://github.com/mikeyobrien/ralph-orchestrator)