Skip to content

核心能力验证

Ralph-Loop 架构与机制分析

核心机制:Stop Hook 拦截循环

Ralph-Loop 的核心实现基于 Stop Hook 机制,这是一个在 Claude Code CLI 中可用的钩子系统。当 AI 模型尝试退出或终止会话时,Stop Hook 会被触发,从而拦截退出行为并重新注入任务提示。

工作机制

  1. 正常执行阶段:AI 模型根据提示词执行任务
  2. 退出尝试拦截:当模型认为自己完成任务并尝试退出时,Stop Hook 捕获退出信号
  3. 条件判断:检查是否满足完成条件(例如是否输出特定的完成标记)
  4. 循环决策
    • 如果未满足完成条件 → 阻止退出,重新注入原始提示词
    • 如果满足完成条件 → 允许退出,结束循环

代码示意(来自官方插件):

bash
# hooks/stop-hook.sh 伪代码
if should_continue_based_on_completion_criteria; then
    exit_code=2  # 阻止退出,触发下一轮循环
else
    exit_code=0  # 允许正常退出
fi

为什么这很重要: 这个机制是 Ralph-Loop 实现自主循环的关键。它将传统的"单次执行"模式转变为"持续迭代"模式,使 AI 能够像人类开发者一样:尝试 → 检查结果 → 修正 → 再尝试。

智能退出检测机制

Ralph-Loop 采用了双重条件检查来确保准确判断任务完成状态,避免过早退出或无限循环。

双重条件架构

条件 1:Heuristic Completion Indicators(启发式完成指示器)

Ralph 通过分析 AI 的输出文本,检测自然语言模式来判断是否接近完成:

  • "完成"相关关键词:complete, done, finished, ready, implemented 等
  • 移动到下一个阶段的信号:"moving to next", "now working on"
  • 测试通过的反馈:"all tests passing", "no errors"

实现方式是统计这些指示器的出现次数(completion_indicators ≥ 2 触发)。

条件 2:Explicit EXIT_SIGNAL(显式退出信号)

要求 AI 在输出的 RALPH_STATUS 块中明确设置 EXIT_SIGNAL: true

markdown
RALPH_STATUS:
{
  "progress": 80,
  "EXIT_SIGNAL": true,
  "notes": "All core features implemented"
}

为什么使用双重条件

单一条件可能导致的问题:

单一条件潜在问题
仅依赖启发式AI 可能使用"complete"但仍有未完成的工作
仅依赖 EXIT_SIGNALAI 可能忘记设置信号或阈值不足

双重条件的好处:

  • 防止过早退出:即使 AI 输出完成相关词汇,如果 EXIT_SIGNAL 为 false,循环继续
  • 防止无限循环:即使 EXIT_SIGNAL 为 true,如果启发式置信度不足(< 2),也会继续
  • 尊重 AI 的判断:当 AI 明确表示"还在进行中"(EXIT_SIGNAL: false),即使有大量完成词汇,也会继续

会话连续性管理

Ralph-Loop 提供了Session Continuity 功能,通过 --continue 标志保持跨循环的上下文连续性。

实现机制

  1. Session ID 持久化:每次启动时生成或读取 session ID,存储在 .ralph_session 文件
  2. 跨循环上下文传递:使用 Claude Code CLI 的 --continue 标志,使模型能够看到之前迭代的输出
  3. 会话过期控制:默认 24 小时后自动重置会话,防止上下文过长影响性能

Session 自动重置触发条件

Ralph 会在以下情况下自动重置会话:

  • 断路器打开:检测到停滞(3 次无进展循环)
  • 手动中断:用户按下 Ctrl+C
  • 项目完成:满足退出条件
  • 会话过期:超过 24 小时未活动

会话历史记录在 .ralph_session_history,保留最近 50 次转换用于调试。

为什么这很重要: 会话连续性是 AI 能够"记住"之前工作决策的基础。没有它,AI 每次循环都会重新评估相同的问题,导致效率低下甚至陷入死循环。

断路器与保护机制

Ralph-Loop 内置了Circuit Breaker 模式,用于检测和防止停滞或无限循环。

多层错误检测

  1. 两阶段错误过滤

    • 第一阶段:基于文本模式检测错误关键词
    • 第二阶段:多行错误匹配,排除 JSON 字段中的 false positive(如 "is_error": false
  2. 停滞检测标准

    • 3 次循环无文件变更(CB_NO_PROGRESS_THRESHOLD=3
    • 5 次循环出现相同错误(CB_SAME_ERROR_THRESHOLD=5
    • 输出长度下降超过 70%(CB_OUTPUT_DECLINE_THRESHOLD=70
  3. 断路器状态机

    • Closed(闭合):正常工作状态
    • Open(打开):触发停滞条件,暂停循环,需要手动重置
    • Half-Open(半开):尝试恢复,监控一次循环决定是否回到 Closed

为什么这很重要**:

断路器是防止资源浪费和 API 成本失控的关键。没有它,AI 可能在某个错误上无限重复,导致:

  • 大量无效 API 调用
  • Token 消耗超出预算
  • 项目无法取得实质性进展

速率限制与配额管理

Ralph-Loop 内置了API 调用速率限制,默认为 100 次/小时,可配置。

实现机制

  1. 调用计数器:记录每小时内的 API 调用次数
  2. 倒计时器:显示距离限制重置的剩余时间
  3. 超时等待:达到限制后自动等待 60 分钟或提示用户选择退出

特殊处理:Claude API 5 小时限制

Ralph 能够检测 Claude 的 5 小时使用限制错误,并提示用户:

  • 选项 1:等待 60 分钟(带倒计时)
  • 选项 2:退出(30 秒后自动退出)

为什么这很重要: 合理的速率限制不仅控制成本,还能避免因超出 API 限制导致的任务失败。对于成本敏感的研究报告生成任务,这尤为重要。

OpenCode + GLM4.7 能力验证

CLI 接口兼容性分析

OpenCode CLI vs Claude Code CLI

特性Claude Code CLIOpenCode CLI兼容性
命令行参数格式-p "prompt"标准参数兼容
JSON 输出格式--output-format json可能不支持需验证
--continue 标志支持需验证关键风险点
Stop Hook 机制原生支持可能不支持关键风险点
会话管理内置机制不同需适配

关键发现

  1. Stop Hook 机制

    • Claude Code CLI 原生支持 Stop Hook(通过 hooks/stop-hook.sh
    • OpenCode 可能没有公开的 Stop Hook 接口
    • 结论:这是最大的兼容性风险,需要验证或寻找替代方案
  2. --continue 标志

    • Claude Code CLI 使用 --continue 保持会话连续性
    • OpenCode 可能使用不同的机制(例如环境变量或配置文件)
    • 结论:需要查阅 OpenCode 文档确认等效功能
  3. JSON 输出格式

    • Ralph-Loop v0.9.8 依赖 JSON 输出进行结构化解析
    • 如果 OpenCode 不支持 JSON 输出,需要回退到文本解析
    • 结论:可行但可能降低可靠性

GLM4.7 模型能力验证

模型输出行为分析

Ralph-Loop 依赖模型满足以下行为要求:

  1. 遵循结构化输出指令

    • 能够按照要求输出 RALPH_STATUS
    • 能够设置 EXIT_SIGNAL 字段
    • GLM4.7 支持:需验证,但通常现代 LLM 都能做到
  2. 理解上下文连续性

    • 在多轮循环中能够理解之前的工作进展
    • 避免重复已完成的任务
    • GLM4.7 支持:理论上支持,但实际效果需测试
  3. 准确评估完成状态

    • 能够判断任务是否真正完成
    • 不会过早声称完成(避免 optimistic estimation)
    • GLM4.7 支持:这是模型推理能力的体现,GLM4.7 作为通用大模型应该具备

与 Claude Opus 4.5 的对比

能力Claude Opus 4.5GLM4.7影响分析
代码理解与生成顶尖中上等代码质量可能略低
上下文长度200K tokens128K tokens复杂任务可能受影响
中文理解优秀优秀适合中文报告生成
指令遵循优秀优秀能够遵循 Ralph 要求
自我纠错能力优秀良好可能需要更多迭代

结论:GLM4.7 在中文场景下表现良好,但可能在复杂任务的自我纠错和代码质量方面略逊于 Claude Opus 4.5。这可以通过增加循环次数来弥补。

替代方案:外部 Bash 循环

由于 OpenCode 可能不支持原生 Stop Hook,可以考虑使用 外部 Bash 循环来实现类似 Ralph 的效果。

方案概述

bash
while true; do
    # 1. 运行 OpenCode 任务
    opencode -p "$(cat PROMPT.md)" --output-file output.txt

    # 2. 检查输出中是否有完成标记
    if grep -q "<<promise>>COMPLETE<</promise>>" output.txt; then
        echo "任务完成!"
        break
    fi

    # 3. 检查是否超出最大循环次数
    if [ $loop_count -ge $max_iterations ]; then
        echo "达到最大循环次数,退出"
        break
    fi

    # 4. 短暂等待后继续
    sleep 5
    ((loop_count++))
done

优缺点分析

优点

  • 不依赖 OpenCode 的特殊功能
  • 完全控制循环逻辑
  • 易于调试和定制

缺点

  • 失去 Ralph 的智能特性(断路器、速率限制等)
  • 需要自行实现状态管理
  • 需要自行编写退出检测逻辑

结论: 如果 OpenCode 不支持 Stop Hook,这是可行的替代方案,但需要额外开发工作来实现 Ralph 的核心保护机制。

验证方法建议

Blackbox 测试计划

由于无法直接验证 OpenCode 的内部机制,建议进行以下 Blackbox 测试:

测试 1:Stop Hook 兼容性

bash
# 创建测试钩子文件
mkdir -p hooks
cat > hooks/stop-hook.sh << 'EOF'
#!/bin/bash
echo "Stop hook triggered!"
exit 2  # 阻止退出
EOF

# 尝试运行 OpenCode 看是否调用钩子
opencode -p "测试任务"

# 观察输出中是否包含 "Stop hook triggered!"

预期结果

  • 如果调用钩子 → Stop Hook 支持,可以原生集成 Ralph
  • 如果未调用 → 需要使用外部循环方案

测试 2:会话连续性

bash
# 第一次调用
echo "任务:创建一个文件 test.txt,内容为 'hello'" > prompt1.txt
opencode -p "$(cat prompt1.txt)" --save-session session1

# 第二次调用,依赖第一次的结果
echo "任务:修改 test.txt,追加 ' world'" > prompt2.txt
opencode -p "$(cat prompt2.txt)" --load-session session1

# 检查 test.txt 是否包含 "hello world"
cat test.txt

预期结果

  • 如果包含 "hello world" → 会话连续性工作正常
  • 如果只有 " world" → 需要实现自定义状态管理

测试 3:JSON 输出格式

bash
opencode -p "简单任务" --output-format json 2>&1 | jq '.'

预期结果

  • 如果返回有效的 JSON → 可以使用 Ralph 的 JSON 解析功能
  • 如果返回错误或文本格式 → 需要回退到文本解析

灰盒测试:代码审查

审查 OpenCode 源代码(如果开源)或文档,查找以下信息:

  1. 钩子系统:是否有类似 Claude Code 的 hooks 目录
  2. 会话管理:是否有 --continue 或等效标志
  3. 输出格式:支持的输出格式选项

结论

能力验证总结

Ralph 核心特性Claude Code 原生支持OpenCode 支持度可行性
Stop Hook 循环❓(需验证)待确认
会话连续性❓(需验证)待确认
JSON 输出❓(需验证)待确认
断路器模式✓ 自研需自研需开发
速率限制✓ 自研需自研需开发
智能退出检测✓ 自研可移植可复用

关键风险点

  1. 高风险:OpenCode 可能不支持 Stop Hook 机制

    • 缓解措施:使用外部 Bash 循环替代
  2. 中风险:会话连续性机制可能不同

    • 缓解措施:实现自定义状态持久化
  3. 低风险:JSON 输出格式可能不支持

    • 缓解措施:回退到文本解析

建议

立即行动

  1. 执行上述 Blackbox 测试验证 OpenCode 的功能支持
  2. 如果 OpenCode 不支持 Stop Hook,评估外部循环方案的开发成本
  3. 测试 GLM4.7 是否能够遵循 Ralph 的结构化输出要求

后续步骤: 根据测试结果选择最合适的集成方案(原生集成 vs 外部循环),进入解决方案设计阶段。

参考资料