第 5 章 — 输入验证与输出过滤

发布于: 2026-05-14 最后更新于: 2026-07-13 版本: 1
第 5 章 — 输入验证与输出过滤

第 5 章 — 输入验证与输出过滤

LLM Primer VII: AI Security》章节走读的第五篇。这一章把第 4 章的分层缓解框架变成操作纪律 —— 清洗阶段、护栏工具、结构化输出、红队,以及能站得住的安全指标。


这一章为什么存在

第 4 章命名的那份四层缓解架构,只有当每一层都能实际运行起来时才算数。第 5 章展开其中的两层:输入侧 —— 用户请求被检查,然后被放行、被改写、或者被拒绝;输出侧 —— 模型响应在离开系统之前被对照第二组关卡再检查一遍。围绕这两层的,是结构化 prompting、对抗性测试和安全度量这几门纪律。工具已经成熟了 —— Llama Guard、NeMo Guardrails、Lakera Guard、AWS Bedrock Guardrails、Garak、PyRIT、promptfoo —— 把它们拼起来的操作模式也已经收敛。

一句话:输入验证和输出过滤组合出的是两份相互独立的错误概率分布,乘起来比任何一份单独存在时都小 —— 而这两份都必须被测量、而不是被断言,安全声明才能在真实流量下站得住。

5.1 清洗是分阶段的,不是一次性的

"清洗输入"这个说法带着 SQL 注入时代的误导性联想。在 LLM 系统里,清洗是一个分阶段的过程 —— 检查、分类、变换、放行或拒绝 —— 产出物不是一份"安全的"输入,而是一份通过了一组策略关卡、结果被记录下来的输入。这条流水线通常有四种检查,按成本从低到高排。结构性检查最便宜:长度限制、字符集约束、Unicode NFKC 归一化、剥除零宽字符和让人眼花的相似字符 —— 这些是走私文献里的主料。基于模式的检查捕捉显式覆盖和已知的对抗性模板;它们在两个方向上都有噪声,但只要命中的是被记录而不是被阻止,作为粗筛还是有用的。分类检查用专门的安全模型 —— Llama Guard、OpenAI Moderation API,以及 Lakera 和 AWS Bedrock 的对应品 —— 对照一份既定分类法给输入打分。基于 LLM 的检查是最贵的一档,在分类器置信度居中时调一个更小的模型来推理意图。每一阶段都有假阳性率和假阴性率,两个都必须被测量,这条流水线才有资格接生产流量。

5.2 结构化输出是防御,不只是格式化的便利

第 4 章那份纵深防御架构还有第三个结构性层,这一章要展开:把模型的输出约束到定义好的 schema,让即使被注入影响的输出也逃不出这个结构性的框子。最简单的形式是 schema 强制的 JSON。模型被指示按 schema 输出 JSON;应用去解析、去校验;不符合的输出被拒绝或重试。Jason Liu 的 instructor 库把 OpenAI 和 Anthropic 的客户端封装到 pydantic 模型上 —— 开发者写一个描述输出结构的类,库处理 prompt 构造、校验和重试。Microsoft Research 的 Guidance 走得更远,按一份模板逐 token 地约束生成,模板明确定义了哪些位置能有自由文本。在输出审核这一侧,Meta 的 Llama Guard 家族 —— 从版本 1 到 3,3 加了多模态覆盖 —— 在 2023–2025 这段时间里成了标准的开权重分类器,被大多数生产栈集成为响应过滤器。NVIDIA NeMo Guardrails,以及 Lakera、AWS Bedrock 和 Cisco AI Defense 的商用产品也在同一战线上竞争。

5.3 未经测量的防御不算防御

红队,是把一份安全声明变成一份测量的东西。人工红队 —— 受过训练的对抗性测试员,经常是外部的 —— 产出的是在部署上成功过的具体 prompt,按攻击模式分组。自动化红队把这份人工工作在输入空间上放大。NVIDIA Garak,2023 年开源、一直在更新,针对一个目标端点跑一组探针,报告哪些成功了;探针覆盖 prompt injection、数据泄露、仇恨言论诱出、编码走私、角色扮演 jailbreak 等等。Microsoft PyRIT(Python Risk Identification Toolkit),2024 年发布,加了一个代理式的红队模式,让一个模型对另一个模型生成攻击。promptfoo 把 prompt 和模型在评估集上做对比,适合回答"哪个配置更安全"这样的问题。真正重要的指标由两种失败模式组合而来。攻击成功率回答"一组既定攻击里多少能过关"。拒绝校准回答"被拒绝的请求里,有多少本不该被拒绝"。一个攻击成功率为零、拒绝率却是 50% 的系统,并没有解决问题;它只是把成本从"不安全的输出"转移到了"没用的输出"。这两个指标都要求从真实流量分布里抽出的带标签样本,并且都取决于评估集的构成。只报一个数字、不说构成,是安全声明最常误导人的地方。

值得记住:在一份 1000 条的内部评估集上 0.7% 的攻击成功率是 7 次失败。同样的比率放到十亿次生产查询上,是七百万次。在足够大的规模上,低概率的失败会变成确定发生的事情 —— 只报比率、不说流量分母,就把这套算术藏起来不让本该看到的人看到。

第 5 章为下面铺了什么

第 6 章专门讲检索增强生成。这一章展开的输入层把"用户消息"当作不受信任的那一部分。RAG 系统加了第二块不受信任的部分:检索回来的片段,其来源往往比用户消息更混乱。Greshake 的间接 prompt injection、Liu 对"针对 LLM 集成应用的注入攻击"的刻画、Zhong 对检索语料的投毒,以及更新的 PoisonedRAG 和 BadRAG 那条脉络,都描述了这第二个面是怎么失败的。第 6 章走一遍 RAG 里的信任边界、具体的攻击模式、领域内已经收敛的安全检索架构,以及能在事件发生前把检索层攻击浮出水面的监控实践。


下一章 — 第 6 章:检索增强生成的风险RAG 里的信任边界、恶意文档注入、经 embedding 路径的索引投毒,以及那份能把清洗漏掉的攻击抓住的监控。

想看完整的?书里的章节包含可跑的 Llama Guard 封装、端到端的 Guidance 和 instructor 模式、把 Anthropic Constitutional AI 作为训练时的补充,以及本文只做摘要的 In Plain English 边栏。在 Amazon 上查看 LLM Primer VII →

下田 昌平
下田 昌平
作为株式会社Receipt Roller的CEO兼CTO,目前负责开发电子收据服务以及自动将对话分类并生成行动任务的系统「ACTIONBRIDGE」。从小便接触编程,1996年参与开发测量仪器的相关程序,始终保持着对技术的深刻探索与热情。 在此前的职业生涯中,曾担任日本最大呼叫中心行业企业的子公司——一家研究开发公司的CEO/CTO,领导了多个技术开发项目。目前,我依然活跃在编程的最前沿,持续书写代码。