工程进阶 · 可靠 Agent 的工程模式

Managed Agent:脑手分离

把思考和执行拆到不同进程,像操作系统一样虚拟化 Agent

本页解决的问题

先给结论

「Managed Agent:脑手分离」要解决的关键问题是什么?

把思考和执行拆到不同进程,像操作系统一样虚拟化 Agent

判断标准

让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。

下一步

写下一个问题:试完这个方法后,你能用什么证据回答它?

常见误区

结论听起来很完整,却没有检查最关键的假设。

类比:操作系统的虚拟化
操作系统虚拟化硬件
当你调用 read() 时,你不关心底层是 SSD、HDD 还是网络磁盘,操作系统帮你抽象了硬件细节。
Managed Agent 做同样的事:虚拟化 Agent 的各个组件,让脑不关心手是哪个容器,让手不关心脑用的是哪个模型。
三个核心组件
Session
会话日志
Append-only 的事件流,持久化存储。记录所有发生过的事情:用户输入、工具调用、模型输出。
Harness
脑 / 大脑
调用 Claude 并路由工具调用的循环。负责思考:决定下一步做什么、如何组织上下文。
Sandbox
手 / 沙箱
执行代码和编辑文件的容器环境。负责执行:运行命令、写文件、与外部系统交互。
为什么要拆开:宠物 vs 牛群
架构演进
旧方案(宠物)
Session + Harness + Sandbox 都在同一个容器里。

容器挂了 = 会话丢失 = 无法调试 = 任务彻底失败。

就像养了一只宠物,挂了就完了,无法替代。
新方案(牛群)
每个组件独立部署,互不依赖。

容器挂了 = 工具调用失败 = Claude 决定重试 = 新建容器继续。

就像牧场的牛,挂了重来一个,系统照常运行。
动手试试:故障恢复模拟
Harness
Brain(脑)
Sandbox
Hand(手)
Event Log
Session(会话)
点击下方按钮,观察不同故障场景下系统的恢复行为。
脑离开容器后的好处
关键改进
  • 容器变成工具调用execute(name, input) -> string,对 Harness 来说就是一个普通函数
  • 容器挂了 = 工具调用返回错误 = Claude 自行决定是否重试 = 自动新建容器继续工作
  • Harness 可以在容器启动前就开始处理,不需要等容器 ready
-60%
TTFT p50 降低
-90%+
TTFT p95 降低

TTFT = Time to First Token(首 Token 响应时间)

安全的结构性解决
安全问题的架构级解决
  • 旧方案:Agent 生成的代码和 API 密钥在同一个容器里,Prompt Injection 可以直接偷密钥
  • Git Token:在克隆仓库时注入容器环境变量,沙箱内可以用,但 Agent 看不到 token 值
  • MCP OAuth Token:存在外部 vault 里,通过代理转发 MCP 调用,沙箱内无法直接访问 token
多脑多手
组件可以自由组合
Brain A
Brain B
Brain C
多个 Brain:各自只是无状态 Harness,按需启动
Sandbox 1
Sandbox 2
Sandbox 3
Sandbox 4
多个 Hand:各自是独立工具,可以传递给不同 Brain

这意味着你可以让一个 Brain 同时操控多个 Sandbox(并行执行),也可以让同一个 Sandbox 在不同的 Brain 之间传递(接力执行)。组件之间完全解耦

好的架构让组件可以独立失败和独立替换。脑手分离不只是性能优化,它从根本上改变了系统的可靠性模型:从「一个宠物挂了全完」到「任何部分都能重建」。

「类比:操作系统的虚拟化」如何改变一次回答

「TTFT = Time to First Token(首 Token 响应时间)」说明,模型处理的不是我们眼中的“字数”,而是一段段 Token。Token 的切分方式会影响输入长度、上下文能放下多少内容,以及一次请求要花多少计算。

长度、信息量和上下文不是一回事

当「这意味着你可以让一个 Brain 同时操控多个 Sandbox(并行执行),也可以让同一个 Sandbox 在不同的 Brain 之间传递(接力执行)。组件之间 完全解耦」变长时,先要分清三件事:文字被切成多少 Token、哪些内容真正参与当前判断、以及旧内容是否已经超出上下文窗口。删掉重复说明通常比单纯把窗口开得更大更有效。

  • 容器变成 工具调用 : execute(name, input) -> string ,对 Harness 来说就是一个普通函数
  • 容器挂了 = 工具调用返回错误 = Claude 自行决定是否重试 = 自动新建容器继续工作
  • Harness 可以在容器启动前就开始处理, 不需要等容器 ready

先保留会改变判断的内容

可以用「这意味着你可以让一个 Brain 同时操控多个 Sandbox(并行执行),也可以让同一个 Sandbox 在不同的 Brain 之间传递(接力执行)。组件之间 完全解耦」做一次对照:保留同样的问题,分别删掉重复背景、压缩格式和移除无关历史,比较答案质量、延迟与 Token 数量。

从「类比:操作系统的虚拟化」走到「三个核心组件」

「类比:操作系统的虚拟化」先把问题落在「操作系统虚拟化硬件 当你调用 read() 时,你不关心底层是 SSD、HDD 还是网络磁盘,操作系统帮你抽象了硬件细节。 Managed Agent 做同样的事 :虚拟化 Agent 的各个组件,让脑不关心手是哪个容器,让手不关心脑用的是哪个模型」上;到了「三个核心组件」,讨论继续推进到「Session 会话日志 Append-only 的事件流,持久化存储。记录所有发生过的事情:用户输入、工具调用、模型输出。 Harness 脑 / 大脑 调用 Claude 并路由工具调用的循环。负责思考:决定下一步做什么、如何组织上下文。 Sandbox 手 / 沙箱 执行代码和编辑文件的容器环境。负责执行:运行命令、写文件、与外部系统交互」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

处理长文本时,先保留会改变结论的内容,再决定如何压缩格式和历史;上下文更长只有在新增信息真正有用时才值得付出代价。

  • 「类比:操作系统的虚拟化」:操作系统虚拟化硬件 当你调用 read() 时,你不关心底层是 SSD、HDD 还是网络磁盘,操作系统帮你抽象了硬件细节。 Managed Agent 做同样的事 :虚拟化 Agent 的各个组件,让脑不关心手是哪个容器,让手不关心脑用的是哪个模型
  • 「三个核心组件」:Session 会话日志 Append-only 的事件流,持久化存储。记录所有发生过的事情:用户输入、工具调用、模型输出。 Harness 脑 / 大脑 调用 Claude 并路由工具调用的循环。负责思考:决定下一步做什么、如何组织上下文。 Sandbox 手 / 沙箱 执行代码和编辑文件的容器环境。负责执行:运行命令、写文件、与外部系统交互
  • 「最后的要点」:Git Token :在克隆仓库时注入容器环境变量,沙箱内可以用,但 Agent 看不到 token 值

最后的「最后的要点」把讨论落到「Git Token :在克隆仓库时注入容器环境变量,沙箱内可以用,但 Agent 看不到 token 值」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 Managed Agent:脑手分离 可靠 Agent 的工程模式
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助