设计不拖垮延迟的 AI 安全层
大多数团队引入护栏的方式,和引入日志一样随意:直接挂上去,以为代价很小,然后继续往下走。但代价并不小。一次内容审核检查要花 10–50ms,再加上 PII 检测,又是 20–80ms;再叠上输出 schema 校验和毒性分类器,在第一个 token 到达用户之前,串行开销就已累积到 200–400ms。加上 500ms 的模型响应,你那个"快速"的 AI 功能现在给人的感觉就是迟钝。
把锅甩给 LLM 是错的。护栏才是瓶颈。解决方案不是去掉安全措施,而是停止把安全检查当成一堆无差别的任务,改用架构思维来对待它。
安全栈的延迟解剖
不同的护栏机制运行在截然不同的时间量级上,理解这一差异是设计不叠加出数百毫秒延迟的护栏栈的第一步。
正则表达式和关键词过滤几乎是免费的——亚毫秒级、确定性执行、CPU 密集。一个设计良好的信用卡号或已知侮辱性词语的模式匹配,无论输入多长,都能在微秒内完成。
轻量级 ML 分类器——例如针对毒性或 PII 检测微调过的 BERT 量级模型——每次检查耗时 10–50ms。对于少数几个类别,串行执行的速度足够快,不会明显影响感知延迟。
基于 LLM 的评估器则完全不同。将一个完整的大模型调用用作输出判断器,最坏情况下需要 7–10 秒;即便是 Meta 的 PromptGuard(86M 参数)或 Prem AI 的 MiniGuard(600M 参数)这类较小的守卫模型,也需要精心部署才能控制在 100ms 以内。把主流前沿模型调用当毒性检测器,是一个延迟陷阱——准确,但慢到足以毁掉用户体验。
大多数团队犯的错误,是把这三个层级等同对待,然后串行堆叠。五个串行检查,每个加 50ms,在调用 LLM 之前就已经付出了 250ms。
风险分级架构
正确的心智模型是安检通道,而不是质检清单。你不会给每个人都做全身搜查——先过金属探测器,只有触发了才升级处理。
同样的逻辑适用于安全检查:
快速通道(微秒级): 正则模式、黑名单、输入长度约束、Unicode 归一化。立即拦截明显的违规。每个请求都经过这一层。
二级分析(10–100ms): 轻量级 ML 分类器——专用于 PII 检测、毒性、提示注入的小型模型。所有通过快速通道的请求都在此处理,但模型足够小,串行执行依然可行。
深度检查(秒级,仅用于模糊案例): 基于 LLM 的评估、多模型共识或人工审核排队。这一层只处理前两层标记为不确定的情况。大多数生产流量永远不会到达这里。
关键设计约束:每一层只向上传递值得进一步审查的流量。如果快速通道过滤器能捕获 95% 的明显违规,你昂贵的 LLM 判断器只需评估剩余的 5%。每个请求的平均成本大幅下降。
一个具体的基准:采用这种级联方式构建的系统,安全评估的 P50 延迟始终低于 70ms,P95 低于 120ms——这些数字在对话界面中对用户来说真正是无感的。
并行化:隐藏无法消除的成本
并非所有检查都可以通过分级来消除。某些类别需要对每个请求进行 ML 级别的评估,某些生产环境还有多个独立要求(PII、内容政策、合规监管),各自都需要独立检查。
串行运行这些检查是默认做法,也是错误做法。如果 PII 检测和毒性评估是相互独立的——事实上它们确实独立——就没有理由等一个完成再开始另一个。
Cloudflare 的 AI 防火墙是一个很好的生产案例:其架构会同时向每个检测模块发出并行、非阻塞的请求。多检查评估的总延迟由最慢的单个检查决定,而不是所有检查的总和。增加新的检测类别不会增加总延迟——只有当新类别比当前瓶颈更慢时才有影响。
实践含义:把每个安全检查当作协程,而不是阻塞调用。同时启动,统一等待结果,结果全部到达后再执行任何阻断逻辑。Python 的 asyncio 模式或任何语言的并行任务执行器都能免费实现这一点。
