当前位置: 首页 > news >正文

内容分享——Scaling Managed Agents: Decoupling the brain from the hands

原文:Scaling Managed Agents: Decoupling the brain from the hands
来源:Anthropic Engineering Blog
作者:Lance Martin, Gabe Cemaj, Michael Cohen


核心命题

Harness(Agent 运行框架)会过时,但接口应该永存。

随着模型能力的快速提升,今天为弥补模型不足而设计的 harness 明天可能就成为"死重"。Anthropic 通过 Managed Agents 解决了一个经典计算机科学问题:如何为"尚未想到的应用程序"设计系统


一、问题背景:Harness 的"过时"问题

1.1 一个具体案例:Context Anxiety

在 Claude Sonnet 4.5 时代,团队发现模型会在感知到上下文限制接近时过早地结束任务——这种行为被称为"上下文焦虑"。当时的解决方案是在 harness 中加入**上下文重置(context resets)**机制。

然而,当同样的 harness 应用到 Claude Opus 4.5 时,发现这个行为已经消失了。模型变得更聪明了,不再需要这种干预。但上下文重置的代码仍然在那里,成为死重(dead weight)

1.2 核心洞察

“Harnesses encode assumptions about what Claude can’t do on its own. However, those assumptions need to be frequently questioned because they can go stale as models improve.”

(Harness 编码了关于 Claude 自身无法做什么的假设。但这些假设需要经常被质疑,因为随着模型改进,它们可能会过时。)

这引用了 Rich Sutton 的《The Bitter Lesson》:试图将人类知识编码到系统中的方法,最终会被利用计算能力的通用方法所超越


二、解决方案:操作系统式的抽象

2.1 类比:操作系统虚拟化硬件

几十年前,操作系统通过将硬件虚拟化为**进程(process)文件(file)**等抽象来解决同样的问题。这些抽象足够通用,可以支持当时还不存在的应用程序。

关键洞察:

  • read()命令不关心它访问的是 1970 年代的磁盘组还是现代 SSD
  • 上层的抽象保持稳定,而底层实现可以自由变化

2.2 Managed Agents 的三层虚拟化

Managed Agents 遵循同样的模式,将 Agent 组件虚拟化为三个核心抽象:

组件类比功能
Session文件系统只追加日志,记录发生的一切
Harness进程调度器调用 Claude 并将工具调用路由到相应基础设施的循环
Sandbox执行单元Claude 可以运行代码和编辑文件的执行环境

这种设计允许每个组件的实现被替换,而不会干扰其他组件。


三、架构演进:从"宠物"到"牲畜"

3.1 第一代架构:紧耦合的"宠物"

初始设计:所有 Agent 组件放在单个容器中

  • Session、Agent Harness、Sandbox 共享一个环境
  • 好处:文件编辑是直接系统调用,无需设计服务边界

问题:采用了"宠物(pet)"模式

在宠物 vs 牲畜(pets-vs-cattle)的类比中:

  • 宠物:有名字的、手工维护的个体,你无法承受失去它
  • 牲畜:可互换的、批量管理的实例

在这个类比中,服务器变成了宠物——如果容器失败,session 就丢失了;如果容器无响应,必须手工 nursed 恢复健康。

3.2 调试噩梦

紧耦合带来的具体问题:

  1. 故障定位困难

    • 唯一的观察窗口是 WebSocket 事件流
    • 无法区分是 harness bug、事件流丢包,还是容器离线
    • 工程师必须进入容器内部调试
    • 但容器通常包含用户数据,实际上缺乏调试能力
  2. 网络假设固化

    • Harness 假设 Claude 操作的所有资源都在同一个容器内
    • 当客户要求连接到他们的 VPC 时,必须:
      • 将他们的网络与 Anthropic 的网络对等连接,或者
      • 在客户自己的环境中运行 harness
    • 一个 baked into harness 的假设成为了连接不同基础设施的障碍

四、解耦架构:"大脑"与"手"分离

4.1 核心设计原则

将"大脑"(Brain)与"手"(Hands)以及"会话"(Session)解耦。

每个组件成为对接口做很少假设的独立单元,可以独立失败或被替换。

4.2 Harness 离开容器

变化:Harness 不再生活在容器内部。

新的调用方式

execute(name, input) → string

Harness 像调用任何其他工具一样调用容器。

结果

  • 容器变成了牲畜(cattle)
  • 如果容器死亡,harness 将其作为工具调用错误捕获并返回给 Claude
  • 如果 Claude 决定重试,可以用标准配方provision({resources})重新初始化新容器
  • 不再需要 nursed 失败的容器恢复健康

4.3 Harness 故障恢复

关键设计:Session log 位于 harness 外部。

这意味着:

  • Harness 内部没有任何需要在崩溃后存活的东西
  • 当 harness 失败时,可以用wake(sessionId)重启新的 harness
  • 使用getSession(id)恢复事件日志
  • 从最后一个事件恢复执行

持久化机制

emitEvent(id, event) // 在 agent 循环中写入 session,保持事件的持久记录

4.4 安全边界

紧耦合设计的安全问题

  • Claude 生成的任何不受信任的代码在与凭证相同的容器中运行
  • 提示注入只需要说服 Claude 读取自己的环境
  • 一旦攻击者获得令牌,可以生成新的无限制 session

解耦后的安全改进

  1. Git 认证模式

    • 使用每个仓库的访问令牌在 sandbox 初始化期间克隆仓库
    • 将令牌接入本地 git remote
    • Git push/pull 在 sandbox 内工作,但 agent从不直接处理令牌
  2. MCP 工具认证模式

    • OAuth 令牌存储在安全 vault 中
    • Claude 通过专用代理调用 MCP 工具
    • 代理接收与 session 关联的令牌
    • 代理从 vault 获取凭证并调用外部服务
    • Harness 永远不会知道任何凭证

五、Session:超越 Claude 的上下文窗口

5.1 长程任务的上下文挑战

长程任务通常超过 Claude 的上下文窗口长度。标准解决方案都涉及不可逆的决策

技术描述问题
CompactionClaude 保存上下文窗口的摘要原始信息丢失
Memory ToolClaude 将上下文写入文件需要显式管理
Context Trimming选择性移除旧工具结果或思考块可能删除未来需要的信息

核心问题:很难知道未来的 turn 需要哪些 token。

5.2 Session 作为上下文对象

Managed Agents 中,session 作为位于 Claude 上下文窗口之外的上下文对象

接口设计

getEvents() // 允许大脑通过选择事件流的位置切片来查询上下文

使用方式

  • 从上次停止读取的位置继续
  • 回退到特定时刻前的几个事件查看前因
  • 在特定动作前重新读取上下文

5.3 关注点分离

  • Session:负责可恢复的上下文存储(持久化、可靠)
  • Harness:负责任意的上下文管理(组织、缓存优化、上下文工程)

这种分离的原因是:无法预测未来模型需要什么样的特定上下文工程。


六、性能优化:多大脑、多手

6.1 解耦前的性能瓶颈

问题:每个大脑需要同样多的容器

  • 每个 session 必须预先支付完整的容器设置成本
  • 即使永远不会 touch sandbox 的 session,也必须克隆仓库、启动进程、获取待处理事件

指标:Time-to-first-token (TTFT)

  • 衡量 session 从接受工作到产生第一个响应 token 的等待时间
  • 这是用户最能感受到的延迟

6.2 解耦后的性能提升

变化:容器仅在需要时由大脑通过工具调用execute(name, input) → string配置。

结果

  • 不需要立即使用容器的 session 不需要等待容器
  • 推理可以在编排层从 session log 拉取待处理事件后立即开始

性能数据

  • p50 TTFT 下降约 60%
  • p95 TTFT 下降超过 90%

扩展到多个大脑只需启动多个无状态 harness,仅在需要时连接手。

6.3 多手的认知挑战

目标:让每个大脑能够连接到多个手(执行环境)。

挑战:Claude 必须推理多个执行环境并决定向哪里发送工作——这比在单个 shell 中操作是更难的认知任务。

解耦后的能力

  • 每个手成为一个工具:execute(name, input) → string
  • 输入名称和输入,返回字符串
  • 支持任何自定义工具、任何 MCP 服务器、Anthropic 自己的工具
  • Harness 不知道 sandbox 是容器、手机还是 Pokémon 模拟器
  • 因为没有任何手与任何大脑耦合,大脑可以相互传递手

七、Meta-Harness 设计哲学

7.1 核心思想

Managed Agents 是一个meta-harness(元框架):

“Unopinionated about the specific harness that Claude will need in the future. Rather, it is a system with general interfaces that allow many different harnesses.”

(不对 Claude 未来需要的特定 harness 持意见。相反,它是一个具有通用接口的系统,允许多种不同的 harness。)

7.2 设计原则

有意见的(Opinionated)

  • Claude 需要操作状态的能力(session)
  • Claude 需要执行计算的能力(sandbox)
  • Claude 需要扩展到多个大脑和多个手的能力
  • 这些接口应该支持在长周期内可靠、安全地运行

无意见的(Unopinionated)

  • 大脑和手的数量和位置
  • 特定的 harness 实现
  • 特定的 sandbox 类型

7.3 与现有 Harness 的关系

  • Claude Code:优秀的通用 harness,在 Anthropic 内部广泛使用
  • 任务特定 harness:在狭窄领域表现出色
  • Managed Agents:可以容纳以上任何一种,随时间匹配 Claude 的智能水平

八、关键工程洞察总结

8.1 架构设计原则

  1. 接口稳定性 > 实现稳定性

    • 设计持久的接口,允许实现自由变化
    • 借鉴操作系统虚拟化硬件的经验
  2. 牲畜 > 宠物

    • 组件应该是可互换的,而不是手工维护的
    • 故障应该导致替换而不是修复
  3. 解耦 > 紧耦合

    • 大脑、手、session 应该独立失败和扩展
    • 通过最小化假设实现灵活性

8.2 安全设计原则

  1. 凭证隔离

    • 执行环境不应该能够访问凭证
    • 使用代理模式间接访问敏感资源
  2. 最小权限

    • 每个组件只获得其功能所需的最小权限
    • 避免"一旦攻破,全部失守"的单点故障

8.3 性能设计原则

  1. 延迟优化

    • 识别用户最能感受到的延迟(TTFT)
    • 按需配置资源,避免预热的固定成本
  2. 水平扩展

    • 无状态组件易于水平扩展
    • 状态集中在专门的持久化层

九、对开发者的启示

9.1 设计 Agent 系统的建议

  1. 质疑你的假设

    • 今天为弥补模型不足而添加的代码,明天可能成为死重
    • 定期评估 harness 中的假设是否仍然有效
  2. 设计持久接口

    • 投资于接口设计,而非具体实现
    • 考虑"尚未想到的应用程序"
  3. 拥抱解耦

    • 将认知(大脑)与执行(手)分离
    • 将状态(session)与逻辑(harness)分离

9.2 使用 Managed Agents 的最佳实践

  1. 利用接口灵活性

    • 通过getEvents()灵活地管理上下文
    • 利用 session 的持久化特性实现容错
  2. 设计可恢复的执行

    • 假设任何组件都可能失败
    • 利用 harness 的故障恢复机制
  3. 安全地管理凭证

    • 使用 vault 存储敏感信息
    • 避免将凭证暴露给执行环境

参考链接

  • Building effective agents
  • Effective harnesses for long-running agents
  • Harness design for long-running applications
  • Effective context engineering for AI agents
  • The Bitter Lesson - Rich Sutton
  • The Art of Unix Programming - Chapter 3 - Eric S. Raymond
  • Pets vs Cattle - Cloud Scaling
http://www.jsqmd.com/news/621594/

相关文章:

  • 如何有效实施styleguide41/styleguide:团队协作与代码规范的最佳实践
  • 全链路可信AI交付闭环,深度拆解训练-推理-反馈三阶段质量门禁设计与自动化卡点部署
  • Hunyuan-MT-7B翻译模型应用:快速搭建文档翻译与网页翻译服务
  • 数据库课程设计新思路:集成PyTorch模型实现智能数据挖掘与分析
  • 家具购物商城|基于springboot + vue家具购物商城系统(源码+数据库+文档)
  • AI翻唱神器RVC入门教程:快速搭建个人语音变声环境
  • SteamTinkerLaunch路线图展望:探索Linux游戏优化工具的未来功能与社区发展方向
  • IMX6ULL开发板GT911触摸屏驱动移植:从内核自带goodix.c到稳定五点触控的实战解析
  • Hive优化参考
  • MOSN负载均衡完全教程:从基础算法到高级策略实战
  • 终极指南:JGrowing服务监控体系如何构建完整的Java应用监控解决方案
  • Autobahn|Python实战:构建高并发WAMP应用组件的10个技巧
  • 【技术底稿 10】16G Ubuntu 服务器手动部署 Ollama 0.20.4 全流程(避坑 HTTP2 错误)
  • 空气质量指数解析:PM10、PM2.5、CO、NO2、SO2的健康影响与防护指南
  • 如何利用Tree of Thoughts提升大语言模型推理能力:完整实现指南
  • 终极指南:探索golang-samples项目的最新功能与实战应用
  • M5NanoC6开发板底层驱动与ESP32-C6多协议工程实践
  • 2026年比较好的风管安装精选厂家推荐 - 品牌宣传支持者
  • 一天一个Python库:oauthlib - 轻松构建OAuth客户端和服务器兜
  • 【SITS2026官方未公开技术白皮书】:AI原生应用性能跃迁的5大硬核优化范式(含实测QPS提升237%数据)
  • 深入解析PCIe LTSSM中的Recovery.Equlization机制与多速率适配
  • Teeworlds游戏引擎架构分析:客户端与服务端核心组件
  • 弦音墨影模型压缩与量化教程:降低部署资源门槛
  • L07A音响系统分析:在尝试固化SSH服务过程中遇到的技术问题
  • Cinny状态管理:Jotai在现代React应用中的应用
  • 【数据解析】深入理解 OpenLane-V2 数据集结构与核心标注
  • Laravel与ThinkPHP5.x核心对比
  • [实战指南]从零构建并发布一款Edge浏览器效率工具插件
  • 2026年Q2农业虫害监测优质品牌推荐:植物补光灯/便携式虫害监测设备/农业虫害监测/可视化虫害监测设备/智能虫害监测设备/选择指南 - 优质品牌商家
  • Aruco_ROS:开启高效AR标记识别的机器人之旅