Signal Desk
Google AI:DEV 作者专属(RSS)AI 中文译文 · 待人工复核

什么是“缰绳工程”,为什么你应该关心?

英文标题:What is harness engineering and why should I care?

OpenAI 的一个实验显示,3 名工程师用 0 行手写代码发布了一个软件产品,关键在于设计“缰绳”来约束 AI 智能体。

正文研究价值 88 / 100

英文原文我的研究区

为什么值得关注

随着 AI 编码智能体的普及,如何确保它们不破坏生产环境或数据成为关键问题。缰绳工程提供了一种方法,让开发者从逐行审查代码转向设计环境,从而安全地自动化编码任务,提高效率并降低风险。

核心要点

  1. 缰绳工程是围绕编码智能体的重要趋势,通过设计环境来约束 AI 行为。
  2. OpenAI 实验证明,3 人团队用 0 行手写代码即可发布产品,全靠缰绳设计。
  3. 缰绳包括编排层、沙箱、状态持久化和验证工具等确定性组件。
  4. 设计缰绳的关键是设定严格边界、构建修复循环和提供地图而非手册。
  5. 使用 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。要核对的数据、可复用的方法、反方观点或补充来源。