如何设计智能体循环
作者:Simon Willison
2025年9月30日
像 Anthropic 的 Claude Code 和 OpenAI 的 Codex CLI 这样的编码智能体,实实在在地改变了我们利用大语言模型 (LLM) 编写可用代码的游戏规则。这些 AI 智能体 (AI Agent) 现在可以直接运行它们自己写的代码、修正错误、深挖现有的实现细节,甚至还能通过做实验来为问题找到有效的代码解决方案。
然而,就像现代 AI 领域的许多事物一样,想要完全释放这些新工具的潜力,背后大有学问。
一项至关重要的新技能应运而生:设计智能体循环 (designing agentic loops)。
你可以把编码智能体想象成一种用“蛮力”解决编程问题的工具。如果你能把问题简化成一个清晰的目标和一套可以用来迭代的工具,编码智能体通常就能硬生生地找到一个有效的解决方案。
我个人对大语言模型智能体的定义是:一个通过循环调用工具来达成目标的系统。而用好它们的艺术,就在于为它们精心设计所使用的工具和循环过程。
YOLO 模式的乐趣
智能体天生具有危险性——它们可能会做出错误的决策,或成为恶意攻击的受害者,这两种情况都可能导致工具调用产生有害的结果。既然编码智能体最强大的工具是“在 shell 中运行这条命令”,一个失控的智能体就能做到任何你自己敲命令能做到的事。
引用 Solomon Hykes 的话来说:
AI 智能体就是一个在循环中不断“破坏”其所处环境的大语言模型。
像 Claude Code 这样的编码智能体会默认请求你批准它要运行的几乎每一条命令,以此来规避风险。
这虽然有点繁琐,但更重要的是,它极大地削弱了智能体用“蛮力”解决问题的能力。
这类工具都提供了各自版本的“YOLO 模式”(YOLO: You Only Live Once,意为“人生只有一次,干就完了”),在这种模式下,一切操作都会被默认批准。
这真的非常危险,但它也是获得最高效成果的关键!
在无人监管的情况下运行 YOLO 模式,需要考虑以下三个主要风险:
糟糕的 shell 命令可能会删除或损坏你珍视的文件。
数据窃取攻击,某些东西可能会偷走智能体能接触到的文件或数据——源代码或环境变量中的密钥尤其脆弱。
代理攻击,你的机器可能被用作代理来攻击其他目标——比如用于分布式拒绝服务攻击 (DDoS),或掩盖其他黑客攻击的来源。
如果你仍然想开启 YOLO 模式,有几个选择:
在安全的沙盒 (sandbox) 中运行你的智能体,限制它能访问的文件、密钥以及可以建立的网络连接。
用别人的电脑。这样一来,即使你的智能体失控,它能造成的损害也有限,顶多是浪费一些别人的 CPU 算力。
承担风险!尽量避免让它接触到潜在的恶意指令源,并祈祷自己能在造成任何损害之前发现错误。
大多数人选择了第三种方案。
尽管存在容器逃逸 (container escapes) 的风险,但我认为对大多数人来说,使用 Docker 或苹果新的容器工具 (container tool) 的第一种方案,风险是完全可以接受的。
第二种方案是我的最爱。我喜欢为此使用 GitHub Codespaces——它能按需提供一个功能齐全的容器环境,通过浏览器即可访问,而且还有相当慷慨的免费额度。如果出了什么问题,烧掉的也只是微软 Azure 机房里某台机器的 CPU,最坏的情况无非是你同步到环境中的代码被攻击者窃取,或者糟糕的代码被推送到关联的 GitHub 仓库。
还有很多其他类似智能体的工具,它们的代码都运行在别人的电脑上。ChatGPT 和 Claude 的代码解释器模式在这方面已经能做到很多意想不到的事情。我还成功地(滥)用过 OpenAI 的 Codex Cloud。
编码智能体本身也实现了不同级别的沙盒化,但到目前为止,我还没看到过足够令人信服的文档来完全信任它们。
更新:原来 Anthropic 官方有一份关于 Claude Code 的安全 YOLO 模式 (Safe YOLO mode) 的文档,其中写道:
让 Claude 运行任意命令是有风险的,可能导致数据丢失、系统损坏,甚至数据泄露(例如,通过提示注入攻击)。为了将这些风险降到最低,请在没有互联网访问的容器中使用
--dangerously-skip-permissions
参数。你可以参考这个使用 Docker Dev Containers 的实现案例。
将互联网访问权限限制在一个受信任的主机列表 中,是防止数据窃取攻击偷走你私有源代码的绝佳方式。
为循环挑选合适的工具
既然我们已经找到了一个(足够)安全的方式来运行 YOLO 模式,下一步就是决定要为编码智能体提供哪些工具了。
你可以在这一步引入 MCP 协议,但我发现直接从 shell 命令的角度思考通常更有效率。编码智能体非常擅长运行 shell 命令!
如果环境允许必要的网络访问,它们还可以从 NPM、PyPI 等地方拉取额外的软件包。因此,确保你的智能体运行在一个“随便安装软件包也不会搞坏你主电脑”的环境中,也是一个重要的考量!
我不太依赖 MCP,而是喜欢创建一个 AGENTS.md
(或类似)的文件,里面详细记录我认为它们可能需要用到的软件包信息。
在一个需要对不同网站进行截图的项目中,我安装了自己开发的命令行工具 shot-scraper,然后在 AGENTS.md
文件里写下了这样一句话: