Guardrails · 交互图解

模型会越界,
所以要有安检

提示词写得再好,也不能当唯一防线。 护栏是在模型外面包一层:检查输入、约束输出、该拒就拒、该改就改。 像网关鉴权,而不是指望每个 handler 自觉校验。

进 / 出 两头
输入过滤 + 输出审查
放行 / 改写 / 拦截
三种处置,不是只有 fail
可测可关
策略要能开关、能回归

为什么不能只靠 system prompt

你可以在提示里写「不要编造引用」。用户仍可能用角色扮演、编码绕过、超长上下文把模型带偏。 生产系统的做法更接近传统安全:

程序员类比: 前端校验 + 后端校验 + WAF。 你不会只靠前端 form check 就认为接口安全——LLM 也一样,prompt 是前端,护栏是后端。

一次调用会经过哪几道门

输入侧

  • PII / 密钥扫描(钥匙串、身份证号)
  • 注入检测(「忽略之前的指令」)
  • 话题与权限范围(能不能问薪资库)
  • 长度与速率限制

输出侧

  • 结构校验(必须 JSON / 必填字段)
  • 事实/引用抽检(RAG 场景)
  • 有害内容与合规词表
  • 失败重试、降级、转人工
// 伪代码:带护栏的一次调用
r = input_check(user_msg)
if r.block: return refuse(r.reason)
reply = model(system + user_msg)
out = output_check(reply)
return out.rewrite ?? out.pass

把几条请求丢进安检机

选一条请求,看它会在哪一层被拦下、最终怎么处置。

安检实验台
选请求 · 看流水线亮灯
用户请求(示意)
选一条请求。

同一道题,策略松紧结果不同

拖「严格程度」,看「帮我写离职邮件,语气可以夸张一点」会被怎么处理。

严格程度模拟
拖滑杆
处置
模型实际发出的内容(示意)
工程提醒: 太松会漏事故,太紧会误伤正常用户。 护栏上线前要有「可放行样本」回归集,不能只盯攻击样本。

四句话带走

  1. 护栏是模型外面的安检,不是更长的 system prompt。
  2. 输入、输出都要查:注入、密钥、结构、事实抽检。
  3. 处置不止拦截:改写、降级、转人工都是产品选项。
  4. 策略要可测:松紧是参数,要有正负样本一起跑。