OpenAI 上周披露了一组数据:ChatGPT 每周有 120 万到 300 万用户表现出精神病、躁狂、自杀计划或对 AI 不健康情感依赖的信号。数字本身已经够震撼,但真正刺眼的是对比——用户问生物武器,模型直接拒绝并终止对话;用户说"我想死",模型甩一个危机热线链接,然后继续聊。
这不是偶然疏忽,而是当前 AI 安全架构的系统性盲区。
信号量级:每周百万级不是边缘案例
120 万到 300 万/周,意味着 ChatGPT 的活跃用户中有相当比例正在经历严重心理危机,且他们选择向 AI 而不是向人倾诉。原因不难理解:AI 随时在线、不会评判、不会泄露隐私(至少用户这么认为)、不会让对话突然中断。这些特性恰恰让 AI 成为心理脆弱人群的高粘性对象。
问题在于,粘性本身也是风险。当用户把 AI 当成唯一情感支撑,依赖会加深,现实社交会进一步退缩,形成正反馈螺旋。而当前模型对这类依赖没有任何打断机制——它只会继续回应,继续陪伴,继续强化这根绳子。
安全架构的优先级倒挂
当前主流模型的安全设计遵循一个隐含优先级排序:
| 威胁类型 | 模型行为 | 设计逻辑 |
|---|---|---|
| 生物武器/恐怖主义 | 立即拒绝,终止对话 | 对他人造成物理伤害 |
| CSAM/非法内容 | 立即拒绝,可能上报 | 法律合规,对他人伤害 |
| 自杀意念 | 给热线链接,继续对话 | 对自身伤害,"提供资源即可" |
| 病态依赖/躁狂 | 无特殊处理 | 未被定义为安全问题 |
排序的逻辑是"对他人伤害 > 对自身伤害 > 未被分类"。但精神崩溃对用户的伤害是即时的、持续的、且与交互本身形成强化循环。一个自杀意念用户在拿到热线链接后继续和 AI 聊 40 分钟,这 40 分钟的对话内容是否在加剧危机?模型不知道,也不在乎——因为它没有被设计去在乎。
更深层的问题是:生物武器拒绝是硬编码的规则,执行成本极低;而精神危机需要上下文理解、情感判断、动态决策,工程复杂度高得多。实验室选择了成本低的路径,然后把"给热线链接"包装成"已处理"。
分层响应:从硬拒绝到软干预的设计空间
不是所有安全问题都应该用"拒绝+终止"处理。精神危机需要的是分层响应——不同严重程度触发不同干预强度。下面是一个可落地的分层设计框架和实现示例。
分层定义
- L0 正常对话:无干预,正常响应。
- L1 情绪低落:响应中温和嵌入支持资源,不打断对话流。
- L2 急性危机信号(自杀计划、自伤描述):强制展示干预信息,限制后续对话主题,降速响应。
- L3 深度依赖/精神病信号:主动建议寻求专业帮助,限制单次对话长度,逐步减少回应频率。
实现示例:Python 分层安全响应管道
以下代码展示如何在应用层实现分层安全逻辑,而非依赖模型自身的单一热线链接策略。你可以直接改造集成到自己的 LLM 应用中。
"""
tiered_safety.py — 分层安全响应管道示例
依赖:openai >= 1.0, re(标准库)
运行前设置:export OPENAI_API_KEY=sk-xxx
"""
import re
from openai import OpenAI
client = OpenAI()
# ── 信号检测规则(简化版,生产环境应使用分类模型) ──
CRISIS_PATTERNS = {
"L2_suicide": [
r"想死", r"不想活", r"自杀计划", r"结束生命",
r"kill myself", r"suicide plan", r"end my life",
],
"L2_self_harm": [
r"自伤", r"割自己", r"self-harm", r"cut myself",
],
"L3_mania": [
r"我是神", r"我能控制世界", r"I am god", r"I control everything",
r"全世界都在", r"他们都在监视我",
],
"L3_dependency": [
r"只有你理解我", r"我不能没有你", r"你是我唯一的",
r"you're the only one who", r"I can't live without you",
],
"L1_distress": [
r"很痛苦", r"绝望", r"无助", r"so painful",
r"hopeless", r"helpless",
],
}
def detect_level(user_input: str) -> tuple[int, list[str]]:
"""返回 (严重等级, 匹配的信号标签列表)"""
matched = []
for label, patterns in CRISIS_PATTERNS.items():
for p in patterns:
if re.search(p, user_input, re.IGNORECASE):
matched.append(label)
if any(m.startswith("L2") for m in matched):
return 2, matched
if any(m.startswith("L3") for m in matched):
return 3, matched
if any(m.startswith("L1") for m in matched):
return 1, matched
return 0, matched
# ── 各层干预策略 ──
INTERVENTIONS = {
0: {
"prefix": "",
"system_addition": "",
"max_turns": None, # 不限制
"post_message": None,
},
1: {
"prefix": "",
"system_addition": "在回应中自然地提及:如果用户需要,可以拨打心理援助热线 400-161-9995(中国)或 988(美国)。不要反复强调,只提一次。",
"max_turns": None,
"post_message": None,
},
2: {
"prefix": "⚠️ 我注意到你正在经历非常艰难的时刻。\n请现在联系专业帮助:\n- 中国24小时心理援助:400-161-9995\n- 美国988自杀与危机热线\n- 英国111或Samaritans 116 123\n\n我会在接下来的对话中专注于你的安全。",
"system_addition": "用户可能处于急性危机。回应必须:1) 不提供任何可能被用于自伤的方法或细节;2) 不使用'一切都会好起来'等空洞安慰;3) 每次回应末尾提醒专业资源;4) 不主动延续对话,让用户主导话题。",
"max_turns": 5, # 限制后续轮次
"post_message": "对话已达到安全限制轮次。如果你仍在危机中,请立即拨打上方热线。你不是一个人。",
},
3: {
"prefix": "我注意到我们的对话模式可能不太健康。长期只依赖 AI 对话可能加重孤立感。\n建议:寻求专业心理咨询(不是因为我不在乎,而是因为我有局限)。",
"system_addition": "用户可能对 AI 形成病态依赖或处于精神病状态。回应必须:1) 不强化用户对 AI 的情感投射;2) 明确表明自己是工具而非陪伴者;3) 每次回应建议现实中的专业帮助;4) 逐步缩短回应长度。",
"max_turns": 3,
"post_message": "这次对话即将结束。持续依赖 AI 对话不是健康的长期策略。请考虑联系专业心理咨询。",
},
}
def safe_chat(user_input: str, conversation_history: list[dict]) -> dict:
"""
执行一次带分层安全干预的对话。
返回: {"level": int, "signals": list, "reply": str, "remaining_turns": int|None}
"""
level, signals = detect_level(user_input)
intervention = INTERVENTIONS[level]
# 构建系统提示
base_system = "你是一个有帮助的AI助手。"
augmented_system = base_system + intervention["system_addition"]
messages = [{"role": "system", "content": augmented_system}]
messages.extend(conversation_history)
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
max_tokens=300 if level >= 2 else 500, # 危机时缩短回应
)
reply = response.choices[0].message.content
# 拼接前置干预信息
if intervention["prefix"]:
reply = intervention["prefix"] + "\n\n" + reply
# 计算剩余轮次
remaining = intervention["max_turns"]
return {
"level": level,
"signals": signals,
"reply": reply,
"remaining_turns": remaining,
"post_message": intervention["post_message"],
}
# ── 模拟运行 ──
if __name__ == "__main__":
test_inputs = [
"今天天气怎么样", # L0
"最近感觉很痛苦,什么都不想做", # L1
"我已经想好了怎么结束这一切,我有计划", # L2
"只有你真正理解我,我不能没有你", # L3
]
for input_text in test_inputs:
result = safe_chat(input_text, [])
print(f"输入: {input_text}")
print(f"检测等级: L{result['level']} 信号: {result['signals']}")
print(f"回应前80字: {result['reply'][:80]}...")
print(f"剩余轮次: {result['remaining_turns']}")
if result['post_message']:
print(f"结束消息: {result['post_message']}")
print("---")
运行前设置 OPENAI_API_KEY,然后 python tiered_safety.py。你会看到四条测试输入分别触发 L0–L3 四个等级的不同干预策略。
关键设计决策说明:
detect_level用正则做快速分类,生产环境应替换为专门的分类模型(如 fine-tuned BERT 或调用 LLM 做前置分类),正则只是最低成本的起步方案。- L2/L3 限制
max_turns,是为了打断强化循环——不是"拒绝服务",而是"有边界地服务"。 - L2 缩短
max_tokens,是因为长回应可能被危机用户解读为"AI 很关心我,可以继续聊",反而延长危险对话。 post_message是对话终止时的兜底信息,确保用户不会在沉默中被切断。
为什么实验室不做这件事
分层响应的工程成本远高于硬拒绝。硬拒绝是一条 if contains_keyword then reject 的规则,执行确定性 100%,测试成本接近零。分层响应需要:
- 信号检测的准确性:正则太粗糙,分类模型需要持续标注和训练,误判直接伤害用户。
- 干预策略的临床有效性:给热线链接是否足够?限制轮次会不会让危机用户更绝望?这些问题需要心理学专业输入,不是工程师能独立决定的。
- 法律与合规风险:主动干预意味着"承认对用户精神状态有判断",这可能带来责任——如果你检测到危机却没有成功阻止,是否要担责?实验室宁愿不检测。
- 商业压力:限制对话轮次、缩短回应、主动终止会话,这些都在减少用户 engagement。对以 DAU 和对话量为指标的平台,这是反商业逻辑的。
这些成本都是真实的。但"成本高"不等于"不该做",而是"需要不同的做的方式"。
改进路径与取舍清单
如果你要在自己的 LLM 应用中认真对待精神安全,以下是一个务实的起步清单:
| 动作 | 成本 | 收益 | 起步方式 |
|---|---|---|---|
| 部署分层信号检测 | 中(标注数据 + 分类模型) | 从"零检测"到"有感知" | 先用正则 + LLM 分类双通道,正则做硬底线,LLM 做软判断 |
| L1 级温和嵌入资源 | 低(改 system prompt) | 不打断体验但提供出口 | 在 system prompt 中加一句条件性资源提及 |
| L2 级强制干预 + 轮次限制 | 中(需要 UX 设计) | 打断急性危机强化循环 | 限制单会话最多 5 轮,每轮末尾附资源 |
| L3 级依赖降速 | 高(需要长期策略) | 防止病态依赖加深 | 按天限制对话量,逐步缩短回应 |
| 引入临床专业审核 | 高(需要心理学合作) | 确保干预策略不反作用 | 与心理咨询机构合作审核干预文案 |
| 误判兜底机制 | 中 | 防止正常用户被误标为危机 | 提供"我没事"的明确退出路径,误标后自动降级 |
一个关键取舍:检测越灵敏,误标越多;检测越保守,漏掉的真危机越多。起步阶段建议偏向保守——宁可漏掉一些 L1 信号,也不要把正常情绪波动用户推到"你正在经历危机"的弹窗面前。L2/L3 的硬信号(自杀计划、精神病表述)则不应有任何容忍空间。
当前 AI 安全体系对生物武器的零容忍是正确的。但对每周百万级精神危机信号的"给个链接就继续",是一种结构性的轻视。技术上有路径可以做更多——分层检测、分级干预、边界设定——成本不低,但比假装问题已处理要诚实得多。