
1. 从“会写代码”到“会驾驭循环”Loop Engineering 到底在解决什么问题第一次听到 Loop Engineering 这个词很多人会以为是某种新的编程范式或者又是一个被包装出来的概念。但如果你真的在 Claude Code、Codex、Cursor 这类 AI 编程工具里连续工作过几周就会明白它指向的是一个非常具体、非常痛的问题当 AI 能一次性写出几百行代码之后真正的瓶颈不再是“生成”而是“循环”——你怎么让 AI 反复地读、改、跑、验直到任务真正收敛而不是在第三轮就开始胡编。我自己的转折点是在一个重构项目上。当时用 Claude Code 处理一个两千多行的老模块第一轮它给出的方案相当漂亮第二轮开始改细节第三轮就开始“幻觉式重构”——把没问题的函数也改了还信誓旦旦说这是为了“统一风格”。我盯着 diff 看了半小时才反应过来问题不在模型能力而在我没有设计好这个循环的边界、退出条件和验证环节。Loop Engineering 要解决的就是这件事。它是一套围绕 AI 编程代理agent设计“工作循环”的工程方法定义任务如何被拆解、每一轮循环输入什么上下文、AI 的输出如何被验证、什么条件下循环终止、失败时如何回退。它不关心你用 Claude Code 还是 Codex 还是 Cursor关心的是这些工具背后的循环结构是否可控。这套方法适合谁三类人最该认真看一是已经在用 AI 写代码但经常被“越改越乱”折磨的开发者二是想把 AI 编程引入团队流程、但苦于无法保证输出稳定性的技术负责人三是刚上手 Claude Code、Codex 这类工具还在“它能干啥”和“它怎么老出错”之间反复横跳的新手。下面我会把整套循环拆开讲包括我踩过的坑和现在稳定在用的配置。2. 循环的四层结构为什么大多数人的 AI 编程是“一次性”的2.1 单轮生成、双轮验证、多轮收敛三种循环模式对比大部分人用 AI 编程工具的方式本质上是单轮生成描述需求拿到代码复制粘贴结束。这种方式在简单任务上没问题但一旦任务涉及多个文件、多个约束就会迅速崩掉。我把它和另外两种模式放在一起对比你就能看出差距在哪。循环模式典型操作适用任务主要风险单轮生成一次 prompt 拿结果单函数、脚本片段上下文缺失边界情况漏掉双轮验证生成 一次 review/测试单文件改动、小功能第二轮容易过度修改多轮收敛生成-验证-修正循环多文件重构、复杂功能需要明确的终止条件单轮生成的问题在于AI 没有机会看到自己写的代码“跑起来是什么样”。它只能基于静态上下文推理而真实项目里大量问题是运行时才暴露的。双轮验证好一些但很多人做第二轮的方式是“你再检查一下”这种模糊指令会让 AI 倾向于找点东西改哪怕原本没问题。多轮收敛的关键区别是每一轮循环都有明确的输入、明确的验证动作、明确的退出条件。不是“再改改”而是“跑这个测试如果失败只修改失败相关的函数其他不动”。这个约束一加上AI 的行为立刻稳定很多。2.2 为什么“循环”比“模型”更决定最终质量这里有个反直觉的结论在 Claude Code、Codex 这类工具上同一个模型不同的循环设计产出质量差距可以到三倍以上。我做过一个不太严谨但很有说服力的对比同一个重构任务用模糊循环“继续优化”跑了五轮最后代码虽然能跑但风格混乱用结构化循环每轮限定修改范围 跑测试 对比 diff跑了三轮代码干净且测试全绿。原因在于AI 编程代理的“智能”很大程度上体现在它对上下文的利用上。循环设计得好每一轮它拿到的都是精准的、增量的上下文上一轮改了什么、测试结果如何、哪些约束必须保持。循环设计得差每一轮它拿到的都是模糊的、重复的上下文于是它只能靠猜猜多了就开始编。所以 Loop Engineering 的核心不是“怎么让 AI 更聪明”而是“怎么让 AI 在每一轮都拿到它真正需要的信息并且知道什么时候该停”。2.3 循环的四个必备组件目标、上下文、验证、退出一个可用的循环必须同时具备四个组件缺一个都会出问题。目标要具体到可验证。比如“重构 user 模块”太模糊“把 user 模块里的数据库调用抽到 repository 层保持所有现有测试通过”才是可验证的目标。目标越具体AI 越不容易跑偏。上下文要分层。我通常分三层项目级技术栈、目录结构、编码规范、任务级这次要改什么、不能动什么、轮次级上一轮改了什么、测试结果。很多人只给任务级结果 AI 不知道项目规范改出来的风格和现有代码格格不入。验证要自动化。能跑测试就跑测试能跑 lint 就跑 lint实在不行至少要做 diff 对比。我见过太多人让 AI 改完代码自己肉眼扫一遍就提交然后线上出问题。验证环节是循环的“刹车”没有刹车循环越快越危险。退出要提前定义。是测试全绿就停还是改到某个文件就停还是达到最大轮次就停我一般设两个退出条件测试全绿或者连续两轮 diff 变化小于某个阈值说明已经收敛。没有退出条件AI 会一直“优化”下去最后把好代码也改坏。3. 工具链选型Claude Code、Codex、Cursor 在循环里各站什么位置3.1 三个工具的真实定位差异热词里反复出现 Claude Code、Codex、Cursor很多人搞不清它们的关系。我用下来的感受是它们不是替代关系而是在循环里承担不同角色。Claude Code 更像一个“终端里的代理”它擅长在项目目录里自主执行多步操作读文件、改文件、跑命令。它的循环能力最强适合做多轮收敛的主力。Codex 更偏向“代码补全和生成”在单轮生成和快速原型上很顺手但让它做多轮自主循环控制力不如 Claude Code。Cursor 则是“编辑器里的 AI”它的优势在于人机协作的即时性——你改一行它立刻给建议适合做循环里的“人工验证”环节。我现在的组合是Claude Code 跑主循环Cursor 做人工 review 和微调Codex 用来快速生成测试用例或样板代码。这个分工不是绝对的但比“一个工具干所有事”稳定得多。3.2 国内用户安装与配置的实操要点热词里“claude code 安装”“codex 安装教程”“cursor 汉化”出现频率极高说明很多人的第一道坎就是环境。我按自己的安装经验说几个关键点。Claude Code 的安装核心是 Node 环境。我建议用 nvm 管理 Node 版本避免和系统自带 Node 冲突。安装命令本身不复杂但安装后一定要在项目目录里初始化配置否则它不知道你的项目结构。配置文件里我通常会写明技术栈、测试命令、代码规范文件位置这三项写清楚后续循环会顺很多。Codex 的安装重点是配置文件解析。热词里“codex配置文件解析”是个高频问题因为它的配置项比较多而且不同版本的字段名有变化。我的经验是先跑最小配置确认能连通再逐项加。一次性把配置写全出错了很难定位是哪个字段的问题。Cursor 的汉化和中文设置热词里问得很多。Cursor 本身支持界面语言切换在设置里找 language 相关选项即可。但要注意界面语言和 AI 回复语言是两回事。界面切中文不代表 AI 就用中文回复AI 回复语言通常要在提示词或设置里单独指定。我一般会在项目级提示词里写一句“所有解释和注释用中文”这样比每次手动要求省事。3.3 工具选型的三个判断标准选工具不要看热度看三个标准循环控制力、上下文管理能力、验证集成度。循环控制力指的是工具能不能让你精确控制“改什么、不改什么、改几轮”。Claude Code 在这点上最强它支持比较细粒度的指令。上下文管理能力指的是工具能不能记住项目级信息而不是每次都要重新喂。验证集成度指的是工具能不能直接跑测试、跑 lint把结果纳入下一轮上下文。按这三个标准我的排序是复杂多轮任务用 Claude Code快速单轮用 Codex人机协作微调用 Cursor。这个排序会随工具更新变化但判断标准不变。4. 实战一个多文件重构任务的完整循环设计4.1 任务拆解与循环目标定义我拿一个真实做过的任务来拆把一个 Express 项目里的数据库调用从路由层抽到 repository 层。原始代码里路由文件直接调db.query大概涉及 8 个路由文件、20 多个查询点。这个任务如果单轮生成AI 很可能只改一两个文件就“交差”或者改得太多把路由逻辑也动了。所以我把它拆成循环目标目标所有db.query调用从路由层移到 repository 层路由层只调 repository 方法约束路由的 URL、请求参数、响应格式完全不变验证现有集成测试全绿且路由文件里不再出现db.query退出测试全绿 路由文件 grep 不到db.query这四个条件写清楚之后循环的边界就明确了。AI 知道什么必须保持什么必须改掉什么算完成。4.2 每一轮循环的输入与输出规范我的循环输入模板大概是这样当前任务将 db.query 调用从路由层迁移到 repository 层 本轮范围仅处理 routes/user.js 和 routes/order.js 必须保持URL、请求参数、响应格式不变 上一轮结果已完成 routes/auth.js测试通过 本轮验证跑 npm test并 grep routes/ 下是否还有 db.query 输出要求只输出修改后的文件内容不要解释这个模板的关键是限定本轮范围。如果不限定AI 会试图一次改完所有文件结果上下文太长质量下降。限定范围后每轮只处理两三个文件质量稳定很多。输出规范也很重要。“只输出修改后的文件内容不要解释”这条能省掉大量废话也让 diff 更干净。我早期没加这条AI 每轮都写一大段解释复制粘贴时容易把解释也带进去。4.3 验证环节的自动化脚本验证环节我写了一个小脚本每轮循环后跑一次#!/bin/bash # verify.sh echo 跑测试 npm test TEST_RESULT$? echo 检查路由层是否还有 db.query GREP_RESULT$(grep -r db.query routes/ | wc -l) echo 路由层 db.query 剩余$GREP_RESULT if [ $TEST_RESULT -eq 0 ] [ $GREP_RESULT -eq 0 ]; then echo 循环可以退出 else echo 需要继续循环 fi这个脚本不复杂但它把“验证”从人工判断变成了自动判断。每轮循环后跑一次结果直接决定是否继续。我实测下来有这个脚本和没有循环轮次能差两到三轮而且最终质量更稳定。4.4 循环终止与回退策略终止策略我前面说了测试全绿 grep 为零。但还有个隐藏问题如果循环跑了五轮还没收敛怎么办我的做法是设一个最大轮次比如 6 轮。到 6 轮还没收敛就停下来人工介入看看是任务拆解有问题还是某个文件特别难处理。回退策略同样重要。每轮循环前我会先 commit 一次当前状态。如果某一轮改坏了直接git reset --hard回到上一轮。这个习惯救过我很多次——有一次 AI 在第五轮突然把 repository 层的接口签名改了导致所有路由报错我直接回退到第四轮重新限定范围再跑。提示循环前 commit 是个小动作但它是整个循环的安全网。没有这个安全网你不敢让 AI 大胆改循环效率反而低。5. 循环中的常见故障与排查手册5.1 AI 越改越乱上下文污染与范围失控这是最高频的问题。表现是前两轮还好第三轮开始改无关代码第四轮把测试也改了。根因通常是两个上下文污染和范围失控。上下文污染指的是每一轮的对话历史越积越长AI 把早期的、已经过时的信息也当成当前约束。比如第一轮说“暂时保留旧接口”第三轮旧接口已经删了但 AI 还记得那句话于是又把它加回来。解决办法是每轮开新对话只带必要的上下文而不是在一个超长对话里一直聊。范围失控指的是AI 觉得“顺便把这个也优化了”。解决办法是在每轮输入里明确写“本轮只改 X其他文件不要动”。这句话看起来多余但实测能减少大量意外修改。5.2 测试通过但代码变丑验证指标的盲区测试全绿不代表代码没问题。我遇到过测试全绿但代码里多了一堆重复逻辑的情况——AI 为了让测试过复制粘贴了几个函数。测试覆盖不到的地方就是验证的盲区。补这个盲区的方法是加静态检查。我在验证脚本里加了 lint 和重复代码检测。lint 能抓风格问题重复代码检测能抓复制粘贴。这两个加上之后“测试绿但代码丑”的情况少了很多。还有一个土办法每轮循环后我自己扫一眼 diff。不用细看就看改动行数和改动文件数是否符合预期。如果本轮说好只改两个文件结果改了五个那肯定有问题直接回退。5.3 循环不收敛任务拆解粒度的调整循环不收敛的表现是每轮都有改动但改动越来越小始终达不到退出条件。这通常是任务拆解粒度的问题。比如“把所有 db.query 迁移到 repository”这个任务如果一次处理 8 个文件AI 很容易在某个文件上卡住反复改都改不对。这时候要把任务再拆细先处理简单的 4 个文件再处理复杂的 4 个。或者按功能模块拆用户相关的一批订单相关的一批。我的一般原则是单轮循环涉及的文件不超过 3 个涉及的核心函数不超过 5 个。超过这个量就拆。拆细之后每轮的成功率明显提高总体轮次反而可能更少。5.4 常见问题速查表现象可能原因排查动作解决方式第三轮开始改无关代码上下文污染检查对话历史长度每轮开新对话测试绿但代码重复验证盲区跑 lint 和重复检测加静态检查循环五轮不收敛任务粒度太粗看每轮改动文件数拆细任务改完报错但 AI 说没问题验证缺失检查是否真跑了测试强制自动验证接口签名被意外修改约束未写明检查输入模板明确写“不可修改项”6. 把循环工程化从个人技巧到可复用流程6.1 循环模板的沉淀与复用跑通几个任务之后我把循环模板沉淀了下来。现在每次新任务我先套模板改几个字段就能用。模板大概长这样任务目标[具体可验证的目标] 本轮范围[限定文件或函数] 必须保持[不可修改的接口、格式、行为] 上一轮结果[改了什么验证结果如何] 本轮验证[跑什么命令看什么指标] 输出要求[只输出代码不解释] 退出条件[什么情况下停止循环]这个模板的价值在于它把“循环设计”从每次现想变成了填空。填空比现想快而且不容易漏项。我团队里新人用这个模板第一周就能跑出比较稳定的循环。6.2 团队协作中的循环规范团队里用循环最大的问题是每个人的循环标准不一样。有人跑三轮就提交有人跑十轮还在改。解决办法是定一个团队级的循环规范最大轮次、验证命令、退出条件、回退方式都写清楚。我们团队的规范是最大 6 轮每轮必须跑测试和 lint退出条件是测试全绿 lint 无 error回退用 git。这套规范不复杂但它让不同人的产出质量拉齐了。新人按规范跑产出和老手差距不大。6.3 循环效率的度量与优化循环效率可以用两个指标衡量收敛轮次和每轮有效改动率。收敛轮次越少越好每轮有效改动率越高越好有效改动指的是真正推进目标的改动不包括回退和重复修改。我自己的数据是优化前平均 5.2 轮收敛每轮有效改动率大概 60%优化后平均 3.4 轮有效改动率 85%。提升主要来自三件事任务拆细、每轮开新对话、加自动验证。这三件事都不难但加起来效果很明显。6.4 我踩过的三个坑第一个坑是过度信任 AI 的自我验证。早期我让 AI 自己说“改好了”结果它说改好了但其实没跑测试。后来我强制所有验证必须由脚本执行AI 不能自己声明完成。第二个坑是循环范围写得太宽。有一次我写“优化整个模块”结果 AI 把模块里所有东西都改了包括没问题的部分。后来我把范围限定到具体函数问题就没了。第三个坑是忘记 commit。有一次循环到第四轮改坏了想回退发现没 commit只能手动恢复。从那以后我每轮循环前必 commit这个习惯再也没断过。7. 循环之外Harness Engineering 与工具生态的配合热词里出现了 Harness Engineering这个词和 Loop Engineering 经常一起被提到。我的理解是Harness Engineering 更偏向“给 AI 搭一个可运行、可验证的环境”而 Loop Engineering 偏向“在这个环境里设计循环”。两者是配合关系。比如Harness Engineering 会关心测试环境怎么搭、mock 数据怎么造、CI 怎么集成。这些是循环能跑起来的基础设施。没有好的 harness循环里的验证环节就是空的AI 说改好了你也没法确认。我现在的做法是先把 harness 搭好——测试能一键跑、lint 能一键跑、环境能一键起——然后再设计循环。harness 是地基循环是地基上的流程。地基不稳流程再漂亮也没用。至于 Claude Code、Codex、Cursor 这些工具它们会持续更新功能会变但循环的四个组件——目标、上下文、验证、退出——不会变。把这四个组件想清楚工具换了你也能快速适应。我见过太多人追着工具更新跑但循环设计一直很粗糙结果工具越新产出越乱。反过来循环设计扎实的人用旧工具也能跑出稳定结果。最后分享一个我最近在用的技巧每轮循环结束后让 AI 用一句话总结“本轮改了什么、验证结果如何”然后把这句总结作为下一轮的上下文。这样下一轮拿到的上下文是压缩过的、精准的比带一整段对话历史干净得多。这个技巧不复杂但实测能让循环稳定性再上一个台阶。