<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Amp on KnightLi的博客</title>
        <link>https://www.knightli.com/tags/amp/</link>
        <description>Recent content in Amp on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Mon, 27 Apr 2026 08:08:55 +0800</lastBuildDate><atom:link href="https://www.knightli.com/tags/amp/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Ralph 是什么：把 Claude Code 和 Amp 变成可循环执行的自主开发流程</title>
        <link>https://www.knightli.com/2026/04/27/ralph-autonomous-agent-loop-claude-code-amp/</link>
        <pubDate>Mon, 27 Apr 2026 08:08:55 +0800</pubDate>
        
        <guid>https://www.knightli.com/2026/04/27/ralph-autonomous-agent-loop-claude-code-amp/</guid>
        <description>&lt;p&gt;如果你最近在关注 coding agent 的长流程执行，&lt;code&gt;snarktank/ralph&lt;/code&gt; 是个很值得看一眼的小项目。它不是再做一个新的模型壳子，也不是再包一层聊天界面，而是把 &lt;code&gt;Claude Code&lt;/code&gt; 或 &lt;code&gt;Amp&lt;/code&gt; 组织成一个可以反复运行的 autonomous loop，让 AI 按 &lt;code&gt;PRD&lt;/code&gt; 里的 story 一项一项往前做，直到全部完成。&lt;/p&gt;
&lt;p&gt;它的核心思路其实很直接：&lt;strong&gt;不要让同一个 agent 在一个越来越长、越来越脏的上下文里硬撑，而是每轮都重新启动一个全新的 AI coding session。&lt;/strong&gt; 这样做的好处是，上下文不会一路膨胀，任务边界也更清楚。&lt;/p&gt;
&lt;h2 id=&#34;01-ralph-是什么&#34;&gt;01 Ralph 是什么
&lt;/h2&gt;&lt;p&gt;Ralph 的官方定位很明确：它是一个 autonomous AI agent loop，会反复调用 AI coding tool，直到 &lt;code&gt;PRD&lt;/code&gt; 里的项目都做完。&lt;/p&gt;
&lt;p&gt;当前仓库支持两种工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Amp CLI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Claude Code&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一轮迭代都会启动一个 fresh instance。也就是说，不依赖“同一个会话一直聊下去”，而是依赖这些外部状态来保存记忆：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;git 历史&lt;/li&gt;
&lt;li&gt;&lt;code&gt;progress.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prd.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这点非常关键。很多人让 agent 跑长任务时，最大的痛点不是模型不会写，而是会话越跑越重，最后开始漏上下文、忘要求、反复返工。Ralph 的设计，基本就是冲着这个问题去的。&lt;/p&gt;
&lt;h2 id=&#34;02-它怎么工作&#34;&gt;02 它怎么工作
&lt;/h2&gt;&lt;p&gt;Ralph 的工作流分成三步：&lt;/p&gt;
&lt;h3 id=&#34;1-先写-prd&#34;&gt;1. 先写 PRD
&lt;/h3&gt;&lt;p&gt;README 里建议先用配套的 &lt;code&gt;prd&lt;/code&gt; skill 生成需求文档，把功能拆成比较细的 story。&lt;/p&gt;
&lt;h3 id=&#34;2-再把-prd-转成-prdjson&#34;&gt;2. 再把 PRD 转成 &lt;code&gt;prd.json&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;然后用 &lt;code&gt;ralph&lt;/code&gt; skill，把 Markdown 版 PRD 转成结构化的 &lt;code&gt;prd.json&lt;/code&gt;。这个文件里会保存 user stories，以及每一项是不是已经通过。&lt;/p&gt;
&lt;h3 id=&#34;3-运行循环脚本&#34;&gt;3. 运行循环脚本
&lt;/h3&gt;&lt;p&gt;真正执行的是 &lt;code&gt;ralph.sh&lt;/code&gt;。命令大致是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./scripts/ralph/ralph.sh &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;max_iterations&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./scripts/ralph/ralph.sh --tool claude &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;max_iterations&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;默认是 10 轮。每一轮大致会做这些事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从 &lt;code&gt;branchName&lt;/code&gt; 创建分支&lt;/li&gt;
&lt;li&gt;选择优先级最高、&lt;code&gt;passes: false&lt;/code&gt; 的 story&lt;/li&gt;
&lt;li&gt;只实现这一项&lt;/li&gt;
&lt;li&gt;跑质量检查，比如 typecheck 和 tests&lt;/li&gt;
&lt;li&gt;检查通过后提交代码&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;prd.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把经验追加到 &lt;code&gt;progress.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;继续下一轮&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也就是说，Ralph 并不追求“一口气把整件事做完”，而是把任务压缩成很多个能在单个上下文窗口里完成的小闭环。&lt;/p&gt;
&lt;h2 id=&#34;03-ralph-最有意思的地方&#34;&gt;03 Ralph 最有意思的地方
&lt;/h2&gt;&lt;h3 id=&#34;1-每轮都是-fresh-context&#34;&gt;1. 每轮都是 fresh context
&lt;/h3&gt;&lt;p&gt;这是 Ralph 最核心的设计点。README 里强调，每次迭代都是一个新的 AI 实例，跨轮记忆只靠 git、&lt;code&gt;progress.txt&lt;/code&gt; 和 &lt;code&gt;prd.json&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这和很多人平时直接在一个长对话里让 Claude Code 或其他工具连续工作很不一样。后者在任务变大后，很容易被历史消息拖慢，还会逐渐失去焦点。Ralph 则是主动接受“单轮记不住全部”，然后把记忆放到外部文件里。&lt;/p&gt;
&lt;h3 id=&#34;2-强制把任务拆小&#34;&gt;2. 强制把任务拆小
&lt;/h3&gt;&lt;p&gt;仓库文档特别强调，单个 PRD item 必须小到能在一个 context window 里完成。像“加一个筛选器”“改一个 server action”“补一列数据库字段”这种粒度比较合适；而“重构整个 API”“做完整 dashboard”这种就太大了。&lt;/p&gt;
&lt;p&gt;这个约束其实很现实。很多 autonomous agent 跑崩，不是 loop 本身有问题，而是任务切分太粗，让模型一轮里就背了过量目标。&lt;/p&gt;
&lt;h3 id=&#34;3-不是只有代码连经验也要沉淀&#34;&gt;3. 不是只有代码，连经验也要沉淀
&lt;/h3&gt;&lt;p&gt;除了 &lt;code&gt;progress.txt&lt;/code&gt;，README 还特别强调要更新 &lt;code&gt;AGENTS.md&lt;/code&gt;。原因也很实际：未来迭代和未来开发者都会读这些说明，所以每轮发现的模式、坑点、约定，最好都落到项目文档里。&lt;/p&gt;
&lt;p&gt;换句话说，Ralph 不只是让 agent 连续写代码，也想让它连续积累对代码库的工作记忆。&lt;/p&gt;
&lt;h2 id=&#34;04-它适合什么场景&#34;&gt;04 它适合什么场景
&lt;/h2&gt;&lt;p&gt;如果你的任务具备这些特征，Ralph 会比较对路：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;已经能拆成一组明确的 user stories&lt;/li&gt;
&lt;li&gt;代码库里有比较可靠的反馈回路，比如测试、typecheck、CI&lt;/li&gt;
&lt;li&gt;你希望 agent 持续推进，但不想把所有事压在单个长对话里&lt;/li&gt;
&lt;li&gt;你接受它按迭代方式一点点完成，而不是一次性全做完&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;反过来说，如果你的需求还很模糊，或者任务本身高度依赖来回讨论、频繁改方向，那 Ralph 可能还不是第一选择。它更适合“需求已经整理好，现在需要稳定推进执行”的阶段。&lt;/p&gt;
&lt;h2 id=&#34;05-它和普通-claude-code-用法有什么不同&#34;&gt;05 它和普通 Claude Code 用法有什么不同
&lt;/h2&gt;&lt;p&gt;如果平时直接用 &lt;code&gt;Claude Code&lt;/code&gt;，常见模式是你开一个会话，让它持续读代码、改代码、跑命令。这个方式在中小任务上很好用，但在大任务上容易碰到两个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上下文越来越长&lt;/li&gt;
&lt;li&gt;中间决策不容易结构化沉淀&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ralph 的做法更像把 &lt;code&gt;Claude Code&lt;/code&gt; 或 &lt;code&gt;Amp&lt;/code&gt; 变成一个“批处理执行器”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;任务来源不是临时聊天，而是 &lt;code&gt;prd.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;每轮只认一个 story&lt;/li&gt;
&lt;li&gt;完成状态写回文件&lt;/li&gt;
&lt;li&gt;经验写进 &lt;code&gt;progress.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;代码提交进 git&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以它更像是“给 coding agent 加了一层迭代控制器”，而不是换了一个新的 AI assistant。&lt;/p&gt;
&lt;h2 id=&#34;06-一个值得注意的前提&#34;&gt;06 一个值得注意的前提
&lt;/h2&gt;&lt;p&gt;Ralph 能不能跑顺，关键不在 loop 本身，而在反馈回路够不够好。README 里写得很直白：如果没有 typecheck、tests、CI 这些机制，错误会在后续迭代里不断累积。&lt;/p&gt;
&lt;p&gt;对于前端任务，仓库甚至明确建议把“用浏览器验证”写进 acceptance criteria。因为如果没有实际验证，agent 很容易把“看起来写完了”和“真的可用”混在一起。&lt;/p&gt;
&lt;p&gt;这点很重要。Ralph 不是 magical automation，它更像把你现有的工程纪律放大。如果你的项目本来就有清晰任务拆分和可靠检查，它会更有价值；如果这些基础还没有，loop 只会把混乱重复很多次。&lt;/p&gt;
&lt;h2 id=&#34;07-一句话总结&#34;&gt;07 一句话总结
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Ralph&lt;/code&gt; 最值得看的地方，不是它写了多少新基础设施，而是它把一个朴素但很有用的思路落成了现成流程：&lt;strong&gt;让 &lt;code&gt;Claude Code&lt;/code&gt; 或 &lt;code&gt;Amp&lt;/code&gt; 每轮只做一个足够小的 story，用 fresh context 保持专注，再靠 &lt;code&gt;git&lt;/code&gt;、&lt;code&gt;prd.json&lt;/code&gt; 和 &lt;code&gt;progress.txt&lt;/code&gt; 维持跨轮连续性。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你已经开始把 coding agent 用到真实项目里，并且正在被“长任务怎么稳定推进”这个问题困住，Ralph 这套方法很值得参考。&lt;/p&gt;
&lt;h2 id=&#34;参考链接&#34;&gt;参考链接
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GitHub 仓库：&lt;a class=&#34;link&#34; href=&#34;https://github.com/snarktank/ralph&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/snarktank/ralph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;交互式流程图：&lt;a class=&#34;link&#34; href=&#34;https://snarktank.github.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://snarktank.github.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
