
我建了一個示範來重現著名 AI 錯誤。我的基線拒絕犯下它。
我怎麼也無法重現的那個錯誤
我開始做這個示範時,想重現一個有充分文獻記載的特定失敗。病患配對 AI 把臨床筆記當純文字來讀,因此會混淆在醫學裡看起來相似、意義卻不同的詞。經典例子很清楚:一項第三期抗凝劑試驗會排除先前有過心導管檢查,病患的筆記寫著中心靜脈導管置放,相似度配對器看到兩個心血管導管處置,給出接近的分數,並排除了一位其實符合資格的病患。已發表的評估證實真實模型會犯這個精確錯誤(Fierce Biotech,2025)。我想讓我的示範先顯示它發生,再顯示我的引擎把它抓出來。
於是我寫了一個公平的基線來當反派。實體層級的 TF-IDF 餘弦相似度,詞與字元的 3 到 5-gram,一個真正的向量相似度方法。我甚至給它慷慨的設定,並代它交叉驗證決策閾值(分層 3 折 ROC、Youden's J、種子 13,落在 t = 0.6932),因為稻草人證明不了什麼。然後我跑了心導管案例,等著錯誤排除出現。
它沒有出現。基線給這兩個導管片語的分數舒適地低於它自己交叉驗證的閾值,並回傳符合資格。我整套示範所圍繞的那個錯誤,就是重現不出來。
我原本打算上演一場著名的失敗,卻發現我誠實的反派太弱,犯不了那個錯。
原因後來很有啟發性,我想說得精確,因為這很容易被誇大。一個稀疏的詞彙基線並不會產生那種特定的錯誤排除。它需要稠密語意嵌入,才能把那兩個片語拉得夠近去觸發。加上一個重量級嵌入模型會把示範膨脹成無法用一條指令離線執行的東西,所以我做了決定:讓基線保持誠實且稀疏,別再假裝它會犯它犯不了的罪。那個決定重組了我正在建構的整篇文章。若你想自己跑,它在 veriprajna.com/zh-Hant/demos/clinical-trial-recruitment-ai。
中心靜脈導管到底是什麼?
我仍保留了心導管案例,因為它後來證明的事,比抓到一個錯誤更好。它證明為什麼我的引擎答案根本值得信任。這裡兩個概念都有真實、可查核的 SNOMED-CT 識別碼。中心靜脈導管置入是392230005。心導管檢查是41976001。你可以任選一個貼進任何公開 SNOMED 瀏覽器,確認它們位在階層的不同分支上。兩者之間沒有is-a 路徑從一方通往另一方。中心靜脈導管不是心導管,只有階層知道這一點。
那就是整篇論點濃縮在圖的一條邊上。相似度分數無法表示「is-a」。它只能表示「這些字串看起來相似」,而看起來相似不等於意義相似。當我的引擎評估排除條件「無先前心導管檢查」時,它不對任何東西打分。它問一個結構性問題:病患已驗證的事實是否被禁止概念所包含?它遍歷本體,找不到包含路徑,並以三步追蹤回傳符合資格,點名兩個概念 ID 以及它檢查過的圖邊。

我第一次看那條追蹤渲染時,打動我的不是判決。是它底下的收據。同一畫面上基線的框顯示一個相似度數字,沒有出處、也沒有可重現性。我的引擎的框點名兩個 SCTID 以及它問的確切is-a 問題。其中一個,監管機構可以歸檔。另一個只是一個附帶聳肩的數字。心導管案例真正賺到的,是那個對比,而不是抓到錯誤。
配對器真正丟掉的那位病患
我仍需要一位真正被丟掉的病患,所以我去找誠實基線真正失敗的地方,結果發現它藏在一個詞裡:not。合成英雄病歷 P-074 帶有筆記行「No evidence of diabetes.」。腫瘤學方案的排除條件之一是「無糖尿病診斷」。向量基線看到詞元「diabetes」就坐在準則的「diabetes」旁邊,並把它們匹配到相似度 1.0。完美分數。它沒有否定模型,因此讀到一句把糖尿病排除的句子,卻當成把糖尿病納入,並排除了一位符合資格的病患。
這就是配對器丟掉的病患,也是我原本期望心導管案例要承擔的那一拍。否定,正是稀疏基線在自己的最佳閾值上誠實崩壞的地方,無需任何操弄。

我一直在想這個失敗有多安靜。沒有錯誤訊息、沒有低信心旗標、沒有任何東西出錯的訊號。分數是 1.0,可能的最高分,系統能有的最大信心。基線從來沒有比它最錯的那一刻更確定。一位審查這類佇列的協調員,無從知道這個特定的完美匹配,其實是一位本該被納入的病患。把這乘上整個方案,你就會理解為什麼 80% 的試驗錯過納入時程(產業共識,2025),以及為什麼每次篩選失敗平均約花 1,200 美元(Antidote.me,2025)。
基線從來沒有比它最錯的那一刻更有信心。那不是你能調掉的 bug。那是範疇錯誤。
為什麼判決要活在模型之外?
我很早就做了一個架構決定,現在我認為那是唯一真正重要的決定:把語言模型完全隔在判決之外。整條管線裡恰好只有一個機率步驟。一個可替換供應商的模型,僅供諮詢,讀取凌亂散文並提出候選事實,每一項帶著它讀到該事實的原文片段,以及從小型封閉詞彙抽出的候選概念 ID。那是模型真正擅長的一件事:閱讀。它對誰符合資格沒有投票權。
之後的一切都是我可以稽核的確定性程式碼。任何被提出的事實進入決策之前,一個對抗式驗證器會用三項檢查對照字面筆記挑戰它:片段是否真的存在、是否被否定、以及主語是病患而非家屬。「No evidence of diabetes」這項事實在否定檢查失敗,從未進入引擎。同一份病歷上,「Family history of breast cancer」在主語檢查失敗,因為那段病史屬於家屬而非病患,並被標為拒絕,且點名失敗的檢查。

在完整金標集上,這個驗證器拒絕了7 個事實實例、3 個不同的錯誤事實(一則被否定的糖尿病提及、一則家族史乳癌歸因,以及一項沒有支持片段的植入幻覺藥物),分布在 13 次計分案例執行中的 4 次,全都在它們能觸及判決之前。當人們問我「我怎麼信任代理從我的筆記抽出的東西」時,這個面板就是完整答案。我不要求你信任它。我讓你看它提出了什麼、什麼被丟掉、以及為什麼。
然後判決本身是坐在代理框架之外的普通 Python:一個道義邏輯引擎,在本體與一些日期計算上評估禁止、時間例外與要求。模型無法覆寫這道閘門,因為閘門運行時模型不在場。這也是引擎可重現的原因。當邏輯是固定本體上的確定性程式碼時,重跑同一份病歷會產生相同答案,逐位元組,每一次。
模型負責讀。它不投票。那一條界線,讓重跑變成位元組級相同。
我的臨床營運讀者唯一在意的那個數字
我花了數週優化那些指標,最後我對自己承認,買方不會為那些徹夜難眠。決策準確率是排行榜數字。在贊助商或 CRO 負責可行性的人,不是在比較排行榜分數。他們看的是納入時程在滑落,而每一天的滑落都很貴。Tufts CSDD Impact Report(2024)把納入延遲成本定在約每天 80 萬美元的處方藥銷售損失,而在這個示範觸及的治療領域更高:腫瘤學約每天 84 萬美元,心血管約每天 140 萬美元。方案複雜度自 2005 年以來在試驗程序上攀升了 139%(IQVIA,2026),意味著更多準則、更多子句,以及更多文字配對器可能弄錯一處的地方。
所以我不再以準確率開場,開始以真正對應那份痛的數字開場:你沒有丟掉的符合資格病患。在一個固定標註的金標集上,共13 個案例,來自 7 位合成病患、跨 2 個合成方案,我的引擎丟掉0 位符合資格病患。公平基線丟掉 3 位。同一集合,同一閾值,交叉驗證到對基線自身有利。

我想精確說明那些數字是什麼、不是什麼。它們是工具在那一個固定 13 案例集上自己的輸出,不是開放世界的承諾。100% 是「在這個金標集上的 100%」,絕不是「永遠正確」。我不會告訴你 TrialProof 從不犯錯,因為我沒有資料可以這麼說,而且我也不會相信任何這麼說的人。我能說的更窄、我也認為更有用:在這個集合上,引擎丟掉零位符合資格病患,每個決策都帶有可重現追蹤,有兩個決策在缺少必要檢驗或生命徵象時安全地以 NEEDS-REVIEW 棄權而不是猜測,而且重跑整組是位元組級相同,13 比 13。所有病患、筆記與方案都是合成夾具,任何地方都沒有真實紀錄。你可以在 veriprajna.com/zh-Hant/demos/clinical-trial-recruitment-ai 觀看每一次執行。
我在意的數字不是準確率。是我沒有丟掉的符合資格病患。在這個集合上,相對基線的三位,那是零位丟掉。
這也有監管形狀,我會小心點名。FDA 2026 年 1 月的 Clinical Decision Support 指引,是像這樣人在迴路中配對輔助的相關框架。引擎發出的每個決策都可以匯出為 CDISC SDTM IE 紀錄,每位病患與每條準則一列,帶著判決、推理追蹤、概念 ID 與道義操作。那不是核可,我也沒有在主張核可。那是對齊與方向。但這意味著追蹤不是除錯便利。它是可歸檔的產物,而且依建構存在於每個決策上,而不是事後追加。
我不斷回到的事
我不斷回到我的反派拒絕扮演它角色的那一刻,因為它改變了我在問的問題。三年來,這個領域一直在問如何讓模型更好地決定誰符合資格。更好的提示、更大的上下文、更多檢索,全都指向讓一個機率系統值得信任到足以裁定病患納入。這次建構的前一段,我也陷在那個框架裡,試著抓模型犯錯,好讓我能修好模型。
最終想通的是:那是錯誤的層次。相似度分數無法表示「is-a」、無法表示「不」,也無法表示「除非療法在隨機分派前超過十二個月已完成」。再多提示也加不進那些,因為它們不是語言問題。它們是邏輯問題。所以高階做法不是讓模型值得信任。而是讓信任變得不必要。讓模型做它擅長的那一件事:讀散文並提出事實,附上它讀到的片段。然後讓驗證器丟掉筆記不支持的,並讓可稽核的普通程式碼在醫學本體上計算判決。
資格應被計算,而非預測。進去之前我沒預料到的是,回報感覺一點也不像基準。它感覺像收據。同一份病歷每次給相同答案,答案點名決定它的概念 ID 與圖邊,而可行性負責人真正為之失眠的那個數字,變成零位符合資格病患被丟掉。
如果你寧願看它運轉,而不是聽我描述,整套端到端就在這裡。
所以這是我一直轉著想、也真心想知道你怎麼回答的問題。當賭注是一個真實的人參加試驗的機會時,你希望信任落在哪裡:在一個你必須相信的模型裡,還是在你可以閱讀的程式碼裡?


