1. 从“会写代码”到“会驾驭循环”:Loop Engineering 到底在解决什么问题
第一次听到 Loop Engineering 这个词,很多人会以为是某种新的编程范式或者框架。其实不是。它更像是一种围绕 AI 编程助手构建的工程化工作方法——核心思路是把 Claude Code、Codex、Cursor 这类工具从“单次问答的代码生成器”升级成“可以持续迭代、自我校验、闭环交付的工程流水线”。
说白了,以前我们用 AI 写代码,流程是:提需求 → 拿代码 → 人工检查 → 发现问题 → 再提需求。这个循环靠人来驱动,一轮一轮手动跑。Loop Engineering 要做的事情,就是把这个循环结构化、自动化、可观测化,让 AI 在每一轮里不只是生成代码,还要自己跑测试、自己看报错、自己修正,直到满足退出条件才停下来。
这个思路为什么现在特别值得聊?因为 Claude Code、Codex CLI、Cursor 这些工具在 2024 到 2025 年集中爆发,大家手里都有能写代码的 AI 了,但真正拉开差距的不是“谁用的模型更强”,而是谁的循环设计得更合理。同样一个功能,有人三轮就交付了,有人改了二十轮还在打转,差别就在循环的工程化程度上。
这篇文章适合三类人看:第一类是完全没用过 Claude Code 或 Codex、想从零上手的新手;第二类是已经在用但总觉得“AI 写出来的东西不太靠谱”的中级用户;第三类是想把 AI 编程助手接入团队工作流、需要一套可复制方法的工程负责人。我会从概念拆解讲到实操配置,再到项目实战和踩坑排查,尽量把每一步的“为什么”都说清楚。
提示:本文涉及的 Claude Code、Codex、Cursor 均为当前主流 AI 编程辅助工具,具体版本和界面可能随更新变化,核心方法论不受版本影响。
2. 核心概念拆解:Loop Engineering 和 Harness Engineering 的关系
2.1 什么是 Loop Engineering
Loop Engineering 直译过来是“循环工程”。在 AI 编程的语境下,它指的是设计并管理 AI 助手与代码库之间的迭代循环。一个完整的循环包含四个阶段:
- 意图输入:你用自然语言描述要做什么,包括功能、约束、验收标准。
- 生成执行:AI 读取项目上下文,生成代码或修改文件。
- 验证反馈:运行测试、类型检查、lint,把结果反馈给 AI。
- 修正收敛:AI 根据反馈调整,进入下一轮,直到通过验证或达到最大轮次。
关键点在于:这个循环不是让 AI 无限自由发挥,而是有明确的进入条件、退出条件和每轮的验证手段。没有验证手段的循环就是“AI 自言自语”,跑一百轮也没用。
2.2 Harness Engineering 是什么角色
Harness 这个词在软件工程里一直有“测试夹具、脚手架”的意思。Harness Engineering 在 AI 编程场景下,指的是为 AI 助手搭建运行环境和约束框架。它包括:
- 项目上下文的组织方式(哪些文件让 AI 看,哪些不让看)
- 工具链的接入(测试命令、构建命令、lint 命令怎么暴露给 AI)
- 权限边界(AI 能改哪些文件,不能碰哪些目录)
- 输出格式约束(要求 AI 按什么结构返回结果)
打个比方:Loop Engineering 是“怎么跑圈”,Harness Engineering 是“跑道和护栏”。没有护栏,AI 跑着跑着就跑到隔壁项目去了;没有跑道,你都不知道它跑到哪了。
2.3 两者的协作关系
实际项目中,这两个概念是绑在一起用的。你先用 Harness Engineering 把环境搭好——配置文件、权限、工具链、上下文规则;然后用 Loop Engineering 定义循环——每轮做什么、怎么验证、什么时候停。
我自己的习惯是:Harness 先行,Loop 后置。因为如果环境没搭好,循环跑起来就是灾难。比如你没限制 AI 的写入范围,它可能把你整个src目录重构一遍,测试还没跑通,代码已经面目全非了。
| 维度 | Loop Engineering | Harness Engineering |
|---|---|---|
| 关注点 | 迭代流程、验证反馈、收敛条件 | 运行环境、权限边界、工具接入 |
| 产出物 | 循环脚本、提示词模板、退出规则 | 配置文件、上下文规则、工具链封装 |
| 失败表现 | 循环不收敛、反复改同一处 | AI 看不到关键文件、命令执行失败 |
| 调试难度 | 中,主要看日志和轮次 | 高,涉及环境变量和权限 |
3. 环境准备:Claude Code、Codex、Cursor 的安装与基础配置
3.1 Claude Code 安装与初始化
Claude Code 是 Anthropic 推出的命令行 AI 编程工具,运行在终端里,可以直接读写项目文件、执行命令。安装方式根据系统不同略有差异。
macOS 和 Linux 用户,官方推荐用 npm 全局安装:
npm install -g @anthropic-ai/claude-code安装完成后,在项目根目录执行:
claude首次运行会引导你完成登录和初始化。如果你在国内网络环境下遇到登录问题,可以检查是否有可用的网络代理配置,或者使用官方支持的 API 密钥方式接入。
Windows 用户建议在 WSL2 环境下运行,原生 PowerShell 的支持虽然有了,但文件路径和权限处理还是 WSL 更顺。安装完 WSL 后,在 Ubuntu 子系统里执行同样的 npm 命令即可。
初始化完成后,Claude Code 会在项目根目录生成一个.claude目录,里面可以放配置文件。这个目录建议加入.gitignore,因为里面可能包含本地路径和密钥信息。
3.2 Codex 安装与配置文件解析
Codex 是 OpenAI 推出的编程助手,有 CLI 版本也有 IDE 插件版本。CLI 版本通过 npm 安装:
npm install -g @openai/codex安装后在项目目录执行codex启动。Codex 的配置文件通常位于用户主目录下的.codex/config.json,核心配置项包括:
{ "model": "o3", "approvalMode": "suggest", "fullAutoErrorMode": "ask-user", "notify": true }几个关键参数解释一下:
approvalMode:控制 AI 执行命令前是否需要你确认。suggest是每次确认,auto-edit是自动改文件但命令要确认,full-auto是全自动。新手建议从suggest开始。fullAutoErrorMode:全自动模式下出错时的行为,ask-user会暂停问你,ignore-and-continue会跳过继续。notify:是否开启桌面通知,长任务跑的时候有用。
Codex 还支持通过环境变量配置 API 接入点。如果你用的是第三方兼容接口,需要设置OPENAI_BASE_URL和OPENAI_API_KEY。这里要注意,不同兼容服务的接口路径可能不一样,Codex 默认走/responses端点,如果服务端不支持这个路径,会出现cc switch local proxy failed while handling codex endpoint /responses这类报错。解决办法是确认服务端支持的端点路径,或者在配置里显式指定。
3.3 Cursor 中文设置与基础使用
Cursor 是基于 VS Code 的 AI 编辑器,对新手最友好,因为有图形界面。下载安装包后一路下一步即可。
设置中文回复的步骤:
- 打开 Cursor,按
Ctrl+Shift+P(macOS 是Cmd+Shift+P)打开命令面板。 - 输入
Configure Display Language,选择中文(简体)。 - 重启编辑器,界面变成中文。
但注意,这只改了界面语言,AI 回复的语言还需要单独设置。在设置里搜索cursor.chat.language,或者直接在对话开头加一句“请用中文回复”。更彻底的办法是在项目根目录建一个.cursorrules文件,写入:
Always respond in Chinese (Simplified). All code comments should be in Chinese.这样每次对话都会自动用中文。Cursor 的免费额度每月有一定次数的快速请求和慢速请求,具体数额会调整,可以在设置里的 Billing 页面查看当前用量。
3.4 三者的定位差异与选择建议
| 工具 | 形态 | 优势 | 适合场景 |
|---|---|---|---|
| Claude Code | 命令行 | 上下文管理强,适合大项目 | 后端、脚本、重构 |
| Codex | 命令行 + 插件 | 与 OpenAI 生态集成好 | 快速原型、算法题 |
| Cursor | 图形编辑器 | 上手快,可视化 diff | 前端、全栈、新手 |
我个人的组合是:Cursor 做日常编辑和快速修改,Claude Code 做复杂重构和批量任务,Codex 做算法验证和独立脚本。三者不冲突,反而互补。
4. Loop Engineering 实战:搭建一个可收敛的 AI 编程循环
4.1 循环设计的第一步:定义退出条件
很多人用 AI 写代码效率低,根本原因是没定义什么叫“做完了”。你说“帮我写个登录功能”,AI 写完给你,你说“再加个验证”,AI 又改,来回十轮。这不是 AI 的问题,是你没给退出条件。
正确的做法是在循环开始前,明确三件事:
- 功能验收标准:比如“用户可以用邮箱和密码登录,登录成功后跳转到首页,失败显示错误提示”。
- 技术验收标准:比如“所有单元测试通过,TypeScript 编译无错误,ESLint 无 warning”。
- 轮次上限:比如“最多迭代 5 轮,5 轮后仍未通过则暂停,由人工介入”。
把这三条写进提示词里,AI 的行为会明显收敛。我实测下来,加了退出条件的循环,平均轮次从 8 轮降到 3 轮左右。
4.2 用 Claude Code 搭建循环的实操步骤
假设我们要给一个 Node.js 项目加一个用户注册接口。项目结构如下:
my-project/ ├── src/ │ ├── routes/ │ ├── services/ │ └── models/ ├── tests/ ├── package.json └── tsconfig.json第一步,在项目根目录启动 Claude Code:
cd my-project claude第二步,输入循环提示词。我常用的模板是这样的:
任务:在 src/routes/ 下新增用户注册接口 POST /api/register。 验收标准: 1. 接收 email 和 password 两个字段 2. email 格式校验,不合法返回 400 3. password 长度至少 8 位,否则返回 400 4. 注册成功返回 201 和用户 ID 5. 邮箱重复返回 409 技术约束: - 使用现有的 express 框架和已有的 service 层模式 - 必须写单元测试,放在 tests/ 目录 - 每轮修改后运行 npm test 和 npx tsc --noEmit - 如果测试失败,根据报错自行修正,最多 5 轮 请开始,每轮结束后告诉我当前状态。第三步,观察循环。Claude Code 会先读项目结构,然后生成代码,接着运行测试。如果测试失败,它会读报错、改代码、再跑。你可以在旁边看着,也可以去干别的,它跑完会通知你。
第四步,人工验收。循环结束后,不要直接合并。先看 diff,重点检查:边界条件处理、错误信息是否泄露敏感信息、测试覆盖是否充分。
4.3 用 Codex 做循环的配置要点
Codex 的循环配置和 Claude Code 类似,但有几个细节要注意。
首先,Codex 默认的approvalMode是suggest,每步都要确认,循环跑不起来。做循环任务时建议临时改成auto-edit:
codex --approval-mode auto-edit这样它会自动改文件,但执行命令前还是会问你。如果你信任当前任务,可以用full-auto,但强烈建议只在有版本控制的分支上这么干,因为全自动模式下 AI 可能做出你意想不到的修改。
其次,Codex 的上下文窗口管理需要手动干预。长循环跑下来,上下文会越来越长,最后可能超出窗口。解决办法是每轮结束后让它总结当前状态,然后开新会话继续:
请总结当前进度:已完成什么、还差什么、下一步计划。总结控制在 200 字以内。拿到总结后,新开会话,把总结作为初始上下文贴进去。这样既保留了进度,又释放了窗口。
4.4 循环中的验证手段配置
验证手段是循环的“眼睛”。没有验证,AI 就是盲人摸象。常用的验证手段按优先级排列:
- 单元测试:最直接,覆盖核心逻辑。命令示例
npm test或pytest。 - 类型检查:TypeScript 项目必配,
npx tsc --noEmit。Python 可以用mypy。 - Lint 检查:
npx eslint src/或ruff check .。能抓出风格问题和潜在 bug。 - 构建检查:
npm run build。确保代码能打包。 - 端到端测试:
npx playwright test。适合前端项目。
在提示词里把这些命令写清楚,AI 每轮都会跑。如果某个命令跑得特别慢,可以拆成“快速验证”和“完整验证”两档,循环中用快速档,最后一轮用完整档。
注意:不要让 AI 自己决定跑什么验证命令。它可能偷懒只跑一个,或者跑错命令。明确写死命令,是 Harness Engineering 的基本要求。
5. 项目实战:用 Loop Engineering 完成一个完整功能模块
5.1 项目背景与需求拆解
我拿一个真实做过的小项目举例:给一个已有的博客系统加“文章草稿”功能。需求如下:
- 用户可以保存文章为草稿,草稿不对外可见
- 草稿可以编辑、删除、发布
- 发布后草稿变成正式文章,从草稿列表移除
- 草稿列表按最后编辑时间倒序
技术栈是 Express + TypeScript + Prisma + PostgreSQL,测试用 Jest。
这个需求看起来简单,但涉及数据库 schema 变更、API 新增、权限校验、测试覆盖,是一个适合练循环的完整模块。
5.2 第一轮循环:数据库层与模型定义
第一轮的目标是只做数据库层,不碰 API。提示词这样写:
任务:为博客系统添加草稿功能的数据层。 具体要求: 1. 在 Prisma schema 中新增 Draft 模型,字段包括 id、title、content、authorId、createdAt、updatedAt 2. authorId 关联 User 模型 3. 生成 migration 并应用 4. 写一个 seed 脚本,插入 3 条测试草稿 验证命令: - npx prisma migrate dev --name add_draft - npx prisma generate - npm run seed 最多 3 轮。每轮结束报告 migration 状态和 seed 结果。Claude Code 第一轮生成了 schema,但 migration 报错,因为authorId的外键约束和现有数据冲突。它读了报错,第二轮加了onDelete: Cascade并处理了空值,migration 通过。第三轮 seed 成功。总共 3 轮,符合预期。
这里的关键经验是:把大任务拆成小循环。如果第一轮就让 AI 同时做数据层和 API,出错时你很难判断是 schema 问题还是路由问题。拆开之后,每轮的验证范围清晰,排查成本低。
5.3 第二轮循环:API 路由与业务逻辑
数据层稳定后,第二轮做 API:
任务:基于已完成的 Draft 模型,实现草稿相关 API。 接口列表: - POST /api/drafts 创建草稿 - GET /api/drafts 获取当前用户的草稿列表 - PUT /api/drafts/:id 更新草稿 - DELETE /api/drafts/:id 删除草稿 - POST /api/drafts/:id/publish 发布草稿 约束: 1. 所有接口需要登录态,从 req.user.id 取用户 ID 2. 只能操作自己的草稿,否则返回 403 3. 发布时把草稿内容写入 Article 表,然后删除草稿 4. 每个接口写对应的单元测试 验证命令: - npm test -- drafts - npx tsc --noEmit 最多 5 轮。这一轮跑了 4 轮。第一轮路由写完了但测试失败,因为 mock 的登录态没配好。第二轮修了 mock,但 publish 接口的事务处理有问题,草稿删了文章没建。第三轮加了事务,测试通过。第四轮 tsc 报了一个类型错误,修完收工。
5.4 第三轮循环:边界情况与错误处理
前两轮跑完,功能基本可用。但生产环境不能只跑 happy path。第三轮专门处理边界:
任务:审查并加固草稿功能的边界处理。 检查项: 1. 空标题、空内容是否拒绝 2. 超长内容(>10000 字)是否限制 3. 并发更新同一草稿是否冲突 4. 删除不存在的草稿返回什么 5. 发布已发布的草稿返回什么 对每个检查项,补充测试用例并修正代码。 验证命令:npm test -- drafts 最多 3 轮。这一轮 AI 找出了 3 个问题:空标题没校验、并发更新没加版本号、删除不存在的草稿返回了 500 而不是 404。修完后测试覆盖率从 72% 提到 89%。
5.5 循环结束后的代码审查要点
循环跑完不等于可以合并。我自己的审查清单是这样的:
- 看 diff 不看全文件:重点看新增和修改的行,避免被格式化改动干扰。
- 检查错误信息:有没有把数据库错误直接返回给前端,泄露表结构。
- 检查权限逻辑:每个接口是否都校验了资源归属。
- 检查测试质量:测试是不是只测了 happy path,断言是否充分。
- 跑一次完整验证:
npm test && npx tsc --noEmit && npm run build,确保循环外的命令也能过。
这套流程走下来,一个中等复杂度的功能模块,从零到可合并,大概 2 到 3 小时。如果纯手写,同样质量至少一天。
6. 常见问题与排查技巧实录
6.1 循环不收敛的典型原因
循环跑了十几轮还在改同一处,通常有三个原因:
原因一:验收标准模糊。比如“代码要优雅”这种标准,AI 每轮理解都不一样。解决办法是把标准量化,比如“函数不超过 30 行,圈复杂度不超过 10”。
原因二:验证命令不稳定。测试本身有 flaky 用例,这轮过下轮挂,AI 就被带偏了。解决办法是先修测试再跑循环,或者把 flaky 用例临时 skip。
原因三:任务粒度过大。一个循环里让 AI 做五件事,它顾此失彼。解决办法是拆成多个小循环,每个循环只做一件事。
6.2 工具报错速查表
| 报错信息 | 可能原因 | 解决办法 |
|---|---|---|
cc switch local proxy failed while handling codex endpoint /responses | 接口端点不匹配 | 确认服务端支持的路径,或改用兼容端点 |
codex无法加载组织设置 | 账号权限或网络问题 | 检查登录状态,重新认证 |
cursor taking longer than expected... | 请求排队或网络慢 | 切换模型或稍后重试 |
claude code 找不到 start in cowork | 项目路径或配置问题 | 确认在项目根目录启动,检查.claude配置 |
codex登录不上 | 认证过期或网络问题 | 清除本地凭证重新登录 |
6.3 上下文管理的实操技巧
AI 编程助手最大的瓶颈是上下文窗口。几个实用技巧:
- 用
.gitignore思路管理上下文:在.claudeignore或类似配置里排除node_modules、dist、*.log,减少噪音。 - 每轮结束让 AI 写摘要:前面提过,200 字以内的进度总结,新会话用。
- 关键文件手动置顶:把核心接口定义、数据模型文件在提示词里显式引用,确保 AI 每轮都看到。
- 长文件分段处理:超过 500 行的文件,让 AI 只读相关函数,不要整个读。
6.4 我踩过的三个坑
坑一:全自动模式跑在 main 分支。有一次我图省事,在 main 分支开了full-auto,AI 重构了一个工具函数,把调用方全改了,测试也过了,但有个边缘调用方在另一个仓库里,没测到。上线后才发现。教训:全自动模式必须在新分支跑,合并前人工审查。
坑二:提示词里写了“优化性能”。结果 AI 把可读性很好的代码改成了位运算,性能提升微乎其微,可读性暴跌。教训:性能优化要有明确的指标,比如“把响应时间从 200ms 降到 100ms”,而不是笼统的“优化”。
坑三:让 AI 自己决定测试范围。它只测了新增代码,没测受影响的旧代码。结果新功能没问题,旧功能挂了。教训:验证命令要写死,明确跑全量测试还是增量测试。
6.5 提升循环效率的五个习惯
- 循环前先手动跑一遍验证命令,确认基线是绿的。基线不绿,循环白跑。
- 每轮结束看一次 diff,不要等循环全跑完。早发现跑偏,早止损。
- 把常用提示词存成模板,比如“新增 API”“修 bug”“重构”,用的时候改几个参数就行。
- 给 AI 的报错信息要完整,不要只贴最后一行。完整的 stack trace 能帮它更快定位。
- 循环结束后跑一次完整 CI,本地过了不代表 CI 过,环境差异经常出问题。
这套方法我从去年开始用,到现在跑了大概三十多个功能模块。最大的感受是:AI 编程的上限不取决于模型,取决于你给它设计的循环有多严谨。同样的 Claude Code,有人用起来像玩具,有人用起来像团队。差别就在这些工程细节里。