gists

Ralph ループとその派生に関して

Ralph パターンの本質、業界での採用状況、そしてループ内の LLM コール数のバリエーション (single / multi / hybrid) について整理した議論ログ。


Q1. ralph の考え方って重要らしいですね。superpowers や Anthropic 公式も取り入れているらしい

はい、現在の AI コーディング界隈で確実にホットな潮流。

Ralph パターンの本質

Geoffrey Huntley 氏が提唱した「A loop + the right prompt」というシンプルな発想:

while not done:
    LLM(prompt + 外部状態ファイル)

たったこれだけで、長時間自律動作する agent が成立する。コアアイデアは:

  1. コンテキストを LLM のメモリに頼らない → ファイルに外出し
  2. 毎ループ コールドスタート → コンテキスト汚染ゼロ
  3. 状態は人間が読めるテキスト → デバッグ・介入が容易
  4. ループ自体は dumb → 賢さは prompt とファイル設計に集約

各所への波及

Anthropic 公式

Superpowers (obra/superpowers)

その他の採用例

全部「LLM の文脈窓は信頼するな、ファイルに書け、ループを回せ」という同じ原理に収束している。

なぜ重要か

  1. 文脈窓問題への現実解 — 200K あっても長時間タスクでは溢れる/汚れる。Ralph 方式なら理論上無限のタスク長を扱える。
  2. 観測可能性 (observability)progress.txt / prd.json を見れば agent の頭の中が全部わかる。
  3. 人間の介入点が明確 — ファイルを編集すれば軌道修正できる。
  4. モデル非依存 — Claude / GPT / Gemini どれでも乗る。
  5. 安価 — 会話履歴を引きずらないので 1 回あたりが安定して小さい。

現在の到達点

「巨大な context window を持つ賢い single-shot LLM」より「小さく賢い LLM + 良い外部記憶 + ループ」のほうが強い

という認識が業界コンセンサスになりつつある。Anthropic が Skill / Memory / Agent SDK を矢継ぎ早に出しているのも、この流れに自社プラットフォームを最適化しているから。

Ralph は そのプロトタイプとして 100 行のシェルスクリプトで本質を示した 点で、教材的価値がとても高い。


Q2. while の中は LLM コール一つだけ?それとも n 個置いてもいいの?

どちらもアリ。設計上の重要な分岐点

パターン1: 1 ループ = 1 LLM コール (Ralph 方式)

while not done():
    llm(prompt="prd.json を読んで 1 story 実装してコミットしろ")
    # ↑ この 1 行の中で LLM が内部で
    #   read_file, edit_file, run_test, git_commit ... を自律的に何十回も呼ぶ
    #   外から見ると LLM コールは 1 回

特徴: while の中身は実質 1 行。賢さは全部 prompt と LLM 任せ。

向いてる場面:

パターン2: 1 ループ = N 個の LLM コール (パイプライン方式)

while not done():
    plan   = llm(prompt="次にやるべき story を計画しろ", model="opus")
    code   = llm(prompt=f"この計画を実装しろ: {plan}", model="haiku")
    review = llm(prompt=f"このコードをレビューしろ: {code}", model="sonnet")

    if review.ok:
        write_file(code)
        git_commit()
    else:
        continue  # 次ループでやり直し

特徴: while の中で LLM を 明示的に複数回 呼ぶ。各コールで役割・モデル・プロンプトを変える。

向いてる場面:

並べて比較

# パターン1
while not done():
    llm("全部やれ")                    # 1 コール

# パターン2
while not done():
    a = llm("計画")                    # コール ①
    b = llm(f"実装({a})")              # コール ②
    c = llm(f"レビュー({b})")          # コール ③
    if c.ok: commit(b)

ハイブリッド (Superpowers 等)

while not done():
    plan = llm("計画立てろ")                          # 軽い 1 コール
    llm(f"この計画を実装しろ。完了したら報告: {plan}")  # 重い 1 コール (内部で agentic)
    llm(f"差分をレビューしろ")                        # 軽い 1 コール

外側はパイプライン的に 3 コール、真ん中の “実装” コールは内部で大量のツール呼び出しを伴う agentic ループ。外側パイプライン × 内側 agentic の二層構造。

設計上の判断軸

観点 パターン1 (single-call) パターン2 (multi-call)
複雑度
デバッグ性 LLM 内部はブラックボックス 各ステージの中間成果物が見える
コスト 1 コール内のトークン全部 1 モデル ステージごとに最適モデル選択可
失敗時の局所化 全部やり直し 失敗ステージだけ retry
実装労力 数十行 数百〜数千行
賢さの源 プロンプト パイプライン設計 + プロンプト

実用的な指針

始めはパターン1

パターン2 化が効くサイン

やりすぎ注意

multi-agent / multi-stage は 接合部のバグが指数的に増える

A single capable model in a tight loop beats a clever multi-agent system until it provably doesn’t”

これも業界の合言葉になっている (Anthropic の “Building effective agents” 記事の主張に近い)。

まとめ