開源釋出 · Apache-2.0
護理師講「皮蛇」,指的是帶狀皰疹。健檢名冊上的「L-CT」是低劑量肺部電腦斷層,不是頭部。健檢單上的「鈣化」問的是冠狀動脈鈣化分數。「傷寒」通常是說糞便檢體還沒交回來,不是那個病。這些字每天出現在台灣的紀錄裡,而我們試過的通用模型幾乎都讀不出來。所以我們自己訓練了一個,取名 IlhaEmbed,然後用 Apache-2.0 放上 Hugging Face。它 38.5 MB,用 CPU 就能跑,推論的時候不連網——護理站那台舊電腦跑得動。
權重和完整的 model card(評測方法、限制、引用格式)在這裡:huggingface.co/weemed/IlhaEmbed
為什麼要做這件事
八年來我們在健檢中心、企業職場和社區站做同一件事:把別人手上的檔案,變成一筆可以用的健康紀錄。那些檔案長什麼樣子?一格裡寫「定期心內門診-戒菸」,其實是兩件事:心臟科還在追蹤,加上戒菸。「成健」是成人預防保健。「檳榔」在社會史那一欄,跟菸、酒同一級。
這些不是錯字,是台灣醫療現場真正在用的寫法。它們大量出現在每天產生的紀錄裡,卻幾乎不存在於公開的訓練資料裡。所以拿現成的模型來讀,讀不出來。
讀不出來的話,就只能讓人一格一格自己判斷。而人一格一格搬的時候,搬錯了不會有人發現——錯的那一格會安靜地變成病歷。
為什麼不用現成的
自己訓練模型很花時間,不是我們的第一選擇。我們先拿市面上表現最好的中文嵌入模型來測,測完發現三件事都不行,才決定自己養。
同一份題目、同一個檢索池、同一套算分方式:通用中文模型是 0.11 到 0.21,我們的是 0.856。「皮蛇→帶狀皰疹」這種題目,通用模型 0.00 到 0.05,等於完全沒讀到。
中文領域表現好的開源模型大多來自中國。台灣的公立醫院受關鍵基礎設施的資安規範,採購時看模型來源,而且沒有中間值:過或不過。我們的底座用 IBM Granite ModernBERT(Apache-2.0,美國來源),就是為了讓來源攤開來給人檢查。
另一個候選在我們的測試裡吃掉將近 8 GB 記憶體。跑不動的替代方案是把病歷送上雲端,這條路我們不走。條件只有一個:地端、CPU、不連網。最後做出來的模型 38.5 MB,384 維,量化到 int8。
同一份題目的正確率(訓練時已保留,自我匹配排除)
| 題型 | IlhaEmbed | jina-v2-base-zh | ckip-base | bge-small-zh |
|---|---|---|---|---|
| 俚語(皮蛇→帶狀皰疹) | 0.855 | 0.05 | 0.00 | 0.00 |
| 縮寫(L-CT→低劑量胸部電腦斷層) | 0.817 | 0.14 | 0.01 | 0.00 |
| 同位語(傷寒→傷寒篩檢糞便檢體) | 0.895 | 0.45 | 0.36 | 0.33 |
| 總分 | 0.856 | 0.21 | 0.13 | 0.11 |
| 台語(斷腦筋→中風) | 0.943 | 0.64 | 0.56 | 0.50 |
IlhaEmbed 這一欄是 fp32 的數字。實際放出去的 int8 版本總分 0.815、台語 0.929。評測腳本跟著 model card 一起公開,可以自己跑一次。
主權 AI 這件事
一句台語的話要變成一筆能被稽核的紀錄,中間要經過三段:聽懂它、把用字對回標準概念、存進國家的資料標準。台灣現在三段都有人做了,中間那段是我們補的。
Breeze-ASR-26
聽 — 聯發科研究院的語音模型,聽得懂台語和台灣口音
IlhaEmbed
懂 — 這一頁的模型,把現場的寫法對回標準概念
TW Core FHIR
存 — 衛福部的健康資料標準,紀錄才能交換、能稽核
底座是 IBM Granite ModernBERT(Apache-2.0,美國來源),整條路上沒有任何中國來源的元件。對受關鍵基礎設施規範的機構,這決定了能不能用。
38.5 MB、int8、只用 CPU。不需要 GPU,不需要 API key,推論的時候不連網。病人資料不必離開機構的機房。
權重是 Apache-2.0,底座也是。任何人——包括做同一件事的公司——都可以下載、修改、裝進自己的產品,不用問我們。
我們的做法是接衛福部的 TW Core FHIR。標準是公共財,接得上才有用。
就我們所知,這是第一個公開釋出的台灣臨床語意模型。希望它不是最後一個。
連失敗一起公開
要讓模型認得某一家機構自己的縮寫,直覺上就是拿那些字去微調。我們測完的結論是:這條路走不通,而且原因可以算出來。
把小模型量化到 int8,每個向量都會被擾動固定的量,我們量到的是 0.44。而要在一堆機構縮寫裡挑對,第一名和第二名的差距中位數只有 0.14。也就是說,模型是在自己的誤差裡面做選擇。把縮寫微調進權重,只會讓那個差距更小,誤差卻沒有變小——所以越調越差。我們試了 18 種組合(逐張量和逐通道的 int8、fp16、混合精度、權重內插、QAT、加了量化限制的 LoRA…),在可以部署的體積下沒有一種追得上全精度。
有用的做法是換個地方放這些知識:模型完全凍結,機構的詞彙表放在模型外面一份幾 KB 的對照表,進來的字先過一道門。夠像已知的字,就換成它的標準概念;不夠像,就原封不動走原本的路。所以加了這份對照表,原本會的題目不可能變錯。
我們把這件事記成一句話:量化之前,先量你的判斷餘裕有沒有大過量化的誤差。如果沒有,在權重上動手都救不了。這句話和所有走不通的嘗試,都寫在公開的研究紀錄裡。
同一個放出去的 int8 模型,加上對照表前後(110 個真實的機構縮寫)
| 只有模型 | 加上對照表 | |
|---|---|---|
| 機構縮寫(110 個) | 83/110 | 110/110 |
| 沒放進對照表的變體 | — | 20/22 |
| 一般臨床題目的總分 | 0.815 | 0.815(沒變) |
| 體積 | 38.5 MB | 38.5 MB + 幾 KB |
它不是 demo
IlhaEmbed 已經取代我們原本用的通用模型,包進系統的映像檔,在客戶自己的環境裡判斷匯入的檔案「這一欄到底在寫什麼」。
順序是刻意排的:先讓確定性的程式解掉絕大多數欄位,剩下的才交給模型,而且整批一次問完,不是每一欄問一次。真的判斷不出來的那幾欄才會拿去問人。人確認過一次之後就記住,同樣格式的檔案下一次連模型都不用問。
0.856
臨床語意總分,同一份題目通用中文模型最好 0.21
38.5 MB
int8 ONNX,384 維,CPU 就能跑
110/110
加上對照表後認出的機構縮寫
Apache-2.0
權重、方法、評測腳本、研究紀錄都公開
為了讀懂一句台灣的病歷,我們自己養了一顆模型。
記者、研究者、同業都可以直接拿:權重、完整的 model card、可以自己跑一次的評測腳本,還有包含失敗紀錄的研究日誌。訓練用的原始配對含第三方著作權,不隨權重釋出;我們放出去的是訓練完成的權重和方法。
引用格式
IlhaEmbed: An Open Embedding Model for Taiwanese Clinical Text. WeeMed AI, 2026. https://huggingface.co/weemed/IlhaEmbed