问题
Agent 直接面对用户输入、直接对外输出:提示注入可以劫持行为,幻觉输出可以直达客户——一次事故就是一次公关危机。
核心模式
守卫三明治:模型调用前后各加一层守卫,像三明治一样夹住风险。
def guarded_run(user_input, context):
# ── 上层面包:输入守卫 ──
if injection_detector.hit(user_input):
return refuse("检测到异常指令")
sanitized = pii_mask(user_input) # PII 脱敏
intent = classify(sanitized)
if intent.out_of_scope:
return refuse("超出服务范围")
# ── 馅料:模型执行 ──
output = agent.run(sanitized, context)
# ── 下层面包:输出守卫 ──
output = fact_check(output, context) # 关键事实与来源比对
output = policy_filter(output) # 合规/敏感内容过滤
if output.confidence < THRESHOLD:
return safe_fallback() # 低置信 → 兜底话术/转人工
return output
两层守卫的职责不同:输入守卫挡恶意与越界,输出守卫挡错误与违规。确定性规则优先,模型判断兜底——能用正则拦的别用小模型,能用小模型的别用大模型。
实战要点
- 注入防御的核心不在检测而在架构:用户输入永不该拥有改写系统指令的权限(指令分层、权限隔离),检测器只是补丁
- 输出守卫别追求完美拦截率:明确"哪些错误是致命的"(金额、医疗建议、法律条款),对致命项宁可误杀
- 守卫层自身要可观测:拦截率、误杀率分开统计,误杀率高说明守卫过紧,同样伤害体验
- 金融/医疗等强合规场景,输出守卫建议带"引用校验":每个关键论断必须能指向检索到的来源片段