Agent 能读写文件、运行代码、联网以后,怎样让它在有用的同时不把错误扩大?

权限、沙箱与错误恢复

约 14 分钟8 道自测更新于 2026-11-01

一句话记住让 Agent 安全动手靠四件事:用隔离划边界,用分级审批节省人的注意力,用检查点和有限重试恢复,用独立评估者验证结果。安全不是把每一步都交给人点确认,而是让越界和高风险动作真正停下来。

01学完你能做到

知道怎么让 Agent 安全地动手:用沙箱划边界、按风险分级审批、出错能重试和回滚,并用独立的评估者检查结果。

第 29 讲(工具调用 / Function Calling)讲了 Agent 能调用工具,第 35 讲(工具循环、状态与长任务)讲了它能连续干几个小时。能力越大,出错的代价越大:删错文件、把密钥发出去、在坏代码上越改越乱。这节讲 harness 里管「安全动手」的四件事:隔离、审批、恢复、验证。

02为什么光靠「每步都问人」不行

Anthropic 在《Making Claude Code safer with sandboxing》(2025-10-20)里介绍了 Claude Code 原来的做法:默认只读,修改文件或运行命令前都要问用户,只有 echo、cat 这类安全命令自动放行。

问题是,一直点「同意」会拖慢开发,还会造成审批疲劳(approval fatigue):人开始不看内容就点同意,结果反而更不安全。

解法是换个思路:事先划好边界,边界里随便干,越界才问人。 这就是沙箱。文章说,在他们内部使用中,沙箱把权限弹窗减少了 84%。

03沙箱的两道边界

沙箱建立在操作系统级的功能上(Linux 用 bubblewrap,macOS 用 seatbelt),限制不仅作用于 Agent 直接运行的命令,也作用于这些命令启动的所有子进程和脚本。它有两道边界:

边界做法防的是什么
文件系统隔离当前工作目录可读写,目录外的文件不能修改被注入的 Agent 改系统敏感文件
网络隔离所有出网请求都经过沙箱外的代理,只放行批准的域名;新域名要用户确认被注入的 Agent 外泄数据、下载恶意软件

文章特别强调:两道边界缺一不可。

  • 只有文件隔离、没有网络隔离:Agent 可以把 SSH 密钥这类敏感文件发出去;
  • 只有网络隔离、没有文件隔离:Agent 可以改系统文件逃出沙箱,再拿到网络权限。

这样即使提示注入(第 39 讲(提示注入))成功了,影响也被关在沙箱里。

演示:凭证不进沙箱

文章还介绍了云端版的做法:每个会话跑在隔离的沙箱里,git 凭证、签名密钥等敏感凭证从来不放进沙箱。沙箱里的 git 只拿到一个权限很小的专用凭证,所有 git 操作都经过一个代理:

  1. 沙箱里的 git 客户端用专用凭证连代理;
  2. 代理检查凭证,再检查这次操作的内容,例如是不是只允许更新指定分支;
  3. 检查通过后,代理换上真正的令牌,再发给 GitHub。

要点:真正有权限的东西放在 Agent 碰不到的地方,由代码代为使用。 第 39 讲(提示注入)讲防注入时还会用到这条原则。

沙箱同时限制文件系统和网络:工作目录与批准域名内可操作,越界动作被拦截或暂停审批。
沙箱同时限制文件系统和网络:工作目录与批准域名内可操作,越界动作被拦截或暂停审批。

04权限审批:按风险分三档

把上面的做法整理一下,Agent 的每个动作可以分三档:

  1. 安全的只读命令:直接执行;
  2. 沙箱边界内的动作:直接执行,不弹窗;
  3. 越界或高风险的动作(改目录外的文件、连新域名):暂停,请人批准。

这样人只需要在真正要紧的时候做判断,注意力不会被大量无关弹窗耗光。第 40 讲(对齐与 Agent 安全总复习)会把这一点和「人在回路」「最小权限」放在一起总结。

05错误恢复:重试与回滚

Agent 一定会出错,关键是错了能不能回来。

接口层面防错。 SWE-agent 论文(2024)提出「Agent-计算机接口」(ACI):像给人设计软件界面一样,专门给 Agent 设计命令和反馈格式。其中一条设计是在编辑命令里接入 linter(代码检查器):如果一次编辑引入了语法错误,就把错误告诉 Agent,并拒绝这次编辑。论文说 Agent 很难从自己造成的错误里恢复,所以最好在错误发生时就拦住。凭这类接口设计,SWE-agent 在完整 SWE-bench 上解决了 12.47% 的问题,此前非交互式方法的最好成绩是 3.8%。

检查点和回滚。 第 35 讲(工具循环、状态与长任务)讲过,每完成一个功能就提交一次 git,相当于存档。改坏了就退回上一个好版本,而不是在坏的基础上继续改。

重试要有上限、有变化。 盲目重试同一个错误做法没有用。第 37 讲(用 trace 迭代 harness)会讲到 LangChain 发现的「死循环」:Agent 对同一个错误方案反复做小改动,有的 trace 里超过 10 次。

演示:一次出错后的恢复流程(示意)

假设 Agent 在修一个 bug:

  1. 改代码,linter 报语法错误 → 编辑被拒绝,Agent 立刻看到错误行号并重写;
  2. 代码能运行,但测试失败 → 读失败信息,再改一次;
  3. 连续三次都没通过 → 不再微调,回退到上次提交,换一个思路;
  4. 测试通过 → 提交 git,更新进度文件。

第 1 步靠接口,第 3 步靠检查点和重试上限,第 4 步靠存档。

06自我验证与规划者-生成者-评估者

做完了怎么知道真的做对了?最简单的是让 Agent 自己检查,但 Anthropic 在《Harness design for long-running application development》(2026-03-24)里指出:让 Agent 评价自己的作品,它往往会自信地夸奖,哪怕质量明显一般。在设计这类主观任务上尤其明显。

文章的结论是:把干活的和评判的分开。分开之后评估者仍然是 LLM,仍然偏宽容,但「把一个独立的评估者调得挑剔」比「让生成者批评自己」容易得多。这和第 28 讲(什么是 Agent)的「评估-优化」模式、第 32 讲(多智能体)「干活的和把关的分开」是同一个道理。

文章受生成对抗网络(GAN)启发,设计了三个角色:

角色职责
规划者把用户 1–4 句话的需求扩写成完整的产品规格,只写高层设计,不过早规定实现细节
生成者按冲刺(sprint)一块一块地写代码
评估者用 Playwright 像真人一样点击运行中的应用,测试界面、API 和数据库状态

几个关键设计:

  • 冲刺合同:每个冲刺开始前,生成者提出要做什么、怎么验证,评估者审核,双方反复修改直到达成一致,然后才写代码。这一步把高层规格变成可以测试的标准。
  • 硬门槛:每条标准都有及格线,任何一条不达标,这个冲刺就判失败,生成者会收到具体的反馈。
  • 通过文件交流:一个智能体写文件,另一个读了再回复。

演示:评估者抓出的 bug

合同可以很细,文章说第 3 个冲刺仅关卡编辑器就有 27 条标准。评估者的反馈具体到可以直接动手修,例如:

  • 「可以通过 API 调整动画帧顺序」→ 不通过:PUT /frames/reorder 路由写在 /{frame_id} 路由后面,FastAPI 把 reorder 当成帧 ID 去解析成整数,返回 422 错误。
  • 「可以选中并删除实体出生点」→ 不通过:LevelEditor.tsx:892 的删除键处理要求两个状态同时存在,但点击实体只设置了其中一个。

评估者也不是一开始就这么好用。文章说「开箱即用的 Claude 是个糟糕的 QA」:它会发现问题,然后说服自己问题不大,照样放行;测试也停留在表面。改进方法是读评估者的日志,找出它的判断和人不一致的地方,据此修改 QA 提示词,反复几轮。第 37 讲(用 trace 迭代 harness)会把这种「读日志、改 harness」的方法系统化。

规划者写可测试规格,生成者实现冲刺,独立评估者用真实操作验证,失败反馈回到生成者。
规划者写可测试规格,生成者实现冲刺,独立评估者用真实操作验证,失败反馈回到生成者。

07延伸阅读

  • David Dworken、Oliver Weller-Davies(Anthropic), Making Claude Code safer with sandboxing, 2025-10-20:anthropic.com
  • Yang et al., SWE-agent: Agent-Computer Interfaces Enable Automated Software Engineering, 2024:arxiv.org
  • Prithvi Rajasekaran(Anthropic), Harness design for long-running application development, 2026-03-24:anthropic.com

08一分钟讲给别人

试着用自己的话讲一遍让 Agent 安全动手靠四件事。隔离:沙箱同时做文件系统隔离(只能改工作目录)和网络隔离(只连批准的域名),两者缺一不可,即使被注入也出不了边界;真正的凭证放在沙箱外,由代理代为使用。审批:每步都问人会造成审批疲劳,改成安全命令和沙箱内动作直接执行、越界才问人,Anthropic 内部弹窗因此减少 84%。恢复:接口层面用 linter 拒绝有语法错误的编辑,用 git 检查点回滚,重试要有上限、要换思路。验证:Agent 评自己容易自夸,所以把评估者独立出来;规划者扩写规格,生成者按冲刺写代码,评估者用 Playwright 实测,每个冲刺先签合同,任一标准不达标就失败。

想一想

8 道自测

先在心里答一遍,再展开对照。能说清理由,比答对数字更重要。

  1. 01为什么「每个动作都请人批准」反而可能不安全?

  2. 02沙箱的两道边界分别是什么?为什么缺一不可?

  3. 03云端沙箱为什么不把 git 凭证放进去?那 Agent 怎么更新代码?

  4. 04SWE-agent 为什么要在编辑命令里加 linter?

  5. 05Agent 在同一个方案上连续失败时,该怎么做?

  6. 06为什么要把评估者独立出来,而不是让生成者自己检查?

  7. 07冲刺合同解决什么问题?

  8. 08评估者一开始「放水」,Anthropic 是怎么改进的?

已看 0/8 题

练动手练习

给一个只需读取资料并生成摘要的 Agent 列出它需要的权限,再给一个会修改工作目录的 Agent 列出权限;逐项问“去掉后任务还能完成吗”,删掉不必要的权限。最后为其中一个高风险动作设计审批点、沙箱边界和回滚点。

完成这一课

完成这一课

读完讲义、看完自测答案,这一课就算学完了。

  • 读完讲义
  • 看完全部自测

本课为投资者教育内容,案例数字均为示意,不构成任何投资建议,也不承诺收益。规则和费率会变,实际操作前请以交易所、监管机构和产品的最新公告为准。