👀在网上看到一个案例,震撼到我了。
有人用 Claude Code 跑了一个while true循环,整整三个月,最后造出了一门编程语言。
对,你没看错,一门完整的编程语言,还是用 Gen Z 黑话写的那种(关键字包括slay、sus、based)。
我第一反应:这人是不是疯了?
仔细一想,这不就是软件工程吗——不断迭代,不断失败,不断改进,直到成功。只不过这次执行循环的不是人,是 AI。
这就是Ralph Wiggum 技术。
先说名字。
Ralph Wiggum 是《辛普森一家》里那个蠢萌的小男孩,有句经典台词:"Me fail English? That's unpossible!"(我英语不及格?那不可能!)
创造这个技术的 Geoffrey Huntley 用这个名字,想表达的哲学很简单:通过不断坚持和迭代,最终实现看似不可能的任务。
Ralph 的本质是什么?Geoffrey 自己说得很直白:
Ralph is a Bash loop.
没错,就一个 Bash 循环:
while:;do
catPROMPT.md | claude-code --continue
done把同一个提示词不断喂给 AI,让它反复执行、反复失败、反复改进,直到任务完成。
听起来傻?但 Geoffrey 说得好:
Deterministically bad in an undeterministic world.
在一个不确定的世界里,确定性的失败反而是好事。
为啥?因为可预测的失败意味着你能通过调整提示词来系统性改进。
我们看看 Ralph 怎么工作:
关键在第 6 步——Claude 通过读自己之前写的代码,形成了一种"自我指涉"(self-referential)的反馈。
这不是 AI 跟自己对话(那会疯),而是 AI 在不断审视自己的产出,就像程序员不停 review 自己的代码。
要实现 Ralph,核心是Claude Code 的 Hooks 系统。
Hooks 是啥?简单说,在 Claude Code 运行的特定时刻自动触发的 shell 命令。其中最关键的是Stop Hook。
当 Claude 想退出时,Stop Hook 会被触发。Ralph Wiggum 插件在这里做了件"不讲武德"的事:阻止 Claude 退出,把原始 prompt 重新塞回去。
看核心代码(简化版):
#!/bin/bash
# stop-hook.sh
# 检查有没有活跃的 ralph-loop
if[[ ! -f".claude/ralph-loop.local.md"]];then
# 没有循环,正常退出
exit0
fi
# 读循环状态
ITERATION=$(grep'^iteration:'.claude/ralph-loop.local.md | ...)
MAX_ITERATIONS=$(grep'^max_iterations:'.claude/ralph-loop.local.md | ...)
COMPLETION_PROMISE=$(grep'^completion_promise:'.claude/ralph-loop.local.md | ...)
# 到最大迭代次数了吗?
if[[$ITERATION-ge$MAX_ITERATIONS]];then
echo"🛑 到头了"
rm".claude/ralph-loop.local.md"
exit0
fi
# 检测到完成标记了吗?
if[[ -n"$COMPLETION_PROMISE"]];then
PROMISE_TEXT=$(echo"$LAST_OUTPUT"| perl -0777 -pe's/.*?<promise>(.*?)<\/promise>.*/$1/s')
if[["$PROMISE_TEXT"="$COMPLETION_PROMISE"]];then
echo"✅ 检测到 <promise>$COMPLETION_PROMISE</promise>"
rm".claude/ralph-loop.local.md"
exit0
fi
fi
# 还没完,继续!
NEXT_ITERATION=$((ITERATION +1))
PROMPT_TEXT=$(awk'/^---$/{i++; next} i>=2'".claude/ralph-loop.local.md")
# 输出 JSON 阻止退出,重新注入 prompt
jq -n \
--arg prompt"$PROMPT_TEXT"\
--arg msg"🔄 第$NEXT_ITERATION轮"\
'{
"decision": "block",
"reason": $prompt,
"systemMessage": $msg
}'
exit0关键机制:
状态文件:.claude/ralph-loop.local.md存当前状态(迭代次数、最大次数、完成标记等)
阻止退出:返回"decision": "block"的 JSON,Claude Code 就会拦住
重新注入:"reason"字段装着原始 prompt,作为下一轮输入
这就像给 Claude 设了个"死循环"。但这循环是有目标的。
Ralph Wiggum 插件用起来很简单。
/ralph-loop"BuildaRESTAPIfortodos.Requirements:CRUDoperations,inputvalidation,tests.Output<promise>COMPLETE</promise>whendone."--completion-promise"COMPLETE"--max-iterations50
这命令做了啥?
.claude/ralph-loop.local.md状态文件然后你就可以离开电脑了。
Claude 会自己:
<promise>COMPLETE</promise>Ralph 提供两种停止机制:
最大迭代次数(--max-iterations)
这是你的救命稻草。永远记得设:
/ralph-loop"Fixtheauthbug"--max-iterations20
为啥这么重要?
因为--completion-promise只能精确字符串匹配,不能有多个完成条件。任务要是完不成,Ralph 会一直跑,直到你 API 配额耗光(或者哭着取消)。
完成承诺(--completion-promise)
让 Claude 输出特定标签表示完成:
<promise>TASKCOMPLETE</promise>
注意!这里有个道德约束:Claude绝对不能为了退出而撒谎输出这标签。
插件文档反复强调:
CRITICAL RULE: You may ONLY output the promise when the statement is completely and unequivocally TRUE. Do not output false promises to escape the loop.
就像程序员的职业道德——代码没过测试,你也不能强行改成assert True。
要手动停:
/cancel-ralph
Ralph 能不能成,80% 看prompt 质量。
BuildatodoAPIandmakeitgood.
问题在哪?
Build a REST API for todos.
When complete:
-All CRUD endpoints working
-Input validation in place
-Tests passing (coverage > 80%)
-README with API docs
-Output:<promise>COMPLETE</promise>好 prompt 应该:
Implement feature X following TDD:
1.Write failing tests
2.Implement feature
3.Run tests
4.If any fail, debug and fix
5.Refactor if needed
6.Repeat until all green
7.Output:<promise>TESTS PASSING</promise>这种 prompt 利用测试的确定性反馈——要么绿,要么红,没模糊地带。
Ralph 技术背后有几个深刻的道理。
不要想着第一次就做对。让循环去打磨。
Geoffrey 自己说,他从没写过编译器,但通过 Ralph,用 3 个月跑出了完整的编程语言,包括:
这传统开发里可能要个小团队干一年。
"确定性的糟糕"(deterministically bad)意味着失败是可预测、可分析的。
每次失败告诉你:
这些比成功更有价值。
Ralph 不是"设了就忘"的工具。它是个放大器——放大你写 prompt 的能力。
LLMs are mirrors of operator skill.
经验丰富的开发者,通过精心设计的 prompt,能让 Ralph 干出惊人的活儿。新手可能陷入无尽循环。
Y Combinator 的一次黑客松测试中,Ralph 一夜生成了 6 个完整代码仓库,API 成本 297 美元。
Geoffrey 分享的案例:价值 5 万美元的外包合同,用 Ralph 完成,API 成本 297 美元。
当然,这不是说 Ralph 能替代所有开发工作。但对于明确定义的、机械性任务,它确实提效明显。
Geoffrey 用 Ralph 跑了三个月,造了 Cursed 编程语言——用 Gen Z 俚语做关键字的函数式语言。
成功的定义?让 Cursed 上 Stack Overflow 开发者调查,成为"最受喜爱"或"最被憎恨"的语言之一。
共同点:有明确成功指标,执行过程机械化。
Ralph Wiggum 插件的代码结构很清晰:
ralph-wiggum/
.claude-plugin/
plugin.json # 插件元数据
commands/
ralph-loop.md # /ralph-loop 命令
cancel-ralph.md # /cancel-ralph 命令
help.md # /help 命令
hooks/
hooks.json # Hook 配置
stop-hook.sh # Stop Hook 实现
scripts/
setup-ralph-loop.sh # 初始化脚本.claude/ralph-loop.local.md用的是Markdown + YAML frontmatter:
---
active: true
iteration: 1
max_iterations: 50
completion_promise: "COMPLETE"
started_at: "2025-12-28T10:30:00Z"
---
Your original prompt goes here...为啥用 Markdown 不用纯 JSON?
因为 Markdown易读,方便检查当前状态。YAML frontmatter 提供结构化元数据。
Stop Hook 通过 stdin 收 JSON:
{
"transcript_path":"/path/to/conversation.jsonl"
}通过 stdout 返回 JSON:
{
"decision":"block",
"reason":"The original prompt to feed back",
"systemMessage":"🔄 Ralph iteration 5"
}这设计很优雅——hook 脚本只处理 JSON,不用管 Claude Code 内部实现。
Ralph Wiggum 技术让我重新想了 AI 编程助手的用法。
我们习惯了交互式编程——写一点,问 AI 一点,再改一点。
但 Ralph 展示了另一种可能:自主式编程——定义好目标,让 AI 自己迭代到完成。
这不是替代程序员,是解放程序员。
把那些明确的、重复的、机械的任务交给 Ralph,我们专注更有创造性的工作——架构设计、产品决策、用户体验。
Geoffrey 说得对:"最高智商的做法可能是最低智商的做法:让 AI 跑循环"。
有时候,最简单的方案就是最强大的。
P.S. 要是想试 Ralph,记得:
--max-iterations(救命稻草)好吧,就这样。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |