← 回總覽 · 13 篇研究

醫學 AI · 完整實測 · 未寫稿

本機 LLM 讀心電圖不是偶爾錯,是「非常有自信地錯」

ECG-Trust: Calibration Failure and Dangerous Misses in Local LLM ECG Interpretation

GO · 題目成立 一晚自主執行 零 PHI · 全本機 原假設被自己否證

2026-06-27 · PTB-XL 公開去識別資料 · 4 個本機 LLM × 150 筆 ECG × 2 種 prompt + 1 個多模態模型讀圖 · 逾 1,000 次本機推論

PDF

原文:ECG-Trust 研究提案 + 實測數據 + 前人工作掃描

9 頁 · 514 KB · PDF

沒有 LaTeX 手稿。由研究提案、實測數據表與前人工作掃描三份文件合併生成(英文為主)。

開啟 →

這個專案是一次整夜的自主執行:從抓公開資料、跑本機推論、自寫統計層、掃前人工作到寫出研究提案,全部在終端機裡完成。而它最有價值的產出,是一個把我原本假設推翻的負面結果

01原本要驗的假設,跟最後量到的東西

這一節是本專案的重點:假設錯了,但因為量得夠細,換來一個更強的題目。

原本的假設:LLM 讀心電圖時會編造 PR / QRS / QT 這些數值(幻覺)。這是一個很直覺、也很好賣的題目。

實測結果:在文字特徵輸入下,這件事幾乎不發生。四個模型在「要求給數字、而且沒有護欄」的寬鬆提示下,約 200 次回應裡零次捏造 PR / QRS / QT —— 它們回傳 null,或忠實地把給定的心率抄回來。

但幻覺確實存在,只是出現在另一個地方:多模態模型直接讀心電圖圖片時,73 張圖裡有 70 張報「心率 = 75」(真實範圍 39–158),等於把母體平均當答案吐出來。56% 的心率誤差超過 10 bpm、23% 超過 20 bpm。

貢獻因此從「假設 LLM 一定會編」變成「量出在哪一種輸入模式下、哪一種失效會主導」。這比原假設更可信,也更有用。

真正的問題是什麼

量完之後浮出來的核心問題不是準確率,而是校準(calibration):模型不只是會錯,而且在最危險的時候最讓人安心。所以需要的不是「更大的模型」,是一個外部的、與模型無關的可信度監測層 + 選擇性轉人工的閘門

02可靠度圖:過度自信長什麼樣子

對角線是完美校準。所有實測點都落在它下面,落差就是校準誤差。拉閘門門檻,看模型自報的信心能不能當把關依據。

03硬數字:全部來自那一晚實跑

模式 A = 把心電圖特徵文字化後餵給 LLM(嚴格提示,4 模型 × 150 筆)。

模型診斷正確率危險漏診(病理→判正常)校準誤差 ECE信心≥0.8 卻答錯信心→對錯 AUROC漏診時平均信心
qwen3.6-35B21.3%51.7%0.7178.7%0.52(≈隨機)0.92
llama3.1-8B15.3%45.0%0.6860.0%0.800.92
gemma4-12B27.3%65.8%0.6272.0%0.46(低於隨機)0.92
gpt-oss-120B(旗艦)20.7%43.3%0.6241.3%0.590.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。

04產線:一晚在終端機裡跑完的東西

沒有 GUI、沒有雲端推論、沒有病人資料離開這台電腦。

環節做法產物
資料PTB-XL 公開去識別資料集,21,799 筆 metadata + 5 類診斷 ground truthsrc/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 個 PMIDdocs/prior-art.md
三件套研究提案 / 專利草稿 / 落地設計docs/research-proposal.md 等三份

「親自逐一驗證引用」那一條特別重要:這是一個關於「幻覺」的專案,如果它自己的引用是幻覺,整個專案就沒有立場。所以每一個 arXiv ID 與 PMID 都用 API 重新拉回來核對過。

05自寫並自測統計層

護城河在統計層,不在提示詞。

src/anytime.py 實作了一個 anytime-valid 的信賴序列 —— 跟 SAVE 論文同一個家族的工具,用途是在連續監看模型表現時,任何時刻都能給出有效的可信度區間

自測結果:模擬覆蓋率誤差 ≤5%(符合名目),區間寬度比 Hoeffding 界緊約 2 倍。這一步是自己寫測試自己驗的,不是引用套件宣稱的性質。

為什麼要自己寫:因為這是這個題目的護城河。「又一個 ECG benchmark」是紅海;「與模型無關的 anytime-valid 監測層 + 轉人工閘門」是白地。而後者需要一個真的能跑、能測的統計核心,不是一段描述。

06刻意設下的誠實閘門

整晚自主執行最大的風險是「為了交差而把不成立的題目包裝好看」。

自己否證自己的賣點

原賣點

「LLM 會編造 ECG 的 interval 數值」——好懂、好講、好賣。

實測

在文字特徵輸入下,約 200 次無護欄回應中零次捏造。

處理

照實寫進執行摘要的第五個關鍵發現,並且據此把題目重新框定,而不是換一組提示詞去逼出想要的結果。

最終判定 GO,但題目要重新框定。重新框定之後反而更強、也更誠實:不要以「又一個 ECG benchmark」開場,要以「anytime-valid 監測層 + 選擇性轉人工」開場 —— 這跟那晚獨立跑的前人工作掃描給的建議完全一致。

07誠實限制

樣本數

150 筆波形、75 張圖。足夠支持「校準嚴重失效」這個量級的結論,不足以支持任何細分診斷類別的宣稱。

還沒寫成論文

目前的產出是執行摘要 + 研究提案 + 資料與程式碼,不是投稿等級的手稿。這是接下來的工作。

08產出物

~/Desktop/02-研究/ecg-trust/EXECUTIVE_SUMMARY.md
5 分鐘可讀完的判斷用摘要
…/src/(19 支 Python)
資料前處理、推論、評分、統計層、監測示範
…/results/spike_table.md + fig_*.png
全部數字與六張圖
…/docs/prior-art.md
六角度前人工作掃描,引用逐一 API 驗證過
…/docs/research-proposal.md / patent-draft.md / deployment.md
研究、專利、落地三件套

這個專案示範的是:一次自主執行如果沒有誠實閘門,最可能的產物是一份看起來很棒、但賣點不成立的報告。有了閘門,換來的是一個被資料重新指定過的、更硬的題目。

← Flagship Quarantine總覽Foresight →

PROJECT 10 · ECG-Trust