CQL教育專區

CQL 架構與表達邏輯模型

臨床品質語言 (CQL) 是一種高階、特定領域的語言,專注於臨床品質,面向測量和決策支援工件作者。此語言還描述了一種機器可讀的規範表示,稱為表達邏輯模型(ELM),實際系統執行則是以ELM為主,旨在實現臨床知識的共享。透過工具,可以將CQL與ELM互相轉換,將複雜的邏輯轉換為可執行程式。


CQL 開發環境與工具

(1) 傳統開發CQL所需要的工具為Visual Studio Code。在VS Code環境下透過plugin的步驟安裝CQFramework Clinical Quality Landuage Extension,藉由此外掛程式,VS Code可執行CQL以及觀看ELM資訊。詳細資訊可參考:
https://github.com/cqframework/vscode-cql/wiki/User-Guide
https://github.com/cqframework/cqf-exercises

(2) Clinical Decision Support (CDS) Authoring Tool 是一個基於 Web 的應用程式,開發者可直接創作HL7標準之臨床質量語言(CQL)語句,而無需完全理解如何撰寫 CQL 之規範。
創作的基礎是使用廣泛類型(如 Condition)定義元素,並應用一個或多個值集和代碼來指定更具體的概念(如 Diabetes)。可以使用修飾符進一步細化這些元素,以指示特定狀態、最新值、與特定值的比較等。
CDS 創作工具是 CDS Connect 專案的一部分,由美國醫療保健研究和品質局 (AHRQ) 贊助開發。完整的使用及開發流程請參考下列連結資訊:https://cds.ahrq.gov/authoring/documentation
如果您有測試需求,請參考 : https://github.com/AHRQ-CDS/CQL-Testing-Framework

註 : 開始使用 CDS Authoring Tool 之前,必須先註冊兩個帳戶,CDS Authoring Tool 帳戶以及UMLS 術語服務帳戶。

(3) 透過生成式AI及大語言模型適當的訓練,未來也將有機會成為開發CQL的工具。

CQL-TOOL
(圖片來源:工研院整理製作)

CQL 結構範例


本範例以世界衛生組織 (WHO) 對於孕婦產前護理的建議(A2.1) :鐵和葉酸補充劑,進行說明。建議孕婦每日口服鐵和葉酸補充劑, 包含30 毫克至 60 毫克元素鐵和 400 微克(0.4 毫克)葉酸,以預防孕產婦貧血、產後敗血症、低出生體重和早產。
ECA規則(Event - Condition - Act):
每次接觸時,如果檢測到貧血,建議每天攝取 120 毫克元素鐵和 400 微克葉酸(建議 A.2.1),否則建議每天攝取 30 至 60 毫克元素鐵和 400 微克葉酸(建議 A.2.1)。

資料元素 :
貧血定義:
血紅素濃度 < 11 g/dL,孕齡 < 12 週 或 孕齡 > 28 週
血紅素濃度 < 10.5 g/dL,孕齡在 13 週至 27 週之間

為了表達上述計算,我們需要以下元素:
血紅素 (Hb) 濃度 (LOINC)
胎齡(週)
預計預產期(計算胎齡)
懷孕狀況 (LOINC)

以下說明CQL進行此計算之程式碼結構:
(1)宣告、引用函式庫與Valueset、codesystem設定

ANCA2-1
(圖片來源:工研院整理製作)

(2)資料元素與邏輯規則訂定義:

ANCA2-2
(圖片來源:工研院整理製作)

(3)決策及建議:

ANCA2-3
(圖片來源:工研院整理製作)

CQL 如何與 FHIR Resource 配合使用

納入條件:
患者年齡 >=35 歲且 <=70 歲且BMI >=25kg/m2 (最新值)
或 患者年齡 >=18 歲且 <35 歲且BMI >=25kg/m2 (最新值)且包含以下其中一項(糖尿病家族史、多囊性卵巢綜合症、種族 = 非裔美國人、種族 = 西班牙裔或拉丁裔)
或 患者年齡 >=18 歲且 <=70 歲且BMI >=23kg/m2(最新值)且種族 = 亞裔美國人
或 患者年齡 >=18 歲且 <=70 歲 妊娠糖尿病

排除條件:
懷孕
或過去 42 週內的妊娠觀察
或過去 12 個月患有糖尿病
或過去 12 個月內患有糖尿病前期(活動期、復發期)
或過去 12 個月內空腹血糖 (IFG) 受損(活躍、復發)
或過去 12 個月內糖耐量受損 (IGT)(活動性、復發性)
或血紅素 A1C 測試結果,過去 3 年內的最新值
或空腹血糖測試結果,過去 3 年內的最新數值
或葡萄糖耐受測試結果,過去 3 年內的最新值

應用程式分析JSON ELM用以確認需要哪些資料,然後向FHIR伺服器進行相應的查詢。從 EHR 檢索到必要的 FHIR 資料後,將使用它和JSON ELM呼叫 CQL 執行引擎庫,以計算結果。

需用的FHIR資源:
Patient Resource : 生日、性別、種族
Observation Resource : BMI (LOINC)
Condition Resource : 妊娠糖尿病、糖尿病前期、空腹血糖 (IFG) 受損、糖耐量受損 (IGT) … (SNOMED CT、ICD-10-CM)

diabete-1
(圖片來源:工研院整理製作)

diabete-2
(圖片來源:工研院整理製作)

於CQL中將同個概念但不同CodeSystem的碼進行聚合:
方法1.Concept for aggregating codes
方法2.建立ValueSet

diabete-3
(圖片來源:工研院整理製作)

diabete-4
(圖片來源:工研院整理製作)

定義簡單的品質測量

假設我們想定義一個品質測量標準,用於識別在過去一年中接受過 HbA1c 檢測的糖尿病患者。CQL 程式碼如下所示:


library DiabetesHbA1c version '1.0.0'

using FHIR version '4.0.1'

context Patient

define InInitialPopulation:
   exists (
      [Condition: "diabetes mellitus"] D
         where D.clinicalStatus.coding.code = 'active'
   )

define InDenominator:
   InInitialPopulation

define InNumerator:
   exists (
      [Observation: "HbA1c"] H
         where H.effectiveDateTime during Interval[start of "Measurement Period" - 1 year, end of "Measurement Period"]
   )

InInitialPopulation:此定義了主診斷為糖尿病的患者。
分母:分母包括初始人群中的所有患者。
InNumerator:分子包括在測量期間進行過 HbA1c 測試的患者。

品質指標建置

撰寫簡易eCQM

撰寫CQL

library mvp version '0.0.1'

using QICore version '4.1.1'
// using FHIR version '4.0.1'

include FHIRHelpers version '4.4.000' called FHIRHelpers
include SupplementalDataElements version '3.5.000' called SDE

codesystem "AdministrativeGender": 'http://terminology.hl7.org/CodeSystem/v3-AdministrativeGender'

code "Female": 'F' from "AdministrativeGender" display 'Female'


parameter "Measurement Period" default Interval[@2025-01-01, @2025-01-01)

context Patient

define "Initial Population":
    [Patient]

define "Denominator":
  "Initial Population"

define "Numerator":
  [Patient] P where P.gender = 'female'


git clone https://github.com/cqframework/ecqm-content-qicore-2025.git

2. 把剛剛寫的 CQL 放進 input/cql/

cql-file

3. 撰寫 Library 必要資訊

{
    "resourceType": "Library",
    "id": "mvp",
    "url": "http://ecqi.healthit.gov/ecqms/Library/mvp",
    "version": "0.0.1",
    "name": "mvp",
    "type": {
        "coding": [
            {
                "system": "http://terminology.hl7.org/CodeSystem/library-type",
                "code": "logic-library"
            }
        ]
    },
    "content": [
        {
            "id": "ig-loader-mvp.cql",
            "__comment__": "ig-loader-[cql file name]"
        }
    ]
}

4. 撰寫Measure

{
    "resourceType": "Measure",
    "id": "mvpMeasure",
    "url": "https://madie.cms.gov/Measure/mvpMeasure",
    "version": "Draft based on 0.2.000",
    "name": "mvpMeasure",
    "title": "mvp Measure",
    "status": "draft",
    "experimental": false,
    "date": "2025-03-31T03:01:34+00:00",
    "publisher": "TBD",
    "description": "TBD",
    "purpose": "UNKNOWN",
    "usage": "TBD",
    "copyright": "TBD",
    "effectivePeriod": {
        "start": "2025-01-01",
        "end": "2025-12-31"
    },
    "library": [
        "http://ecqi.healthit.gov/ecqms/Library/mvp"
    ],
    "disclaimer": "TBD",
    "####################": "scoring 區塊,定義計分方式",
    "scoring": {
        "coding": [
            {
                "system": "http://terminology.hl7.org/CodeSystem/measure-scoring",
                "code": "proportion",
                "display": "Proportion"
            }
        ]
    },
    "clinicalRecommendationStatement": "TBD",
    "guidance": "TBD",
    "####################": "group 區塊,定義population及分子分母",
    "group": [
        {
            "population": [
                {
                    "id": "initial-population",
                    "code": {
                        "coding": [
                            {
                                "system": "http://terminology.hl7.org/CodeSystem/measure-population",
                                "code": "initial-population",
                                "display": "Initial Population"
                            }
                        ]
                    },
                    "criteria": {
                        "language": "text/cql-identifier",
                        "expression": "Initial Population"
                    }
                },
                {
                    "id": "Denominator",
                    "code": {
                        "coding": [
                            {
                                "system": "http://terminology.hl7.org/CodeSystem/measure-population",
                                "code": "denominator",
                                "display": "Denominator"
                            }
                        ]
                    },
                    "criteria": {
                        "language": "text/cql-identifier",
                        "expression": "Denominator"
                    }
                },
                {
                    "id": "Numerator",
                    "code": {
                        "coding": [
                            {
                                "system": "http://terminology.hl7.org/CodeSystem/measure-population",
                                "code": "numerator",
                                "display": "Numerator"
                            }
                        ]
                    },
                    "criteria": {
                        "language": "text/cql-identifier",
                        "expression": "Numerator"
                    }
                }
            ]
        }
    ]
}

5. 安裝套件

./_updatePublisher.sh
./_updateCQFTooling.sh

install package

6. 更新 IG: ./_refresh.sh

refresh ig

7. 查看產生的bundle


bundle

8. 上傳bundle

curl --location 'https://cdsa.bdlai.net/fhir' --data '[Bundle JSON]'

9. 進行 Measure 評估

measure evaluate

撰寫簡易eCQM 個人

P11

撰寫簡易eCQM Summary(多人)

P12

臨床決策支援規則

創建一個臨床決策支持規則,以提醒臨床醫生糖尿病患者在過去一年中沒有進行 HbA1c 檢測。
CQL 程式碼如下:


library DiabetesHbA1cAlert version '1.0.0'

using FHIR version '4.0.1'

context Patient

define HasDiabetes:
   exists (      [Condition: "diabetes mellitus"] D         where D.clinicalStatus.coding.code = 'active'   )

define LastHbA1cTest:
   [Observation: "HbA1c"] H
      where H.effectiveDateTime during Interval[start of "Measurement Period" - 1 year, end of "Measurement Period"]
      sort by effectiveDateTime desc

define NoRecentHbA1cTest:
   HasDiabetes and not exists (LastHbA1cTest)

define Alert:
   if NoRecentHbA1cTest then
      'Patient has not had an HbA1c test in the past year. Consider ordering one.'

HasDiabetes:識別診斷為糖尿病的患者。
LastHbA1cTest:檢索過去一年內最近的 HbA1c 檢測。
NoRecentHbA1cTest:檢查糖尿病患者最近是否沒有進行 HbA1c 檢測。
警報:如果患者在過去一年中沒有進行過 HbA1c 測試,則生成警報。

CQL_CDS_Service
(圖片來源:HL7.org,工研院整理製作)