什么是“缰绳工程”,为什么你应该关心?
英文标题:What is harness engineering and why should I care?
OpenAI 的一个实验显示,3 名工程师用 0 行手写代码发布了一个软件产品,关键在于设计“缰绳”来约束 AI 智能体。
为什么值得关注
随着 AI 编码智能体的普及,如何确保它们不破坏生产环境或数据成为关键问题。缰绳工程提供了一种方法,让开发者从逐行审查代码转向设计环境,从而安全地自动化编码任务,提高效率并降低风险。
核心要点
- 缰绳工程是围绕编码智能体的重要趋势,通过设计环境来约束 AI 行为。
- OpenAI 实验证明,3 人团队用 0 行手写代码即可发布产品,全靠缰绳设计。
- 缰绳包括编排层、沙箱、状态持久化和验证工具等确定性组件。
- 设计缰绳的关键是设定严格边界、构建修复循环和提供地图而非手册。
- 使用 Google ADK 和 Antigravity SDK 可以快速实现沙箱化智能体和自我修复循环。
你是如何用 0 行手写代码发布一个软件产品的?
今天有个朋友问我这个问题,我意识到自己没有一个简单的答案。所以我深入探究了一下。
结果发现,答案在于你如何设计你的“缰绳”(harness)。
等等,什么?什么是缰绳工程?
这是当前围绕编码智能体(coding agents)最重要的趋势,是有原因的。如今最大的问题是:如何在不逐行阅读 AI 生成代码的情况下验证它?你如何确保一个智能体不会搞坏生产环境或删除你的数据?
OpenAI 的一篇博客分享了一个有趣的实验:一个由 3 名工程师组成的团队,用 0 行手写代码构建并发布了一个软件产品的内部测试版。每一行代码——应用逻辑、测试、CI 配置、文档、可观测性(observability,即监控系统运行状态的能力)和内部工具——都是由 Codex 编写的。
他们是怎么做到的?他们没有写应用本身,而是设计了“缰绳”。
缰绳到底是什么?
把 AI 智能体想象成一匹强大的赛马。缰绳就是赛道、眼罩和骑师的缰绳,让它朝着正确的方向奔跑,而不是冲进观众席。
正如我的同事 Arthur Thompson 今天解释的那样:对于智能体来说——缰绳由所有包裹着大语言模型(LLM)的确定性组件组成。
Balaji Subramaniam 在他的博客中详细介绍了这些确定性组件——包括编排层(orchestration layer,负责协调各组件工作)、执行沙箱(execution sandboxing,隔离运行环境)、状态持久化(state persistence,保存运行状态)和验证工具。
如果你想构建可靠的智能体系统,你的工作重心就从编写逻辑转变为设计环境。以下是你需要关注的重点:
-
设定严格边界:不要让智能体猜测它能接触什么。强制执行严格的访问规则(比如把它限制在特定的沙箱中),这样它就不会意外清空生产数据。
-
构建“修复循环”:智能体不可避免地会犯错。一个好的缰绳会自动捕获错误,比如构建失败或测试失败,并将这些清晰的日志反馈给智能体,让它自己修复代码。
-
给它们一张地图,而不是一本手册:正如 OpenAI 团队发现的,不要用庞大的指令文件淹没智能体。合理组织你的代码仓库结构,让智能体在工作过程中逐步发现上下文。
给我看看代码
这在实践中是什么样子?这里有一个简单的例子,使用 Google Antigravity SDK 配合 Google 的 ADK 来配置一个本地缰绳。注意我们是如何严格地将智能体限制在特定工作区(workspaces=["./sandbox"])并给它一个保存记忆的地方(save_dir="./trajectories"),以便它能从之前的经验中学习:
import os
from google.adk.labs.antigravity import AntigravityAgent
from google.antigravity import LocalAgentConfig
from google.antigravity.hooks import policy
# 确保使用绝对路径来限制工作区范围
sandbox_dir = os.path.abspath("./sandbox")
os.makedirs(sandbox_dir, exist_ok=True)
save_dir = os.path.abspath("./trajectories")
# 1. 设计缰绳环境
sdk_config = LocalAgentConfig(
system_instructions="你是一个有用的本地环境助手。",
workspaces=[sandbox_dir],
# 让智能体在受限的沙箱边界内安全地写入
policies=[policy.allow_all()],
save_dir=save_dir,
)
# 2. 包装配置,让智能体在缰绳内运行
root_agent = AntigravityAgent(
name="antigravity_assistant",
description="在 ADK 中运行一个 Antigravity SDK 智能体。",
config=sdk_config,
)
有了这个设计,你可以把遗留代码放进沙箱,写一个简单的循环来对它运行单元测试,然后让智能体迭代地修复自己的 bug。
添加测试
那么,我们实际上如何对这个沙箱化的智能体运行测试呢?
在现代缰绳工程中,测试是智能体工作流图中活跃的一部分。使用 Google 的 ADK 2.0,它引入了基于图的工作流,你可以将测试验证步骤定义为一个简单的路由节点。
如果测试通过,工作就完成了。如果失败,缰绳会自动将错误循环回给智能体,让它再试一次。注意内置的“紧急停止开关”:我们跟踪迭代次数,这样如果智能体陷入无限循环的“破坏-修复”循环中,缰绳就能安全地切断电源。
from google.adk.agents.context import Context
from google.adk import Event
from google.adk.events.event_actions import EventActions
from google.genai import types
# 3. 在沙箱中评估代码
def execution_test_node(ctx: Context):
# 安全地跟踪尝试次数,防止无限循环
iteration_count = ctx.state.get("iteration_count", 0) + 1
ctx.state["iteration_count"] = iteration_count
test_passed = ctx.state.get("test_passed", False)
feedback = ctx.state.get("feedback", "")
if test_passed:
# 成功!结束工作流。
return Event(actions=EventActions(route="END"))
if iteration_count > 5:
# 紧急停止开关:智能体卡住了。停止循环。
return Event(actions=EventActions(route="END"))
# 失败!将错误追踪信息反馈给智能体并循环回去。
feedback_msg = f"单元测试失败,错误追踪信息如下:\n\n{feedback}"
return Event(
content=types.Content(role="user", parts=[types.Part(text=feedback_msg)]),
actions=EventActions(route="loop_back")
)
如果你想看到这个测试路由模式的实际运行,可以查看 Balaji 的 ADK 缰绳仓库中一个完整实现的示例。
使用基于图的工作流将所有部分连接起来
要连接智能体和测试节点,你可以使用一个 Workflow 图来精确规划执行流程,而不需要复杂的嵌套 Python while 循环。
把这想象成在赛道上画出实际的跑道线:
from google.adk import Workflow
# 4. 将智能体和测试节点连接成一个循环
repair_loop = Workflow(
name="repair_loop",
edges=[
# 第 1 步:定义主序列(START -> 智能体 -> 测试节点)
("START", root_agent, execution_test_node),
# 第 2 步:如果测试返回 "loop_back",回到智能体
(execution_test_node, {"loop_back": root_agent})
]
)
恭喜!你已经构建了一个自主系统。智能体编写代码并将其交给测试节点。如果测试失败并返回 loop_back 路由,智能体会拿着错误日志再试一次。
在 ADK 示例中查看更多循环模式的示例。
自己动手试试
你可能会想,为什么需要一个 Python 脚本来运行智能体?在普通的聊天窗口中,你就是缰绳:你复制错误日志并盯着模型。而软件缰绳让系统能够自我监督,让你完全自动化测试驱动的编码,或安全地重构庞大的遗留代码库。
要在你自己的机器上运行这个自我修复循环,设置时间不到五分钟:
-
安装框架:在终端中运行
pip install "google-adk[antigravity]"来获取开源的 Agent Development Kit 和 Antigravity 集成。 -
设置 API 密钥:从 Google AI Studio 获取一个免费的 Gemini API 密钥,并将其导出到你的环境中(
export GEMINI_API_KEY="your-key")。 -
运行循环:将上面的代码块保存为 Python 脚本,把一个有问题的 Python 或 Node 文件放入你新建的 ./sandbox 目录中,然后运行你的脚本。
-
扩展你的图:单元测试只是基础。为了让你的缰绳坚不可摧,可以在工作流中添加第二个 AI 智能体,比如一个 SecurityAuditor,在代码通过之前进行审查,或者接入自定义的 linter(代码检查工具)来强制执行严格的架构规则。
从这里开始,你可以将我们简单的测试节点替换为一个子进程,实际对沙箱运行 pytest 或 npm test,这样你就拥有了一个功能完整的修复循环。
如果你准备好扩展规模,可以在 antigravity.google 下载完整的 IDE 和 CLI,探索 Antigravity 托管智能体 进行远程执行,以及 Google 的 ADK 2.0 来使用基于图的工作流。
延伸阅读
我在 Google 的同事们整理了一些很棒的指南,告诉你接下来该往哪里走。要学习如何为你的智能体构建安全环境,可以查看 Sara 的 codelab,展示 Cloud Run 沙箱。如果你想掌握自我修正,Balaji Subramaniam 最近发布了一篇关于编码智能体的循环工程的深度文章。要看到这一切应用在大型企业场景中,可以阅读 James O'Reilly 对使用智能体管道和 Antigravity 大规模自动化遗留系统现代化的解析。
如需进一步操作,你可以考虑屏蔽此人并/或举报滥用行为。
术语表
- 缰绳工程
- 指设计一套确定性组件来约束和引导 AI 智能体,使其安全、可靠地执行任务,类似于用缰绳控制马匹。
- 编码智能体
- 能够自主编写、修改或修复代码的 AI 系统,通常基于大语言模型。
- 编排层
- 负责协调智能体各组件工作的系统层,确保任务按顺序执行。
- 沙箱
- 隔离的运行环境,限制智能体的访问范围,防止其破坏生产数据。
- 状态持久化
- 保存智能体运行状态的能力,使其能从之前的经验中学习。
- 可观测性
- 监控系统运行状态的能力,帮助发现和诊断问题。
- 修复循环
- 一种机制,自动捕获错误并将反馈提供给智能体,使其自我修复代码。
- 基于图的工作流
- 一种工作流设计方式,将任务定义为节点和边,便于控制流程和循环。
生产区
使用这篇文章
复制包含 frontmatter、中文正文和英文来源的 Markdown。
我的研究区
记录自己的判断,不会写回原文或公开页面。
一句话说清这篇材料能支撑什么角度。
每行一个,最多 20 个。
支持 Markdown。要核对的数据、可复用的方法、反方观点或补充来源。