初级

循环工程清晰解析

循环工程清晰解析

你的信息流突然被同一件事刷屏了。别再给你的智能体写提示了,开始设计循环吧。
Boris Cherny,Claude Code 的构建者,直言不讳地说:"我不再给 Claude 写提示了。我运行着一些循环。我的工作是编写循环。"
这位全球最受欢迎的编码智能体之一的构建者,并不给它写提示。那他到底在做什么?
这就是循环工程背后的核心理念。现在,我们来拆解一下为什么它比看起来要难得多。

首先,循环本身#

智能体不是一个魔法盒子。其核心就是一个简单的循环:
python
while True:
    response = model(context)
    if response.has_tool_calls():
        results = run_tools(response.tool_calls)
        context += results
    else:
        break
模型读取上下文。它请求调用一个工具。你运行该工具并将结果反馈回去。模型再次读取,如此重复,直到它不再请求工具为止。
模型 → 工具 → 上下文 → 重复。
这就是让人惊讶的部分。这个循环本身已经解决了。每个严肃的智能体框架最终都会归结为大致这六行代码。没有人会在 while 语句上竞争。
那么,如果循环本身微不足道,每个人究竟在工程化什么?

工作重心转移到了模型之外#

AI 的重心一直在远离模型本身。
  • 提示工程:你发送的文字。
  • 上下文工程:模型看到的一切,不仅仅是你的指令。
  • 框架工程:模型周围的代码,用于运行工具、跟踪状态和处理错误。
  • 循环工程:驱动整个系统朝着目标前进的自主循环。
每一层都包裹着前一层。你并没有停止关心提示。你只是意识到提示是一个更大系统的一小部分。
LangChain 说得一清二楚:智能体 = 模型 + 框架。如果你不是模型,你就是框架。
这里有一个发现,应该让你重新排列优先级:框架现在比模型更重要。团队保持模型不变,只改变其周围的代码,就能从基准测试的中游跃升至前五名。相同的大脑,不同的循环。
循环工程就是构建那个大脑运行所需一切环境的学科。让我展示一下那些真正会出问题的部分。

难点 1:知道何时停止#

这是没人提醒过你的问题。
当智能体停止请求工具时,它的回合就结束了。但这并不等同于完成任务。
想象一个编码智能体。它写了一些代码,环顾四周,看到取得了进展,然后宣布任务完成。但测试仍然失败。它还是宣告了胜利。
终端消息结束的是回合,而不是任务。混淆这两者是循环出错最常见的方式。
好的循环会因正确的原因而停止,因此你需要设置几层制动机制:
  • 最大迭代次数:一个硬性上限,防止卡住的智能体无限运行。
  • 预算和时间限制:对令牌、金钱和时间的上限。
  • 无进展检测:如果它用相同的参数重复调用同一个工具,说明它在空转。
  • 真正的完成检查:一个自动化的条件,证明任务已完成。
最后一点至关重要。"完成"应该意味着测试通过,而不是智能体自我感觉良好。

难点 2:保持上下文清洁#

长循环会从内部腐烂。
智能体运行的回合越多,其上下文中堆积的垃圾就越多,比如旧的工具输出、死胡同和过时的推理。随着垃圾堆的增长,模型性能会下降。这个领域称之为上下文腐烂
循环会加剧这种螺旋。腐烂的上下文导致更糟糕的决策,这又增加了更多噪音,进一步加剧上下文腐烂。人们称之为厄运循环,你一定感受过:智能体运行时间越长,变得越笨。
你需要将上下文视为预算,而不是一个桶,来对抗它:
  • 压缩:当对话变长时,对其进行总结,然后从摘要继续。
  • 卸载:将巨大的输出推送到一个文件,只保留你需要的片段。
  • 子智能体:将混乱的子任务交给一个独立的智能体,只让其干净的结果返回。
直觉是保留一切,以防万一。但技巧在于知道该丢弃什么。

难点 3:智能体能实际使用的工具#

循环的好坏取决于其内部的工具。
堆上一百个工具,智能体就会迷失方向,不知道该用哪一个。一组精炼、专注且不重叠的工具才是制胜之道。Anthropic 的经验法则很犀利:如果人类工程师都无法确定哪个工具合适,那智能体更不可能。
有两件事比人们预期的更重要:
  • 让写入操作可安全重复:循环会重试,如果重试的"创建客户"调用创建了第二个客户,你醒来就会发现重复的记录和重复的账单。任何改变状态的操作都必须能够安全地调用两次。
  • 为智能体编写错误消息,而不是为人:一个好的错误消息会告诉智能体下一步该做什么。在发布一个工具之前,问问自己,一个 LLM 读到它的错误信息时,是否知道下一步该怎么做。
在循环中,错误不是死胡同。它是下一个指令。

难点 4:能够说"不"的东西#

自主循环有一个安静的失败模式:被单独留下的智能体倾向于同意自己。
整个讨论中最犀利的评论一针见血:设计循环只是工作的一半,另一半是在循环中放入一个能够说"不"的东西,比如测试、类型检查或真正的错误。
没有批评者的循环,只是一个对自己的工作点头称是的智能体。
解决办法是将创造者与检查者分开。一个模型负责工作。另一个不同的检查机制(通常是另一个模型或硬性测试)来评估它。工作者不给自己打分。

真正的转变#

现在,Cherny 的话就说得通了。
提示是你一步步地引导智能体。循环工程是你构建一个能够引导智能体的系统,然后退后一步。
你的工作从给出指令转变为设计三件事:
  1. 目标:写成智能体可以自行对照检查的成功标准。
  2. 循环:带有合理的制动机制,使其能够良好地停止。
  3. 验证器:确保"完成"是被证明的,而不是声称的。
Andrej Karpathy 捕捉到了这种心态:不要告诉模型该做什么,给它成功标准,然后看着它运行。他运行过夜的研究循环,循环会调整脚本、测试它、保留有效的、丢弃无效的,而他自己完全不在循环中。他只需安排一次,然后按下启动键。
这就是整个转变。你不再是执行者,而是成为设计机器的人。

从何开始#

你不需要在第一天就拥有一个过夜自主智能体。循序渐进地构建:
  1. 从基本循环开始,并立即添加最大迭代次数上限、超时时间和成本上限。
  2. 在开始之前,将"完成"定义为一个自动化检查,而不是事后的感觉。
  3. 保护上下文:压缩长运行、卸载大输出、隔离混乱的子任务。
  4. 审计你的工具:保持工具数量少且专注,使写入操作可安全重复,并重写错误信息以便智能体能够据此行动。
  5. 在循环中加入一个批评者:只有当你信任那个说"不"的机制后,才完全放手。

要点总结#

循环工程不是一个你可以安装的框架或工具。它是一种将你的努力重心转移到何处的转变。
模型正在变成一种商品。它周围的循环才是真正工程所在的地方。
最优秀的构建者不再问"我应该告诉智能体做什么?"他们开始问"什么样的系统可以在没有我的情况下完成这件事?"
如果你能很好地回答这个问题,你也会停止写提示。
以下是总结:
循环工程的关键要点。
感谢阅读!
干杯 :) Akshay.