|
👀在网上看到一个案例,震撼到我了。 有人用 Claude Code 跑了一个while true循环,整整三个月,最后造出了一门编程语言。 对,你没看错,一门完整的编程语言,还是用 Gen Z 黑话写的那种(关键字包括slay、sus、based)。 我第一反应:这人是不是疯了? 仔细一想,这不就是软件工程吗——不断迭代,不断失败,不断改进,直到成功。只不过这次执行循环的不是人,是 AI。 这就是Ralph Wiggum 技术。 《贾杰的AI编程秘籍》付费合集,共10篇,现已完结。30元交个朋友,学不到真东西找我退钱;)
以及我的墨问合集《100个思维碎片》,1块钱100篇,与你探讨一些有意思的话题(文末有订阅方式
Ralph 是啥?先说名字。 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 看到自己刚才写的代码和 Git 记录
关键在第 6 步——Claude 通过读自己之前写的代码,形成了一种"自我指涉"(self-referential)的反馈。 这不是 AI 跟自己对话(那会疯),而是 AI 在不断审视自己的产出,就像程序员不停 review 自己的代码。 Stop Hook:让 Claude 停不下来要实现 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?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 会自己: - 7. 直到所有测试过了,输出
<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 怎么写好的 Prompt?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 应该:
实战技巧:TDD 风格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 的哲学Ralph 技术背后有几个深刻的道理。 迭代 > 完美不要想着第一次就做对。让循环去打磨。 Geoffrey 自己说,他从没写过编译器,但通过 Ralph,用 3 个月跑出了完整的编程语言,包括: 这传统开发里可能要个小团队干一年。 失败是数据"确定性的糟糕"(deterministically bad)意味着失败是可预测、可分析的。 每次失败告诉你: 这些比成功更有价值。 操作员技能至关重要Ralph 不是"设了就忘"的工具。它是个放大器——放大你写 prompt 的能力。 LLMs are mirrors of operator skill.
经验丰富的开发者,通过精心设计的 prompt,能让 Ralph 干出惊人的活儿。新手可能陷入无尽循环。 真实战绩YC 黑客松Y Combinator 的一次黑客松测试中,Ralph 一夜生成了 6 个完整代码仓库,API 成本 297 美元。 5 万美元的合同Geoffrey 分享的案例:价值 5 万美元的外包合同,用 Ralph 完成,API 成本 297 美元。 当然,这不是说 Ralph 能替代所有开发工作。但对于明确定义的、机械性任务,它确实提效明显。 Cursed 编程语言Geoffrey 用 Ralph 跑了三个月,造了 Cursed 编程语言——用 Gen Z 俚语做关键字的函数式语言。 成功的定义?让 Cursed 上 Stack Overflow 开发者调查,成为"最受喜爱"或"最被憎恨"的语言之一。 适合啥场景?✅ 适合的- •大规模重构:框架迁移、依赖升级、API 版本升级
共同点:有明确成功指标,执行过程机械化。 ❌ 不适合的插件技术细节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 提供结构化元数据。 Hook 的输入输出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,记得: - 1.永远设
--max-iterations(救命稻草)
好吧,就这样。
|