☰
【随笔】Agent沙箱:让代码有地方运行,也让结果有据可查
2026/9/28 20:41:28 网站建设 项目流程

昨天讨论了Agent执行高影响操作前的人类审批。审批通过以后,还有一个很实际的问题:模型生成的脚本应该在哪里运行?如果脚本意外修改文件、持续占用资源,或者访问了任务之外的数据,执行环境能否把影响范围控制住?

Agent沙箱正在成为代码执行型智能体的重要基础设施。本文借助Deep Agents的官方沙箱文档理解结构,再用一个可运行的小例子说明如何验收返回结果。

资料核对日期为2026年9月27日。Deep Agents部分依据当日在线文档介绍架构,不绑定某个SDK小版本;本地示例适用于Python 3.11及以上版本,只使用标准库,不调用云服务。

一、从“生成一段代码”走到“完成一次任务”

假设用户给Agent一份销售明细,希望得到按地区汇总的CSV。一次完整任务至少包含:确定输入文件、编写脚本、执行脚本、查看报错、修正、导出结果。

如果这些步骤直接发生在日常工作目录,任务数据与其他文件就很容易混在一起。更合理的设计是给这次任务准备独立工作区,并明确允许读取哪些输入、能够使用哪些工具、最后可以带回哪些产物。

Deep Agents文档介绍了sandbox as tool模式:Agent的控制逻辑在外部运行,通过工具调用沙箱执行代码和操作文件。这种拆分可以把模型调用凭据留在沙箱之外。具体隔离机制仍由沙箱提供方实现。官方沙箱说明

二、把控制、执行和结果回收分开

可以将一个教学用架构分成三个部分:

部分主要职责需要记住的边界
控制端保存任务状态、准备输入、决定是否继续凭据与授权留在受控位置
执行环境在限定工作区内运行代码文件、网络、资源权限分别配置
结果验收检查退出状态、产物名称与内容执行成功不等于业务正确

图中上方的凭据留在控制端,任务输入进入执行区;执行区返回状态和产物,再由控制端验收。这里展示的是本文的设计分工,具体产品的部署形态和接口名称可能不同。

文件隔离与网络限制要分别检查。即使宿主文件不可见,只要执行环境能够联网,输入中的敏感内容仍可能被发送出去。LangChain的安全建议也强调最小权限、分层防护与限制工具访问范围。安全策略

三、一次任务的生命周期

给每次执行分配独立的task_id,能够把输入版本、运行记录和产物连接起来。本文采用下面的流程:

  1. 准备:记录输入清单,创建工作区,设置资源预算和网络规则。
  2. 执行:传入必要数据,收集退出码和受限长度的日志。
  3. 验收:只接收约定的产物,检查格式、大小和业务约束。
  4. 清理:保存必要记录,再结束执行环境;失败路径也必须覆盖。

导师猫拿着验收清单,学习猫递交结果文件。文件能够生成,只说明执行走到了产出步骤;列名、行数和内容是否符合任务要求,还要继续检查。

在工程实现中,还应区分两类失败:脚本返回非零退出码,通常需要查看错误;执行请求超时且状态未知,则应先查询任务状态,避免立刻启动第二次相同任务。对于会产生外部副作用的操作,隔离环境也不能替代幂等设计。

四、可运行示例:验收一份汇总结果

下面编写一个结果接收函数。它接收已经返回的字节数据,检查任务编号、退出码、文件白名单、大小、CSV结构以及金额范围,然后生成内容摘要。

这是沙箱外围的教学代码,不创建沙箱,也不执行模型生成的代码。示例中的返回值由程序构造,便于观察验收逻辑,不代表调用了任何沙箱服务。

保存为artifact_check.py:

importcsvimportiofromdecimalimportDecimal,InvalidOperationfromhashlibimportsha256defaccept_result(expected_task,result):ifresult["task_id"]!=expected_task:raiseValueError("task mismatch")ifresult["exit_code"]!=0:raiseValueError("execution failed")files=result["files"]ifset(files)!={"summary.csv"}:raiseValueError("unexpected artifact")data=files["summary.csv"]ifnotisinstance(data,bytes)orlen(data)>4096:raiseValueError("invalid artifact size or type")reader=csv.DictReader(io.StringIO(data.decode("utf-8")))ifreader.fieldnames!=["region","total"]:raiseValueError("invalid columns")rows=list(reader)ifnotrows:raiseValueError("empty report")seen=set()forrowinrows:ifNoneinrowornotrow["region"]orrow["region"]inseen:raiseValueError("invalid region or row")seen.add(row["region"])try:total=Decimal(row["total"])except(InvalidOperation,TypeError):raiseValueError("invalid total")fromNoneifnottotal.is_finite()ornot0<=total<=1_000_000:raiseValueError("total out of range")return{"rows":len(rows),"sha256":sha256(data).hexdigest()}result={"task_id":"report-001","exit_code":0,"files":{"summary.csv":b"region,total\neast,120\nwest,80\n"},}receipt=accept_result("report-001",result)print("accepted rows:",receipt["rows"])print("digest length:",len(receipt["sha256"]))try:accept_result("report-002",result)exceptValueErroraserror:print("rejected:",error)

运行python artifact_check.py,输出:

accepted rows: 2 digest length: 64 rejected: task mismatch

SHA-256用于标识这份具体内容,方便后续比对;它不能证明汇总逻辑正确,也不能单独证明产物来自可信执行者。Python标准库的hashlib文档说明了摘要接口。

这个函数只演示接收后的检查。真实系统还需要在下载过程中限制字节数,验证返回消息结构与来源,处理编码错误,并对照原始输入验证金额总和。若把产物保存到磁盘,还要另外设计路径和符号链接处理,不能直接相信外部返回的文件名。

五、选型时具体看什么

工作负载决定隔离要求。固定的可信脚本、外部用户提交的代码、模型临时生成的代码,风险和使用方式并不相同。应了解提供方怎样实现文件系统、进程和网络隔离,不能只根据产品名字判断。

资源预算要落到执行层。CPU、内存、磁盘、进程数、运行时长分别需要对应的限制措施。请求超时后,远端进程是否真正终止,也要有可验证的机制。

按任务保存必要证据。输入摘要、执行标识、退出状态、产物摘要与验收结果,有助于定位问题。日志中不应无条件记录凭据、完整敏感输入或无上限的输出。

保留业务审批边界。沙箱适合承接计算和文件处理。发送消息、修改生产数据、扣费等外部行为,需要单独授权与检查;一个受限执行区无法自动判断这些行为是否符合用户意图。

六、🧠 思维导图

Agent沙箱

控制端

任务状态

凭据留外

执行环境

文件隔离

网络与资源限制

产物验收

退出码与白名单

格式和业务校验

生命周期

准备和执行

回收和清理

七、总结

总结要点

执行隔离为Agent提供受约束的工作空间。文件、网络和资源权限要分别设计,并落实到执行环境。

结果验收连接技术执行与业务目标。退出码、文件清单和摘要提供基础证据,真正的正确性仍依赖任务对应的校验规则。

生命周期管理应覆盖成功、失败和状态未知。任务标识、结果回收与环境清理连在一起,后续才能追踪一次执行究竟发生了什么。

下一篇随笔继续关注Agent的执行记录与可观测性,看看一次工具调用如何留下可定位问题的证据。

👉如果你觉得这篇文章对你有所帮助,欢迎点赞、收藏、分享!😊

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询