Ralph Loop 到底是什么?一种自主 AI 编码技巧详解
Ralph loop(又称 "Ralph Wiggum" 技巧)每一轮都让编码智能体从干净的上下文重新启动,靠读取磁盘上的状态文件推进进度。本文讲清楚它的原理,以及如何实际跑一条 Ralph loop。
什么是 Ralph Loop?
Ralph loop——常被称为 "Ralph Wiggum" 技巧——是循环工程里被复用得最多的模式之一。这个思路出自开发者 Geoffrey Huntley,简单到近乎朴素:把编码智能体放进一个 shell 循环里,给它一份可读取的状态文件,然后让它每一轮都从零重新开始,直到任务完成。
不需要编排框架,不需要持续的对话上下文,也不需要复杂的智能体记忆系统。就是一个循环、一份规格文件,加上每一轮都重新开始。
它是如何工作的
一条 Ralph loop 由三个部分组成:
- 磁盘上的状态文件——通常是任务列表、需求规格或进度记录(例如
prd.json、progress.md这类文件)。这是智能体在各轮之间唯一的"记忆",不依赖任何对话线程。 - 重新启动,而不是接着聊。 每一轮都会启动一个全新的智能体会话:读取状态文件,挑出下一个范围明确的任务,实现它,运行项目真实的测试/lint/构建命令,提交代码,并在退出前更新状态文件。
- 一个持续重启它的 shell 循环。 进程一退出,循环就重新启动——新的会话,同一份状态文件,处理下一项任务。
"每次都是干净上下文"正是这套方法的关键所在。智能体的会话跑得越久,越容易积累"上下文腐化"——过时的错误判断、陈旧的假设、无关的历史信息,都会悄悄拖累产出质量。Ralph 的做法是干脆不让任何一个会话跑得足够久到腐化:每一轮只啃下一个任务,记录下发生了什么,然后干净地重新开始。
Ralph 与常规提示词对话的区别
一次普通的编码智能体会话本质上是一场对话:你输入,它响应,你纠正它,在同一个持续的上下文窗口里来回进行。Ralph loop 把这场对话替换成了一份"契约"——一份你和智能体都会读写的状态文件——再交给一个"很笨"的 shell 循环去做"继续下去"这件本该由人手动完成的事。
这套交易只有在状态文件里的任务本身范围明确的前提下才成立。如果任务写得含糊或者过大,每一轮全新上下文都会对任务边界做出不同的猜测,这也是 Ralph loop 在实践中最常见的翻车方式。
一条你今天就能跑的 Ralph Loop
MCP.so 上的 Ralph Story Executor 就是这套技巧的直接实现:它从 .ralph/prd.json 文件里读取尚未完成的故事(story),每一轮只实现一个、范围尽量小,用项目的测试/lint/构建命令作为背压校验,用与该故事对应的提交信息提交代码,并在下一轮开始前把学到的经验记录到 .ralph/progress.md。只有当文件里所有故事都标记为完成,它才会退出。
与之紧密相关的 Guardrails Learning Loop,在同一个 .ralph/ 目录里多加了一份状态:当同一种检查连续两次以同样方式失败,循环会把它写成一条固定规则记录到 .ralph/guardrails.md 里,此后每一轮——即便是全新上下文——也都会自动遵守这条规则。
相关的其他模式
Ralph 并不是唯一值得了解的命名循环模式:
- Reflexion 式循环保留的不是长期计划,而是短期的"反思"——智能体在每次尝试失败后写下哪里出了问题,下一轮重试前先读取它。参见 Reflexion Debug Loop。
- MCP.so 循环工作流目录里的大多数其他循环并不会在各轮之间重启上下文——它们是配有检查命令和退出条件的、范围明确的单条提示词,属于循环工程谱系里更简单的一端。而 Ralph 适用的场景,是任务大到一条提示词装不下、又重复到不值得人工盯守的时候。
如果你还不熟悉循环工程这个更大的概念,可以先读《什么是 Loop Engineering》,了解每一条循环——包括 Ralph——共同的四要素结构。