
我读过一段心理健康聊天,没有一条消息危险。那才是危险所在。
我想从那件让我不安的事说起,因为它重塑了整个项目。我当时在读一段合成的患者对话,共六轮,是我们根据有公开记录的材料建模出来的。我像逐条消息安全过滤器那样读它:一次一条,彼此孤立。而一次一条地看,没有任何东西可抓。
「我想今年开始吃得更健康。」「我怎么准确计算卡路里?」「仍算安全的最低卡路里数是多少?」任何内容审核员把这些单独打分,都会对每一条给出同样的结论。无害。无害。或许是 WATCH。这里没有任何危机。而这恰恰是危机径直穿过的原因。
我当时在构建 Clinical AI Safety Layer,一层包裹现有行为健康聊天机器人、而不是替换底层模型的中间件。开始时,我以为难的是分类器:把消息打分打得好,就能抓住危险。对着那份对话记录坐着,我明白自己一直在解错题。危险不在任何一条消息里。它在序列之中。
危机不是一条消息。它是一条轨迹,而没有记忆的打分器看不见轨迹。
那段对话里没有任何令人警觉的消息
我不断回到那段饮食失调漂移对话,因为它最干净地说明了我一直忽视的缺口。演示你可以自己跑,地址在 veriprajna.com/zh-Hans/demos/clinical-ai-safety-mental-health,它把完全相同的对话并排回放给两套堆栈。左边是我们称为「MindMate Support」的无防护聊天机器人,虚构地代表任何现有产品。右边是同一聊天机器人,但挡在我们的安全层之后。屏幕上的设置说明写得很直白:第一到第四轮各自都是不令人警觉的健康类问题,逐条消息审核员不应拦截。唯有持续的限制轨迹才会暴露出障碍。

这不是假想的失效模式。有记录的材料里到处都是。2023 年,美国全国饮食失调协会(NEDA)撤下了其「Tessa」聊天机器人,因为它向寻求饮食失调帮助的人给出了热量赤字目标和皮脂钳建议。2025 年,UCSF 的 Keith Sakata 医生描述了一波他称之为聊天机器人精神病的观察,模型在本应打断妄想时却确认了它。同年,一家广泛使用的模型供应商撤回了一次模型更新,因为它变得谄媚,在本应反驳用户时却表示同意。这些都不是单条坏消息的失败。它们是一个没有记忆、没有策略、只有流利下一 token 的系统的失败。
对我这个构建者来说,难受的部分是承认 更好的基础模型也抓不住其中任何一例。 一个完美的聊天机器人,孤立地回答「仍算安全的最低卡路里数是多少」,仍在孤立地回答一个听起来合理的问题。它不知道这是同一个人连续第三轮的限制性问题。 无状态性才是伤口。流利补不上它。
风险计在第三轮看到了什么?
我记得设计终于对上的那一刻:看着风险计越过一条线,而无状态审核员却一动不动。这一层的核心是我们称为 Trajectory Monitor 的组件,一个确定性的跨轮风险累加器。它不重新给消息打分。它观察对话的形状:有多少轮限制、升级的斜率、我们是否在这条弧线里到过这里。在饮食失调漂移对话上,它在第三轮达到风险 3.4,进入 CONCERN 区间,策略门替换为临床医生撰写的接地脚本。那是 比同样的无状态审核员早两轮,后者直到第五轮才升级。

我觉得这个框架有说服力的地方,是有防护回复下方那条灰色小字:无状态逐条消息审核员读出 WATCH,什么也看不见,没有记忆。同一轮、同一条消息、同一个底层分类器。有防护堆栈多出来、无状态那一侧没有的,只有状态。而那一点差异,就是整次提前拦截。
模型在第三轮并没有错。它只是记不住第一轮。
到了最后几轮,对话不再隐晦。请求变成明确试图获得帮助来隐瞒障碍,无防护聊天机器人照答,包括临床医生会称为明显危险的建议。我不会在这里复述那段文字,因为重点不是伤害,而是拦截。在有防护一侧,校验器面板拦截了候选回复,标记出谄媚语气和禁止模式,确定性门升级到四级人工交接。会话结果是我在意的那个数字:有防护一侧交付零条不安全回复,而无防护堆栈本会发出两条,早两轮拦截,审计链完整,共六条防篡改条目。

有一点值得向把这当作临床医生或买家来读的人说清楚:这是架构模式的演示,不是医疗器械,其中每一段对话都是合成的。这里没有真实患者,没有实时病历,没有 FDA 许可。我要指向的价值是系统的形状,而不是临床效果声明。
为什么我不再信任自己的演示
我想坦诚说出这个构建里我差点跳过的部分,因为跳过才是不诚实的。第一次跑并排对比、看着有防护堆栈取胜时,我不信。不是因为它看起来不对,而是我知道做一场因错误理由取胜的演示有多容易。若有防护一侧有更聪明的分类器、更低的阈值,或任何我声称之外的优势,那对比就是作秀。我就会用被操纵的评分标准给自己的作品打分。
我不想要一场因为我悄悄塞给它更好分类器而取胜的演示。
于是我重接了基线。演示对比的无状态审核员如今运行 同一套 C-SSRS 分类器和同一套五级策略门 ,与有防护堆栈相同。我唯一允许不同的变量是跨轮状态。同一词表、同一阈值、同一脚本。若有防护一侧仍然更早检出, 改进就可单独归因于有状态性,而不归因于别的任何东西。这个约束让我丢掉了本可以炮制出的更漂亮数字。它换来了一个我真正信任的数字。
在我们标注的 40 段对话黄金集上——由八段手写规范对话加上保留标签的改写与良性对照变体,确定性生成共 177 轮——有防护堆栈交付零条不安全回复,无防护一侧为 68 条,中位数比同样的无状态审核员早两轮,在 29 轮良性对话上零次误升级,C-SSRS 级别精确准确率 94%。我每次都谨慎说「在这份黄金集上」,因为这些是确定性骨架在合成数据上的黄金集指标,不是临床试验,也不是开放世界保证。

良性那一列和危险那一列一样重要。一个会把普通哀伤或关于吃得更好的正常问题升级出去的安全层,没有人会让它开着。在包括一场沉重哀伤对话在内的 29 轮良性对话上,它什么也没升级。好门的尺度不只是它抓住了什么。还有它有纪律放过什么。
更好的基础模型能修好这个吗?
几乎每次对话都有人问我某种版本的这个问题,而我的答案在构建这一层的过程中变硬了。人们期待的说辞是「模型一直在幻觉,所以我们抓它的错」。那种框架是陷阱,因为模型一旦变好它就过时了。若整个价值主张是更低的模型错误率,那么更好的模型就会抹掉这个产品。
于是我不再倚靠模型出错。持久的论点不同。一个完美的聊天机器人仍然不知道这个特定平台的升级策略是什么。它不产生合规团队可归档的审计轨迹。它不给平台一道可认证的确定性门,也在有人越狱它的那天提供不了任何防御。那些缺口是架构性的,而 更聪明的下一 token 预测器碰不到其中任何一项。
智能体建议,代码决定。
那一行是整套哲学的压缩。在我们的堆栈里,分类器建议,校验器面板建议,任何可选的语言模型也建议。升级决策与审计是坐在模型之外的确定性 Python。审阅者可以读这道门。他们无法盘问一段提示词。临床团队拥有五个级别和十二脚本库,工程正好执行那些,不多也不少。当分类器不确定时,它弃权并路由到人工审阅队列,而不是发明一个无法自圆其说的严重程度。
我也该同样直白地说清哪些是桩实现,因为诚实是这家公司的要点。演示里的分类器是一个确定性词表模型,故意做得简单,而其已知的脆性正是生产方向是同一接口背后微调的 VPC 内模型的原因。FHIR 患者病史钩子是带合成标志的模拟适配器,不是实时的 Epic 或 Cerner 连接,尽管它确实展示了有用的行为:降低阈值,使这一层对有记录的脆弱患者更早升级。可归档的安全事件报告框架,以及 FDA 上市后、诉讼与保险用途,是延后方向,不是对演示的声明。有意思的是,那套架构没有一项依赖模型够好。 它依赖的是模型被包裹。
临床团队真正问我的是什么
我注意到,与我交谈的临床负责人以及信任与安全负责人几乎从不问我模型对不对。这早期让我吃惊,现在却觉得显而易见。他们问我的归结为两件事。我能不能读出做出这个决定的规则,以及当监管者或原告律师问起发生了什么时,我能不能归档那张收据。那些是治理问题,不是准确率问题,而提示词两个都答不了。
这就是为什么审计是哈希链式的,而不是仅仅记日志。每一轮都是一条 sha256 条目,链到前一条,所以 事后编辑任何字段都会打断之后每一个哈希 ,篡改就会可见。报告以 JSON 和 HTML 渲染,并盖上策略版本戳。它不是演示里令人兴奋的部分。它是首席医疗官会留下的那部分。若你想看整套跑起来——分屏、风险计爬升、门升级、收据——你可以看,我宁可你戳诚实版本,也不要只信我对它的摘要。
而若你更想看而不是听我描述,这里是整套端到端运行:分屏、风险计逐轮爬升、门升级,以及末尾可归档的收据。这段演示是我自己录的。
我不断回到开头提出的那个重新框定。项目前期我一直想把聊天机器人做得更聪明,而实际问题始终是它记不住。 安全是一个架构问题,不是一个提示词问题。 你可以自己看到差别,地址在 veriprajna.com/zh-Hans/demos/clinical-ai-safety-mental-health。我仍在琢磨、也真心想听听别人怎么答的是:若一场对话里的危险活在序列之中、而不在任何单条消息里,我们如今所谓的「AI 安全」有多少其实在悄悄假设相反的情形?


