支柱二:沙箱与运行时 —— Agent 在哪里干活
让 Agent 写代码、跑命令、操作浏览器,最先要回答的不是"它会写吗",而是"它在哪儿跑"。
5.1 为什么必须有沙箱
Agent 自己写出来的命令是 rm -rf / 怎么办?写出来一个死循环把内存吃光怎么办?拉了一个含恶意代码的 npm 包怎么办?这些都不是假设,是已经在生产里出过的事故。
解决方案是 沙箱(sandbox):把 Agent 关进一个隔离的小盒子里,盒子里跑飞了不会影响外面,盒子可以被一键销毁重建。
5.2 三档沙箱方案
"沙箱"听上去抽象,本质上就一句话:给 Agent 多大的活动空间。我们用一个生活类比来理解 —— Agent 要跑代码,就像让一个陌生租客住进你家,你得决定锁哪些门、给不给厨房钥匙。隔离越严,越安全,但启动越慢、成本越高。三档不是非此即彼,而是一张"安全 vs 性能 vs 成本"的菜单。
类比速记:第一档 = 让租客在客厅活动但厨房上锁;第二档 = 给他一间独立带门的房间;第三档 = 直接租一整套公寓给他,连钥匙都不留。越往下空间越大、越自由,你睡觉也越踏实。
| 档位 | 典型实现 | 隔离强度 | 启动时延 | 能联网/装包? | 真实项目锚点 | 适合什么活 |
|---|---|---|---|---|---|---|
| 第一档 语言级沙箱 |
Python RestrictedPython、JS vm2、WASM runtime;同进程内白名单 API |
最弱(共享内存,逃逸即拿全部权限) | 毫秒级 | 不行 | OpenAI 早期 Code Interpreter 的 exec 限制版 |
纯计算、表达式求值、可信代码(数学、画图) |
| 第二档 进程/容器级沙箱 |
Docker、Podman、独立子进程 + seccomp/cgroup | 中等(内核共享,但文件/网络/进程隔离) | 百毫秒 ~ 秒级 | 能装包,但不敢让它随便联网 | Open Interpreter 默认模式、Jupyter Kernel Gateway | 主流 code interpreter、跑用户脚本、临时执行 |
| 第三档 远程 VM / 云沙箱 |
microVM(Firecracker、gVisor)、E2B、Modal、Daytona、独立云主机/K8s Pod | 最强(独立内核 + 独立网络命名空间) | 数秒 ~ 数十秒(可池化预热) | 可放心联网下载、pip install、apt install |
E2B、Modal、Daytona、Cursor / Replit 的远端执行环境 | 长任务、装依赖、联网拉数据、面向不可信用户的 SaaS |
关键直觉一:越往下越"贵",但能干的事越多。第一档跑不了 pip install(动不了系统),第二档能装包但不敢让它随便联网下载,第三档可以放心让 Agent 自己折腾出一个完整开发环境。
关键直觉二:三档不是互斥,而是组合菜单。成熟 Agent 系统经常按任务难度分流:
- 算个数学表达式 → 走第一档(毫秒返回)
- 跑一段用户写的 Python 数据分析 → 走第二档(Docker 容器,1 秒内拉起)
- "帮我克隆这个 repo、装依赖、跑测试" → 走第三档(E2B / 远程 VM,分钟级长任务)
怎么挑档,问自己三句话:
① 代码可信吗?(自己生成的 vs 陌生用户提交的)
② 要不要联网/装包?(要 → 至少第二档)
③ 任务多长?(秒级 → 第二档够;分钟以上 → 第三档更划算)
5.3 运行时还要管这些
- 文件系统视图:Agent 看到的工作目录是什么、能不能写出去、产出物如何持久化。
- 网络出口:白名单(只能访问 GitHub / npm / pypi)还是开放?开放时怎么防 SSRF?
- 超时与资源:单次工具调用超时、整任务总耗时、CPU/内存上限、token 预算上限。
- 会话级生命周期:Agent 重启时旧沙箱要不要保留?跨会话能不能复用?这是和"记忆系统"对接的关键。
产品参照:
· Claude Code:典型"第二档" —— 直接落地到用户本地 shell,但默认对所有写入/执行类操作弹二次确认,沙箱本身轻、靠 permission 闸门保安全。
· Trae(字节)/ Qoder(阿里):AI IDE 形态,把 Agent 关在 IDE 自带的工程沙盒里,文件系统视图绑定当前 workspace,跑测试/装依赖走 IDE 的项目级容器。
· 悟空(钉钉):默认走"第二档"远程容器跑代码与脚本;企业版可按租户开启更强隔离的"第三档"VM 沙箱用于不可信脚本执行。