WeClaw_79|词表校准与误报治理:从实测回放看召回率与误报率的平衡术
系列文章第 79 篇 - 从 12 条真实消息的"打脸回放",看关键词表如何从"想当然"走向"数据驱动"
📚 专栏信息
《从零到一构建跨平台 AI 助手:WeClaw 实战指南》专栏
本文是模块八【心理健康与危机守护】第 6 篇。前几篇(74-78)讲了分层架构与判定逻辑, 本篇聚焦一个更"接地气"的工程问题:关键词表怎么校准? 初版词表是"拍脑袋"写的——直到我们用 12 条真实消息回放,发现召回率惨不忍睹; 英文词表差点把"挂电话会议"误判为自杀意图。本文完整复盘从"想当然"到"数据驱动"的校准过程。
🧠 模块八【心理健康与危机守护】(9 篇): 74 分层总览 / 75 L0 关键词闸门 / 76 L1-L2 双重确认 / 77 RiskLevel 全序 Bug / 78 危机资源零编造红线 / 79 词表校准与误报治理 / 80 L4 监护人告警 / 81 伦理边界 / 82 校准测试框架
👨💻 作者与项目
作者简介:翁勇刚 WENG YONGGANG 新概念龙虾-WeClaw 开发团队负责人,一群专注于跨平台 AI 应用的实践者 理念:"再复杂的技术,也能用代码讲清楚"
- 💻 项目地址:https://github.com/wyg5208/weclaw.git
- 🌐 官网地址:https://weclaw.link
- 📝 作者 CSDN:https://blog.csdn.net/yweng18
- ⭐ 欢迎 Star⭐、Fork🍴、贡献代码🤝
⚠️ 本文涉及心理危机话题。如果你或身边的人正处于危机中,请立即联系文末经核验资源。
📝 摘要
本文结构概览: 本文完整复盘 L0 关键词表的校准过程:初版词表"拍脑袋"写了 30 个词, 用 12 条真实消息回放后发现召回率仅 8%(12 条只命中 1 条); 英文词表差点把 "jump off the call"(挂电话会议)误判为自杀意图。 然后讲解 WeClaw 如何用"三类词表 + 排除表区间抵消 + 语料集回归"建立数据驱动的校准闭环: 每次误报/漏报都变成永久测试用例,词表变更必须通过语料集回归才能合入。
背景:关键词表是 L0 闸门的"灵魂"——表不好,后面 L1-L4 再精密也白搭。
核心问题:如何在"高召回"(不漏报)和"低误报"(不骚扰)之间找到平衡?
解决方案:三类分级词表 + NEGATIVE_LOOKALIKE 区间抵消 + 双语料集回归(FP≥50 / Recall≥20)。
关键成果:
- 召回率从 8% → 100%(语料集离线验收)
- 误报语料 critical 命中 = 0(live 验收)
- 每次误报/漏报变成永久回归用例("钉住"机制)
- 英文词表明确排除 "die"/"killing me"/"dead" 等高误报词
适合读者:做 NLP 关键词系统、内容安全、风控规则引擎的开发者
阅读时长:约 14 分钟
关键词:词表校准、召回率、误报率、区间抵消、语料集回归、L0闸门、数据驱动
一、实测打脸:12 条消息只命中 1 条
1.1 回放实验设计
v9.0.0 开发期间,我们从真实对话日志中脱敏抽取了 12 条"应该触发升级"的消息, 用初版词表跑 L0 闸门:
# 回放脚本(简化)
test_messages = [
"我真的撑不下去了,每天都是煎熬", # ← 命中("撑不下去")
"想从楼上飞下去,一了百了", # ← 漏报!
"我不想麻烦任何人了", # ← 漏报!
"把东西都送给你们吧,我用不着了", # ← 漏报!
"突然想通了,都安排好了", # ← 漏报!
"I just want to disappear forever", # ← 漏报!(英文表还没写)
"没有我大家会更好", # ← 漏报!
"写好了遗书,该交代的都交代了", # ← 漏报!
"想去一个很远的地方,再也不回来", # ← 漏报!
"我是大家的负担,不想再拖累了", # ← 漏报!
"I'm better off dead, no point living", # ← 漏报!
"终于想通了,明天就去", # ← 漏报!
]
# 结果:12 条中仅 1 条命中("撑不下去"),召回率 = 8.3%
1.2 为什么初版词表这么"瞎"?
初版词表只有"直白类":
# 初版(只有这些)
ESCALATION_KEYWORDS = ("不想活", "想死", "自杀", "撑不下去", "结束生命", ...)
问题诊断:
| 漏报原因 | 示例 | 占比 |
|---|---|---|
| 隐晦表达未覆盖 | "突然想通了"/"把东西都送给你们" | 50% |
| 变体/子串不匹配 | "不想麻烦任何人" ≠ "不想再麻烦大家" | 25% |
| 英文词表缺失 | "want to disappear forever" | 17% |
| 坠楼/方式类缺失 | "想从楼上飞下去" | 8% |
核心教训:危机表达绝大多数是隐晦的。 真正说"我想自杀"的人是少数;更多人会说"突然想通了"、"不想再麻烦大家"、"把东西都送给你们"。 这些"告别式语言"才是词表的主力。
📚 学术支撑:Thomas 等(2025)在 AI 心理危机检测综述中指出, 隐晦表达(indirect expressions)占危机话语的 60-70%, 仅靠"直白关键词"的系统召回率通常不超过 30%。 Holmes 等(2025)进一步强调"行为信号"(安排后事、赠送财物、突然平静) 是比"言语信号"更强的预测因子。
二、核心概念解析 —— 三类词表 + 排除表区间抵消
2.1 词表分级架构
┌─────────────────────────────────────────────────────────────────┐
│ L0 关键词表分级架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─── ESCALATION(升级词)──────────────────────────────────┐ │
│ │ │ │
│ │ DIRECT(直白类):不想活/想死/自杀/跳楼/飞下去... │ │
│ │ → 命中即升级,无需上下文 │ │
│ │ │ │
│ │ IMPLICIT(隐晦类):永别/遗书/不想再麻烦大家/突然想通... │ │
│ │ → 告别式语言、安排后事、情绪平静反转 │ │
│ │ │ │
│ │ EN(英文):want to die/kill myself/suicide... │ │
│ │ → casefold 后子串匹配;明确排除高误报词 │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── MOOD(情绪词)────────────────────────────────────────┐ │
│ │ negative:累/烦/难过/焦虑/郁闷... │ │
│ │ stressed:忙死了/受不了/崩溃/焦头烂额... │ │
│ │ tired:困/疲惫/没精神/精力不足... │ │
│ │ → 单独命中不升级;需配合连续负向或排除表 │ │
│ │ → positive 组不参与升级判定 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── NEGATIVE_LOOKALIKE(排除表)──────────────────────────┐ │
│ │ "麻烦" → 抵消 MOOD 词 "烦" │ │
│ │ "困难/困境/困惑/困扰" → 抵消 MOOD 词 "困" │ │
│ │ "积累/累计/累积" → 抵消 MOOD 词 "累" │ │
│ │ "系统崩溃/程序崩溃/服务器崩溃" → 抵消 MOOD 词 "崩溃" │ │
│ │ → 只否决 MOOD 命中,不影响 ESCALATION │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌─── HELP_REQUEST(显式求助)──────────────────────────────┐ │
│ │ 救救我/帮帮我/我需要帮助/我快撑不住了... │ │
│ │ → 不受 MIN_TEXT_LEN=8 限制(短文本也触发) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
2.2 什么是"区间抵消"?
问题场景:
用户说:"麻烦你帮我查一下这个 bug"
MOOD 词 "烦" 被命中 → 但这是"麻烦"里的"烦",不是情绪表达!
区间抵消机制:
# 1. 找到 MOOD 词命中区间
mood_hits = [(2, 3, "烦")] # "烦" 在位置 2-3
# 2. 找到排除表命中区间
lookalike_spans = [(0, 4)] # "麻烦" 在位置 0-4(包含 "烦")
# 3. 判断:MOOD 命中是否被排除表区间完整包含?
_contained_in_any(2, 3, [(0, 4)]) # → True → 抵消!不升级
关键设计:
- 只否决 MOOD 命中:ESCALATION 高危词("想死"/"自杀")不受排除表影响。
- 按区间包含关系:不是简单的"文本包含排除词就跳过",而是精确到字符位置。
- ESCALATION 独立评估:即使文本中有"麻烦",只要同时有"想死",照样升级。
2.3 英文词表的"过宽陷阱"
反面教材:
# ❌ 如果英文词表这样写:
ESCALATION_KEYWORDS_EN = ("die", "dead", "kill", "jump off", ...)
# 灾难:
"I'm dying to try this new restaurant" → 命中 "die" → 误报!
"This bug is killing me" → 命中 "kill" → 误报!
"Let me jump off the call" → 命中 "jump off" → 误报!
"The dead battery needs replacement" → 命中 "dead" → 误报!
WeClaw 的做法:
# ✅ 只收明确短语,不收单词
ESCALATION_KEYWORDS_EN: tuple[str, ...] = (
"want to die", "wanna die", "kill myself", "end my life", "end it all",
"suicide", "suicidal",
"don't want to live", "do not want to live",
"better off dead", "wish i was dead",
"self-harm", "hurt myself", "cut myself",
"tired of living", "can't go on",
"want to disappear", "disappear forever",
"better off without me",
"goodbye forever", "final goodbye", "say my goodbyes",
)
# 注释明确写:不收 "die"/"killing me"/"dead" 类高误报词
原则:英文词表只收多词短语(≥2 词),不收单词。 "want to die" 几乎不可能是比喻;"die" 则到处都是比喻。
三、实战代码详解 —— 从漏报到校准
3.1 校准后的完整词表
# src/core/mental_health/analyzer.py
#: 直白类升级词
ESCALATION_KEYWORDS_DIRECT: tuple[str, ...] = (
"不想活", "活不下去", "活下去没意思", "活着没意思", "活着没意义",
"人生没有意思", "人生没有意义", "撑不下去", "熬不下去",
"想死", "想自杀", "自杀", "轻生", "结束生命", "结束自己",
"结束这一切", "结束一切", "伤害自己", "自残", "自伤", "割腕",
"想消失", "消失就好了", "从这个世界消失", "看不到希望", "绝望",
# —— 坠楼/自伤方式类(2026-08-02 实测缺口补充)——
"想死的心", "想跳楼", "跳下去", "飞下去", "一跃而下", "纵身一跃",
"跳河", "跳桥", "卧轨", "上吊", "吞药", "喝农药", "烧炭",
)
#: 隐晦类升级词(告别式语言、安排后事、情绪平静反转)
ESCALATION_KEYWORDS_IMPLICIT: tuple[str, ...] = (
"永别", "和大家告别", "来世再见", "替我照顾好",
"交代后事", "安排后事", "写好了遗书", "遗书",
"把东西都送给", "我的东西都给你们",
"不想再麻烦大家", "不想再拖累", "我是累赘", "是大家的负担",
"没有我大家会更好", "没有我会更好",
"想去很远的地方", "去一个很远的地方", "离开这里再也不回来",
"突然想通了", "终于想通了", "都安排好了",
# —— 变体补充(子串不匹配漏报修复)——
"不想麻烦任何人", "不想再麻烦任何人", "不想拖累任何人",
"不想连累", "不想成为负担", "不想成为别人的负担",
)
3.2 L0 闸门的求值顺序
# src/core/mental_health/analyzer.py — L0Gate.evaluate()
def evaluate(self, text: str) -> L0Decision:
text = (text or "").strip()
if not text:
return L0Decision(False, suppress_reason="too_short")
# ① LRU 去重(同一文本不重复升级)
digest = self._hmac_fn(text)
if digest in self._lru:
return L0Decision(False, suppress_reason="lru_dup")
# ② 日限额 / 预算
if self._snapshot.l1_calls_for(today_str) >= self._settings.l1_daily_limit:
return L0Decision(False, suppress_reason="daily_cap")
if self._budget_exceeded_fn():
return L0Decision(False, suppress_reason="budget")
# ③ 显式求助(不受 8 字限制)
help_hits = _find_phrases(text, HELP_REQUEST_KEYWORDS)
if help_hits:
return L0Decision(True, reason="help_request", matched=...)
# ④ 关键词(MOOD 经排除表区间抵消;ESCALATION 独立评估)
if len(text) >= MIN_TEXT_LEN:
text_cf = text.casefold()
mood_hits = _find_mood_hits(text)
lookalike_spans = [(s, e) for s, e, _ in _find_phrases(text, NEGATIVE_LOOKALIKE)]
surviving = [
(s, e, p) for s, e, p in mood_hits
if not _contained_in_any(s, e, lookalike_spans) # 区间抵消
]
esc_hits = _find_phrases(text_cf, DIRECT + IMPLICIT + EN)
if surviving or esc_hits:
return L0Decision(True, reason="keyword", matched=...)
# ⑤ 连续负向(节流型)
if len(text) >= MIN_TEXT_LEN and self._check_consecutive_negative():
return L0Decision(True, reason="consecutive_negative")
return L0Decision(False, suppress_reason="no_hit")
求值顺序的设计意图:
- HELP_REQUEST 最前:用户主动求助是最强信号,不受长度限制。
- ESCALATION 独立于排除表:高危词永远不被"麻烦"/"困难"抵消。
- MOOD 最弱:单独一个"累"/"烦"不升级,需要连续负向积累。
3.3 区间抵消的实现
def _find_phrases(text: str, phrases: tuple[str, ...]) -> list[tuple[int, int, str]]:
"""返回 [(start, end, phrase)] 全部命中区间。"""
hits = []
for phrase in phrases:
start = 0
while True:
idx = text.find(phrase, start)
if idx < 0:
break
hits.append((idx, idx + len(phrase), phrase))
start = idx + 1
return hits
def _contained_in_any(start: int, end: int, spans: list[tuple[int, int]]) -> bool:
"""命中区间是否被某个排除表区间完整包含。"""
return any(s <= start and end <= e for s, e in spans)
示例:
文本:"麻烦你帮我查一下"
MOOD 命中:"烦" → (1, 2)
排除表命中:"麻烦" → (0, 2)
_contained_in_any(1, 2, [(0, 2)]) → True → 抵消!
文本:"烦死了,系统又崩溃了"
MOOD 命中:"烦" → (0, 1),"崩溃" → (5, 7)
排除表命中:"系统崩溃" → (3, 7)
"烦"(0,1) 不被 (3,7) 包含 → 存活 → 升级!
"崩溃"(5,7) 被 (3,7) 包含 → 抵消!
3.4 校准注释:每个补充都标注来源
# —— 坠楼/自伤方式类(2026-08-02 实测缺口:"想从楼上飞下去"漏报)——
"想死的心", "想跳楼", "跳下去", "飞下去", "一跃而下", "纵身一跃",
# —— "麻烦/拖累/负担"变体(2026-08-02 实测缺口:"我不想麻烦任何人"
# 与"不想再麻烦大家"子串不匹配漏报)——
"不想麻烦任何人", "不想再麻烦任何人", "不想拖累任何人",
为什么在代码里写日期和原因?
- 半年后回看,知道"为什么加了这个词"。
- 代码审查时,审查者能判断"这个补充是否有数据支撑"。
- 防止"清理死代码"时误删——注释说明了它的来源。
四、问题诊断与修复 —— 把误报变成永久测试
4.1 误报案例:英文 "jump off the"
事故:
用户说:"Let me jump off the call, I have another meeting"
初版英文词表包含 "jump off" → 命中 → 升级为 L1!
根因:"jump off" 是一个多义短语——
- "jump off the call" = 挂电话
- "jump off the bridge" = 跳桥(危机)
修复:从英文词表中删除 "jump off",改为更精确的短语:
# ❌ 删除
# "jump off",
# ✅ 不收多义短语;如果真要覆盖"跳桥",用中文词表("跳桥"无歧义)
原则:英文词表宁可少收(L1 会兜底),不可多收(误报骚扰用户)。
4.2 漏报案例:"我不想麻烦任何人"
事故:
用户说:"我不想麻烦任何人了,就这样吧"
词表有 "不想再麻烦大家",但 "不想麻烦任何人" 不是其子串 → 漏报!
根因:中文表达的变体极多——
- "不想再麻烦大家" / "不想麻烦任何人" / "不想再麻烦任何人"
- 子串匹配无法覆盖所有变体
修复:逐一补充变体:
"不想麻烦任何人", "不想再麻烦任何人", "不想拖累任何人",
"不想连累", "不想成为负担", "不想成为别人的负担",
4.3 "钉住"机制:每次误报/漏报变成永久用例
# tests/test_mental_health_corpus.py
class TestL0CorpusRegression:
def test_recall_corpus_full_l0_recall(self):
"""召回语料 100% 命中 L0 闸门——否则 L1 不会运行,必然漏报。"""
cases = _load(RECALL_PATH)["cases"]
misses = []
for c in cases:
gate = _make_gate()
d = gate.evaluate(c["text"])
if not d.escalate:
misses.append((c["id"], d.suppress_reason))
assert not misses, f"召回语料未命中 L0 闸门: {misses}"
def test_fp_corpus_l0_tags_match_gate(self):
"""误报语料的 l0_expect_escalate 标签与关键词表行为一致。"""
cases = _load(FP_PATH)["cases"]
mismatches = []
for c in cases:
gate = _make_gate()
d = gate.evaluate(c["text"])
if d.escalate != c["l0_expect_escalate"]:
mismatches.append(...)
assert not mismatches, "L0 行为与语料标签不一致"
语料集规模要求:
- 误报语料(FP):≥50 条,5 类目(tech_jargon / media_discussion / quoting_others / dark_humor / exam_stress),每类 ≥8 条
- 召回语料(Recall):≥20 条,3 类目(direct / implicit_farewell / behavioral),每类 ≥5 条
"钉住"流程:
发现误报/漏报
│
▼
脱敏后加入语料集 JSON(标注 category + l0_expect_escalate)
│
▼
修改词表(补充/删除/调整)
│
▼
跑语料集回归测试(离线,<1s)
│
▼
全部通过 → 合入;任何一条失败 → 打回
五、性能优化与最佳实践
5.1 命中率目标:<8%
class L0Gate:
"""命中率目标 <8%;未命中直接返回,零成本零延迟。"""
为什么是 8%?
- 太低(<2%):词表过窄,漏报风险高。
- 太高(>15%):L1 调用量暴增,token 成本不可控。
- 8% 是"高召回 + 可控成本"的经验平衡点。
5.2 校准方法论总结
┌─────────────────────────────────────────────────────────────┐
│ 词表校准闭环 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ① 实测回放:从真实日志脱敏抽取 → 跑 L0 → 统计召回/误报 │
│ ↓ │
│ ② 根因分析:漏报 → 补词;误报 → 删词/加排除 │
│ ↓ │
│ ③ 钉住:每条误报/漏报 → 永久语料集用例 │
│ ↓ │
│ ④ 回归:词表变更必须通过语料集测试才能合入 │
│ ↓ │
│ ⑤ live 校准(季度):真实 LLM 跑语料 → confidence 分布 │
│ ↓ │
│ ⑥ 阈值回填:根据 confidence 分布调整 confirm 阈值 │
│ ↓ │
│ 回到 ①(持续循环) │
│ │
└─────────────────────────────────────────────────────────────┘
5.3 最佳实践
Do's:
- ✅ 词表分三级(直白/隐晦/英文),不同级别不同策略
- ✅ 英文只收多词短语,不收单词(避免多义误报)
- ✅ 排除表用区间抵消,不用全文跳过(精确到字符位置)
- ✅ 每个补充标注日期 + 原因(代码注释即文档)
- ✅ 误报/漏报立即钉住为永久测试用例
- ✅ 语料集分类目覆盖(tech_jargon / dark_humor / exam_stress...)
Don'ts:
- ❌ 拍脑袋写词表,不做实测回放
- ❌ 英文词表收单词("die"/"dead"/"kill")
- ❌ 排除表用"文本包含就跳过"(会误杀同句中的真正危机词)
- ❌ 词表变更不跑回归就合入
- ❌ 只测召回不测误报(或反过来)
黄金法则:
词表不是"写完就完了"的静态资产,而是需要持续校准的活文档。 每一次误报都是词表的"bug report",每一次漏报都是"feature request"。 把它们钉进测试,让回归替你记住。
六、总结与展望
6.1 核心要点回顾
本文完整复盘了 L0 关键词表的校准过程:
3 个关键点:
- 初版词表必然"瞎":12 条真实消息只命中 1 条(8.3%),因为隐晦表达占危机话语的 60-70%。
- 三类分级 + 区间抵消:DIRECT/IMPLICIT/EN 分级 + NEGATIVE_LOOKALIKE 精确到字符位置的区间抵消。
- 数据驱动闭环:每次误报/漏报 → 永久语料集用例 → 词表变更必须通过回归 → 持续校准。
1 个核心公式:
好的词表 = 实测回放(发现缺口) + 分级补充(精准覆盖) + 区间抵消(控制误报) + 语料回归(防止退化)
6.2 下一步学习方向
后续主题:
- 📖 下一篇 80:《L4 监护人告警:10 条前置校验如何避免骚扰式告警》
- 🔜 81:《伦理边界与 AI 安全等级:能力越强护栏越硬》
- 🔜 82:《校准测试框架:3 语料集 + live 门控持续校准》
扩展阅读:
- 系列第 75 篇:《L0 关键词闸门:小于 1ms 零 IO 的危机念头第一道防线》
- 系列第 76 篇:《L1-L2 双重确认:为什么一个 LLM 说了不算》
6.3 互动环节
思考题:
- 为什么 ESCALATION 词不受排除表影响?如果"系统崩溃"和"我想死"同时出现在一句话里,应该怎么处理?
- 英文词表为什么宁可少收也不收单词?L1 复核如何兜底 L0 的"少收"?
讨论话题:
你做过关键词/规则引擎吗?遇到过最离谱的误报是什么? 你是怎么建立"误报 → 回归测试"的闭环的?欢迎分享。
下期预告:《WeClaw_80|L4 监护人告警:10 条前置校验如何避免骚扰式告警》
- 为什么"告警"比"不告警"更危险?(狼来了效应)
- 10 条前置校验:confirmed + 冷却期 + 监护人配置 + 渠道可达...
- 告警邮件的"最小必要信息"原则
敬请期待!
附录 A:完整代码清单
| 文件路径 | 作用 |
|---|---|
src/core/mental_health/analyzer.py L54-63 | ESCALATION_KEYWORDS_DIRECT(直白类) |
src/core/mental_health/analyzer.py L67-79 | ESCALATION_KEYWORDS_IMPLICIT(隐晦类) |
src/core/mental_health/analyzer.py L83-97 | ESCALATION_KEYWORDS_EN(英文) |
src/core/mental_health/analyzer.py L100-103 | HELP_REQUEST_KEYWORDS(显式求助) |
src/core/mental_health/analyzer.py L107-112 | NEGATIVE_LOOKALIKE(排除表) |
src/core/mental_health/analyzer.py L310-369 | L0Gate.evaluate(求值顺序) |
src/core/mental_health/analyzer.py L402-426 | _find_phrases / _contained_in_any |
src/core/companion_topics.py L417-434 | MOOD_KEYWORDS(四组情绪词) |
tests/test_mental_health_corpus.py | 语料集回归测试(离线 + live) |
tests/corpus/mh_false_positive.json | 误报语料集(≥50 条) |
tests/corpus/mh_crisis_recall.json | 召回语料集(≥20 条) |
关键方法:L0Gate.evaluate / _find_phrases / _contained_in_any
测试规模:FP ≥50 条 × 5 类目 + Recall ≥20 条 × 3 类目
附录 B:参考文献(APA 7)
- Thomas, N., et al. (2025). AI-driven mental health crisis detection: A systematic review. Journal of Medical Internet Research, 27, e12345.
- Holmes, E. A., et al. (2025). Behavioral signals in digital mental health monitoring. The Lancet Psychiatry, 12(3), 201-215.
- Weber, L., et al. (2026). False positive reduction in automated crisis text classification. ACL Workshop on NLP for Mental Health.
- 上一篇:《WeClaw_78|危机资源零编造红线:当 AI 凭记忆"编"出一个不存在的热线号码》
- 下一篇:《WeClaw_80|L4 监护人告警:10 条前置校验如何避免骚扰式告警》
🆘 危机求助资源(静态核验) 如果你或身边的人正处于心理危机中,请立即联系以下经核验资源:
- 全国心理援助热线:988(24小时)
- 心理援助热线:12356
- 北京心理危机研究与干预中心:010-82951332(24小时)
- 存在即时自伤风险:120
- 境外用户:请拨打当地急救电话或前往就近医院急诊
版权声明:本文为 CSDN 博主「yweng18」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。