随着Agent应用场景的深入,安全隔离的执行环境将成为标配。理解这两种模式的区别,有助于开发者根据实际需求构建更安全、高效的Agent架构。

随着AI Agent能力的提升,越来越多的Agent需要一个独立的"工作空间"——一台可以运行代码、安装依赖包、访问文件的计算机。为了保证安全,这个工作空间通常是一个隔离的沙箱(Sandbox)。

图片

对于构建Agent的开发者来说,问题不在于"是否"使用沙箱,而在于"如何"将沙箱集成到Agent架构中。

LangChain官方博客最近详细探讨了两种主流的连接模式,并分析了各自的优劣势。

核心观点速览

目前主要存在两种架构模式:

• 模式一(Agent IN Sandbox):Agent直接运行在沙箱内部,通过网络与外部通信。这种模式模拟了本地开发环境,Agent与环境紧密耦合。

• 模式二(Sandbox as Tool):Agent运行在本地或服务器上,通过API远程调用沙箱执行代码。这种模式下,沙箱仅作为Agent的一个工具,便于逻辑更新和密钥管理。

模式一:Agent运行在沙箱内 (Agent IN Sandbox)

在这种模式下,Agent本身就驻留在沙箱环境中。你通过网络与Agent进行交互。

图片

实践方式:
构建一个预装了Agent框架的Docker镜像或虚拟机镜像,在沙箱中启动它,并通过HTTP或WebSocket暴露接口供外部调用。

优势:
这种方式最接近本地开发体验。Agent拥有直接的文件系统访问权限,可以自由修改环境。当Agent与执行环境紧密耦合(例如需要特定依赖库或复杂的环境状态)时,这种模式非常有效。

挑战与权衡:
1. 通信基础设施:需要处理跨沙箱边界的通信。虽然部分提供商(如E2B)提供了封装好的SDK,但如果自行实现,则需要处理WebSocket/HTTP层、会话管理和错误处理。
2. 安全风险:API密钥必须存放在沙箱内部以便Agent调用模型。如果沙箱隔离被突破或遭遇提示词注入攻击,密钥可能泄露。
3. 迭代效率:更新Agent逻辑通常需要重新构建镜像并部署,这会减慢开发迭代速度。
4. 知识产权:Agent代码完全运行在沙箱中,面临更高的代码泄露风险。

Witan Labs的Nuno Campos指出了另一个安全隐患:在这种模式下,Agent的所有部分都拥有与Bash工具相同的权限。如果LLM生成的代码可以无限制地访问网络,这将是一个巨大的安全漏洞。而在"沙箱即工具"模式下,你可以更精细地控制权限边界。

模式二:沙箱即工具 (Sandbox as Tool)

在这种模式下,Agent运行在你的本地机器或服务器上。当需要执行代码时,它通过API调用远程沙箱。

图片

实践方式:
Agent在本地运行,当生成需要执行的代码时,调用沙箱提供商(如E2B, Modal, Daytona, Runloop)的API。对Agent而言,沙箱只是众多工具中的一个。

优势:
1. 快速迭代:更新Agent代码无需重构镜像,开发效率极高。
2. 安全性:API密钥保留在沙箱外部,只有代码执行在隔离环境中进行。
3. 关注点分离:Agent的状态(对话历史、推理链、记忆)与执行环境分离。沙箱崩溃不会导致Agent状态丢失,且更换沙箱后端不影响Agent核心逻辑。
4. 并行与成本:支持在多个远程沙箱中并行执行任务,且只需为代码执行时间付费,而非整个Agent运行时间。

挑战与权衡:
主要的缺点是网络延迟。每次执行都需要跨越网络边界,对于包含大量微小执行任务的场景,延迟会累积。不过,许多沙箱提供商支持有状态会话(Stateful Sessions),可以在多次调用间保持变量和文件状态,从而减少不必要的往返。

如何选择?

选择"Agent IN Sandbox"模式,如果:
• Agent与执行环境高度耦合(依赖特定库或复杂状态)
• 需要生产环境与本地开发环境完全一致
• 使用的SDK已经完美封装了通信层

选择"Sandbox as Tool"模式,如果:
• 需要快速迭代Agent逻辑
• 希望将API密钥保存在沙箱之外
• 倾向于将Agent状态与执行环境解耦

代码实现示例

以开源框架 deepagents 为例,展示"沙箱即工具"模式的实现:

from daytona import Daytona
from langchain_anthropic import ChatAnthropic
from deepagents import create_deep_agent
from langchain_daytona import DaytonaSandbox

# 初始化沙箱后端(也可以使用 E2B, Runloop, Modal 等)
sandbox = Daytona().create()
backend = DaytonaSandbox(sandbox=sandbox)

# 创建 Agent,将沙箱作为后端传入
agent = create_deep_agent(
  model=ChatAnthropic(model="claude-sonnet-4-20250514"),
  system_prompt="You are a Python coding assistant with sandbox access.",
  backend=backend,
)

# 调用 Agent
result = agent.invoke(
  {
    "messages": [
      {
        "role": "user",
        "content": "Run a small python script",
      }
    ]
  }
)

sandbox.stop()

在这个流程中:
1. Agent在本地进行规划
2. 生成解决问题的Python代码
3. 调用API在远程沙箱中执行代码
4. 沙箱返回结果
5. Agent根据结果继续在本地进行推理

随着Agent应用场景的深入,安全隔离的执行环境将成为标配。理解这两种模式的区别,有助于开发者根据实际需求构建更安全、高效的Agent架构。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐