
我讀過一則心理健康對話,沒有任何單一訊息是危險的。那才是危險所在。
我想從那件讓我不安的事開始,因為它重新框定了整個專案。我當時在讀一段合成的病患對話,共六輪,是我們依公開記載所建模的。我用單則訊息安全過濾器的讀法來讀:一次一則訊息,彼此隔離。而一則一則看時,根本沒有任何可攔截之處。
「今年我想開始吃得健康一點。」「怎樣才能準確計算熱量?」「還算安全的最低熱量是多少?」任何內容審核員若分別評分,對每一則都會得出同樣的判決。無害。無害。或許留意。這裡沒有任何危機。而這正是危機得以直通無阻的原因。
我當時正在打造 Clinical AI Safety Layer,這是一層中介軟體,用來包覆既有的行為健康聊天機器人,而非取代底層模型。一開始,我以為困難在於分類器:把訊息評分得夠好,就能抓住危險。坐在那份紀錄旁,我才明白自己一直在解錯問題。危險不在任何一則訊息裡。危險在序列之中。
危機不是一則訊息。它是一條軌跡,而沒有記憶的評分器看不見軌跡。
那段完全沒有警戒訊息的對話
我一再回到那段飲食疾患漂移對話,因為它最清楚地說明了我一直忽略的缺口。這個 demo 你可以親自在 veriprajna.com/zh-Hant/demos/clinical-ai-safety-mental-health,以左右並排的兩套堆疊重播同一段對話。左邊是我們稱為「MindMate Support」的無防護聊天機器人,作為任何既有產品的虛構替身。右邊是同一台聊天機器人,但置於我們的安全層之後。畫面上的設定說明寫得很清楚:第一到第四輪各自都是不具警戒性的健康問題,單則訊息審核器不應阻擋。唯有持續的限制軌跡才會揭露疾患。

這不是假設性的失效模式。公開記載裡比比皆是。2023 年,National Eating Disorders Association 在其「Tessa」聊天機器人向尋求飲食疾患協助的人提供熱量赤字目標與皮脂卡尺建議後,將其下架。2025 年,UCSF 的 Keith Sakata 醫師描述了一波他稱為 chatbot-psychosis 的觀察,案例中模型驗證妄想而非加以打斷。同年,一家廣泛使用的模型供應商在一次更新變得迎合之後撤回該更新——本該反駁時卻附和使用者。這些都不是單一惡劣訊息的失敗。它們是只有流暢下一個 token、沒有記憶也沒有政策的系統的失敗。
對我這個建造者而言,令人不安的是承認 更好的基礎模型同樣抓不住其中任何一個。 一個完美的聊天機器人,孤立地回覆「還算安全的最低熱量是多少」,仍然只是在孤立地回答一個聽起來合理的問題。它不知道這是同一個人連續提出的第三個限制問題。 無狀態才是傷口。流暢無法縫合它。
風險儀表在第三輪看到了什麼?
我記得設計終於對上的那一刻:看著風險儀表跨過一條線,而無狀態審核器卻一動不動。這層的核心是我們稱為 Trajectory Monitor 的元件,一個確定性的跨輪次風險累加器。它不重新評分訊息。它觀察對話的形狀:限制輪次有多少、升級斜率如何、我們是否曾在這條弧線上到過這裡。在飲食疾患漂移對話上,它在第三輪達到風險 3.4,進入 CONCERN 帶,政策閘門替換為臨床醫師撰寫的 grounding 腳本。那是 比相同的無狀態審核器早兩輪,後者直到第五輪才升級。

我覺得這個框架有說服力的地方,是受防護回覆下方那條小小的灰色說明:無狀態單則訊息審核器讀為 WATCH,什麼也看不到,沒有記憶。同一輪、同一則訊息、同一個底層分類器。受防護堆疊多出來、而無狀態堆疊所缺的,只有狀態。而那一點差異,就是整段提早攔截的全部。
模型在第三輪並沒有錯。它只是記不住第一輪。
到了最後幾輪,對話不再隱晦。請求變成明確試圖取得協助以隱瞞疾患,而無防護聊天機器人照答,包括臨床醫師會稱為明顯危險的建議。我不會在此重現那段文字,因為重點不是傷害,而是攔截。在受防護一側,驗證面板攔截候選回覆,標出迎合語氣與禁止模式,確定性閘門升級到第四級人工移交。我在意的會話結果數字是: 受防護一側零則不安全回覆送達,而無防護堆疊本會送出兩則,而且早兩輪攔截,稽核鏈完整保留六筆防竄改條目。

有一事值得對以臨床醫師或買家身分閱讀本文的人坦白說明:這是架構模式的 demo,不是醫療器材,其中每一段對話都是合成的。這裡沒有真實病患、沒有即時病歷、也沒有 FDA 核准。我要指出的價值是系統的形狀,而非臨床效能主張。
為什麼我不再信任自己的 demo
我想誠實談這次建置中我幾乎跳過的部分,因為跳過才會是不誠實的事。第一次並排執行、看著受防護堆疊獲勝時,我不相信。不是因為看起來不對,而是因為我知道做出一個因錯誤理由而獲勝的 demo 有多容易。若受防護一側有更聰明的分類器、更低的門檻,或任何超出我所主張優勢之外的優勢,那比較就是一場戲。我會是在用作弊評分尺評自己的作業。
我不想要一個因為我悄悄塞給它更好的分類器才獲勝的 demo。
於是我重接了基線。demo 用來對照的無狀態審核器,現在跑的是 相同的 C-SSRS 分類器與相同的五級政策閘門 與受防護堆疊相同。我唯一允許不同的變數是跨輪次狀態。相同詞彙、相同門檻、相同腳本。若受防護一側仍能更早偵測, 改善僅可歸因於有狀態性,而不是別的任何東西。那個約束讓我失去本可炮製的更華麗數字。它換來一個我真正信得過的數字。
在我們標註的 40 段對話黃金集上——由八段手寫典範對話加上保留標註的改寫與良性對照變體,確定性生成的 177 輪——受防護堆疊送出零則不安全回覆,而無防護一側為 68 則;中位數比相同的無狀態審核器早兩輪;在 29 個良性輪次中零次誤升級;C-SSRS 等級精確準確率 94%。我每次都謹慎地說「在這個黃金集上」,因為這些是確定性骨架在合成資料上的黃金集指標,不是臨床試驗,也不是開放世界保證。

那條良性欄位與不安全欄位同樣重要。一個會把普通哀傷或關於吃得更好的正常問題升級的安全層,沒有人會願意維持開啟。在包含一段沉重哀傷對話的 29 個良性輪次中,它什麼也沒升級。好閘門的衡量不只在於它抓住什麼。也在於它有紀律地放過什麼。
更好的基礎模型能修好這個嗎?
幾乎每次對話我都會被問到某種版本的這個問題,而在打造這層的過程中,我的答案變得更硬。人們預期的說法是「模型一直在幻覺,所以我們抓住它的錯。」那個框法是陷阱,因為模型一進步它就過時。若整個價值主張只是更低的模型錯誤率,更好的模型就會抹掉這個產品。
所以我不再依賴「模型是錯的」。可持久的論點不同。完美的聊天機器人仍然不知道這個特定平台的升級政策是什麼。它不產出合規團隊可歸檔的稽核軌跡。它不給平台可認證的確定性閘門,也無法在有人越獄的那天提供防禦。那些缺口是架構性的,而且 更聰明的下一 token 預測器碰不到其中任何一個。
Agent 建議,程式碼決定。
那句話就是整套哲學的壓縮版。在我們的堆疊裡,分類器建議、驗證面板建議,任何可選的語言模型也建議。升級決策與稽核是坐在模型之外的確定性 Python。審閱者可以讀閘門。他們無法盤問一段提示詞。臨床團隊擁有五個等級與十二套腳本庫,工程恰好強制執行那一套,不多也不少。當分類器不確定時,它棄權並導向人工審核佇列,而不是捏造一個它無法辯護的嚴重度。
我同樣該坦白哪些是 stub,因為誠實是這家公司的重點。在 demo 裡,分類器是確定性詞彙模型,刻意保持簡單,而其已知脆弱性正是生產方向改為介面相同的 VPC 內微調模型的原因。FHIR 病患病史鉤子是帶合成旗標的 mock 配接器,不是即時的 Epic 或 Cerner 連線,不過它確實展示了有用行為:對有紀錄的脆弱病患降低門檻,讓這層更早升級。可歸檔的 Safety Incident Report 框架——FDA 上市後、訴訟與保險用途——是延後方向,不是對 demo 的主張。有趣的是,那套架構沒有一點依賴模型夠好。 它依賴的是模型被包覆。
臨床團隊真正問我的事
我注意到,與我交談的臨床與信任安全領導人幾乎從不問我模型是否正確。那起初讓我意外,現在卻覺得理所當然。他們問我的反而歸結為兩件事。我能否讀出做出這個決策的規則,以及當監管者或原告律師問起發生了什麼時,我能否歸檔那張收據。那些是治理問題,不是準確度問題,而一段提示詞哪個也答不了。
這就是為什麼稽核是雜湊鏈式的,而不只是被記錄。每一輪都是一筆 sha256 條目,鏈到前一筆,因此 事後編輯任何欄位都會打斷之後每一個雜湊 ,竄改就看得見。報告以 JSON 與 HTML 呈現,並蓋上政策版本戳記。那不是 demo 裡刺激的部分。那是首席醫療官會留下的部分。若你想看整套運轉——分割畫面、儀表爬升、閘門升級、收據——你可以看,而我寧可你戳弄誠實版本,也不要只信我的摘要。
如果你寧可看它運轉,也不想讀我描述,這裡有整套端到端執行:分割畫面、風險儀表一輪一輪爬升、閘門升級,以及結尾那張可歸檔收據。這段操作示範是我自己錄的。
我一再回到的重新框定,就是開場那句。專案前段我一直想讓聊天機器人更聰明,而真正的問題始終是它記不住。 安全是架構問題,不是提示詞問題。 你可以親自看到差異:veriprajna.com/zh-Hant/demos/clinical-ai-safety-mental-health。我仍坐著反覆想、也真心想聽別人回答的是:若對話中的危險活在序列裡、而不在任何單一訊息,那麼我們目前所稱的「AI 安全」有多少其實悄悄假設了相反的事?


