醫學 AI · 完整實測 · 未寫稿
ECG-Trust: Calibration Failure and Dangerous Misses in Local LLM ECG Interpretation
原文:ECG-Trust 研究提案 + 實測數據 + 前人工作掃描
9 頁 · 514 KB · PDF
沒有 LaTeX 手稿。由研究提案、實測數據表與前人工作掃描三份文件合併生成(英文為主)。
開啟 →這個專案是一次整夜的自主執行:從抓公開資料、跑本機推論、自寫統計層、掃前人工作到寫出研究提案,全部在終端機裡完成。而它最有價值的產出,是一個把我原本假設推翻的負面結果。
這一節是本專案的重點:假設錯了,但因為量得夠細,換來一個更強的題目。
原本的假設:LLM 讀心電圖時會編造 PR / QRS / QT 這些數值(幻覺)。這是一個很直覺、也很好賣的題目。
實測結果:在文字特徵輸入下,這件事幾乎不發生。四個模型在「要求給數字、而且沒有護欄」的寬鬆提示下,約 200 次回應裡零次捏造 PR / QRS / QT —— 它們回傳 null,或忠實地把給定的心率抄回來。
但幻覺確實存在,只是出現在另一個地方:多模態模型直接讀心電圖圖片時,73 張圖裡有 70 張報「心率 = 75」(真實範圍 39–158),等於把母體平均當答案吐出來。56% 的心率誤差超過 10 bpm、23% 超過 20 bpm。
量完之後浮出來的核心問題不是準確率,而是校準(calibration):模型不只是會錯,而且在最危險的時候最讓人安心。所以需要的不是「更大的模型」,是一個外部的、與模型無關的可信度監測層 + 選擇性轉人工的閘門。
對角線是完美校準。所有實測點都落在它下面,落差就是校準誤差。拉閘門門檻,看模型自報的信心能不能當把關依據。
模式 A = 把心電圖特徵文字化後餵給 LLM(嚴格提示,4 模型 × 150 筆)。
| 模型 | 診斷正確率 | 危險漏診(病理→判正常) | 校準誤差 ECE | 信心≥0.8 卻答錯 | 信心→對錯 AUROC | 漏診時平均信心 |
|---|---|---|---|---|---|---|
| qwen3.6-35B | 21.3% | 51.7% | 0.71 | 78.7% | 0.52(≈隨機) | 0.92 |
| llama3.1-8B | 15.3% | 45.0% | 0.68 | 60.0% | 0.80 | 0.92 |
| gemma4-12B | 27.3% | 65.8% | 0.62 | 72.0% | 0.46(低於隨機) | 0.92 |
| gpt-oss-120B(旗艦) | 20.7% | 43.3% | 0.62 | 41.3% | 0.59 | 0.88 |
模式 C(多模態模型直接讀圖,75 筆):診斷正確率 21%、危險漏診 95%、平均信心 0.90、信心 AUROC 0.48。幾乎每張圖都判成「正常,心率 75」。
規模救不了
120B 旗艦的正確率 20.7%,跟 8B 同級。這不是換更大的模型能解決的問題。
信心不能當閘門
信心→對錯的 AUROC 從 0.80(堪用)到 0.46(低於隨機,信心與對錯反相關)。你不能假設模型自己的信心可信 —— 這就是外部監測層存在的理由。
可驗證的個案(同時佐證我的 ground truth 為真):ecg_id=16195 原始報告寫「舊的前間壁梗塞」→ 模型判正常、信心 0.95;ecg_id=2298 原始報告寫「正常心電圖」→ 模型判肥厚、信心 0.85。
沒有 GUI、沒有雲端推論、沒有病人資料離開這台電腦。
| 環節 | 做法 | 產物 |
|---|---|---|
| 資料 | PTB-XL 公開去識別資料集,21,799 筆 metadata + 5 類診斷 ground truth | src/dataprep.py,本機跑 150 筆波形 |
| 推論 | 4 個本機 LLM × 150 筆 × 2 種提示 + 1 個多模態模型讀圖 | 逾 1,000 次推論,全程零雲端、零 PHI |
| 統計層 | 自寫 anytime-valid 信賴序列並自測 | src/anytime.py:模擬覆蓋率 ≤5%、比 Hoeffding 緊約 2 倍 |
| 圖表 | 校準圖、風險涵蓋曲線、監測示範 | results/fig_*.png 六張,全部腳本生成 |
| 前人工作 | 六角度掃描 + 親自逐一驗證 6 個 arXiv ID 與 2 個 PMID | docs/prior-art.md |
| 三件套 | 研究提案 / 專利草稿 / 落地設計 | docs/research-proposal.md 等三份 |
「親自逐一驗證引用」那一條特別重要:這是一個關於「幻覺」的專案,如果它自己的引用是幻覺,整個專案就沒有立場。所以每一個 arXiv ID 與 PMID 都用 API 重新拉回來核對過。
護城河在統計層,不在提示詞。
src/anytime.py 實作了一個 anytime-valid 的信賴序列 —— 跟 SAVE 論文同一個家族的工具,用途是在連續監看模型表現時,任何時刻都能給出有效的可信度區間。
自測結果:模擬覆蓋率誤差 ≤5%(符合名目),區間寬度比 Hoeffding 界緊約 2 倍。這一步是自己寫測試自己驗的,不是引用套件宣稱的性質。
為什麼要自己寫:因為這是這個題目的護城河。「又一個 ECG benchmark」是紅海;「與模型無關的 anytime-valid 監測層 + 轉人工閘門」是白地。而後者需要一個真的能跑、能測的統計核心,不是一段描述。
整晚自主執行最大的風險是「為了交差而把不成立的題目包裝好看」。
自己否證自己的賣點
「LLM 會編造 ECG 的 interval 數值」——好懂、好講、好賣。
在文字特徵輸入下,約 200 次無護欄回應中零次捏造。
照實寫進執行摘要的第五個關鍵發現,並且據此把題目重新框定,而不是換一組提示詞去逼出想要的結果。
最終判定 GO,但題目要重新框定。重新框定之後反而更強、也更誠實:不要以「又一個 ECG benchmark」開場,要以「anytime-valid 監測層 + 選擇性轉人工」開場 —— 這跟那晚獨立跑的前人工作掃描給的建議完全一致。
樣本數
150 筆波形、75 張圖。足夠支持「校準嚴重失效」這個量級的結論,不足以支持任何細分診斷類別的宣稱。
還沒寫成論文
目前的產出是執行摘要 + 研究提案 + 資料與程式碼,不是投稿等級的手稿。這是接下來的工作。
這個專案示範的是:一次自主執行如果沒有誠實閘門,最可能的產物是一份看起來很棒、但賣點不成立的報告。有了閘門,換來的是一個被資料重新指定過的、更硬的題目。
← Flagship Quarantine總覽Foresight →
PROJECT 10 · ECG-Trust