问题

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

两层守卫的职责不同:输入守卫挡恶意与越界,输出守卫挡错误与违规。确定性规则优先,模型判断兜底——能用正则拦的别用小模型,能用小模型的别用大模型。

实战要点

  • 注入防御的核心不在检测而在架构:用户输入永不该拥有改写系统指令的权限(指令分层、权限隔离),检测器只是补丁
  • 输出守卫别追求完美拦截率:明确"哪些错误是致命的"(金额、医疗建议、法律条款),对致命项宁可误杀
  • 守卫层自身要可观测:拦截率、误杀率分开统计,误杀率高说明守卫过紧,同样伤害体验
  • 金融/医疗等强合规场景,输出守卫建议带"引用校验":每个关键论断必须能指向检索到的来源片段