ByteNoteByteNote
别再给 AI 写提示词了:让系统自己提示自己的循环工程
字

字节笔记本

2026年10月5日 · 约 19 分钟读完

别再给 AI 写提示词了:让系统自己提示自己的循环工程

API中转
¥120

2026 年 6 月,三个互不通气的人在同一周说了同一句话:"不要再给 AI 写提示词了。"

他们是 Peter Steinberger(OpenClaw 作者,帖子浏览量 800 万)、Boris Cherny(Anthropic Claude Code 负责人)和 Addy Osmani(Google Chrome 工程师)。

然后有人把这件事写成了一篇论文。不是学术象牙塔的理论,而是来自 Anthropic 内部、用真实案例和数据堆出来的工程方法论。

论文叫《Loop Engineering: The Anthropic Playbook for Designing Systems That Prompt Your Agents》。本文就来完整解析它。

一、这篇论文到底在说什么

用一句话概括整篇论文的核心主张:

循环让生成几乎免费,判断力成为唯一的稀缺资源。同样的循环,两个人构建,可以产生截然相反的结果。

这不是"又一个 XX 工程"概念炒作。论文开篇就承认:过去两年,提示词工程、上下文工程、框架工程接连出现,"想翻白眼是可以理解的"。

但这一次不同。 之前的所有术语都假设人坐在键盘前,逐行指挥 Agent。循环工程删除了这个假设:人不再在循环内部,而在循环外部,构建循环。

从"操作 Agent 的人"变成"设计 Agent 的人"。从"做发动机"变成"设计发动机"。

二、四层栈:循环在哪里

论文把 AI 编程的演进画成一个四层栈:

层管理什么核心问题
提示词工程写一个好提示词我该告诉模型什么
上下文工程窗口里放什么检索什么、总结什么、清除什么
框架工程武装一次运行哪些工具、哪些动作、什么算完成
循环工程调度框架怎么让它一遍又一遍地自己跑

循环工程是 AI 编程演进的第四层

每一层向上,关注的东西大一号:从一句话,到一个窗口,到一次运行,最后到一个自运行的循环。

关键在于,每层的失败爆炸半径不同。

考虑同一个 bug(Agent 误读函数返回值):

  • 提示词层:一次错误答案,人立即看到,改提示词
  • 上下文层:答案自信地错了,人清掉过时上下文
  • 框架层:Agent 改了文件,但 diff 可见,人发布前审查
  • 循环层:误读被写入状态文件,第二天被当作既定事实读回,在多轮中层层叠加。等人发现时,错误已成承重结构

循环工程中最重要的直觉:错误的代价与它在被发现前存活的轮次成正比,而循环按其构造就是一个最大化轮次的机器。

后面所有内容,评估器、检查点、预算上限,都是为了缩短错误与发现之间的距离。

三、循环的五个动作

论文把一轮循环拆成五个动作,丢掉任何一个循环就不转:

text
调度(Scheduling)
    │ 定时器或触发器启动
    ▼
发现(Discovery)
    │ Agent 自己找值得做的工作
    │ 读 CI / issue / 提交 / 上次状态
    ▼
交接(Handoff)
    │ 每个发现开一个隔离的 git worktree
    │ 多个 Agent 并行互不干扰
    ▼
验证(Verification)
    │ 第二个 Agent 审查第一个的产出
    │ 不同指令,有时是不同模型
    │ 这就是"能说不的东西"
    ▼
持久化(Persistence)
    │ 结果写到磁盘(PR / 状态文件 / 收件箱)
    │ Agent 会遗忘,仓库不会
    ▼
回到调度:下一轮

五个动作对应的失败模式

论文给的真实例子

Osmani 的晨间分诊循环,每天早上自动化自己启动:

  1. 分诊 Skill 读取昨天失败的 CI、开放 issue、最近提交
  2. 对每个发现打开隔离 worktree
  3. 子 Agent A 起草修复,子 Agent B 审查
  4. 连接器自动开 PR + 更新工单
  5. 处理不了的进收件箱等人
  6. 状态文件保存,第二天从这继续

没有一步需要人动手,但它在该等人的地方停下来等人。

四、六个部件:循环由什么构成

五个动作由六个部件实现:

部件实现的动作说明
自动化调度挂在定时器或触发器上,触发的是 Skill 不是文本墙
Worktree交接每个并行 Agent 一个独立目录,互不干扰
Skills发现项目知识永久化在 SKILL.md 里,偿还"意图债"
连接器发现+持久化基于 MCP 连接外部世界(Jira/数据库/Slack)
子 Agent验证把写代码的和评判的分开
记忆持久化磁盘上的持久状态:Agent 遗忘,仓库不遗忘

论文特别强调一个概念,意图债(Intent Debt):

每次你重新解释"这个项目是什么、规则是什么、陷阱在哪",你都在还一笔利息越来越高的债。Skill 把这笔债一次还清:知识永久化在文件里,Agent 每轮直接读。

五、生成器与评估器:论文的核心章节

这是整篇论文最重要的一章。

循环最难的部分不是让 Agent 运行,而是在里面放一个能说"不"的东西,而写代码的 Agent 最不可能说它。

问题:Agent 总是赞美自己

Anthropic 工程师 Prithvi Rajasekaran 在构建长时间运行的应用时发现:让 Agent 给自己刚写的东西打分,它倾向于自信地赞美。

这不是模型不够聪明。这是给自己的作业打分。代码写入时的上下文已经塞满了"为什么这样写"的理由,Agent 看自己输出时看到的不是结果,是自我说服的链条。

在循环里这个缺陷被放大:如果每轮的"够好了吗"都由刚写完的 Agent 决定,每轮都在向自己点头,跑得越久偏离真实质量越远。

解法:结构性地分离生成和判断

论文给出的四个步骤:

第一步:分离。写代码的 Agent 和评判的 Agent 必须是不同的,不同指令,最好不同模型。

第二步:把评估器调教成怀疑者。告诉它"假设代码是坏的,除非证明不是",默认立场是怀疑,不是信任。

第三步:让评估器行动,不只是读。接 Playwright MCP:打开页面、点击按钮、截图、检查 DOM。判断基础从"这个 JSX 看起来没问题"变成"我点了按钮,页面导航了,这是截图"。

第四步:停止条件由全新模型判断。Claude Code 的 /goal 命令:每轮后一个小而快的模型检查条件是否成立;不成立就继续跑,而不是返回给人。

循环的地板是它的评估器。生成器的水平决定循环能产出什么;评估器的水平决定它不会产出什么。

评估器的配置模板

markdown
# 评估器 Agent (.claude/agents/reviewer.md)
ROLE: 对抗性代码审查者
ASSUME: 这段代码是坏的,除非证明不是
DO NOT 赞美。找出失败的地方
CHECK,按顺序:
1. 它能跑吗?(执行,别只读)
2. 测试:运行它们,粘贴真实输出
3. 作者跳过的边界情况
4. 行为是否匹配工单?
USE Playwright MCP:打开页面、点击、截图、检查 DOM
VERDICT: 只有所有检查通过才 PASS
否则 REJECT + 列出每个原因

这个思路借自生成对抗网络(GAN):一个网络构建,一个挑错,移植到 Agent 上。

六、五种失败模式

论文列举了循环失败的方式,每种对应五个动作之一被跳过:

名称跳过了什么症状
点头循环验证数百轮从不对自己说"不",统计上不可能,证明没有真正的检查
失忆循环持久化每天早上从同一个地方开始,没有累积进展
手动循环调度最后一次运行是它演示的那天
盲目循环发现人仍然花早上时间决定循环该干什么
纠缠循环交接多个 Agent 改同一目录,合并一团糟

论文指出,这些失败不是独立的。缺少验证的循环通常也缺少持久化。实践中它们成簇出现:

纪律严明的循环安装全部五个动作,仓促的循环只安装发现和交接这两个产生可见输出的,跳过三个产生安全的。

七、三个真实案例

论文最有说服力的部分不是理论,是已经在跑的真实循环。

案例一:一个工程师的早晨

Osmani 的晨间分诊循环,第三节已经完整拆过。一个人、一台机器,每天早上干掉粗活。

案例二:Stripe 的 Minions,每周 1300 个 PR

Stripe 每周合并超过 1300 个拉取请求,没有一行手写。

这是企业级的循环。关键设计:

  • 触发器很轻:在 Slack 里向机器人发消息或加表情反应
  • 模型醒来之前,确定性编排器先组装上下文:扫描链接、拉取 Jira、用 Sourcegraph + MCP 定位代码
  • 能被硬编码的工作永远不交给概率模型
  • Agent 写代码,硬编码管线跑 linter(Agent 不能跳过),Agent 修 lint,硬编码步骤提交
  • 沙箱是 EC2 上的 Devbox,"牲畜不是宠物",每个环境随意替换

最反直觉的结论:

Minions 不是建立在更强的模型上。它是开源工具 Goose 的 fork。可靠性来自约束的质量,而非模型的大小。

那 1300 个 PR 仍然由人类审查,人没离开,只是换了桌子,从写代码换成了审查代码。

案例三:"睡觉时运行"到底依赖什么

论文做了一个重要区分:

本地 /loop桌面定时任务云端调度
机器要开吗要要不要
最小间隔1 分钟1 分钟1 小时
能看本地文件是是否
真正自主否否是

本地重运行意味着"我在的时候多跑几轮";云端调度意味着"我不在的时候也跑"。把两者混为一谈,就是为什么有人合上盖子后以为循环还在跑,其实已经停了。

成熟的循环通常两者都用:本地做紧密内循环检查,云端做过夜扫描。

八、四种隐性成本

循环跑得越欢,错得越静。 四种成本悄然累积,循环运行时一个都不响警报。

1. 验证债(Verification Debt)

每个打开并合并的 PR 省了时间,但省下的时间变成了等待偿还的未验证输出。问题藏在测试没覆盖的地方,藏在"能跑"和"正确"之间的缝隙里,积累到某个发布早晨突然爆发。

2. 理解腐烂(Comprehension Rot)

循环越快发布人没写的代码,存在的与人实际理解的差距越大。读代码比写代码无聊,循环把写代码拿走了;代码库在增长,人脑的地图停滞了。

3. 认知投降(Cognitive Surrender)

当循环自行运行,诱惑是停止持有观点,直接接受它给的东西。不是"没时间"而是**"不再想操心"**。循环越可靠,越容易外包判断。

4. Token 失控(Token Blowout)

循环孵化帮手、重试、一轮又一轮。一个 bug 能整夜空转,产出一张不熟悉的账单而不是修复好的代码。

四种成本的恶性循环

论文给出了一个让人后背发凉的例子:

一个循环一夜打开 20 个 PR,全部测试通过。3 个包含测试未覆盖的微妙错误。没有独立评估器,那 3 个合并了(验证债)。人合并了 20 个 PR 没读,心理模型落后 20 个改动(理解腐烂)。循环跑得太顺了,人停止读第二天早上的批次(认知投降)。循环整夜自由孵化帮手,账单是预估的三倍(Token 失控)。

三个埋藏的错误现在坐在人不再完全理解的代码库里,被一个已经停止查看的人守护着。

四种成本不是独立风险的清单;它们是穿着四张面孔的同一个失败。

九、保持工程师身份

这是整篇论文最打动人的章节。

同样的循环,由两个不同的人构建,可以到达截然不同的地方。一个用循环在已掌握的事情上加速,六个月后变强了。另一个用同样的循环这样再也不用理解了,六个月后变成了一台他读不懂的机器的守门人。

循环不是质量由工具固定的工具。它如此强大,不变地放大人带来的任何东西:带来理解,放大理解;带来懒惰,放大懒惰。它是一个忠实的乘号,它乘的是人。

循环让生成变得几乎免费:代码、计划、PR、修复。保持稀缺的是判断力:知道哪个计划是对的,哪行应该停,哪个输出跑起来没问题但根本上是错的。

循环可以生成一百个选项但不能真正选择。它选择"看起来合理",不是"真的对"。而那两者之间的差距就是工程师存在的理由。

因为循环是判断力的放大器,判断力的失误也被放大。旧世界里一个错误决定代价一段手写的错误代码,爆炸半径有限。新世界里一个错误决定被忠实地、批量地、一百次地执行,被一台不会停下来问"这对吗"的机器。

循环移除了曾经拯救工程师的慢速齿轮。人不能再指望过程慢到能在中途发现错误,因为过程没有慢速齿轮了。

十、判断力的经济学

论文做了一个经济学观察。

什么变得充裕:循环让代码、计划、修复、PR 变得充裕。一个构建了良好循环的工程师可以产出一个小团队的量。打字、样板代码、机械重构,坍塌向零成本。

什么保持稀缺:决定保留哪些充裕产出的判断力。循环可以生成一百个候选实现;它不能告诉你哪个是对的。

一个价值主要在机械劳动的工程师,快速打字、广博的 API 记忆、愿意啃样板,发现那价值在蒸发。一个价值在判断力的工程师,发现它被放大了。

同一个工具扩大了两种工程师之间的差距。它不会平等地抬升每个人;它乘上每个人带来的东西。

十一、操作纪律:三条铁律

1. 总是读一个样本

不是读循环产出的所有东西,那违背目的。而是每天读一个有代表性的样本,强迫自己解释每个改动:做了什么,为什么那样做。无法解释一个改动,就是你的心理地图落后于代码库的精确信号。

2. 先设上限再发布

在循环第一次无人值守运行前设硬天花板:每次运行预算、每日预算、最大重试次数。这些数字主要不是省钱;它们是断路器,把无界风险转换成有界风险。没有上限的循环,是把消费权委托给自己 bug 的循环。

3. 保持一扇门开着

在循环里建至少一个检查点让人暂停,不是因为人总是干预,而是因为暂停的存在让人保持在能干预的位置。焊死每扇门的工程师,在必须进去的那天发现不再持有钥匙。

十二、构建你的第一个循环

论文给了完整的、带注释的第一个循环代码。Stripe 是终点,不是起点。第一个循环应该小到几乎看不出是个系统。

五步:

  1. 运行 /loop:按间隔重运行同一任务
  2. 读 CI 和 issue,先分诊:给它一个 prompt 每天看三件事
  3. 加状态文件:把结果写到磁盘,Agent 遗忘,仓库不遗忘
  4. 加评估器:/goal 跑到条件满足,由不同模型判断
  5. 加 worktree 做并行:每个后台 Agent 独立 worktree

安全扩大循环的原则

先增加循环发现的东西,再增加它并行做的量。先证明评估器能抓住真正的错误,再信任它门控多个 Agent。Stripe 的可靠性来自多年硬化确定性门,不是从大规模开始。一个循环赢得运行更多 Agent 权利的方式,是先证明它能停住一个坏的。

十三、论文的终极主张

横跨全部章节,论点有一条脊柱。循环工程是四层栈的第四层。一轮是五个动作,由六个部件实现。失败就是那些动作被跳过。最难的是验证,因为给自己的工作打分的 Agent 会赞美它。

循环已经在实践中运行,从一个工程师的早晨到每周 1300 个 PR 的企业。让它们可靠的是约束的质量,而非模型的大小。它们积累四种隐性债务,互相强化,同时到期。

因为循环是构建者的放大器,同样的循环由两个人构建产生相反的结果,差别在一两个检查点上,它们决定了后来谁掌控。

要带走的一句话:

停止提示 Agent,设计提示它的系统,但像一个打算继续当工程师的人那样设计,而不只是按"开始"的人。

十四、首月的田野笔记

论文结尾有四条给团队的实操建议:

  1. 存活的是赢得信任的小循环,不是要求信任的大循环
  2. 工程精力应该花在评估器上:强生成器配弱审查者产出自信的垃圾,中等生成器配尖锐审查者产出可靠进展
  3. 人工审查点不是临时脚手架:它是保持循环可信的永久特征,拆除的那天就是理解腐烂认真开始的那天
  4. 预算上限应该假设会有东西整夜空转来设

最后的总结让人深思:

让团队惊讶的是,循环"就是能用"的愉快体验多快侵蚀了让它能用的纪律,而那种侵蚀在某个它不再能用的早晨之前是不可见的。手册最终不是关于构建循环,那部分现在确实容易了,而是关于保持那种在任何给定早上仍然能回答"循环刚做的事到底对不对"的工程师。


本文是对论文《Loop Engineering: The Anthropic Playbook for Designing Systems That Prompt Your Agents》的解析。论文基于开源指南《Loop Engineering: Stop Asking Me What It Is》(橙皮书 v260615):循环框架归功于 Addy Osmani,生成器与评估器的发现归功于 Anthropic 工程师 Prithvi Rajasekaran,企业案例归功于 Stripe 的 Steve Kaliski。

相关文章

分享: