2026 年如何搭建你的第一个 AI 循环

How To Build Your First AI Loop in 2026

中文译文 · 23k 字

一句话摘要

搭建第一个 AI 自动化循环的方法

如何在 2026 年构建你的第一个 AI Loop2026 年 7 月 10 日 · 20 分钟阅读 · 查看原文 ↗ Claude AI 自动化 Loops 上个月,两位在世的、最资深的 AI 工程师说了同样的话。 Peter Steinberger,OpenClaw 的创作者,现在在 OpenAI: "你不该再去提示 coding agent 了。你应该设计那些去提示你的 agent 的 loop。" Boris Cherny,Anthropic 的 Claude Code 负责人: "我不再提示 Claude 了。我让在跑的 loop 去提示 Claude、去弄清楚该做什么。我的工作是写 loop。" 大多数人读到这个时想:那到底是什么意思? 而更重要的是:我怎么构建一个? 这篇文章精确地告诉你怎么做。 没有代码就没有理论。没有上下文就没有代码。真实的步骤。真实的命令。复制就能跑。 大多数人使用 AI 的方式已经过时了 写提示词。等。读输出。手动修它。再写一个提示词。 你就是那个 loop。 每一步都要经过你。AI 等着。你决定。AI 又等着。 你停下的那一刻,一切就停了。 2026 年跑得最快的构建者,不是写出更好提示词的人。 他们是在构建替他们做提示的系统的人。 杠杆点已经移动了。 从"输入提示词"→ 到"设计 loop"。 GPT-5.6 改变了什么? GPT-5.6 并没有改变对 loop 的需求。 它提高了 loop 的价值。 模型越好,在两次提示之间让它闲置的成本就越高。 在终端工作流里,GPT-5.6 在这些方面明显更好: → 理解大型代码库 → 保持实现的一致性 → 遵循多步骤计划 → 从失败的尝试中恢复 → 充当一个严格的验证者 结果不是"更好的提示"。 而是每个任务更少的人工干预。 一个 loop 到底是什么 简单的定义: 一个提示词回答一次,然后停。 一个 loop 一直工作到活真正干完。 不是到它生成出一个答案为止。 是到它达到一个被验证的结果为止。 每一个正经的 AI agent 都在跑同一个底层循环: → 发现(Discover)——需要做什么? → 执行(Execute)——干活 → 验证(Verify)——它真的成功了吗? → 迭代(Iterate)——没完成?修了再重复 → 停止(Stop)——条件满足,或触达硬上限 Claude Code。Cursor。Codex。 在底层,它们都在跑这个 loop。 一个提示词和一个 loop 之间的区别,不是模型。 是"是否有某个东西检查这项工作,并一直做下去直到它通过"。 4 条件测试——在构建任何东西之前先跑这个 大多数 loop 死在这里。 一个 loop 只有在全部 4 个条件都为真时,才值得它的搭建成本。 漏掉一个,这个 loop 的成本就超过它的回报。 任务会重复。至少每周一次。一次性任务还是用一条好提示词更划算。 验证是自动化的。必须有什么东西能在你不在场时判它失败。测试。Linter。构建。类型检查。没有闸门 = agent 在给自己的作业打分。 你的 token 预算能吸收浪费。loop 在每一次迭代都重新读完整上下文。它们重试、探索、烧 token,无论这次运行有没有交付任何东西。这是没人提的成本。 "完成"是客观的。一个通过或失败的测试。一个编译得动或编译不动的构建。不是"当它看起来不错"。如果完成需要人的判断,那就保持手动。 4 个全过 → 构建 loop。 任何一个不过 → 用一个提示词代替。 诚实的版本:大多数开发者现在还不需要重型 loop。每个人都能用的是简单 loop。我们马上会构建一个。 安装 Slate Slate 是一个 AI coding agent,正是为这件事而构建的——在你的终端里跑长时、并行、多步骤的任务。 由 RandomLabs 构建。第一个专门为 swarm(群体)编排而构建的 agent。 它和 Claude Code 或 Cursor 的区别: → 自动为每一步选择正确的模型。用 Claude 规划、用另一个搜索、用 Codex 执行——Slate 决定。 → 在你的代码库上同时并行跑多个 subagent → 在长达数小时的多会话里管理自己的上下文 → 和你并肩工作——而不只是为你工作 一行安装它: 导航到你的项目并启动它: 这会打开 Slate TUI——一个终端界面,你在里面给它任务,看它工作。 第 1 步——设置你的工作区 在 Slate 能在你的项目上跑 loop 之前,它需要理解你的代码库。 在你的项目根目录创建一个 AGENTS.md 文件。这是 Slate 在每个会话开始时读的上下文。 Slate 启动时自动读这个文件——不用每个会话都粘一遍。 在 Slate 里添加你的工作区目录: 或者用 @ 提及内联引用特定文件: 第 2 步——配置 Slate 在你的项目根目录创建 slate.json,来控制 Slate 的行为。 它做什么: → "*": "allow" ——Slate 可以读写文件,不用每次都问 → "bash": "ask" ——Slate 在跑 shell 命令前先问(保持开启,直到你信任它) → 模型配置——便宜的快速模型用于搜索,昂贵的模型用于主推理 对于想要零提示的 CI 或自动化运行: 第 3 步——你的第一个任务(还不是一个 loop) 在构建 loop 之前,先让一次手动运行变得可靠。 这是最被跳过的一步。也是大多数 loop 在生产中失败的原因。 给 Slate 一个真实的任务: 看着 Slate 工作。它会: 搜索你的文件 建立对架构的理解 起草 ARCH.md 在停下之前对照你的请求审查它 这已经是一个迷你 loop——它在完成之前检查自己的输出。 对于一个更长的任务: Slate 返回一个计划。你迭代它: 批准计划。Slate 自主执行。 第 4 步——创建一个 Skill(让 loop 可复用) Skill 是你不再每个会话都重新解释你项目的方式。 写一次。Slate 在每次相关运行时读它。 创建文件夹结构: 写这个 skill: 在 Slate 里列出可用 skills: 手动激活一个: 或者 Slate 在它判定某个 skill 与当前任务相关时自动激活它。 第 5 步——加状态(loop 的记忆) agent 会忘。 文件不会。 在你的项目根目录创建 STATE.md: 通过加到 AGENTS.md,告诉 Slate 在每个会话开始时使用它: 没有状态:每次运行从零开始。 有状态:每次运行接续上一次,并复利。 第 6 步——构建真正的 loop 现在你有: → 工作区设置好了(AGENTS.md) → 配置设好了(slate.json) → 一次可靠的手动运行被证明过了 → 一个 skill 写好了(ci-triage) → 状态文件创建了(STATE.md) 是时候把它包成一个真正的 loop 了。 选项 A:队列文件 loop(最简单) 创建 loop.md: 运行它: Slate 读队列文件,把每个块当作一条排队的消息来跑。 选项 B:无头/CI loop(自动化) 在 GitHub Action 或 cron 任务里非交互式运行: 在一个 GitHub Actions 工作流里: 现在每次 CI 失败都会自动触发 triage loop。 直到升级之前都不需要人。 第 7 步——加 sub-agents(maker-checker 分离) 对任何 loop 来说,唯一最重要的结构性改进。 绝不要让同一个 agent 给自己的作业打分。 写了修复的那个模型,打分太宽松了。 在 Slate 里,你可以为不同角色设不同模型: 然后这样写你的任务,让 Slate 自然地使用这种分离: Slate 自动编排 subagents。 搜索 agent 用一个快速便宜的模型。实现 agent 用一个更强的模型。验证者用一个严格的模型,且无法访问 maker 的推理。 这种分离正是 Slate 能在单个任务上跑 5 个并行 subagent 的原因——每个都专精,每个都隔离。 第 8 步——状态 loop 模式(用于长时任务) 对于跑几小时或几天的任务,在你的任务提示词里用这个模式: 每天早上跑这个: --continue 接续最近的会话,而不是从新开始。 每天,多一条路由。STATE.md 追踪一切。 loop 精确地从它停下的地方接续。 第 9 步——为你最常用的 loop 加自定义命令 把自定义 slash 命令加到 slate.json,让你的 loop 总是一键即达: 现在在 Slate 里: 每一个都即时跑你预先写好的 loop 提示词。 你今天就能跑的 3 个完整 loop Loop 1:CI 失败 triage(我们刚构建的那个) 何时:每次 CI 失败 做什么:分类 → 修简单的 → 升级难的 → 开 PR 状态:STATE.md 闸门:测试通过 搭建时间:30 分钟 Loop 2:晨间简报 何时:每个工作日早上 7 点(cron 任务) 做什么:扫描过去 24 小时的 commit、PR 和 open issue → 写一份 5 条要点的简报 → 发到 Slack Loop 3:依赖升级 loop 何时:每周一 做什么:扫描过期的包 → 测试兼容性 → 为安全的升级开 PR 会花钱的失败模式 在排任何东西之前,先了解这些。 Ralph Wiggum Loop agent 在一个干了一半的活上宣布完成。 提前退出。loop 继续烧钱。静悄悄地。 修复:由一个全新的模型来检查的硬停止条件。 目标漂移 在长会话里,早期的约束消失了。 第 3 条消息里的"绝不碰 src/billing/"到第 47 条消息就没了。 修复:加一个 VISION.md,让 Slate 在每个会话开始时重读。 自我偏好偏差 maker 给自己的作业打分。永远给自己通过。 修复:一个完全无法访问 maker 推理的验证者 subagent。 明确告诉 Slate: Agentic 懒惰 loop 在部分完成时把一个任务叫成"够好了"。 尤其是在模糊的成功标准上。 修复:只用客观的停止条件。 真正要紧的 Slate 专属技巧 一些让 Slate 在实践中不同于其他 agent 的东西。 在它工作时排队消息 Slate 正在跑一个长任务。你想起一件重要的事。 按 Tab 排队这条消息——它在当前任务完成后运行,不打断它。 运行中转向 如果 Slate 走错了方向,你不必停掉它: 用 /enter-mode-next 在 steer / queue / interrupt 模式之间循环。 直接跑 shell 命令 在 Slate 会话里跑命令,不用切到另一个终端: Slate 读输出,并在下一步动作里用它。 团队配置的 server 模式 把 Slate 作为 server 跑,从多个终端连上去: 对和 Slate 结对编程、或在一台远程机器上跑它很有用。 完整设置清单 在跑你的第一个真正的 loop 之前: 在排任何东西之前,把每个框都勾上。 跳过一个,loop 要么静默失败,要么给你记一堆空账。 更多 loop 灵感 一旦你理解了这个模式,瓶颈就从"我怎么构建一个 loop"变成了"我下一步该构建什么 loop"。 signals.forwardfuture.com/loop-library 的 Forward Future Loop Library 是个好地方,可以浏览跨品类真实在跑的 loop——内容、工程、运营、研究。 当你在一个地方看到 20 个正在工作的 loop 时,你就不再以一次性提示词来思考了。 不舒服的真相 两个构建者可以跑完全相同的 loop,得到相反的结果。 一个用它来在自己已经深刻理解的工作上更快地推进。 另一个用它来回避理解工作本身。 loop 不知道这两者的区别。 你知道。 loop 设计比提示词工程更难——不是更容易。 重点不是工作变得更容易了。 是杠杆点移动了。 构建这个 loop。 但要像一个打算继续做工程师的人那样去构建。 而不只是那个按下"go"的人。 而新的 GPT-5.6 并没有取代这个原则。如果说有什么,它强化了它。 前沿不再是谁写出最巧妙的提示词。 是谁在越来越强的模型周围设计出最好的系统。 60 秒回顾 loop 是什么: → 提示词 = 问题。loop = 工作。 → 发现 → 执行 → 验证 → 迭代 → 停止 4 条件测试: → 任务重复 / 验证自动化 / 预算能吸收浪费 / 完成是客观的 5 个设置步骤: → AGENTS.md → slate.json → 一次手动运行 → SKILL.md → STATE.md 然后包起来: → loop.md 队列文件,或在 CI 里无头跑 slate 失败模式: → Ralph Wiggum(提前退出)/ 目标漂移(忘约束)/ 自我偏好偏差(maker = checker)/ Agentic 懒惰(够好了) Slate 的优势: → 每步自动选模型 → 带隔离的并行 subagents → 长会话管理 → 你的 loop,你的设计 如果这有用: → 转发它,分享给你认识的每一个构建者 → 关注 @sairahul1 获取更多这样的系统 → 收藏这个——光是那份设置清单就值得存下来 订阅 theaibuilders.co 获取更多这样的有趣文章 我写 AI、构建产品,以及那些在你睡觉时也在运行的系统。 提到的工具: → Programs by Slate: randomlabs.ai/s | @wearerandomlabs → Slate 文档: docs.randomlabs.ai → Forward Future Loop Library: signals.forwardfuture.com/loop-library 提示词 slate --continue "$(cat loop.md)" 读 STATE.md 来理解已经试过什么。 在最后一次构建的所有失败测试上跑 CI triage skill。 对每个失败: - 用 ci-triage skill 的规则分类它 - 为 bug 和依赖问题起草修复 - 升级 env 和 infra 问题 跑修复。检查测试是否通过。 如果测试通过 → 开 PR。 如果测试仍然失败 → 记进 STATE.md 并停。 用这次运行做的所有事更新 STATE.md。 硬停止:最多 8 次尝试。到上限时,报告当前状态。 # loop.md for morning brief cat > morning-brief-loop.md << 'EOF' Read the last 24 hours of: - git log --since="24 hours ago" --oneline - Open PRs in draft or review - GitHub Issues opened or updated in the last 24h Write a morning brief: - 3 most important things that happened - 2 things that need attention today - 1 thing at risk of blocking someone Keep it under 120 words. Post to the #engineering Slack channel. EOF # run on a schedule with cron 0 7 * * 1-5 slate run "$(cat morning-brief-loop.md)" --dangerously-skip-permissions slate run "Run the test suite and fix any failures" --dangerously-skip-permissions --output-format stream-json 不,别加一个新的 auth provider 类。 让它遵循 src/auth/api-key.ts 里现有 ApiKeyAuth 的同样模式。 !npm test # run tests and send output to Slate !git diff HEAD # check what changed !git status # see current state { "models": { "main": { "default": "anthropic/claude-opus-4.6" }, "subagent": { "default": "anthropic/claude-sonnet-4.6" }, "search": { "default": "anthropic/claude-haiku-4.5" } } } 请审查 @src/api/routes.ts 并提出改进建议 npm i -g @randomlabs/slate 你在跑一个多会话 loop。 目标:把所有 Express 路由迁移到新的 ApiError 模式。 在 STATE.md 里追踪进度。 每个会话开始时: 1. 读 STATE.md 2. 找到"剩余路由"里第一个未完成项 3. 只做那一项 每个会话结束时: 1. 把完成项移到 STATE.md 里的"已完成路由" 2. 在"阻塞"里记录任何阻塞 3. 更新"上次运行"时间戳 4. 干净地停 STATE.md 格式: --- ## Done routes - [x] /api/users (2026-06-27) - [x] /api/auth/login (2026-06-28) ## Remaining routes - [ ] /api/payments/checkout - [ ] /api/payments/refund - [ ] /api/admin/users ## Blockers - /api/payments/refund — requires human review (touches billing logic) ## Last run 2026-06-28 14:30 UTC --- 硬规则: - 未经人工批准绝不碰 src/billing/ - 每次路由迁移后都跑测试 - 每个会话完成一条路由后就停 嘿 Slate,研究一下我的代码库里的认证流程, 然后为添加 OAuth2 支持做一个计划。 确保你查看 @src/auth/ 和 @src/api/routes.ts # VISION.md — 每个会话开始时读 ## 核心目标 把所有 Express 路由迁移到 ApiError 模式。 ## 硬约束(绝不违反) - 未经人工批准绝不碰 src/billing/ - 绝不禁用失败的测试 - 开任何 PR 前总是跑完整测试套件 ## 当前优先 src/api/payments/ 里的路由——格外小心地处理 停止条件:tests/auth/ 里所有测试通过 且 lint 返回 0。 用一次单独的检查运行来验证,而不是 agent 自己的判断。 硬上限:8 次迭代。到上限:报告状态并停。 mkdir -p .slate/skills/ci-triage touch .slate/skills/ci-triage/SKILL.md # trigger slate run "$(cat loop.md)" --dangerously-skip-permissions --output-format stream-json # 或在 GitHub Actions 里——见上面的第 6 步 name: CI Triage Loop on: workflow_run: workflows: ["CI"] types: [completed] jobs: triage: if: ${{ github.event.workflow_run.conclusion == 'failure' }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Slate run: npm i -g @randomlabs/slate - name: Run triage loop env: SLATE_API_KEY: ${{ secrets.SLATE_API_KEY }} run: | slate run "$(cat loop.md)" \ --output-format stream-json \ --dangerously-skip-permissions \ --workspace ./src \ --workspace ./tests [Slate 正在实现修复的中途……] 你:等等——别为这个加一个新类。用 src/utils/errors.ts 里现有的 BaseError [Enter——立即转向] Slate:明白,切换方法去用 BaseError…… # AGENTS.md ## 这个代码库做什么 [项目的一段描述] ## 架构 - src/api/ —— Express API 路由 - src/services/ —— 业务逻辑 - src/db/ —— 数据库模型(通过 Prisma 的 PostgreSQL) - tests/ —— Jest 测试套件 ## 关键命令 - npm test —— 跑完整测试套件 - npm run build —— TypeScript 编译 - npm run lint —— ESLint 检查 - npm run typecheck —— tsc --noEmit ## 规则 - 未经人工批准绝不修改 src/billing/ 或 src/auth/ - 把任何任务标记完成之前总是跑测试 - 用 src/utils/errors.ts 里现有的错误处理模式 ## 环境 - .env.slate 包含 Slate 需要的所有 env 变量 slate --queue loop.md cd /path/to/your/project slate /triage /review src/api/payments.ts /migrate 请审查我整个代码库的架构。 创建一个 ARCH.md,包含: - 当前结构 - 模块间的依赖 - 3 个可以改进的地方 先看 @src/,然后看 @tests/ □ npm i -g @randomlabs/slate 已安装 □ 已创建 AGENTS.md,带项目概览、命令、规则 □ 已创建 slate.json,带权限和模型配置 □ 一次手动运行完成并验证可靠 □ 为你的第一个重复任务写好 SKILL.md □ 已创建 STATE.md 并在 AGENTS.md 里引用 □ 已写好带明确停止条件的 loop.md □ 迭代的硬上限(先 8 次) □ 验证者不是 maker 那个 agent □ 任何不可逆动作(PR、部署)上的人工审查闸门 验证者 agent 不应看到实现 agent 的工作。 它应该只看到:原始测试需求和测试输出。 如果测试通过 → 批准。如果测试失败 → 拒绝。除此之外没有意见。 ## 会话开始 总是先读 STATE.md。从上次运行停下的地方接上。 每次运行结束时更新 STATE.md,写下做了什么、下一步是什么。 slate run "$(cat loop.md)" --output-format stream-json --dangerously-skip-permissions [Slate 正在做迁移任务……] 你:对了,确保新模式也处理 userId 为 null 的情况 [Tab——排队] [Slate 完成当前步骤,然后读你排队的消息] /workspace add ./src /workspace add ./tests /workspace list { "command": { "triage": { "description": "Run CI triage loop", "template": "Read STATE.md. Run the ci-triage skill on all failing tests. Update STATE.md when done.", "agent": "build" }, "review": { "description": "Review a file for correctness", "template": "Review @$ARGUMENTS for correctness, edge cases, and consistency with surrounding code." }, "migrate": { "description": "Migrate one route to ApiError pattern", "template": "Read STATE.md. Migrate the next incomplete route to ApiError pattern. Run tests. Update STATE.md." } } } # Loop State — CI Triage ## 上次运行 2026-06-28 03:30 UTC —— 分类了 7 个失败,起草了 3 个修复,升级了 4 个 ## 进行中 - claude/fix-auth-token-refresh —— 本地测试通过,等待 CI - claude/fix-flaky-payment-webhook —— 已应用重试模式,监控中 ## 已完成 - claude/bump-axios-1.7.4 → 已合并(CI 绿灯) - claude/lint-fix-pass-june-28 → 已合并 ## 升级给人类 - src/billing/refund.ts —— 测试以 3 种方式失败,根因不明 - ci/staging-runner —— infra 超时,不是代码问题 ## 学到的教训 - 2026-06-27:PowerShell 在这个 Windows runner 上触发 TLS 1.2 问题。用 bash。 - 2026-06-26:tests/e2e/checkout 需要环境里的 Stripe webhook secret。缺失就跳过。 完成当:npm test 返回退出码 0 且 npm run lint 返回退出码 0。 不是当"测试看起来不错"。不是当"大多数测试通过"。 两个命令都退出码 0。那是唯一的完成。 --- name: "ci-triage" description: "Classify CI failures by root cause and draft fixes for the easy ones." --- # CI Triage Skill ## 我做什么 当一次 CI 运行失败时,我: 1. 读测试输出 2. 分类失败:env 问题 / flaky 测试 / 真实 bug / 依赖升级 / infra 3. 为 bug 和依赖问题起草修复 4. 把 env 和 infra 问题升级给人类 ## 分类规则 - env:缺失 secret、错误的 env 变量 → 标记给人类 - flake:不改代码、重试就通过 → 重试一次,然后提 issue - bug:与最近 commit 绑定的确定性失败 → 起草修复 - dependency:与版本升级绑定的失败 → 起草回滚 PR - infra:超时、OOM、runner 问题 → 立即升级 ## 修复模式 - Auth 测试失败 → 先查 src/auth/middleware.ts - 数据库测试失败 → 验证 CI 环境里跑过 migration - E2E 失败 → 对照最新快照查 UI 选择器 ## 绝不做 - 禁用失败的测试 - 未经询问修改 CI 配置 - 碰 src/billing/ 或 src/payments/ ## 状态 每次运行后更新 STATE.md: - 检查过的文件 - 做出的分类 - 开的 PR - 升级的事项 { "$schema": "https://randomlabs.ai/config.json", "permission": { "*": "allow", "bash": "ask" }, "models": { "main": { "default": "anthropic/claude-opus-4.6" }, "subagent": { "default": "anthropic/claude-sonnet-4.6" }, "search": { "default": "anthropic/claude-haiku-4.5" }, "reasoning": { "default": "openai/gpt-5.6" } } } @ci-triage 请 triage 今天失败的测试 请修复失败的 auth 测试。 第 1 步:让一个搜索 agent 探索 src/auth/ 来理解当前实现。 第 2 步:让一个单独的 agent 基于发现来实现修复。 第 3 步:让第三个 agent 对照原始测试需求验证这个修复—— 这个 agent 不应该看过实现。 第 4 步:只有验证者批准了才开 PR。 # 终端 1——启动 server slate serve --port 7777 # 终端 2——连接 TUI slate attach http://localhost:7777 --dir /path/to/project cat > deps-loop.md << 'EOF' Read STATE.md. Run: npm outdated For each outdated package: 1. Check if the version bump is major (breaking) or minor/patch (safe) 2. For minor/patch: update the package, run npm test 3. If tests pass: open a PR 4. If tests fail: record in STATE.md as "needs human review" 5. For major bumps: always escalate to humans Hard rules: - Never bump more than 5 packages in a single loop - Never bump packages in the "peer dependencies" section - Always run the full test suite after each bump, not just related tests Update STATE.md with what was bumped and what was escalated. EOF # 每周一跑 0 9 * * 1 slate run "$(cat deps-loop.md)" --dangerously-skip-permissions /skills 链接 signals.forwardfuture.com/loop-library theaibuilders.co randomlabs.ai/s docs.randomlabs.ai theaibuilders.co/ 标签:# X # Claude # AI # 自动化 # Loops # 指南 # Chatgpt # Sonnet 相关文章 别再自己干活:构建永不睡觉的 AI Loops 2026 年 Playbook AI 自动化 Claude Loops

原文参考:https://maxed.wiki/posts/how-to-build-your-first-ai-loop-in-2026/ (Maxed.wiki,本页为站内中文整理)