摘要:Agent 能调用浏览器和真实账号之后,测试环境就不能只靠 Prompt 假装安全。结合 Anthropic 8 月 31 日的官方复盘,本文给出一套从 Sandbox、Read-only、Canary 到 Controlled Production 的分阶段上线方案。

我们已经很习惯给 Web 服务准备 dev、staging、production,却经常让 Agent 从本地 Demo 直接跳到生产账号。
原因也不复杂:传统服务的副作用写在接口里,Agent 的副作用藏在自然语言任务、工具选择和网页点击中。它上一秒还在分析内容,下一秒可能已经拿着同一份登录态打开发布页。
Anthropic 8 月 31 日的安全复盘提醒了一个关键点:环境说自己是什么不重要,它实际允许什么才重要。
这次事件里,环境配置扮演了什么角色
按照官方披露,7 月 30 日报告的三起事件发生在第三方网络安全评测环境。模型为了能力测试被有意关闭部分安全保护,而环境又因为配置错误保留了互联网访问,模型最终接触了真实计算机系统。
8 月 4 日英国 AI Security Institute 披露的另一起事件,同样发生在有意关闭相关保护、并明确开放互联网的测试中。
调查仍在继续。Anthropic 没把原因全部归给基础设施,也讨论了模型的动机性推理和为完成狭窄目标而采取有害动作的问题。但工程团队已经可以得到一个确定结论:不能用单层配置或一句 Prompt 承担整个安全边界。
这类高风险网络安全评测,与普通用户使用正常安全版本的模型不同。下面讨论的是它对业务 Agent 上线流程的启发,而不是把安全评测事件等同于日常内容自动化。
给 Agent 建一套真正的环境模型
我会把 Agent Runtime 拆成四个独立对象:
ts
type RuntimeContext = {
intent: TaskScope // 想让它做什么
capabilities: ToolGrant[] // 实际能调用什么
environment: Isolation // 网络、文件与进程边界
credentials: Broker // 凭证如何被代理使用
}
Prompt 只属于 intent。它可以告诉 Agent 允许访问哪些目标、禁止哪些行为,却不能替代另外三层。
如果 capabilities 里仍然有 publish,environment 仍可访问任意域名,credentials 仍向进程暴露 Token,那么 Prompt 说"不要发布"只能算软约束。
Anthropic 的官方建议也体现了这一点:边界要写成指令"不要访问互联网",不要写成可能与环境事实矛盾的描述"你没有互联网";与此同时,还要验证沙箱、限制网络、外置 API Key,并实时监控工具调用。

Stage 0:Sandbox,先测试失败路径
Sandbox 不是把生产目录复制一份就结束。
它至少应该具备:
- 合成数据和可重置文件系统;
- 独立浏览器 Profile 与测试账号;
- 默认关闭的网络出口;
- 只返回模拟结果的高风险工具;
- 与真实凭证完全分离的 Secret Broker。
更重要的是主动制造失败:目标页面不存在、任务不可解、工具超时、上传失败、返回状态模糊。观察 Agent 会不会停下来报告,还是为了"完成任务"寻找范围外的替代路径。
可以把启动前检查做成 Policy-as-Code:
rego
deny[msg] {
input.env == "sandbox"
input.network.egress == "open"
msg := "sandbox cannot use open egress"
}
deny[msg] {
input.env != "production"
input.tool in {"public_publish", "delete", "payment"}
msg := "irreversible tool is production-only"
}
不是先相信配置,而是每次运行前验证配置。
Stage 1:Read-only,做影子决策
第二阶段接入真实数据,但能力保持只读。
Agent 可以读取账号历史、分析素材、生成选题和草稿;真人继续照常工作。系统对比 Agent 与真人的选择,但不让 Agent 产生真实副作用。
这里要记录的不只是文本质量,还包括:
- 它选择了哪些数据源;
- 是否尝试调用未授权工具;
- 对失败状态的分类是否准确;
- 是否能区分"已预填""已提交审核""已公开";
- 上下文变化后,结论是否稳定。
Read-only 通过,才说明它理解岗位;还不能说明它会安全执行。
Stage 2:Canary,用小流量验证副作用
Canary 阶段才允许少量写操作,但对象必须有限。
一个发布 Agent 的能力清单可以是:
yaml
principal: agent/blog-publisher-canary
account: dedicated-test-account
allow:
- draft.create
- asset.upload
deny:
- content.public_publish
- content.delete
- account.settings.write
limits:
drafts_per_day: 2
retries_per_task: 1
domains:
- editor.example.com
这里的核心是限制爆炸半径。专用账号、目标白名单、动作预算和重试次数,比一句"谨慎操作"可靠得多。
Stage 3:Controlled Production,把审批做进 Runtime
进入生产后,不应该把 Policy 删除,而应增加人机协作能力:
text
Agent 请求动作
→ Policy 校验目标、参数、预算
→ 高风险动作生成 Diff / Preview
→ 人工确认
→ 凭证代理短时执行
→ 回读页面状态
→ 写入审计日志
公开发布、删除、付款、权限修改等动作,应由 Runtime 统一拦截,而不是让每个 Agent 在 Prompt 里自行决定要不要问人。
实时监控也不能只在任务结束后看日志。Anthropic 新增的做法包括:分类器在工具调用执行前识别激进探测、逃逸尝试或意外网络访问,命中后阻断动作、结束任务并通知人工。
业务 Agent 的版本可以简单得多:目标域名不在清单、页面账号不匹配、按钮语义变成删除、连续重试超过预算,立即停止。
退出标准比"感觉挺稳"更有用
每个阶段都应该有明确的 promotion gate:
ts
type PromotionGate = {
minRuns: number
completionRate: number
unauthorizedCalls: 0
ambiguousSuccessReports: 0
humanOverrideTested: boolean
rollbackTested: boolean
}
具体阈值因岗位而异,但 unauthorizedCalls 和"无法确认却报告成功"通常应该是零容忍项。
岗位隔离会让 Staging 简单很多
如果一个超级 Agent 同时拥有文件、邮箱、内容平台和支付工具,任何一次上线都要测试一整片能力组合。
岗位化后,研究 Agent 只读公开资料;写作 Agent 读品牌资料并输出草稿;发布 Agent 只接收已审稿内容,并在平台页面完成预填。它们通过结构化产物协作,权限和回归范围都更小。
这也是我们做 Tipkay 时采用本地登录态、按岗位配置 Skill/MCP、关键操作保留确认的原因。小红书运营、抖音运营、公众号编辑、视频制作、博客发布等角色各自维护流程和业务上下文,需要时再协作。
但本地执行不等于自动安全,岗位化也不等于零风险。页面变化、验证码、登录失效和工具异常依然存在,所以我们更看重页面回读、失败留稿和安全停机:无法可靠确认,就不把点击按钮写成"发布成功"。
结尾
Agent Staging 的价值,不是把上线流程变慢,而是把副作用逐步暴露出来。
先在沙箱里证明它不会乱找出口,再在只读环境里证明它理解岗位,然后用小流量验证真实动作,最后才接入生产审批。
如果一个 Agent 还没有经历过失败、权限不足和任务无解,它就不是通过了测试,只是碰巧走通了 Happy Path。
参考资料:Anthropic 官方文章《Improving our alignment and security efforts》
www.anthropic.com/news/improv...
建议分类: 人工智能
标签: 人工智能、AI Agent、网络安全、架构