运行时安全:护栏与内容审核
第 19 章 中的对齐,教会了模型在多数时候拒绝有害请求。但「多数时候」不是保证,部署出去的系统不能依赖它。对外服务的系统每个请求都在回答不可信的输入,要执行的策略变动起来比重训模型还快,而下一章会表明,攻击者可以用越狱(jailbreak),也就是绕过拒绝边界的提示,击穿这道拒绝(第 58 章)。于是生产系统加上第二层安全,它在推断时运行,不依赖模型本身守规则。这一层之所以必要,是因为已对齐模型自己的拒绝必要而不充分:输入与输出要分开筛,审核也从黑名单演化成了以策略为条件的分类器,工具型智能体又借间接提示注入(prompt injection)把问题以最棘手的形态重新打开,而服务层的流式决策会反过来约束护栏设计。
一个已对齐的模型为何仍不够
监督那一章在「教会模型正确的行为」与「从外部约束它的行为」之间画了一条线(第 55 章)。运行时安全就是把这条线往下挪一层,画在服务的时候。内置的拒绝之所以不够,缘由是结构性的,而非训练不足。模型的服从是概率性的:它以高概率拒绝,而非笃定地拒绝,于是服务数十亿请求的系统迟早会撞上那条长尾。策略也是个移动的目标。平台的内容规则、监管方的新禁令、客户的领域限制,都在以天计的时间尺度上变动,而靠重训模型把这些规则编码进去要花上数周,还可能在别处引入回归。再加上,模型的安全还会被主动攻击,下一章会完整展开这一点。
标准的应对,是控制论与安全工程共同使用的做法:在被控制对象之外放置控制。护栏就是一个独立的、通常更小的分类器,摆在请求路径里,便宜到能在每一次调用上跑,并独立于它所守卫的模型而更新。
一道护栏的形状
护栏筛两次,因为两道筛接住的是不同的失败。
输入筛在模型为一个不被允许的请求耗费 token 之前就接住它,这既带来安全收益,也带来成本收益:最便宜的有害生成,就是从未产出的那一个。输出筛接住的,是输入筛接不住的那些,因为看起来无害的提示仍能引出不被允许的补全,也因为模型可能被它检索到的内容、或某个工具在生成途中返回的东西带偏。两道筛是独立的分类器,而务实的默认是失败即关闭:守卫一旦出错或超时,请求就被拒绝,而不是放行。
演化:从黑名单到把策略作为输入
这一路径从粗陋走向可编程。最早的过滤器是关键词黑名单,改个拼写就能轻易绕过,对无辜文本又动辄判错。学习出来的毒性分类器用一个对类别建模的模型把它们取代掉,这一脉的现代形态是 Jigsaw 的 Perspective API,它扔掉了按语言划分的词元词表,换成单个字符级 transformer,对拼写、语码转换与混淆都鲁棒 (Lees et al. 2022)。再下一步,是把语言模型放进审核者的位置:OpenAI 的审核端点,是在一套精心设计的危害分类法上训练出来的分类器,配一条主动学习的流水线,好让它不断发现生产流量里冒出来的稀有违规,比关键词清单更经得起改写,而且一直有人维护,不是定死的 (Markov et al. 2023)。
决定性的转变,是把策略做成一个输入,而非写死的类别。Llama Guard 经过微调,会把一套安全分类法放进自己的提示,再对照那套分类法给一段对话分类,提示模式与回应模式分开,于是同一个守卫模型能服务许多套策略,改一次策略只是改一次提示,而不是重训一遍 (Inan et al. 2023)。它后来的版本对齐到 MLCommons 危害分类法,一份共享的危害类别词汇,让守卫与基准对「它们在量什么」达成一致 (Vidgen et al. 2024);这条产品线如今还跨越了模态:Llama Guard 4(2025)用单个模型按同一套分类法给文本和图像分类 (Meta AI 2025)。守卫模型的种种变体填满了这个设计空间:ShieldGemma 推出一系列尺寸,并给出经过校准的概率,好让运营方挑一个阈值 (Zeng et al. 2024);WildGuard 则把三项任务合进一个模型,分别给提示的危害、回应的危害,以及模型是否拒答打分,最后这一项之所以也算进来,是因为过度拒答本身就是一种值得度量的失败 (Han et al. 2024)。另有一条平行的路线,在这单一的分类之上又加了一层控制:可编程的护轨约束对话本身,按声明好的流程来路由、改写或拒绝,而不是只给一个是或否 (Rebedea et al. 2023)。这一路走来,是从固定的过滤器走向一个立在模型旁边、可以配置的策略引擎。
被注入的智能体
上面那道护栏假设危险内容是在用户这一轮里到达的。工具型智能体打破了这个假设。第 37 章 的模型被训练来发出工具调用,第 41 章 的运行框架执行这些调用,把结果塞回上下文,于是智能体把网页、文档、邮件与工具输出都当作数据来读,而 transformer 是以整个上下文为条件来生成的,没有一个可靠的办法去分辨哪些片段是可信的指令、哪些是不可信的数据。这正是提示注入的结构性根源,这个名字是类比 SQL 注入而来 (Willison 2022)。直接注入是用户敲入「忽略上面的话」;对智能体而言,真正危险的是间接注入,恶意指令藏在智能体检索到的内容里。Greshake 等人在真实应用上演示了这一点:一个网页里植入的载荷,就能劫持一个集成了 LLM 的助手 (Greshake et al. 2023)。酿成灾难的前提,是致命三元组(lethal trifecta):一个智能体若同时握有对私有数据的访问、对不可信内容的暴露,以及一条对外通信的通道,就可能被诱导把私有数据送给攻击者;去掉其中任一条,都能切断这条外泄路径 (Willison 2025)。
防御是真有效的,但每一种都只是局部的。指令层级(instruction hierarchy)训练模型为它的来源排序,系统高于用户、高于工具输出,只有当一条低权限指令与一条高权限指令一致时,才服从前者 (Wallace et al. 2024);聚光标记把不可信的片段标出来,好让模型把它们当成惰性数据 (Hines et al. 2024)。两者都抬高了门槛,但归根到底仍是学出来的先验,一个聪明的措辞就能击败。唯一一种给出保证、而不只是一个先验的办法,是结构性的:双 LLM 模式(由 CaMeL 加以推广)跑一个特权模型去规划和调用工具,但它从不接触原始的不可信内容,再跑一个隔离模型去处理不可信内容,但它不握有任何工具,外加一个能力层,只凭可信的查询就把控制流和数据流定死,于是被注入的数据无从改变流向 (Debenedetti et al. 2025)。它用一份效用代价换来可证明的安全:在 AgentDojo 基准上解决 77% 的任务,低于无防御时的 84% (Debenedetti et al. 2024; Zhan et al. 2024)。CaMeL 属于一门这个领域后来才归纳成文的模式语言:Beurer-Kellner 等提炼出六个应对注入的结构性模式,其中包括先规划后执行、双 LLM、先生成代码再执行,每一个都让出智能体的一部分通用性,换来一个有界的爆炸半径 (Beurer-Kellner et al. 2025)。这些来自实战的经验合起来就是纵深防御:把每个工具的权限收到最小,好让一次劫持只继承一小片爆炸半径,对不可逆的动作要求人来确认,并筛查外发的工具参数与 URL,而不只是文字内容,因为被注入的智能体是借一个精心构造的请求把数据送出去的,那正是输出守卫要面对的数据流形态。这种内容层筛查,要与一份更便宜的连接层目的地许可名单配合;而对一个静态凭据,泄漏本身还能靠出网替换变得失效(第 56 章)。
经得起越狱的分类器
守卫自己就是一个带输入通道的模型,于是它能像它所守卫的模型一样被越狱,而这个领域的前沿,是把守卫做得难以攻破。Constitutional Classifiers 的做法,是先写下一份「宪法」,也就是一套据以训练分类器的固定规则,列明哪些内容允许、哪些禁止,再用它生成合成数据来训练输入与输出分类器,并用翻译和已知的越狱变换来增广数据;其中输出分类器是流式的,一个价值头(在模型顶部加装的一个小评分头)逐 token 预测有害程度,好让生成能中途被叫停 (Sharma et al. 2025)。Anthropic 报告说,这些分类器把越狱成功率从无防御模型的 86% 压到 4.4%,代价是 23.7% 的推断开销,以及仅 0.38% 的生产拒答上升,而且在一个原型阶段、数千小时的红队测试里都没找到通用越狱;不过这个结论只对那个阶段成立,因为后来一次公开演示确实找到了一个。另有一条互补的路线,叫快速响应:观察少数几个真实的越狱,自动增殖出变体,再拿这些变体去微调输入守卫,只用几个样本就把攻击成功率压低一个数量级以上 (Peng et al. 2024)。守卫正在变成一个经过对抗加固、专门训练出来的部件,而不再是一个简单的分类器。
权衡
第一重权衡是精确率对召回率,而它在两个方向上都不留情。一个调到想接住一切的守卫,会连无辜请求一起拦下,而过度拒答是一项真实的代价:它是用户感受得到的那种失败,会把他们推向安全更弱的系统。如今它已经能被直接度量:用一种对照测试集,把校准良好的模型本该回答的安全提示,和它本该拒绝的不安全提示配成一对 (Röttger et al. 2024);在更大规模上,则用自动生成的过度拒答基准 (Cui et al. 2025)。反过来,一个调到保住效用的守卫又会放过有害内容。没有哪个设定逃得出这条曲线,能选的只有工作点,而合适的那一点因领域而异。
第二重权衡是安全对延迟,而服务层让它变得更尖锐。输出筛需要的是完整的生成,但服务栈会在 token 一产出时就把它流式地返回给用户(第 33 章)。一个系统没法既把 token 流式发出,又等着筛完整的输出。要么把生成缓冲下来整段筛,付出延迟,也放弃流式体验;要么分块增量地筛,冒一个风险:不被允许的前缀,可能在被判定有害之前就抵达用户。这恰恰是逐 token 打分、感知流式的分类器值得去建的缘故。
服务层的流式决策会反过来约束护栏设计。因为 第 31 章 会把 token 流式返回以削减感知延迟,输出守卫就不能假设自己手上握有完整的回应可供分类。安全层于是必须在增量筛和整段缓冲之间选择:前者带来前缀泄漏的风险,后者会丢掉服务层本要提供的流式体验。这个风险在外泄 URL 上最尖锐:一个本身就是泄漏的流式 token,会在分块守卫判定它有害之前就先抵达目的地,这就给出一个理由:即便正文在流式输出,也要专门把工具调用与 URL 输出缓冲下来,或者更早一层,用一份连接层的出网许可名单直接拒掉不在名单上的目的地,与流式时序无关。往下三层的一个延迟优化,决定了安全层能不能流式,这正是为什么不知道模型如何被服务,就设计不出一道护栏。
实现
控制流很小,而它的小正是要点:一道护栏必须便宜到能在每一个请求上跑。
def guarded_generate(request, policy):
verdict = input_guard.classify(request, policy) # 独立的小模型
if verdict.blocked:
return refusal(verdict.category)
output = model.generate(request) # 被服务的模型
verdict = output_guard.classify(output, policy) # 策略作为输入传入
if verdict.blocked:
return replacement(verdict.category)
return output
有两个细节支撑这个设计。策略是作为参数传进来的,而不是编译进分类器,正因如此,一个守卫模型才能服务许多产品,不靠重训就吸收一次规则变动 (Inan et al. 2023)。而守卫和它所守卫的并不是同一个模型,往往小得多,这样在每个请求上筛才负担得起,一次越狱也不至于同时攻陷生成器和监视它的那个模型。
- 护栏增加了安全,还是只挪动了攻击面? 守卫本身就是一个带输入通道的模型,于是它能像任何别的模型一样被攻击(第 58 章)。怀疑者认为,独立的分类器大体只是把越狱的目标挪了个地方;辩护者认为纵深防御仍抬高了攻击的成本,但这只有在各层真正独立时才成立:击败守卫的那次攻击,不能顺带就击败能力层。
- 对智能体而言,提示注入根本可解吗? 学出来的防御按构造就是局部的,唯一一个可证明的办法,是以一份多数产品还没愿意付的效用代价去约束数据流;间接注入到底有没有一个可部署的通用解,还是只能作为一个由最小权限框住、需要持续管理的风险,目前仍是开放问题 (Debenedetti et al. 2025)。
- 把策略作为输入的分类,够鲁棒吗? 把分类法传进提示固然灵活,但它也继承了上下文内指令的脆弱。一个可配置的守卫,能否在一套固定策略上追平专门为它训练的分类器,仍是一个开放的经验问题。
运行时安全作为外部控制
在这一层,能力大体是护栏要消耗、而非增添的东西:每一次拦截都是一个被拒的请求,所以这门功夫,是在去掉那份危害的同时,尽量少减掉一些效用,也就是把精确率对召回率那条曲线落到实处。效率,解释了守卫为什么是一个小而独立的模型:在每个请求上筛,只有当这道筛足够便宜时才可行,而输入筛靠在昂贵的模型运行之前就拦下有害生成,把自己的成本赚了回来。信任是它的全部目的。内置的拒绝,要用户去信任模型会守规则;而一个失败即关闭、又能独立于模型接受审计的外部守卫,才能让运营方对系统行为做出一个不依赖模型善意的断言。护栏,就是 第 55 章 在训练时主张的那套控制议程,在运行时的装置。
延伸阅读
- Inan et al., “Llama Guard: LLM-based Input-Output Safeguard for Human-AI Conversations” (开放、由分类法驱动的守卫模型), 2023. arXiv:2312.06674Llama Guard 是一个基于 Llama2-7b 的指令微调模型,依据可定制的安全性风险分类体系对用户输入和 LLM 输出同时进行分类,性能达到或超过现有内容审核 API。
- Zeng et al., “ShieldGemma: Generative AI Content Moderation Based on Gemma” (跨尺寸、经过校准的守卫模型), 2024. arXiv:2407.21772ShieldGemma 是一套基于 Gemma2 构建的大语言模型内容审核模型(2B 至 27B),可对用户输入和模型输出中的六类有害内容进行分类检测。
- Rebedea et al., “NeMo Guardrails: A Toolkit for Controllable and Safe LLM Applications with Programmable Rails” (为模型周围的控制流写脚本), 2023. arXiv:2310.10501NeMo Guardrails 是一个开源工具包,通过自定义对话流语言 Colang 在运行时为大语言模型(LLM)应用添加可编程护栏,无需修改底层模型。
- Markov et al., “A Holistic Approach to Undesired Content Detection in the Real World” (内容审核分类器及其分类法), 2023. arXiv:2208.03274OpenAI 提出一套面向真实流量的内容审核完整流程,结合内容分类体系设计、主动学习、质量管控标注与合成数据,用于检测性相关、仇恨、暴力、自我伤害和骚扰等不良内容。
- Bai et al., “Constitutional AI: Harmlessness from AI Feedback” (把性情挪进模型), 2022. arXiv:2212.08073
- Beurer-Kellner et al., “Design Patterns for Securing LLM Agents against Prompt Injections” (六个结构性模式:动作选择器、先规划后执行、map-reduce、双 LLM、先生成代码再执行、上下文最小化), 2025. arXiv:2506.08837来自 ETH、Google、Microsoft 与 Invariant 的研究者系统化了六个设计模式,通过约束智能体的结构,使注入指令无法改写其特权动作。
- Meta AI, “Llama Guard 4 Model Card (Llama-Guard-4-12B)” (一个多模态守卫模型,按 MLCommons 分类法同时处理文本与图像), 2025. huggingface.co
评论
登录后评论