故事:小白的“无限循环”噩梦与大师的 /loop 魔法

0 阅读4分钟

小白:“我又要手动运行测试 → 看报错 → 改代码 → 再测试……已经重复 20 遍了!救命!”
大师:“你需要的不是更快的键盘,而是 时间循环魔法 —— /loop。”


1. /loop 是什么?—— 一个会自己“转圈”直到成功的 AI 助手

/loop 是 Claude Code CLI 里的一个超级命令。它的作用很简单:让 Claude 重复执行某个任务序列,直到你喊停或满足某个条件

想象你有一个任劳任怨的小精灵,你对它说:

“你给这段代码写单元测试,运行它,如果失败就修改代码,再运行测试……直到全部通过为止。”

没有 /loop 时,你得一遍遍手动输入 “修复测试”、“再运行”、“再修复”……
有了 /loop,你只需要说:

/loop "修复所有失败的测试,直到全部通过"

Claude 就会进入一个自动循环:写代码 → 运行测试 → 判断结果 → 修复 → 再运行 → 直到绿灯 🟢。


2. 实现原理 —— 小精灵脑子里的“死循环”流程图

/loop 本质上是一个 带终止条件的递归/循环。Claude 不会真的无限转圈,它会:

  1. 记住你给的目标(例如“让所有测试通过”)

  2. 执行一步(生成代码、运行命令、检查结果)

  3. 判断目标是否达成?

    • ✅ 达成 → 结束循环,输出“搞定!”
    • ❌ 没达成 → 根据反馈调整计划,再执行一步(回到第2步)

为了防止小精灵累死,循环还有安全限制

  • 最多循环 N 次(默认 10 次)
  • 每次循环会把上下文(之前的尝试、报错信息)一起发给 LLM,让它越修越聪明。

核心伪代码(TypeScript 风格)

async function runLoop(
  userGoal: string,           // "让所有测试通过"
  initialContext: Context,    // 当前代码、文件树等
  maxIterations = 10
): Promise<FinalResult> {
  let context = initialContext;
  let iteration = 0;
  
  while (iteration < maxIterations) {
    iteration++;
    console.log(`🔄 第 ${iteration} 次尝试...`);
    
    // 1. 让 LLM 根据当前上下文和目标,决定下一步动作
    const action = await llm.decideNextAction({
      goal: userGoal,
      history: context.history,
      lastOutput: context.lastOutput,
    });
    
    // 2. 执行动作(写文件、运行命令、读取日志)
    const toolResult = await executeTool(action);
    
    // 3. 更新上下文
    context = updateContext(context, action, toolResult);
    
    // 4. 检查是否达成目标(可以LLM判断或规则判断)
    const isGoalMet = await checkGoalMet(userGoal, context);
    if (isGoalMet) {
      console.log("🎉 目标达成!退出循环。");
      return { success: true, finalContext: context };
    }
    
    // 5. 如果上次动作失败或没有进展,LLM 会自动调整策略
  }
  
  console.log("⚠️ 达到最大循环次数,请检查问题。");
  return { success: false, finalContext: context };
}

关键点:每一次循环,Claude 都能看到之前所有失败和成功,就像你有一个不会遗忘的记忆。它会学习“上次那样改不行,这次换一种方式”。


3. 最佳用法 —— 四个让小白变大神的神级场景

① 测试驱动开发(TDD)循环

# 写一个加法函数,但还没写测试
/loop "为 add.py 中的 add(a,b) 编写 pytest 单元测试,运行测试,如果失败就修复 add 函数,直到所有测试通过"

Claude 会自己:

  • 创建 test_add.py
  • 运行 pytest test_add.py
  • 发现失败 → 修改 add.py
  • 再运行 → 直到绿色

② 批量修复 Lint 错误

/loop "运行 `npm run lint`,修复所有报错(自动或手动),然后重新 lint,直到没有错误"

③ 代码重构 + 回归测试

/loop "把 `utils.js` 里所有 var 改成 const/let,每次改动后运行 `npm test`,如果测试失败就撤销那一步并换一种方式"

④ 渐进式性能优化

/loop "运行基准测试 `benchmark.py`,如果运行时间 > 2 秒,就优化代码(但不要改变输出结果),重复直到 < 2 秒"

4. 时序图 —— 一次 /loop 魔法的完整演出

loop.png


5. 小白的“避坑指南” —— 别让循环吃掉你的周末

问题解决方案
循环永远停不下来(比如目标模糊)在目标里加明确终止条件“直到 tests/ 下没有 FAILED” 而不是 “尽量让测试通过”
一次循环改太多,搞乱代码用 /loop 搭配 原子操作“每次只修复一个函数,然后运行测试”
浪费 token,循环太多次设置 --max-iterations 5 或通过 /config 修改默认值
想手动介入但循环还在跑按 Ctrl+C 中断,然后输入 /clear 重置状态

6. 总结 —— /loop 就是你的“自动进取机”

  • 本质:带记忆和终止判断的 while 循环,每次迭代 LLM 都能看到历史。
  • 威力:把重复劳动(改错→测试→改错)变成一键自动化。
  • 灵魂:清晰的目标 + 可验证的终止条件 + 合理的最大迭代数

现在,小白对着那个卡了 20 遍的测试文件,深吸一口气,输入:

/loop "修复所有测试失败,每轮只改一处,直到 pytest 全部通过,最多 10 次"

然后去泡了杯咖啡。回来时,终端上闪耀着绿色的 🎉 All tests passed! —— 他第一次体验到,什么叫 让 AI 替你转圈。🌀