AI Agent安全围栏:从“会动手”到“敢放手”的人机协同实践
第十二天我盯着屏幕上一封AI助手刚起草好的对外邮件收件人、主题、正文都没问题发送按钮就在眼前。前一秒我甚至想问它“你自己能发吗”后一秒我意识到一个问题当一个AI助手手里开始握着“执行权”我们每天挂在嘴边的“它只是建议我才是决策者”瞬间就不是一回事了。这是我们内部那个智能工作台项目连续迭代的第12天。前11天AI助手的角色还只是一个问答知识库——你问它“上季度数据在哪”它给你指路你问“某条审批规则怎么写的”它把原文调出来。这种模式出点错顶多算“回答不准”大家笑一笑就过去了。但第12天我们把工具调用接了进去它开始能主动发邮件、改文档、标记任务状态。能力升级当然是好事可全组人的安全感一下子掉到谷底。原因很简单说错话是小事做错事就是事故。所以我这一天的核心任务只有一个给这个终于“会动手”的AI助手搭一套安全围栏。围栏不是用来限制它的而是让人类敢放手用它。这件事拆开看就是两个关键词——人机协同以及风险分级。1. 一个会动手的AI助手让全组人集体失眠1.1 从“只动嘴”到“会动手”中间隔着执行权先交代一下项目背景。我们组接的是一个30天里程碑的内部工具项目前11天做的是企业知识库问答文档解析、向量检索、引用溯源AI只负责“说话”。当时的风险边界很清晰——AI输出的内容只是信息而不是动作所以哪怕它把某条制度解读得略有偏差最坏情况也就是用户多跑一趟确认。第12天的更新里我们给AI接上了三个真实动作接口发送邮件、修改线上文档、更新任务状态。这是从“信息助手”升级成“智能体/Agent”最关键的一步也是风险性质发生根本改变的一步。为什么这么说因为“执行权”落到AI手里之后同样的失误后果可能是数量级的差别。回答错一个制度条款用户自己去核对一下就纠正了可如果AI批量把一封带有错误结论的报表邮件发给了20个外部联系人这就不只是“小事故”而是信任崩塌。前一晚我们内部做了一次模拟推演结论很让人冷汗没有围栏的状态下AI只要在批量操作时选错一次数据集就能造成需要半天甚至一天才能收拾干净的混乱。所以第十二天早上我把当天目标定为在AI真正开始大规模执行任务之前给所有工具调用装上一道“安全围栏”。1.2 一次模拟事故演示没有围栏时的混乱现场为了向组里所有人说清楚“为什么必须慢这一拍”我特意设计了一个模拟事故。场景很简单AI收到了一个指令“把一月份的日报数据更新到本月摘要里”但实际上系统中存在两个名字很像的数据源一个叫“日报-一月”另一个叫“日报-一月-备份-2022”。AI很自然地选中了看起来更“正式”的那个然后批量执行了更新操作。模拟的结果是备份数据被改写原始数据被污染而且这个动作在系统操作日志里只留下了一行冷冰冰的记录没有任何人当时注意到。直到第二天有人对比数据时才发现不对劲最后只能从备份里恢复。整个过程耗时接近半天而真的出问题时没有人能说清“这个动作到底是谁让它做的”。这套演示让全组意识到问题从来不在AI的“能力”而在“边界”。我们需要的正是这样一道边界——它应该像工厂车间里的实体防护栏一样机器在围栏内正常运转人被挡在危险区之外同时围栏上开一扇带锁的门让授权人员能安全进出。1.3 “安全围栏”这个词我从车间里借来的如果你去过稍微规范一点的工厂会发现高速运转的机床旁边一定有物理围栏。围栏存在的意义不是为了挡住机器——机器本来就在那个区域里干活也不是为了关住人——人有通道可以进出。它真正解决的是在“机器干活”和“人需要靠近”这两件事之间建立起一个可控的交互规则。AI Agent的安全围栏也是同样逻辑。它不是要禁止AI执行动作而是要规定什么动作可以自动跑、什么动作必须停下来等人看一眼、什么动作就算有人同意也不能轻易做。而这个“什么动作对应什么处理方式”就是风险分级要解决的问题。2. 给风险分级把“感觉有风险”变成一套可计算的规则2.1 五级风险模型L0到L4怎么定出来的刚开始聊安全围栏大家提的意见几乎都是“就设置一个开关呗高危的拦一下不高的放行”。但真正落地时就会发现“高危”这个词太模糊了——删一条草稿算不算高危发送一封内部周报邮件算不算把一条生产环境的配置项改了算不算每个人心里都有自己的答案。我给团队提了一个五级模型参考了工业控制里的安全完整性等级和常见的事故分级思路但针对我们这个内部工具场景做了裁剪。五个等级是这样的等级典型动作举例处理策略L0内部计算、生成草稿文本、读取公开配置静默执行事后留痕L1读取内部数据、创建临时会话、发起只读查询自动执行进入审计日志L2修改文档正文、更新任务状态、发送内部邮件需人类一键确认L3修改权限、发送外部邮件、批量更新数据需人类审批影响面预估回滚预案L4删除生产数据、不可逆配置变更、对外发布默认禁止需双人复核并显式授权这个表格不是拍脑袋定出来的。L0到L4的划分依据是我认为任何一个“会动手”的AI系统都必须严格回答的三个维度作用域、可逆性、敏感度。2.2 三个分级维度作用域、可逆性、敏感度第一个维度是作用域。这个动作影响几条数据是一个人、一个部门还是全体用户影响范围越大风险等级天然就越高。我定了一个简单规则只影响单条记录的默认L2封顶影响一整个批次的操作至少L3起跳凡是涉及“全部”“所有用户”这类字眼的动作一律默认L4。第二个维度是可逆性。也就是动作做错了能不能“一键还原”。能撤销的比如编辑文档后可以恢复历史版本风险就低一个档次不能撤销的比如覆盖了原始数据源或者发送了一封收件人无法撤回的外部邮件那不管影响对象有多少级别都要再往上一档。第三个维度是敏感度。这里考虑的不仅是我们自己的数据安全还包括对方接收方的敏感程度。给内部同事发协同通知和给你的客户企业发正式说明完全是两个量级的事。我们把数据内容也分成公开、内部、机密、历史遗留四档后两档会显著拉高风险评分。我刚开始设计时很多人觉得这套规则会不会太复杂。但事实是这三个维度正好对应了人们在现实中判断“这件事能不能让AI直接做”时的大脑活动做错了多严重能不能补救有没有不该碰的东西把这三个问题翻译成数字风险分级就不需要靠感觉了。2.3 不可逆性为什么比影响大小更优先分级规则里有一个容易被忽略的设计细节当作用域很小但不可逆时等级依然要拉高而当可逆性很高时即使作用域较大也可以适当降级。举个例子一个人发送了一封“确认会议时间”的外部邮件收件人只有一个。这个动作可逆吗不可逆。因为邮件一旦进入对方的收件箱你无法把它撤回来。所以哪怕作用域只有1个人我也把它定在L3。反过来修改一份内部知识库的批量文档影响了500篇文档但这个系统和文档平台做了一次快照可以一键恢复到10分钟前那么它用L2就够了。这个排序原则我在代码里是这样表达出来的评分函数先看可逆性再看敏感度最后看作用域只有前三者都压得住时作用域才参与修正。def evaluate_risk(action): risk_flags { reversible: {yes: 0, partial: 2, no: 3}, target_env: {test: 0, staging: 1, prod: 3}, data_class: {public: 0, internal: 1, confidential: 2, legacy: 3}, impact_scope: {single: 1, batch: 2, all_users: 3}, } score 0 score risk_flags[reversible].get(action.get(reversible), 1) score risk_flags[target_env].get(action.get(target_env), 1) score risk_flags[data_class].get(action.get(data_class), 0) if score 3 and action.get(impact_scope) all_users: score 1 if score 2: return L0 if score 4: return L1 if score 6: return L2 if score 8: return L3 return L4初版这个函数很粗糙它没有机器学习就是纯规则打分。但好处是每一个分数都可以向用户解释。谁质疑“凭什么这条是L3”我们直接把三个维度的权重列给他看讨论就变成了对规则的讨论而不是对AI的玄学信任。2.4 冷启动期的风险规则从哪来既然用了规则而不是让AI“自我判断”那规则怎么定就成了关键。我们没有从零发明而是做了三件事第一把这三个月里真实的人工操作日志全部翻出来标注出哪些是高频动作、哪些是偶尔操作的敏感动作第二找几个经常使用系统的人问了问他们对哪些操作“默认希望系统停下来问一下”答案出奇一致和钱有关的、和发到公司外部有关的、和删除有关的事都必须停下来第三把已有权限体系里的角色层级直接映射成风险等级——管理员能做的事AI默认不能自动做。冷启动期宁可“过度谨慎”也不要“过度放权”。因为围栏装上去之后加严容易放宽也容易最难处理的是“已经放出去的权限收不回来”。所以第十二天上线时我们的默认策略是所有拿不准的动作一律升级一级处理。3. 人机协同的安全围栏流程AI提方案人拍板系统留痕3.1 行动提案制让AI在动手前先交一份“作业”安全围栏的核心交互我用了一个很朴素的思路AI要执行任何动作之前先交一份“行动提案”。提案里必须写清楚五件事——目标、要执行的具体动作清单、影响范围、预判风险等级、回滚预案。这份提案会以一张卡片的形式推到对应负责人的面前。这个设计的灵感其实来自日常的代码评审。你不可能让一个新人直接往生产环境推代码你至少希望他先写清楚“这次改了什么、影响哪些接口、怎么回滚”然后由有经验的同事看完再合入。AI Agent的动作执行本质上和推代码是同一回事。实际的交互流程是这样的AI接收到用户任务后先生成初步方案如果方案的评级是L0或L1直接执行并把动作信息记录进日志如果是L2系统推送一条确认消息给当值的操作人操作人点一下“确认执行”就放行如果是L3或L4则进入正式审批通道卡片上会附上AI自己的风险评估、涉及的数据范围预览、以及如果执行后想回滚具体采用哪种恢复方式。3.2 四种处理流静默、留痕、确认、双人复核不同风险等级对应了四种差异很大的处理流这个设计几乎决定了安全围栏的可用性。我把它们列出来你可以直接抄去用静默执行L0AI直接做事后写入审计日志。适合纯内部计算、生成临时文件这种“错了也无所谓”的动作。自动执行留痕L1AI直接做但会同步在操作人的工作台上生成一条可见记录。适合读取内部知识、创建临时会话。一键确认L2AI先把动作准备好但不真正提交等人在IM卡片或工作台里点“确认”才继续执行。适合修改文档、更新任务、发送内部通知。双人复核显式授权L3/L4除当值负责人之外还需要第二个人确认L4动作还要额外开启“临时授权窗口”并且这个窗口5分钟后自动关闭。适合涉及外部联系人、批量覆盖、生产环境变更。这套机制用下来最明显的变化是人不再需要实时盯着AI的每一步了而是在系统认为“风险跨过阈值”的时候才介入。这其实就是人机协同的准确含义——把机器擅长的高速执行和人类擅长的风险判断结合起来各干各擅长的事。3.3 回滚预案AI一定会犯错但错误必须有代价我见过很多安全设计只强调“拦截”却忽视了“善后”。但真实世界里你不可能100%拦住所有错误动作真正拉开系统安全水平差距的是“出事后多久能恢复”。所以每个L2以上的动作系统都会要求AI在提案里附带回滚预案。比如修改文档前自动生成版本快照批量更新数据前先把原始数据导出到一个临时存储发送邮件前把收件人列表和正文内容留存在归档桶里确保事后可以追溯。这里有一个很容易忽略的细节回滚预案本身也可能出问题所以我们在设计时规定凡是AI自己生成的回滚操作必须默认降一级处理权限。也就是说AI可以建议怎么回滚但真正执行回滚动作时必须让人按下那个按钮。为什么因为回滚动作往往是对生产环境的第二次修改如果它又错了你就在事故处理过程中叠加了一个新事故。3.4 哪些动作永远不该交给AI即使有人批准风险分级再完善也有一类动作是默认禁止交给AI自动执行的。我们在系统配置里设了一个“绝对禁止列表”里面包含了几种情况涉及资金支付类操作、删除或覆盖唯一数据源、修改另一个AI系统的行为策略、以及发送任何代表个人/组织正式表态的对外声明。你可能觉得奇怪既然有双人复核为什么这些动作还要禁止因为双人复核天然有一个心理弱点——“反正有别人也看了”团队里很容易互相依赖最后两个人的把关都变成了走过场。所以这四项动作根本不出现在AI的执行能力列表里即使是L4授权窗口临时打开也覆盖不了它们。要给AI增加这类能力必须走人工代码评审流程而不是靠运营侧的审批卡片。4. 搭建围栏时踩过的三个坑每一个都值得写下来4.1 坑一拦截太频繁人比AI先崩溃第十二天下午我们把围栏的初版部署到测试环境让几个同事试用。半个小时后反馈就来了“这破东西怎么什么都问我”我一看日志明白了初版规则确实过严了。AI每执行一次文档编辑就弹一次确认卡片甚至修改一个标签这种无关紧要的动作都要打断人一次使用体验直接回到了“人肉点击器”的时代。这个问题本质上是“精确率/召回率”的失衡——我们为了提高安全性把大量L1的动作错误地升级成了L2。人一旦被频繁打断就会产生两种心态要么干脆不用AI了要么开始无脑点“同意”。两者都会让围栏失效。修法不是简单放宽容错而是给围栏加了一个“行为自学习”的能力系统记录每个用户对不同等级动作的确认率和确认耗时。如果某个动作连续被同一个用户确认超过10次并且平均确认时间不足3秒系统就会把它降级处理在第二天自动转为“留痕审计”而不是“手动确认”。降级过程是可视化的——每次降级都会推送给负责人一条解释消息。4.2 坑二审批卡片挂在那里没人理任务悬空第二个坑来得比预期快得多。当我们把L3动作的审批推送到IM群后出现了这样一个场景AI已经把行动提案写好了、收件人列表都生成好了但审批卡片在群里挂了40分钟没人点。因为大家都有别的事在忙谁也没注意到群里多了一张“不那么紧急”的卡片。这个任务的后续动作全被卡死AI也傻傻地等着整个流程悬空了。我们事后复盘发现这其实是一个协同流程设计缺陷安全围栏的“等待”必须是一个有预期、可处理的状态而不是一个黑洞。于是我们做了两个改动。第一个改动是超时自动降级审批卡片发出5分钟后无人处理系统会向当值负责人再次发送提醒10分钟后依旧无人处理任务自动挂起并给发起用户返回一条“这个动作还在等待审批”的状态通知而不是让用户以为AI已经执行了。第二个改动是增加“等待预估”AI在提交L3动作时会顺带给出一个“预计需要等待审批”的提示让发起方知道现在是卡在人在审批而不是卡在AI卡壳。4.3 坑三信任惯性——点“同意”变成了肌肉记忆这是我在测试中观察到的现象也是最可怕的一个坑。连续几天使用后我把操作日志调出来看了一眼某个频繁使用系统的人对L2动作的确认时间平均只有1.7秒几乎就是看到卡片弹出来顺手点一下根本没看内容。这就是典型的“信任惯性”前几次他认真看了内容发现AI提的方案都合理于是潜意识里默认“AI肯定没问题”确认动作慢慢变成了条件反射。这个现象直接抵消了围栏的意义——如果人的确认环节完全流于形式那跟没有围栏有什么区别我的对策很朴素叫“分桶抽检”同一类型的动作前5次走正常确认流程从第6次开始系统会随机抽取20%的次数弹出一个“复核模式”强制要求确认人回答两个问题——“这个动作的影响范围是什么”以及“它的回滚方案是什么”答不上来动作就不能提交。这个抽检机制不需要每单都做但它的存在会让人不敢养成“无脑确认”的习惯。4.4 表单化总结坑、原因与对策坑根因对策拦截太频繁风险等级设置过严误把L1当成L2根据用户确认率和耗时动态降级审批卡片无人处理审批链路缺少超时机制任务悬空超时提醒、自动挂起、状态可见无脑点同意人对重复确认产生信任惯性分桶抽检、强制回答复核问题这三个坑有个共性表面上看是流程问题本质上都是“人机协同”中人的行为模式没有设计到位。围栏不只是技术的围栏更是安排人如何在循环里工作的围栏。5. 第十二天晚上的复盘围栏不是绊脚石而是加速器5.1 三组对照实验的设计与数据晚上我们做了一组快速对照实验目的就是想回答那个最大的质疑加上围栏之后AI的效率到底会下降多少我们在同一个模拟任务集上跑了三种模式。三种模式分别是完全无围栏、全动作都人工确认、风险分级围栏。任务集包含100个动作请求其中有4个是“模拟危险动作”比如向外部邮箱发信、批量覆盖唯一数据源。结果如下模式总完成动作数危险动作拦截人均介入次数平均单动作耗时无围栏100001.2秒全量人工确认10041006.8秒分级围栏1004232.5秒数据说明了两件事一是分级围栏能把人工介入次数从100次降到23次同时还能100%拦下危险动作二是它确实比完全无围栏要慢但这个“慢”换来的安全收益对这个即将面向全公司使用的系统来说是绝对值得的。更让我惊喜的是分级围栏的平均单动作耗时只增加了大约1秒多。因为大部分动作都落在L0/L1自动执行区间真正需要人来等一等的是少数高价值场景。用不到1秒的额外延迟换掉一次可能造成半天事故的概率这个买卖不亏。5.2 误拦率从19%到4%是靠什么压下来的初版规则在试验里误拦率达到了19%——也就是100个动作里有19个明明不该拦截的被风险评级错误地送去了人工确认。这个数字虽然不致命但会让用户烦躁。我们把误拦样本一个个挑出来看发现大部分是同一个原因可逆性判断过于保守。比如修改一篇内部文档文档平台本身就有版本历史功能这个动作理论上完全可逆但我们的规则没有识别到这个机制仍然按“部分可逆”打了2分导致被升级。修正方法是给动作类型加一张“可逆性映射表”明确标注“哪些动作依赖的平台自带恢复能力”。文档编辑、表单字段修改、任务状态迁移这三类只要平台自身有版本回退能力统一定为“完全可逆”评分直接降到L1区间。这一改误拦率立刻降到了4%。这个优化的经验是风险分级规则一定要尽可能绑定具体平台的机制而不是抽象地去猜。你判断“可逆”的依据必须是这个工具实际提供的能力而不是“我觉得应该可以撤销”。5.3 后续迭代方向把人工审批记录变成训练语料有了第十二天这一版围栏系统已经能可靠运行了但我已经开始琢磨下一步。目前围栏用的是静态规则动态降级本质上还是“人把规则写死AI去匹配”。这套方案上限并不高——真实世界里的风险动作组合远比规则枚举的多得多。我们接下来打算做一件事把每天产生的人工审批数据全部沉淀下来打上标签变成一份“人类风险偏好”数据集。比如“用户在什么场景下会拒绝AI的提案”“用户对哪类文档编辑动作几乎不过问”“双人复核时第二个人真正花时间检查的都是哪些内容”。这些东西一旦攒起来就可以训练一个风险偏好模型让围栏在规则之上再多一层个性化的预测能力。这不是第十二天能完成的事但我认为安全围栏的终态一定是“规则保底模型微调人工抽检”三层结构。规则保护底线模型减少误拦人工抽检防止模型跑偏。我在写这一天总结时的体会是安全围栏最好的状态不是让AI缩手缩脚而是让人类真的敢把事情交给AI做。它真正建立起来的不是障碍而是信任——只不过这份信任不是靠口号喊出来的是靠每一张审批卡片、每一条留痕记录、每一次双人复核一点一点砌起来的。