跳轉到

測試資料檔清單

這份文件記錄「從零重建整套系統」時實際用到的來源檔:每個檔案從哪裡來、放在哪裡、 餵給哪個模組。2026-07-14 的全清重建(docker compose down -vup -d --build → 重新匯入所有模組)就是照這份清單做的。

fhir-code/ 完全不在版控裡(檔案大、部分有授權限制、且全部可重新取得)。所以這份 清單就是那個資料夾唯一的紀錄——換機器時照著它把檔案補齊即可。專案自己整理、下載不到的 那兩個 LOINC 對照表則放在版控中的 data/loinc/(見下)。

檔案清單

放在 repo 根目錄的 fhir-code/ 底下。sha256 只列前 16 碼,用來確認拿到的是同一份檔案。

檔案 大小 sha256 (前16碼) 模組 / source_role
icd/10/icd10cm/icd10cm-table-index-2025.zip 20 MB 7e0fa0cae6348fb6 icd / icd10cm
icd/10/icd10pcs/icd10pcs_tables_2025.zip 648 KB 728d9b8f5c315548 icd / icd10pcs
icd/10/1.2023年中文版ICD-10-CM_PCS_1131118V3(…).xlsx 7 MB 1bf34d1f92930f29 icd / icd_zh_tw
loinc/2.80/Loinc_2.80.zip 74 MB 5a6b10dd6ed29704 loinc / loinc
snomed/SnomedCT_InternationalRF2_PRODUCTION_20250601T120000Z.zip 540 MB 3d6c189288e375d4 snomed / snomed_ct
rxnorm/RxNorm_full_06032024.zip 241 MB fc612ca0abee8955 rxnorm / rxnorm_full
twcoreig/v1.0.0/package.tgz 2.8 MB 2fa1419fa48d1545 ig / ig
(下載後才有)36_2.csv 44 MB drug / drug_index_csv

umls/umls-2024AA-metathesaurus-full.zip(4 GB)也在資料夾裡,但目前沒有任何匯入流程 用到它,重建時可以略過。

兩個在版控裡的 LOINC 對照表

data/loinc/taiwan_mapping.csv(loinc / loinc_taiwan_mapping)和 data/loinc/lab_reference_ranges.csv(loinc / loinc_reference_ranges)是專案自己整理的 (台灣檢驗代碼對應、各醫學中心參考值彙整),網路上下載不到,所以它們放在 data/ 底下、跟著 repo 走——不是 fhir-code/(那整個資料夾都不進版控)。loinc_import 需要這 兩個 role,記得跟 LOINC zip 一起上傳。

各檔案從哪裡來

ICD-10-CM / PCS 2025:CMS 官方年度釋出(https://www.cms.gov/medicare/coding-billing/icd-10-codes)。 中文名稱 XLSX 來自衛福部的中文版 ICD-10-CM/PCS 對照檔。

LOINC 2.80:Regenstrief Institute(https://loinc.org/downloads/),需註冊帳號後下載。

SNOMED CT International RF2:需有效授權(可經 NLM / UMLS 帳號取得); https://www.nlm.nih.gov/healthit/snomedct/。不可再散佈。

RxNorm Full Release:NLM,需 UMLS 帳號;https://www.nlm.nih.gov/research/umls/rxnorm/。 本專案只當作 concept-only 的參考術語(供 IG ValueSet 展開),不是獨立的藥品工具。

TW Core IG package.tgz:從 https://packages.fhir.org 取得 tw.gov.mohw.twcore。 匯入時會自動遞迴抓取相依套件(hl7.terminology、hl7.fhir.r4.core、 hl7.fhir.r4.examples…),最後 DB 裡會有 9 個 package、約 21,000 個 artifact——所以只需要 準備這一個 tgz。

TFDA 藥品許可證 36_2.csv:repo 裡沒有,也不必手動放進 fhir-code/,直接下載:

curl -L "https://data.fda.gov.tw/data/opendata/export/36/csv" -o drug36.zip
# 是一個 zip,裡面就是 36_2.csv(約 44 MB、71,921 列、UTF-8-BOM)

其他兩個看起來合理的網址(cacheData/36_2.csvcodedata/datadownload/36)都是 404。

保健食品與食品營養不需要來源檔health_supplements_sync / food_nutrition_sync 直接 打 TFDA Open Data API。臨床指引則由 guideline_seed 從 repo 內建資料播種。

重建步驟

設定(OCR / TFDA / registry 位址、LLM profiles、passkey)用 Settings 匯出檔還原:

curl -X POST localhost:8080/admin/api/settings/import \
     -H 'Content-Type: application/json' \
     --data-binary @tw-health-settings-YYYY-MM-DD.json

該匯出檔含 API key 與 passkey,不要進版控。自己留一份備份。

來源檔透過 Admin → Sources 上傳(或用 API;注意要帶 Content-Type: application/octet-stream, 否則 body 會被 express 的 4 MB parser 攔下):

curl -X POST "localhost:8080/admin/api/uploads?module_key=icd&source_role=icd10cm&filename=icd10cm-table-index-2025.zip&auto_activate=true" \
     -H 'Content-Type: application/octet-stream' \
     --data-binary @fhir-code/icd/10/icd10cm/icd10cm-table-index-2025.zip

接著依序排入 job:icd_importloinc_importsnomed_importrxnorm_importig_import(要帶 job_options.object_key,值是該來源檔的 MinIO object key)、 guideline_seedhealth_supplements_syncfood_nutrition_syncdrug_index_import

藥品 pipeline 會自動接續

drug_index_import 成功後會 auto-chain 出 drug_enrichment,再接 drug_analysis。 Enrichment 會去爬 TFDA 官方網站、Analysis 會呼叫 OCR + LLM,兩者都要花錢/花時間, 而且待處理的許可證有兩萬多筆。auto-chain 現在每批上限 200 筆 (DRUG_AUTOCHAIN_BATCH_LIMIT),會分批慢慢推進;不想跑就在 Jobs 頁面停掉它。 只想小規模驗證的話,自己排一個帶 {"limit": 30}drug_enrichment 即可。

這份清單對應的資料量

2026-07-14 全清重建後的實際結果,可以拿來核對匯入是否完整:

模組 筆數
ICD 46,498 診斷 + 78,948 處置
LOINC 104,672 concepts
SNOMED CT 373,972 concepts
RxNorm 222,199 concepts
FHIR IG 9 packages / 20,996 artifacts
藥品 66,395 張許可證
保健食品 565
食品營養 1,702
臨床指引 4

語意搜尋要另外跑 *_embed job(需要可連線的 Ollama)。沒有 embedding 時,中文關鍵字 搜尋幾乎搜不到東西——因為 Postgres 的 simple tokenizer 會把整串中文品名當成一個 token, 子字串比對不到。這不是 bug,是設計上就靠向量搜尋來補。