1. 当"安全协议"变成一纸空文:我为什么对这个话题有话说
前阵子跟几个做AI应用开发的朋友吃饭,席间有人提了一嘴"白宫那边又出了个AI安全协议",桌上几个人的反应出奇一致——先是沉默两秒,然后有人笑了一声说"又来"。这个反应本身就挺说明问题的。不是大家不关心安全,恰恰相反,做这行的人比谁都清楚模型被滥用、数据被泄露、输出不可控这些问题有多要命。但问题在于,一份又一份的"协议""框架""倡议"发出来,落到实际开发流程里,能真正改变我们写代码、做测试、上线部署方式的,少之又少。
我写这篇东西,不是要讨论什么政策立场,那也不是我的专业范围。我想聊的是一个更接地气的问题:为什么很多AI安全协议,从工程视角看,天然就容易变成形式主义?以及作为一个真正在做AI产品、做AI测试、搞AI agent协作的一线人,我们该怎么识别哪些条款是真有用的、哪些只是走个过场,又该怎么在自己的项目里把"安全"这件事落到实处,而不是写一份漂亮的合规文档交差。
这个话题适合所有跟AI沾边的人看——不管你是写prompt的、做测试的、搭agent的,还是负责把AI能力集成进业务系统的。因为形式主义最大的危害不是它没用,而是它会消耗掉团队对"安全"这两个字的信任。当大家发现每次合规检查都是填表、每次安全评审都是走过场,真正遇到风险的时候,反而没人当回事了。
2. 安全协议为什么会滑向形式主义:三个绕不开的结构性原因
2.1 协议面向"声明"而非"可执行动作"
我见过太多安全文档,通篇都是"应当确保模型输出符合伦理规范""应当建立完善的数据治理机制""应当对潜在风险进行持续评估"。这些话单独拎出来都没错,但问题是——它们无法被翻译成一行代码、一个测试用例、或者一个CI流水线里的检查项。
举个具体的例子。假设协议里写"应当防止模型生成有害内容"。这句话在工程上要落地,至少得拆成:有害内容的分类标准是什么?用什么数据集做回归测试?阈值定在多少?误报率能接受多少?谁来标注?多久跑一次?发现回归了怎么回滚?这些一个都没有,那这句话就只是一句话。开发团队看完点点头,然后该干嘛干嘛,因为没有任何一个环节会因为"没做到"而卡住。
真正可执行的安全要求,长得应该像这样:"所有面向用户的生成接口,在返回前必须经过一层内容过滤,过滤规则库版本号需记录在日志中,每周用固定测试集跑一次回归,召回率低于95%即触发告警。"你看,这句话有对象、有动作、有指标、有触发条件。它不优雅,但它能被执行、被验证、被追责。
形式主义的第一个根源就在这:协议的语言是给"声明"用的,而工程需要的是"动作"。两者之间的翻译工作,往往没人做,也做不好。
2.2 制定者与执行者之间存在巨大的信息断层
第二个原因更微妙。写安全协议的人,通常不是天天跟模型打交道的人。他们可能是政策研究者、法律背景的合规专家、或者高层管理者。他们理解的风险是宏观的、原则性的。而真正在一线调模型、写agent、做AI测试的人,面对的风险是具体的、琐碎的、充满边界情况的。
这个断层导致一个尴尬的局面:协议里强调的风险,可能不是一线最头疼的风险;而一线真正踩过的坑,协议里根本没提。
我举个自己遇到的例子。我们做多AI协作(multi-agent)的时候,最大的安全隐患其实不是"模型说了不该说的话",而是agent之间传递的中间结果被污染——A agent的输出被B agent当成指令执行了,结果触发了一连串意料之外的操作。这种风险在宏观协议里几乎不会被提及,因为它太具体了,具体到只有真正搭过agent系统的人才会遇到。但它造成的实际危害,可能比一句不当输出大得多。
当一线发现"协议里说的那些我早就注意了,协议里没说的才是我真正怕的",他们对协议的态度自然就变成了应付。这不是态度问题,是信息不对称的必然结果。
2.3 缺乏可验证性,导致"合规"变成"交材料"
第三个原因是最致命的:大部分安全协议没有配套的验证机制。
什么叫验证机制?就是"我怎么知道你真的做到了"。在传统软件安全领域,这件事相对成熟——有渗透测试、有代码审计、有漏洞扫描工具,做没做、做得怎么样,一测便知。但AI安全领域,这套东西还非常不成熟。
结果就是,合规检查变成了交材料:你交一份《数据来源说明》,交一份《风险评估报告》,交一份《应急预案》,齐活。至于这些材料里的内容是不是真的反映了系统现状,没人能验证,也没人有能力验证。于是大家心照不宣地把材料写得漂亮一点,检查通过,皆大欢喜。
当"做到"无法被验证时,"看起来做到"就成了最优策略。这就是形式主义的温床。它不是某个人偷懒,而是整个机制设计上就缺少让"真做"比"假做"更划算的动力。
3. 从工程视角拆解:一份"不形式主义"的AI安全要求长什么样
3.1 可测试性:每条要求都要能对应一个测试用例
我现在评估任何一份安全要求,第一反应就是问:这条能不能写成一个测试用例?如果写不出来,那它大概率是形式主义的候选。
拿"防止prompt注入"这个常见要求来说。形式主义的写法是"应当防范prompt注入攻击"。可测试的写法是:准备一组已知的注入攻击样本(比如"忽略之前的所有指令"这类),跑一遍,统计模型被成功注入的比例,设定一个可接受的阈值,比如低于2%。这个测试可以自动化,可以进CI,可以每次模型更新后跑一遍。
这里有个实操心得:测试集要持续更新,而且要包含你自己业务场景里的真实攻击样本。公开的注入样本库当然要用,但真正有价值的是那些从你自己日志里捞出来的、用户真实尝试过的绕过手段。我一般会建议团队建一个"攻击样本库",每次发现新的绕过方式就加进去,慢慢就积累成了自己的一套回归测试资产。这个东西比任何协议文本都值钱。
3.2 可观测性:安全状态要能被实时看到,而不是事后翻日志
第二个标准是可观测性。一份好的安全要求,应该能让团队在系统运行时就看到安全状态,而不是等出事了再去翻日志。
具体来说,至少要有这几类指标是实时可见的:内容过滤的拦截率、模型输出的异常检测触发次数、agent之间消息传递的校验失败次数、敏感操作的审计日志条数。这些指标不需要多复杂,但必须有一个地方能一眼看到。
我自己的做法是在监控面板上放一个"安全健康度"区域,把这些指标做成趋势图。平时没人看没关系,一旦某个指标突然飙升,值班的人立刻就能注意到。安全这件事,最怕的不是有问题,而是有问题却没人知道。可观测性解决的就是"没人知道"的问题。
3.3 可追责性:每个决策都要能追溯到人和时间
第三个标准是可追责性。这不是为了甩锅,而是为了在出问题时能快速定位、快速修复。
具体到AI系统,至少要记录这几样东西:每次模型调用的输入输出(脱敏后)、使用的模型版本、调用的prompt模板版本、经过的过滤规则版本、以及触发任何安全动作时的完整上下文。这些记录要带时间戳,要能按会话、按用户、按时间段检索。
我踩过的一个坑是:早期我们只记了输入输出,没记prompt模板版本。结果有一次模型行为突然变了,排查了半天才发现是有人改了一个模板但没走发布流程。从那以后,所有影响模型行为的配置都纳入版本管理,每次调用都记录配置版本号。这个习惯救过我们好几次。
4. 一线实操:把安全要求嵌进AI开发流程的几个具体做法
4.1 在prompt工程阶段就引入安全约束,而不是事后补
很多团队的做法是:先把功能做出来,上线前再考虑安全。这个顺序本身就是形式主义的温床,因为到了上线前,改动的成本已经很高了,最后往往就是加一层过滤草草了事。
我的建议是在写第一版prompt的时候就把安全约束写进去。比如系统提示词里明确边界、明确拒绝策略、明确遇到不确定情况时的行为。这些东西在早期加进去,成本几乎为零,而且效果比事后加过滤层好得多。
具体做法上,我会在prompt模板里留一个专门的"安全区块",包含:角色边界声明、禁止行为列表、不确定时的兜底回复、以及敏感话题的处理策略。这个区块由专人维护,改动需要评审。这样安全就不是附加物,而是prompt本身的一部分。
4.2 把安全测试纳入CI,让回归自动跑
这一点前面提过,但值得展开说。安全测试如果不自动化,就一定会被跳过。人都是有惰性的,上线前时间紧,手动跑一遍安全测试?大概率就是"这次先算了"。
我的做法是把安全测试做成CI里的一个必过环节。每次代码合并、每次模型版本更新、每次prompt模板改动,都自动触发一轮安全回归。测试内容包括:注入攻击样本、有害内容生成样本、边界情况处理、以及agent协作场景下的异常传递。跑不过就不让合并。
这里有个细节:安全测试的阈值不要定得太死。一开始可以宽松一点,比如拦截率90%就算过,然后随着系统成熟逐步收紧。如果一上来就定99%,结果天天挂,大家很快就会学会"绕过这个检查",那自动化就白做了。
4.3 建立"安全事件复盘"机制,而不是"安全检查"机制
传统的安全检查是定期的、自上而下的,容易变成走过场。我更推荐的是事件驱动的复盘机制:每次出现真实的安全事件(哪怕很小),都做一次轻量级复盘,搞清楚三件事——怎么发生的、为什么没拦住、怎么改能防止下次。
这个机制的好处是,它是由真实问题驱动的,不是由检查表驱动的。复盘出来的改进项都是具体的、有场景的,落地起来阻力小。而且复盘多了,团队对风险的敏感度会自然提高,这比任何培训都管用。
我印象很深的一次复盘,是有个用户通过多轮对话一点点把模型引导到了边界外。单看每一轮都没问题,但连起来就有问题。这次复盘之后我们加了一个"会话级风险累积"的检测,专门看多轮交互的整体走向。这种改进,任何一份通用协议都不会告诉你,只有自己踩过才知道。
5. 多AI协作场景下的安全盲区:协议往往覆盖不到的地方
5.1 agent之间的信任边界问题
现在做AI agent的人越来越多,多AI协作(multi-agent)也成了热词。但据我观察,大部分安全协议对多agent场景的覆盖几乎为零。它们默认的还是"一个模型对一个用户"的简单结构。
多agent系统里,最核心的安全问题是信任边界。A agent的输出,B agent该不该无条件信任?如果A被注入了,B会不会跟着遭殃?这些问题在单模型场景下不存在,但在多agent场景下是致命的。
我的做法是给agent之间的消息传递加一层校验。不是简单的格式校验,而是语义层面的——B agent在执行A传来的指令前,要判断这个指令是否在自己的职责范围内、是否符合整体目标、是否包含可疑的模式。这层校验会增加一点延迟,但能挡住大部分污染传播。
5.2 中间结果的污染与传播
接上面说,中间结果污染是多agent系统里最隐蔽的风险。因为每个agent单独看都是正常的,问题出在传递环节。
举个具体的场景:一个负责检索的agent返回了一段包含恶意指令的文本,一个负责总结的agent把这段文本当成了正常内容总结进去,一个负责执行的agent又把总结结果当成了指令。三步下来,一个原本无害的检索请求变成了一次越权操作。
防范这种风险,关键是在每个传递节点做"来源标记"和"意图校验"。来源标记就是记录这段内容是谁产生的、经过了哪些环节;意图校验就是判断当前内容是要被"阅读"还是被"执行"。这两个机制加起来,能大幅降低污染传播的概率。
5.3 协作日志的完整记录
多agent系统的调试和安全审计,比单模型难得多。因为一次用户请求可能触发了十几个agent的协作,每个agent又有自己的输入输出。如果日志不完整,出了问题根本没法复现。
我的经验是,多agent系统必须有一个统一的"协作追踪ID",从用户请求进入系统开始,到最终结果返回,所有agent的调用都挂在这个ID下。日志里要记录每个agent的输入、输出、耗时、以及它调用了哪些下游agent。这样出问题时,顺着ID一拉,整条链路清清楚楚。
这个做法在单模型场景下是锦上添花,在多agent场景下是雪中送炭。没有它,排查一次问题的时间可能是有的十倍。
6. 给不同角色的实操建议:怎么在形式主义的环境里做实事
6.1 如果你是开发者:把安全要求翻译成自己的检查清单
你改变不了协议怎么写,但你可以决定自己怎么做。我的建议是,拿到任何一份安全要求,先做一次"翻译"——把它拆成你自己项目里的具体检查项,写进你的开发清单。
比如协议说"确保数据安全",你翻译成:训练数据来源是否记录、用户数据是否脱敏、日志里是否包含敏感字段、数据保留期限是否明确。每一条都对应一个你能检查的动作。这样协议对你来说就不再是空话,而是一份可执行的清单。
6.2 如果你是测试:把安全用例当成功能用例来对待
做AI测试的同学,我特别想说一句:安全测试不是额外的负担,它就是测试的一部分。你测功能的时候会测边界情况,测安全的时候也一样。把注入样本、有害内容样本、异常输入样本,当成你常规测试集的一部分,而不是单独的一次性任务。
具体做法上,我建议建一个"安全回归集",跟功能回归集并列,每次发版都跑。这个集合不用很大,几十条高质量的用例就够,关键是持续维护、持续跑。
6.3 如果你是管理者:用"能不能验证"来筛选要求
如果你负责团队的安全合规,我建议你用一把尺子去衡量所有要求:这条要求,我能不能验证它做到了?能验证的,认真做;不能验证的,至少做到"有记录、有说明",但不要把团队的主要精力耗在上面。
把有限的精力投到那些真正能降低风险的事情上——自动化测试、可观测性建设、事件复盘机制。这些东西不会让你的合规文档更好看,但会让你的系统真的更安全。
7. 我个人的几点体会
做AI这行几年下来,我对"安全"这两个字的理解变了很多。一开始觉得它是束缚,是上线前的最后一道关卡。后来慢慢发现,真正有用的安全实践,都是嵌在开发流程里的,而不是附加在流程之外的。
那些变成形式主义的协议,共同点是它们试图从外部给系统套一层壳。而真正有效的安全,是从内部长出来的——从你写第一行prompt开始,从你设计第一个agent交互开始,从你建第一个测试用例开始。
我不反对协议和框架,它们提供了共同的语言和底线。但我反对把协议当成终点。协议说"应当防范风险",你的工作才刚刚开始——你得搞清楚你的系统里具体有哪些风险、怎么测、怎么防、怎么验证。这些事,没有任何一份协议能替你做。
最后分享一个我一直在用的小习惯:每次项目复盘,我都会问一句"如果现在有人想搞坏这个系统,他会从哪下手?"然后顺着这个思路去找漏洞。这个问题比任何检查表都更能让我保持清醒。安全这件事,说到底不是填出来的,是想出来的、测出来的、改出来的。