ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

你的工作是「写循环」:一文读懂 2026 年最新范式 Loop Engineering

你的工作是「写循环」:一文读懂 2026 年最新范式 Loop Engineering 1. 从「敲提示」到「写循环」Loop Engineering 到底在解决什么如果你最近在 Claude Code 或 Codex 里反复做同一件事——让它跑测试、看报错、改代码、再跑一遍——那你其实已经在手动执行一个循环了。Loop Engineering循环工程要做的就是把这个「你亲手转的圈」交给一套系统去转。它不是一个新工具而是一种组织 Agent 工作的范式你定义目标系统按节拍运行、派生子 Agent、检查结果、写回进度然后决定下一步。一句话概括你不再亲自当那个提示 Agent 的人而是去设计一套替你提示它的系统。Claude Code 之父 Boris Cherny 那句被反复引用的话说得很直白——「我的工作就是写循环」。这句话刺耳的地方在于它宣告了一个姿势转变过去两年我们握着 AI 这把工具现在要放手去搭一个替我们握着工具的系统。这篇文章面向想把重复任务交给循环编排的开发者。我会先讲清楚 Loop Engineering 在四层演进线里的位置再给出一个能在本地跑通的最小循环配置骨架最后把验证动作和常见报错一起过一遍。适合谁已经在用 Claude Code / Codex 做日常开发、想让 Agent 自己跑起来而不是一句句喂提示的人。不适合谁还没搞懂 prompt 和 context 区别、指望复制一段配置就万事大吉的人——循环会放大你的理解也会放大你的偷懒。2. 四层演进线Loop 坐在 Harness 的上面一层要理解循环工程不能孤立地看它。把它放进一条从下往上的演进线里人离「关键路径」就远一层层级名称关注点第 1 层Prompt Engineering优化输入给模型的文字第 2 层Context Engineering怎样把恰当的信息填进上下文窗口第 3 层Harness Engineering设计单个 Agent 运行所在的工程环境目标、上下文、权限、验证、回滚第 4 层Loop Engineering让 Harness 跑在定时器上、自己派生小助手、自己喂自己关键在于这四层是叠层关系不是互相取代。Prompt 优化输入文字Context 决定填什么进窗口Harness 设计单个 Agent 的运行环境Loop 则坐在 Harness 上面让 Harness 按节拍运行、派生子 Agent、自我喂养。所以循环工程是一个需要长期掌握的领域而不是一次转瞬即逝的热点。如果你还没搞懂下面三层很容易把四个概念混为一谈——比如把「写循环」理解成「写更长的提示词」那就完全跑偏了。2.1 五大模块 一处外部记忆循环工程的完整定义是你定义一个目的AI 持续迭代直到完成。它由五大模块加一处外部记忆构成让「单次运行」变成一个「可以自己重复、自己推进的系统」。好消息是这五大模块今天在 Codex 与 Claude Code 上几乎一一对应模块作用Claude CodeCodexAutomations定时发现与分类循环的「心跳」hooks / cron 调度Automations 标签页 Triage 收件箱Worktrees并行隔离底座为同一仓库开独立工作目录与分支git worktree 隔离内建 worktreeSkills把项目知识固化成 SKILL.mdSkillsSkillsPlugins / Connectors用 MCP 接入真实工具MCP 连接器MCP 连接器 .codex/agentsSub-agents产出与检查分离Sub-agents.codex/agents 子 Agent补充两个容易混的概念Skill 是编写格式Plugin 是分发方式MCP 是连接器的开放标准——因为 Codex 与 Claude Code 都讲 MCP所以一个连接器常能两边通用。至于那处外部记忆是所有长周期循环依赖的同一个朴素技巧模型在两次运行之间会忘掉一切所以你要给循环一根「脊柱」。用一个对话之外的状态文件一个 Markdown 文件或一块看板记住进度让明早的运行能接着昨天继续。人会忘仓库不会。3. 前置准备用 TaoToken 统一接入 Claude Code 与 Codex在跑循环之前得先让 Agent 能稳定调用模型。循环的特点是「无人值守地反复调用」所以接入层要满足两个条件一是接口稳定二是能在一个地方看到用量否则循环自己花钱你都不知道花在哪。我这边用的是 TaoToken 做统一接入。它的定位是把 Claude Code、Codex 这类 Agent 工具的模型调用收敛到一个入口官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。下面这套配置对循环场景比较友好因为循环里子 Agent 会各自跑模型统一入口能让你在一个面板里看清消耗。3.1 拿 Key 与配置环境变量先到控制台创建 API Key入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后不要写进代码用环境变量# 写入 shell 配置避免循环脚本里硬编码 export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api # 验证变量生效 echo $TAOTOKEN_BASE_URL注意循环脚本会被反复执行Key 一旦硬编码进脚本很容易在日志或 git 历史里泄露。统一走环境变量是最省心的做法。3.2 在 Claude Code 侧接入Claude Code 支持通过环境变量指定接入地址。把下面这段加进你的 shell 配置或项目级.env# Claude Code 接入配置 export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEY$TAOTOKEN_API_KEY配置完成后进入项目目录启动 Claude Code它会走你指定的入口。如果你更习惯在对话里验证模型是否通可以直接用模型对话页试一句https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。3.3 在 Codex 侧接入Codex 的接入方式类似核心是把 base_url 指向同一个端点。配置文件通常放在~/.codex/config.toml# ~/.codex/config.toml model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY这样 Claude Code 和 Codex 就共用同一个 Key 和同一个用量视图。循环跑起来之后你只需要盯一个地方的成本而不是在两个后台之间来回切。4. 可复制的循环配置骨架/loop 与 /goal理论说再多不如亲手跑一次。最小循环靠两个原生命令/loop按设定的节拍重复运行一段提示像心跳一样/goal持续运行直到你写的条件为真每轮后由一个独立模型判定是否真的完成。Codex 也有同名的/goal。这里藏着一个关键设计哲学为什么/goal要用独立模型判定因为写代码的模型给自己打分太宽容了。循环里最有用的结构就是让一个子 Agent 负责产出、另一个用不同指令甚至不同模型去审查。4.1 最小循环骨架下面是一个可以直接改用的循环骨架。它做三件事读外部记忆、跑一轮产出、让独立检查者判定是否达标。# LOOP.md —— 循环的外部记忆脊柱 ## 目标 让 tests/ 下所有测试通过且不修改测试文件本身。 ## 当前状态 - 最近一次运行2026-06-13 09:00 - 失败用例test_parser.py::test_nested_quotes - 已尝试方案调整 tokenizer 的引号处理未通过 - 下一步检查 parser 的转义逻辑 ## 停止条件 pytest tests/ -q 退出码为 0且 git diff 未触碰 tests/ 目录。 ## 检查者指令 你是独立审查者。不要修改代码只做三件事 1. 运行 pytest记录退出码 2. 检查 git diff --name-only 是否包含 tests/ 3. 若两项都通过输出 GOAL_REACHED否则输出 CONTINUE 并列出失败原因。然后在 Claude Code 里这样驱动/loop 每 10 分钟执行一次 1. 读取 LOOP.md 的「当前状态」和「下一步」 2. 按「下一步」修改源码不要动 tests/ 3. 运行 pytest把结果写回 LOOP.md 的「当前状态」 4. 调用检查者子 Agent 按「检查者指令」判定。 /goal 直到 LOOP.md 的「停止条件」为真 每轮结束后由独立模型判定输出 GOAL_REACHED 才停止。4.2 用 worktree 做并行隔离如果你想让多个循环同时跑必须用 worktree 隔离否则两个 Agent 会互相覆盖文件# 为循环 A 开一个独立工作树 git worktree add ../proj-loop-a -b loop/fix-parser # 为循环 B 开另一个 git worktree add ../proj-loop-b -b loop/refactor-tokenizer # 查看当前所有工作树 git worktree list每个 worktree 是一个独立目录加独立分支循环 A 改 parser、循环 B 改 tokenizer互不干扰。跑完再合并冲突在合并阶段处理而不是在运行阶段互相踩。4.3 用 SKILL.md 固化项目知识循环最怕每轮从零重建项目意图。把项目约定写成 SKILL.md循环每轮读一次就不用反复解释# SKILL.md ## 项目约定 - 测试框架pytest测试文件在 tests/禁止修改 - 代码风格black isort提交前必须跑 - 分支命名loop/任务名 ## 常用命令 - 跑测试pytest tests/ -q - 格式化black src/ isort src/ - 查看改动git diff --stat5. 验证请求与成功结果怎么确认循环真的在跑配置写完不算跑通得看到循环真的在推进。验证分三步先确认模型调用通再确认单轮循环能跑完最后确认外部记忆在更新。5.1 先验证接入层在启动循环之前先用一个最小请求确认接入没问题curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: 只回复 OK}] }返回里能看到正常的 content 字段说明接入层通了。如果这里就报 401 或 404先别急着跑循环回到第 6 节排查。5.2 观察单轮循环的行为启动/loop之后重点观察三件事而不是只看它有没有输出第一LOOP.md 的「当前状态」有没有被更新。如果每轮结束文件都没变说明循环没有写回记忆明早的运行会从零开始。第二检查者子 Agent 有没有真的独立判定。你可以在 LOOP.md 里故意写一个假的「已通过」看检查者会不会被骗——如果它直接输出 GOAL_REACHED说明检查者没有真正运行 pytest产出和检查没有分离。第三git diff 有没有越界。循环应该只改源码不该动 tests/。跑几轮后执行git diff --name-only如果列表里出现 tests/ 下的文件说明停止条件里的约束没有被执行需要把约束写进检查者指令而不是只写在目标里。5.3 成功结果的形态一个健康的循环跑起来之后你会看到这样的节奏LOOP.md 每轮更新一次状态失败用例数量单调下降检查者每轮输出 CONTINUE 加具体原因直到某一轮输出 GOAL_REACHED 然后停止。整个过程你不需要敲任何提示只需要在它停下来之后看 diff。flowchart TD A[定时器触发] -- B[读取 LOOP.md 状态] B -- C[产出子 Agent 修改源码] C -- D[运行 pytest] D -- E[写回 LOOP.md] E -- F[检查者子 Agent 独立判定] F --|GOAL_REACHED| G[停止循环] F --|CONTINUE| A6. 本篇常见错排查循环跑不起来八成是下面几个问题。我按出现频率排一下。6.1 报 401 / 403Key 没生效最常见的原因是环境变量没被循环进程继承。循环脚本如果是通过 cron 或独立 shell 启动的它读不到你交互式 shell 里的 export。解决办法是把变量写进脚本能读到的地方或者在启动脚本里显式 source# 在循环启动脚本开头显式加载 source ~/.bashrc # 或者直接写进脚本 export ANTHROPIC_API_KEY$TAOTOKEN_API_KEY排查时先echo $ANTHROPIC_API_KEY确认非空再确认 base_url 没有多余斜杠。6.2 循环空转每轮状态不变如果 LOOP.md 一直不更新通常是提示里没有明确要求写回。模型不会自动帮你维护外部记忆你必须在/loop的指令里显式写「把结果写回 LOOP.md 的当前状态」。另一个原因是停止条件写得太模糊比如「让代码更好」——这种条件检查者无法判定只能一直 CONTINUE。6.3 检查者被产出者带偏如果检查者和产出者用同一个模型、同一段上下文它很容易顺着产出者的思路走把没通过的判成通过。解决办法是给检查者单独的指令明确「不要修改代码只运行验证命令」条件允许时换一个模型做检查。这就是产出与检查分离的意义。6.4 worktree 冲突两个循环改同一个文件没用 worktree 隔离时两个循环会同时改同一个工作目录git 状态会乱。表现是git status里出现大量非预期改动或者循环报「文件被占用」。解决办法是每个循环一个 worktree跑完再合并。合并冲突是正常的在合并阶段处理比在运行阶段互相覆盖要好得多。6.5 成本失控token 消耗成倍上升循环会自己花钱。子 Agent 各自跑模型、跑工具token 消耗成倍上升。如果发现用量异常先检查是不是给每一步都配了审查者。把「第二意见」花在真正值得的地方而不是每轮都全量审查。在 TaoToken 控制台可以按时间段看用量定位是哪个循环在烧https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。6.6 编排税并行度受限于你能看多少 diff一个残酷的现实约束你能并行跑多少个 Agent取决于你能认真看完多少 diff而不是工具支持多少路。工具支持 100 路并行没用你只看得完 3 个 diff那你的真实并行度就是 3。这不是配置问题是人的带宽问题只能靠减少并行数或提高审查效率来解决。7. 把循环补全成系统从最小骨架到长期运行跑通最小循环之后下一步是把它补成一个能长期运行的系统。路径大致是接上 Automations 做心跳用 Worktrees 做并行隔离用 Skills 固化项目知识用 Connectors 接入真实工具用 Sub-agents 做产出与检查分离最后给循环加上外部记忆脊柱和一个独立的检查者。如果你打算长期跑编码类循环或 Agent 编排可以了解一下 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合这种持续调用的场景。Claude Code 相关的接入说明在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 需要的话可以对照着看。7.1 堆叠循环向上还是向下当你能稳定跑一个循环之后真正的进阶是堆叠循环——一层套一层。这里要在两个方向之间做判断Going Down向下求稳是用杠杆换可靠性把自动化退回到人工把关适用于早期阶段Going Up向上求快是用可靠性换杠杆把原本人工的判断也交给一个新循环适用于模型变强、你有信心的时候。判断什么时候该往哪个方向走正是循环工程师区别于「只会按开始的人」的地方。Karpathy 那句「别再亲手修去做能随更多 Agent 扩展的系统」说的就是这个。7.2 三个必须盯住的成本向上堆叠不是免费的。Token 成本会成倍上升编排税会限制你的真实并行度而最隐蔽的是理解债——出活越快你与代码之间的认知缺口越大。验证仍在你身上循环无人值守它犯错也无人值守。最危险的是循环一顺你就懒得有观点了。同一个循环两个人能跑出完全相反的结果。一个人用它在自己深刻理解的工作上跑得更快另一个人用它来彻底回避理解。循环不知道区别你知道。设计循环比写提示更难而不是更容易——带判断地做是解药为逃避思考而做是加速剂。7.3 一个可以直接用的收尾习惯最后给一个我一直在用的习惯每次循环停下来之后不要只看它改了什么先看 LOOP.md 里它记录的「已尝试方案」。如果里面出现了你没想过的思路说明循环在帮你扩展如果里面全是重复的失败尝试说明停止条件或检查者指令需要调整。循环会忠实地放大你的一切——放大你的理解也放大你的偷懒。你放开了敲提示的手但没有放开判断力事实上判断力比以往任何时候都更值钱。
返回列表