FHIR IG 服務模組 (FHIR IG Service)¶
模組概述¶
FHIR IG 服務模組是一套通用、以 IG 為範圍(IG-scoped)的工具集,建構於多 IG(multi-IG)的 fhir.* 資料儲存之上。它讓 LLM 能探索已安裝的 Implementation Guide、讀取剖面(StructureDefinition)與術語(ValueSet / CodeSystem)、進行術語驗證,並以「骨架填值」(skeleton-fill)方式產生與驗證符合剖面的 FHIR R4 資源。預設 IG 為 TWCore v1.0.0,但可安裝並切換多個 IG。
每個工具都可帶入選用的 package_id + version,回應採用共同信封:{ok, data, warnings, provenance, error?}。
目標套件的解析順序¶
未明確指定時,工具依下列優先順序決定要用哪個 IG 套件,並把結果寫在 provenance.resolved_by:
explicit_version:canonical 參數(或meta.profile)帶|version,且有已安裝套件持有該版本——不會悄悄改用其他版本;package_arg:呼叫端給了package_id(+version);latest:只給package_id未給版本時,取該套件最高的正式版;meta_profile:未給package_id時,改用持有該資源meta.profile的套件(驗證工具);canonical_owner:未給package_id時,改用持有 canonical 參數(profile / ValueSet / system)的套件;default_ig:預設 IG;sole_manual_ig:未設定預設 IG、且恰好只有一個手動安裝的 IG。
都不成立時回傳錯誤碼 NO_DEFAULT_IG(不會任意挑一個套件)。版本比較採 SemVer 2.0 precedence(-ballot、-snapshot1、-cibuild 等 FHIR 標籤視為 pre-release);|version 依 HL7 規則比對(精確版本,否則同 major.minor 中最高者,或萬用字元)。若套件宣告的相依套件未安裝,data.deps_missing 會列出;同一閉包中同一套件有多個版本時,provenance.closure_versions 會標示 canonical 查詢實際使用的版本。
工具分組¶
1. IG 探索¶
fhir_list_igs:列出已安裝的 IG 套件,含packageId、version、title、canonical、fhirVersion、status、isDefault與宣告的相依套件。多個 IG 並存時先用此工具挑選。fhir_get_ig:單一 IG 的詳情,含身分、相依與各資源型別的 artifact 數量。fhir_list_artifacts:以摘要列出 IG 的 conformance artifacts(StructureDefinition / ValueSet / CodeSystem / examples…),可依resource_type或grouping_id過濾。fhir_search_artifacts:以 id / canonical URL / name / title / description 全文搜尋 artifacts。- 上述列表 / 搜尋工具(含
fhir_list_resource_profiles)未給package_id時只看預設 IG;all_packages=true改為涵蓋所有已安裝套件;零筆結果時data.hint會指出哪些其他套件有符合項目。
2. 剖面選擇與讀取¶
fhir_list_resource_profiles:列出 IG 可選的資源剖面(constraint StructureDefinition),依其約束的基礎資源型別分組(例如Patient→Patient-twcore)。fhir_rank_resource_profiles:依你打算填入的來源欄位鍵(keys)與各剖面 element path 的吻合度,對候選剖面排名。此工具僅供建議,回應帶有selectionRequired:true,最終仍須自行挑選,不會自動對應。fhir_get_profile:單一剖面 / StructureDefinition 的摘要(身分、base definition、derivation、element 數)。可用 artifact id、canonical URL 或 artifact_key 解析;相依 IG 定義的 canonical 會遞移解析。fhir_get_profile_required_elements:列出剖面實際要求的所有元素(含必要祖先下的 min≥1、必要 slice、choice type、invariant 隱含的 value 或 dataAbsentReason,以及轉換目標隱含的主要內容),每列標示來源類別(auto/coding/source_fact/workflow_default)與填寫提示。verbosity=compact(預設)或full;可帶instance(草稿)讓已填的選用父節點連帶要求其子元素。撰寫資源前先呼叫,確保必填欄位齊全。fhir_get_profile_elements:讀取剖面 snapshot 的結構真相(cardinality、types、bindings、slicing、choice[x]、constraints)。同一工具提供多種view:elements、element、slices、choices、binding、examples。
3. 術語 / ValueSet¶
fhir_get_valueset:取得 ValueSet 定義摘要。fhir_expand_valueset:展開 ValueSet,列出實際成員碼。fhir_lookup_code:在指定 CodeSystem 中查詢單一碼的顯示名稱與屬性。fhir_validate_code:驗證某system+code是否屬於指定 ValueSet。fhir_normalize_code:以自由文字(例如「流行性感冒」)對照 ValueSet 或 code system,回傳排序後的候選碼;已安裝 IG 的 CodeSystem(例如健保支付碼)走 IG 術語搜尋 引擎。
4. 授權、組裝與驗證¶
fhir_get_resource_skeleton:依剖面產生「骨架」資源—僅含必填 / mustSupport 結構的空白草稿,供逐步填值。fhir_finalize_resource:將草稿(draft)依剖面定稿,補齊結構並回傳完整資源。fhir_resolve_reference:以暫時鍵(key)解析資源參照,供 Bundle 內互相連結。fhir_build_bundle:將多筆資源組裝為transaction/collection等型別的 Bundle。fhir_validate_resource:依meta.profile指定的剖面驗證單一資源(結構 + 術語綁定)。fhir_validate_bundle:驗證整個 Bundle(每個 entry 依其meta.profile,另檢查 Bundle 內參照完整性)。- 兩個驗證工具都回報驗證是否完整:
checked_fully、profiles_unchecked、valuesets_unchecked(valid的語意與 HL7 相同;有剖面或 ValueSet 無法檢查時會明確標出,而不是默默當作通過)。選用參數source_text/site_config/evidence_map會另外加上 grounding 檢查結果;不帶這些參數時輸出與未加 grounding 前完全相同。
5. 紀錄忠實度(grounding,確定性、不使用 LLM)¶
fhir_check_grounding:比對 Bundle 與來源病歷文字——每個已填的臨床事實與代碼都必須能在病歷中找到依據(evidence map 或自動定位),含日期 / 數值 / 單位 / 識別碼 / 劑量 / 頻次正規化,以及段落、否定與病史規則;問題以fhir_validate_bundle的格式回傳。fhir_check_completeness:缺口報告——比較轉換目標所需的事實(剖面必要 + 目標隱含元素)與病歷實際記載的內容,回傳缺漏項目、病歷中明確記載「無」的行、範本化的澄清問題,以及現成的insufficient_information物件。
source_text 屬於臨床資料,伺服器絕不記錄其內容(只記 SHA-256)。各工具的版本號由 node-server/src/toolVersions.ts 管理,可從 health_check 的 tools_version 取得。
技術架構¶
- 資料來源:FHIR IG 套件(
package.tgz),於管理後台 FHIR → IG 套件庫 從套件 registry 安裝或上傳 tgz(匯入階段ig_import)。套件宣告的相依 IG(如hl7.terminology.r4、hl7.fhir.r4.core)會自動從 FHIR registry 下載(預設https://packages.fhir.org,失敗時退到https://packages2.fhir.org;registry 位址可在 整合 → 外部服務 設定),各自以 package-scoped IG 索引,使跨系統的 ValueSet 綁定能展開出真實碼。registry 無法提供的相依套件才需要手動上傳。 - 安裝來源:
fhir.ig_packages.install_origin記錄套件是manual(管理者安裝)或dependency(為滿足其他 IG 的相依而下載),installed_for記錄是哪個 IG 拉進來的(migration20261019_ig_install_origin.sql);手動安裝的標記在重新匯入時保留。IG 套件庫會列出缺少的相依套件與無人使用的相依套件。 - 刪除保護:刪除其他已安裝 IG(直接或遞移)相依的套件,或刪除預設 IG,預設會被拒絕;必須指定新的預設 IG(
new_default)或明確force(記入稽核紀錄)。 - 資料庫:
fhirschema —ig_packages、codesystems、concepts、artifacts(皆 package-scoped,支援多 IG)。管理後台的 IG 詳情可瀏覽 IG 內 CodeSystem 的概念樹(/admin/api/terminology/ig/*)。 - 驗證引擎:以
fhirValidator.ts/fhirTerminology.ts/fhirSnapshot.ts/fhirReference.ts/fhirAuthoring.ts在程序內完成 snapshot 產生、術語綁定檢查、參照解析與骨架填值。判定規則以 HL7validator_cli7.0.1 + tx.fhir.org 為對照基準,並以 corpus 逐筆比對(稽核紀錄見node-server/scripts/validator-audit/REPORT.md)。離線術語:ICD-10-CM / WHO ICD-10(icd.*)、LOINC(含 LA/LP/LL/LG)、SNOMED CT(含 inactive 內容)、RxNorm、CVX(內建 287 碼,版本 20250715)、ISO 3166(內建,版本 2018)、UCUM(@lhncbc/ucum-lhc語法檢查,無法載入時標示 unchecked 而非判錯)。
授權工作流程(建議)¶
fhir_list_igs→(必要時)選定目標 IG。fhir_list_resource_profiles/fhir_rank_resource_profiles→ 挑選剖面。fhir_get_profile_elements(choices/binding/slices)→ 了解結構與術語約束。fhir_get_profile_required_elements→ 確認必填元素;fhir_get_resource_skeleton→ 取得骨架,逐步填入欄位(必要時用fhir_normalize_code/fhir_validate_code處理編碼)。fhir_finalize_resource→ 定稿;多筆資源以fhir_resolve_reference+fhir_build_bundle組裝。fhir_validate_resource/fhir_validate_bundle→ 驗證(有來源病歷時加source_text,或另呼叫fhir_check_grounding/fhir_check_completeness)。
關鍵限制¶
- 程序內驗證以剖面 snapshot 與術語綁定為基礎,雖以 HL7 validator_cli 7.0.1 為對照基準,仍不等同官方 HL7 FHIR Validator 的一致性認證。
- 工具僅提供建議與結構協助,剖面選擇與最終內容由呼叫端負責。
進階說明見 FHIR Authoring Walkthrough。