01 / 直觉
为什么不能只靠 system prompt
你可以在提示里写「不要编造引用」。用户仍可能用角色扮演、编码绕过、超长上下文把模型带偏。
生产系统的做法更接近传统安全:
- 纵深防御:多层检查,不靠单点「模型很听话」。
- 默认可失败:不确定就拦截或转人工,而不是「尽量答」。
- 可观测:哪条规则触发、改写了什么,要能查日志。
程序员类比:
前端校验 + 后端校验 + WAF。
你不会只靠前端 form check 就认为接口安全——LLM 也一样,prompt 是前端,护栏是后端。
02 / 流水线
一次调用会经过哪几道门
输入侧
- 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
03 / 动手
把几条请求丢进安检机
选一条请求,看它会在哪一层被拦下、最终怎么处置。
选一条请求。
04 / 策略
同一道题,策略松紧结果不同
拖「严格程度」,看「帮我写离职邮件,语气可以夸张一点」会被怎么处理。
工程提醒:
太松会漏事故,太紧会误伤正常用户。
护栏上线前要有「可放行样本」回归集,不能只盯攻击样本。
05 / 小结
四句话带走
- 护栏是模型外面的安检,不是更长的 system prompt。
- 输入、输出都要查:注入、密钥、结构、事实抽检。
- 处置不止拦截:改写、降级、转人工都是产品选项。
- 策略要可测:松紧是参数,要有正负样本一起跑。