1. 从“会写代码”到“会设计循环”:Loop Engineering 到底在解决什么问题
第一次听到 Loop Engineering 这个词,很多人会以为是某种新的编程语言或者框架。其实不是。它更像是一种工程方法论,核心就一句话:把 AI 编码工具从“一次性问答”变成“可循环、可验证、可收敛的自动化流程”。你平时用 Claude Code、Codex、Cursor 这些工具,大概率是打开对话框,输入需求,等它吐代码,然后自己复制粘贴、跑测试、改 bug。这个过程重复几十次之后,人会非常疲惫,而且每次都要重新交代上下文。Loop Engineering 要做的,就是把这个“人肉循环”变成“工程循环”。
我最初接触这个概念是在一个内部技术分享里,当时有人用 Claude Code 配合一套自定义的 harness 脚本,让 AI 自动完成“读需求 → 写代码 → 跑测试 → 根据报错修复 → 再跑测试”的闭环。整个过程中,人只需要在关键节点做决策,而不是每一轮都手动介入。实测下来,一个中等复杂度的 CRUD 模块,原本需要我手动来回折腾一个多小时,用循环工程的方式压缩到了十五分钟左右。当然,前期搭建循环的成本不低,但一旦跑通,后续复用非常省心。
这个教程适合谁看?如果你已经在用 Claude Code、Codex 或 Cursor,但还停留在“手动复制粘贴”的阶段,那这篇内容就是为你准备的。如果你完全没用过这些工具,也没关系,我会从最基础的安装配置讲起,再逐步过渡到循环设计。整篇内容会围绕三个核心问题展开:第一,怎么让 AI 编码工具稳定地跑起来;第二,怎么设计一个能自动收敛的循环;第三,怎么在循环里加入验证和纠错机制。这三个问题解决了,Loop Engineering 才算真正落地。
提示:Loop Engineering 不是某个具体工具的功能,而是一种使用 AI 编码工具的思路。工具会变,但循环设计的逻辑是通用的。
2. 环境准备:Claude Code、Codex、Cursor 的安装与基础配置
2.1 Claude Code 的安装与首次运行
Claude Code 是 Anthropic 推出的命令行编码助手,它的优势在于对项目上下文的感知比较强,适合在终端里直接操作。安装方式根据操作系统略有不同。macOS 和 Linux 用户可以直接用 npm 全局安装:
npm install -g @anthropic-ai/claude-codeWindows 用户如果用的是 WSL,步骤和 Linux 一样。如果是在原生 Windows 环境下,建议先装 Node.js 18 以上版本,再执行上面的命令。安装完成后,在项目根目录下运行:
claude第一次运行会提示你登录。这里有个坑:Claude Code 需要账号有对应的 API 额度或者订阅权限,否则登录后也无法正常调用模型。登录成功后,你可以用/help查看所有可用命令。常用的有/init用来生成项目说明文件,/review用来审查代码,/compact用来压缩上下文。
我实测下来,Claude Code 在读取大型项目时,首次索引会花一些时间。建议在项目根目录放一个CLAUDE.md文件,里面写清楚项目结构、技术栈、代码规范。这样 Claude Code 每次启动时都会先读这个文件,减少重复解释的成本。这个文件不需要很长,但关键信息一定要有,比如“这是一个 Next.js 项目,使用 TypeScript,测试框架是 Vitest,所有 API 路由放在app/api目录下”。
2.2 Codex 的安装与配置文件解析
Codex 是 OpenAI 推出的编码工具,早期以 CLI 形式为主,现在也有 IDE 插件。安装 Codex CLI 同样依赖 Node.js:
npm install -g @openai/codex安装完成后,运行codex会引导你进行登录。Codex 的配置文件通常放在用户目录下的.codex文件夹里,核心文件是config.json。这个文件里可以配置默认模型、温度参数、最大 token 数等。我一般会把温度设成 0.2 左右,因为编码任务需要确定性,太高的温度会让 AI 写出风格飘忽的代码。
Codex 有一个比较实用的功能是“沙盒模式”,可以在隔离环境里执行代码,避免直接改动你的工作目录。开启方式是在配置文件里加上:
{ "sandbox": true, "autoApprove": false }autoApprove设为 false 意味着每次执行命令前都会问你,虽然麻烦一点,但安全。如果你已经对循环流程很熟悉,可以改成 true,让 AI 自动执行测试命令。不过我的建议是,在循环还没有稳定之前,不要开自动批准,否则一个错误的删除命令就可能让你损失半天的工作。
2.3 Cursor 的中文设置与免费额度说明
Cursor 是基于 VS Code 的编辑器,集成了 AI 编码能力。它的安装很简单,官网下载对应系统的安装包即可。安装后第一件事是设置中文界面:打开设置,搜索“language”,把显示语言改成“中文(简体)”。如果你想让 AI 用中文回复,需要在设置里找到“Rules for AI”或者“Custom Instructions”,加上一句“请始终用中文回复”。这样每次对话时,AI 都会优先使用中文。
关于免费额度,Cursor 的免费版每月提供一定数量的快速请求和慢速请求。快速请求用完后会降级到慢速队列,响应时间变长,但功能不受影响。如果你只是偶尔用用,免费额度基本够。但如果你要跑 Loop Engineering 这种高频循环,建议还是上 Pro 版,否则慢速队列的延迟会严重拖累循环效率。
Cursor 和 Claude Code 的关系,很多人搞不清楚。简单说,Cursor 是一个编辑器,它内置了多种 AI 模型,包括 Claude 和 GPT 系列。Claude Code 是 Anthropic 官方的命令行工具,专注于终端内的编码任务。两者可以配合使用:在 Cursor 里写代码,在终端里用 Claude Code 跑循环。我自己的习惯是,Cursor 负责日常编辑和快速补全,Claude Code 负责复杂的重构和自动化循环。
注意:安装任何 AI 编码工具之前,先确认你的 Node.js 版本。版本过低会导致安装失败或者运行时报错。用
node -v检查,建议 18 以上。
3. 循环工程的核心设计:从单次调用到自动收敛
3.1 为什么需要循环:单次调用的三个致命缺陷
单次调用 AI 编码工具,看起来简单直接,但在实际项目里问题很多。第一个缺陷是上下文丢失。你让 AI 改一个函数,它改完了,但不知道这个函数被哪些地方调用,改完之后可能引发连锁报错。第二个缺陷是无法验证。AI 说“改好了”,但它不会主动跑测试,你也不知道到底改对没有。第三个缺陷是错误累积。第一轮改错了一个变量名,第二轮基于错误的代码继续改,越改越乱。
Loop Engineering 的思路就是针对这三个缺陷设计的。通过循环,每一轮都把最新的代码状态、测试结果、报错信息重新喂给 AI,让它基于真实反馈来调整。这样上下文不会丢失,错误也能被及时发现和纠正。我踩过最惨的一次坑是,让 AI 连续改了五个文件,结果它把其中一个文件的导出方式改了,导致整个项目编译失败。如果当时有循环验证,第一轮就能发现这个问题。
3.2 循环的基本结构:感知、决策、执行、验证
一个完整的工程循环包含四个环节:感知(Perceive)、决策(Decide)、执行(Act)、验证(Verify)。感知是收集当前状态,比如代码文件内容、测试输出、lint 报错。决策是让 AI 根据感知结果决定下一步做什么。执行是 AI 实际修改代码或运行命令。验证是检查执行结果是否达到预期。
这四个环节里,验证是最容易被忽略的。很多人跑循环只跑到执行就停了,结果 AI 说“已完成”,但实际上测试根本没通过。我的做法是,在循环里强制加入验证步骤:每次 AI 修改代码后,自动运行测试命令,把输出结果作为下一轮感知的输入。如果测试通过,循环结束;如果不通过,把报错信息喂回去,继续下一轮。
用伪代码表示就是:
while not test_passed and iteration < max_iterations: state = perceive() action = decide(state) execute(action) test_passed = verify() iteration += 1这个结构看起来简单,但实际落地时有很多细节要处理。比如max_iterations设多少合适?我一般设 5 到 8 轮。超过这个轮数还没收敛,说明问题可能不是 AI 能解决的,需要人工介入。再比如verify()函数怎么定义?对于不同的项目,验证方式不一样。前端项目可能是跑 Playwright 测试,后端项目可能是跑 pytest 或 jest。
3.3 Harness Engineering:给循环套上缰绳
Harness Engineering 这个词最近经常和 Loop Engineering 一起出现。Harness 原意是“马具”,在工程语境里指的是约束和控制 AI 行为的框架。你可以把它理解成循环的“护栏”:规定 AI 能做什么、不能做什么、做到什么程度必须停下来。
一个典型的 harness 包含三部分:权限控制、边界检查、回滚机制。权限控制决定 AI 能访问哪些文件、能执行哪些命令。边界检查是在 AI 执行前判断操作是否合理,比如不允许删除核心配置文件。回滚机制是在循环失败时恢复到之前的状态,避免代码被改得面目全非。
我自己的 harness 配置里,有一条硬性规则:AI 不能直接修改package.json和tsconfig.json。这两个文件一旦被改错,整个项目可能跑不起来。如果确实需要改,必须由我手动确认。另外,每次循环开始前,我会用 git 创建一个临时分支,循环结束后如果结果不理想,直接切回主分支,干干净净。
提示:Harness 的严格程度和你的项目风险成正比。个人小项目可以宽松一点,公司核心项目一定要严格。
4. 项目实战:用 Claude Code 搭建一个自动修复循环
4.1 实战场景:一个总是跑不过的测试用例
我拿一个真实的小项目来演示。这是一个 TypeScript 写的工具库,里面有一个formatDate函数,负责把时间戳格式化成YYYY-MM-DD的形式。测试用例覆盖了正常日期、闰年、时区边界等情况。最近我改了一版代码,结果有三个测试用例挂了。手动修的话大概要十几分钟,我决定用 Loop Engineering 的方式让 Claude Code 自动修复。
项目结构很简单:
src/ formatDate.ts tests/ formatDate.test.ts package.json tsconfig.json测试命令是npm test,用的是 Vitest。我先在终端里运行了一次,确认有三个失败用例,报错信息都指向formatDate.ts的第 12 行到第 18 行。
4.2 循环脚本的编写与参数设置
我写了一个简单的 bash 脚本来驱动循环。核心逻辑是:调用 Claude Code 修复代码,然后跑测试,如果测试通过就退出,否则把报错信息追加到提示词里继续下一轮。
#!/bin/bash MAX_ITER=6 ITER=0 while [ $ITER -lt $MAX_ITER ]; do echo "第 $ITER 轮循环" if npm test > /tmp/test_output.txt 2>&1; then echo "测试通过,循环结束" break fi ERROR_MSG=$(cat /tmp/test_output.txt) claude --prompt "以下是测试报错信息,请修复 src/formatDate.ts 中的问题。只修改这个文件,不要动其他文件。报错信息:$ERROR_MSG" ITER=$((ITER + 1)) done这个脚本里有几个关键参数。MAX_ITER设为 6,是因为我观察下来,大部分简单 bug 在三轮内能修好,复杂一点的最多五轮。超过六轮还没好,说明问题可能出在测试用例本身或者需求理解上,继续跑下去意义不大。--prompt里的约束也很重要:明确告诉 AI 只修改一个文件,避免它到处乱改。
实际跑的时候,第一轮 Claude Code 改了formatDate.ts里的月份计算逻辑,把getMonth()的返回值加了 1。跑测试,还是有两个用例失败。第二轮它改了时区处理,把toISOString()换成了手动拼接。跑测试,只剩一个用例失败。第三轮它发现是闰年判断的问题,加了一个isLeapYear的辅助函数。跑测试,全部通过。整个过程花了不到四分钟。
4.3 验证环节的设计:不只是跑测试
跑测试是最基本的验证,但还不够。我在循环里还加了两个检查:类型检查和 lint 检查。类型检查用tsc --noEmit,lint 用eslint。这两个检查能发现测试覆盖不到的问题,比如类型不匹配、未使用的变量、潜在的逻辑错误。
修改后的验证逻辑是这样的:
verify() { npm test > /tmp/test_output.txt 2>&1 || return 1 npx tsc --noEmit > /tmp/tsc_output.txt 2>&1 || return 1 npx eslint src/ > /tmp/eslint_output.txt 2>&1 || return 1 return 0 }这样一轮循环里,AI 不仅要让测试通过,还要保证类型和 lint 都没问题。实测下来,加了这两个检查之后,AI 修复的代码质量明显更高,不会出现“测试过了但类型报错”的情况。
注意:类型检查和 lint 检查的输出信息可能很长,喂给 AI 之前最好截取关键部分,否则会占用大量上下文窗口。
5. 常见问题与排查技巧实录
5.1 Claude Code 安装失败与登录问题
安装 Claude Code 时最常见的报错是EACCES权限错误。这是因为 npm 全局目录没有写权限。解决办法是配置 npm 的全局目录到用户目录下:
npm config set prefix ~/.npm-global export PATH=~/.npm-global/bin:$PATH然后重新安装。登录问题方面,如果提示“无法验证账号”,先检查网络连接是否正常,再确认账号是否有对应的订阅。有时候浏览器登录成功了,但终端里还是提示未授权,这时候可以试试claude logout再claude login,重新走一遍授权流程。
5.2 Codex 无法加载组织设置与登录不上
Codex 报“无法加载组织设置”通常是因为账号没有加入任何组织,或者组织权限配置有问题。如果你用的是个人账号,可以忽略这个提示,直接使用。如果确实需要组织权限,联系管理员确认你的账号是否被正确添加。
登录不上是另一个高频问题。Codex 的登录依赖浏览器回调,如果默认浏览器没有正确跳转,可以手动复制终端里显示的链接到浏览器打开。另外,确保你的系统时间准确,时间偏差过大会导致 token 验证失败。
5.3 Cursor 中文设置不生效与提示词泄露
Cursor 设置中文后,如果 AI 还是用英文回复,检查两个地方:一是设置里的“Rules for AI”是否保存成功,二是当前对话是否开启了新的会话。有时候旧会话会沿用之前的语言设置,新建一个对话就好了。
关于提示词泄露,这是指 Cursor 在某些情况下会把你的自定义指令暴露在对话里。避免的方法很简单:不要在自定义指令里写敏感信息,比如 API key、内部项目名称、客户数据。自定义指令只写通用的偏好,比如“用中文回复”“代码要加注释”“优先使用函数式编程”。
5.4 循环跑飞了怎么办:回滚与止损
循环跑飞的表现是:AI 反复修改同一个文件,但测试始终不通过,而且代码越改越乱。这时候不要犹豫,直接回滚。我的做法是,在循环开始前用git stash或者创建临时分支保存当前状态。一旦发现循环超过预期轮数还没有收敛,立刻停止,回滚到初始状态,然后人工分析问题。
止损的关键是设置硬性上限。除了MAX_ITER,我还会监控每轮循环的耗时。如果单轮超过三分钟,说明 AI 可能在处理一个它无法解决的问题,继续跑下去只是浪费时间。这时候应该停下来,把报错信息和当前代码状态整理一下,手动分析。
| 问题现象 | 可能原因 | 排查方法 | 解决方式 |
|---|---|---|---|
| 安装时报 EACCES | npm 全局目录无写权限 | 检查npm config get prefix | 修改 prefix 到用户目录 |
| 登录后仍提示未授权 | 账号无对应权限或网络问题 | 检查账号订阅状态 | 重新登录或联系管理员 |
| 中文设置不生效 | 旧会话缓存或指令未保存 | 新建对话测试 | 重新保存自定义指令 |
| 循环超过 6 轮不收敛 | 问题超出 AI 能力范围 | 查看每轮报错是否变化 | 停止循环,人工介入 |
| 代码被改乱 | 缺少文件级约束 | 检查提示词是否限定范围 | 回滚并加严 harness 规则 |
5.5 独家避坑技巧:让循环更稳的三个习惯
第一个习惯是每轮循环后打一个 git commit。这样即使后面改乱了,也能快速回到上一个稳定状态。commit message 可以写成“loop-iter-1”“loop-iter-2”,方便追溯。
第二个习惯是把 AI 的修改限制在最小范围。提示词里明确写“只修改 X 文件”“不要动 Y 目录”。我试过让 AI 自由发挥,结果它把测试文件也改了,导致测试本身失去了验证意义。
第三个习惯是保留每轮的报错日志。把每轮的测试输出保存到单独的文件里,循环结束后对比一下,能看出 AI 是在逐步收敛还是在原地打转。如果报错信息一直没变,说明 AI 没有理解问题,需要换一种提示方式。
6. 循环工程的扩展玩法:从单文件到多模块协作
单文件循环跑通之后,可以尝试更复杂的场景。比如一个功能涉及三个模块:数据层、逻辑层、UI 层。这时候循环的设计要复杂一些,不能简单地让 AI 一次性改所有文件。我的做法是分层循环:先让 AI 修复数据层的测试,通过后再进入逻辑层,最后是 UI 层。每一层都有自己的验证命令和约束条件。
另一个扩展方向是多工具协作。Claude Code 负责代码修改,Codex 负责生成测试用例,Cursor 负责代码审查。三个工具各司其职,通过脚本串联起来。这种玩法对 harness 的要求更高,需要仔细设计每个工具的输入输出格式,确保信息在工具之间正确传递。
我目前还在探索的一个方向是循环的自我优化。让 AI 在每轮循环结束后,分析自己的修改历史,总结哪些策略有效、哪些无效,然后把总结写入下一轮的提示词。这样循环不仅是在修复代码,还在积累经验。虽然目前效果还不稳定,但方向是对的。
最后分享一个小技巧:如果你的项目有 CI 流程,可以把循环脚本挂到 CI 的失败重试环节。当 CI 失败时,自动触发一轮修复循环,修复成功后再重新跑 CI。这样能把 Loop Engineering 的价值最大化,让整个开发流程更加自动化。