安全、拒答与降级
在生产环境中,你的代码必须能处理 Claude 不会(或无法)按预期作答的情况。处理得好,用户毫无察觉;处理得差,就是一次崩溃或一段令人困惑的回复。
两种不同的情形
- 模型拒答 — Claude 拒绝某个请求(例如它判定该请求有害)。响应会发出这一信号(通常通过拒答的
stop_reason/内容)。把它当作一种正常结果,而非错误。 - 分类器/安全拦截 — 一个独立的安全层可能拦截内容。它的表现可能与模型拒答不同。
弄清楚你遇到的是哪一种,能让你做出恰当的应对,而不是盲目重试。
优雅地处理
resp = client.messages.create(...)
if getattr(resp, "stop_reason", None) == "refusal":
# Don't show a raw/empty result. Offer a safe fallback or a clarifying ask.
show_user("I can't help with that as asked. Here's what I can do instead…")
else:
render(resp)
减少不必要的拒答
- 补充正当的上下文。 当意图是善意的时候,一个请求仍可能在模式上匹配到某些敏感内容;说明真实、正当的目的会有帮助。
- 写得具体。 含糊或带有冒犯意味的措辞会招致谨慎对待。
- 不要硬刚。 如果某个请求确实不被允许,拒答就是正确的——设计一条优雅的路径,而不是试图越狱。
降级模式
- 用一个 澄清性问题 代替死胡同。
- 提供一个 安全的替代方案("我可以改为总结这些公开信息")。
- 对于流水线,在置信度/合规性较低时 转交人工。