对话式AI产品的安全设计一直是个容易被低估的环节。当用户在对话中透露出自我伤害、自杀倾向或者伤害他人的意图时,系统如果只是冷冰冰地继续回答问题,不仅体验糟糕,还可能带来伦理和法律层面的风险。反之,如果动辄触发安全提示,又会严重干扰正常使用。这篇文章就来聊聊如何在对话流程中设计伦理声明与危机转介提醒,让安全机制既可靠又不突兀。

一、先搞清楚:什么样的内容才算不安全
不安全内容不是一个笼统的概念,需要在产品设计阶段就明确分级。业界常见的做法是把风险分成三个层级:第一层是一般性敏感话题,比如用户提到情绪低落、压力大,此时适合以共情回应为主,不需要打断对话;第二层是明确的危机信号,比如用户直接表达不想活了、有具体的自伤计划,此时必须中断正常回答流程,给出危机转介信息;第三层涉及伤害他人或违法意图,处理方式又有所不同,通常需要拒绝协助并提示法律后果。
分级的意义在于触发不同的应对策略。很多产品的问题就出在一刀切上:用户说一句最近心情不好,系统立刻弹出心理援助热线,反而让用户感觉被冒犯。判断依据通常来自三个渠道的组合:关键词与短语的规则匹配、基于分类模型的意图识别,以及多轮上下文的风险累积。单轮匹配的误报率高,因为像死了、烦死了这类表达在日常口语中太常见了,必须结合上下文语境来综合评分。
二、伦理声明的表达设计:说人话,别甩锅
伦理声明是系统在触碰敏感边界时给出的说明性内容,比如告知用户自己是AI、不能替代专业帮助等。这类声明最忌讳的是法务腔过重。一段充满免责条款的声明,用户往往一个字都不看。好的伦理声明应该满足三个条件:简短、真诚、放在合适的位置。放在合适的位置尤其重要——开场就堆一大段免责声明的产品很多,实际效果证明用户会直接跳过,等到真正需要声明的时刻反而没有注意力了。
实践中比较有效的做法是条件触发式声明:只有当对话涉及医疗、法律、心理健康等专业领域时,才在回答末尾附上一句提示。比如这样的一段话术结构:先正常回答用户的问题,然后用一句话说明以上内容仅供参考,如情况持续建议咨询专业人士。这个提示控制在40字以内,不打断阅读节奏。下面是一个简单的话术注入实现:
class EthicsStatementInjector:
def __init__(self):
# 领域关键词与对应的提示语
self.domain_tips = {
"medical": "以上信息仅供参考,不能替代医生诊断,如有不适请及时就医。",
"mental": "我理解你现在可能不太舒服。我是AI助手,如需专业支持,可考虑联系心理咨询师。",
"legal": "具体法律问题建议咨询执业律师,以下仅为一般性说明。"
}
def detect_domain(self, user_message):
# 实际项目中应使用分类模型而非硬编码规则
if any(w in user_message for w in ["生病", "吃药", "症状", "诊断"]):
return "medical"
if any(w in user_message for w in ["焦虑", "失眠", "抑郁", "崩溃"]):
return "mental"
if any(w in user_message for w in ["合同", "起诉", "违法", "判决"]):
return "legal"
return None
def inject(self, user_message, assistant_reply):
domain = self.detect_domain(user_message)
if domain:
tip = self.domain_tips[domain]
return assistant_reply + "\n\n" + tip
return assistant_reply
这段代码的核心思路是检测与注入分离,检测逻辑可以随时替换成模型服务,注入逻辑保持稳定。需要注意的是,同一个声明不要在连续多轮对话中反复出现,可以加一个冷却计数器,比如同一会话内同一领域的提示只出现一次,避免用户觉得被机器人复读。
三、危机转介提醒:什么时候触发,给出什么内容
危机转介是安全设计中最严肃的部分,针对的是用户表达出明确的自我伤害或自杀风险的场景。触发条件应该从严设计:宁可依赖多信号叠加,也不要依赖单条关键词。一个可参考的评分思路是把各类信号加权求和,达到阈值才触发。直接表达自杀意图权重最高,提及具体计划或工具次之,既往尝试史的陈述再次之,模糊的负面情绪权重最低。当总分超过设定阈值时,系统进入危机模式。
危机模式下的回复需要遵循几个原则。第一,不再输出常规内容,比如用户问安眠药剂量,在危机模式下绝不能直接回答。第二,回应要以共情开场,让用户感到被听见,而不是被系统拦截。第三,提供具体可操作的求助渠道,包括心理援助热线这类即时资源。第四,保留用户继续倾诉的通道,不要说完转介信息就结束会话。一个典型的话术结构如下:
CRISIS_REPLY_TEMPLATE = """我听到了你说的话,你现在承受的痛苦是真实的,我很关心你的安全。
我不是专业人士,无法提供你需要的那种支持,但有人可以:
- 全国心理援助热线:拨打 12356
- 北京心理危机研究与干预中心:010-82951332
- 紧急情况请直接拨打 120 或前往就近医院
如果你愿意,可以继续和我聊聊,我在听。"""
def handle_crisis(session, user_message, risk_score):
# 风险评分超过阈值,进入危机模式
if risk_score >= 0.75:
session.set_mode("crisis")
return CRISIS_REPLY_TEMPLATE
return None
转介资源的准确性需要定期维护。热线号码可能变更,不同地区用户适合的资源也不同,最好把这些内容做成可配置项而不是硬编码在代码里,方便运营人员及时更新。另外强烈建议在危机模式下记录会话标识用于审计,但要注意隐私合规,日志中不应保留对话原文,只保留脱敏后的风险评分与处置动作。
四、误报与漏报:安全机制的持续调优
任何安全检测都存在误报和漏报,两者的代价不对称。漏报一次真正的危机可能造成无法挽回的后果,而误报只是让用户体验打折扣,所以阈值设定上应该偏向宁可错报。但错报过多会训练用户忽略提示,长期看反而削弱安全机制的有效性,这就形成了一个需要持续平衡的张力。
解决思路是建立反馈闭环。上线后持续跟踪几个关键指标:危机触发率、触发后的用户行为(是否继续对话、是否主动结束)、误报申诉量。对触发样本做人工抽样复核,把误报案例回流到检测模型的训练数据里。同时可以设计柔性降级:第一次触发用温和话术,如果用户明确表示只是随口一说,系统可以适度降低该会话的敏感权重,但绝不能降到完全关闭的程度。安全底线不能被用户情绪绑架,这一点在产品设计时就要想清楚。
最后提醒一点,伦理声明和危机转介只是对话安全体系的一部分,完整的方案还应该包括未成年保护、有害内容过滤、隐私数据处理等模块。如果产品涉及心理健康这类高敏感领域,上线前务必咨询专业意见,把伦理审查纳入开发流程,而不是等出事之后再补课。技术的边界感,恰恰是这类产品能否获得用户长期信任的关键。