一、前言
前面的章节我们对XGBoost和规则引擎都做了详细的说明,今天我们结合实例,分享一下“慢病智能筛查与风险预警”的构建经历,核心本质是将机器学习、规则引擎与大模型技术融合,应用于医疗慢病管理场景的智能化解决方案。核心目标是通过技术手段辅助人工,对患者健康数据进行自动化分析,快速、精准、合规地判定患者风险等级,是属于低、中、高哪一类,提前识别并发症隐患,为临床决策提供数据支撑。
在传统慢病筛查中,医生需要手动对照纸质评分表,如高血压高危人群筛查表,逐条核对患者指标后判定风险,存在效率低、易遗漏、主观性强等问题;而智能筛查系统通过“机器学习模型自动打分 + 规则引擎合规校验 + 大模型辅助解读”的模式,既保证了效率,又兼顾了准确性和合规性。
二、基础说明
1. XGBoost基础原理
要理解 XGBoost,首先要从“决策树”和“梯度提升”两个基础概念入手:
- 决策树:是一种简单的分类、回归模型,通过“if-else”逻辑对数据进行划分,比如“如果收缩压≥140mmHg,则进入高风险分支;否则进入低风险分支”。单棵决策树的预测能力有限,且容易过拟合。
- 梯度提升:是一种“集成学习”思路,先训练一棵基础决策树,然后训练第二棵树来修正第一棵树的误差,接着训练第三棵树修正前两棵的总误差,以此类推,最终将所有树的结果加权求和,得到最终预测结果。
XGBoost是“极端梯度提升”,相比传统梯度提升树,它做了两大优化:
- 1. 正则化:在损失函数中加入正则项,控制树的深度、叶子节点数,避免过拟合;
- 2. 并行化:在构建树的过程中支持特征并行,提升训练速度;
- 3. 缺失值处理:自动学习缺失值的最优分裂方向,无需手动填充缺失值,医疗数据中缺失值常见,这一特性尤为重要。
2. 规则引擎判别原理
2.1 规则引擎的核心组成
规则引擎本质是“数据输入→规则匹配→逻辑执行→结果输出”的闭环系统,核心组成包括:
- 1. 规则库:存储预定义的合规规则,比如高血压高危人群筛查规则、糖尿病风险评分规则,通常以“IF 条件 THEN 动作”的形式存储,比如“IF 收缩压≥160mmHg AND 舒张压≥100mmHg THEN 核心指标异常 + 1”;
- 2. 推理引擎:规则引擎的核心,负责将输入的患者数据与规则库中的规则进行匹配,执行逻辑判断;
- 3. 事实库:存储当前待判定的患者数据,这里可以理解为事实,比如“患者 A:收缩压 165mmHg,舒张压 105mmHg,无家族史”;
- 4. 执行器:根据推理引擎的匹配结果,执行对应的动作,比如“修正风险等级为高风险”、“输出合规判定依据”。
2.2 规则引擎的执行逻辑
以高血压高风险判定为例,规则库中预定义:“高风险 = 核心指标异常≥2 条”,核心指标包括:
- 指标 1:收缩压≥160mmHg 或 舒张压≥100mmHg;
- 指标 2:有高血压家族史;
- 指标 3:年龄≥65 岁;
- 指标 4:BMI≥28(肥胖)。
当XGBoost模型输“患者A为高风险”后,规则引擎的执行逻辑是:
- 1. 从事实库中提取患者A的指标:收缩压 155mmHg(指标1不满足)、有家族史(指标2满足)、年龄 68 岁(指标3满足)、BMI27(指标4不满足);
- 2. 统计核心指标异常数:2 条;
- 3. 匹配规则“高风险 = 核心指标异常≥2 条”,确认模型结果合规,输出最终高风险等级;
- 4. 若患者B的模型输出为高风险,但核心指标异常数仅1条,规则引擎会修正结果为中风险,并记录“修正原因:核心指标异常数不足 2 条,不符合国家高风险判定标准”。
3. 大模型应用原理
大模型的核心能力是自然语言理解和自然语言生成,在本系统中,它的应用原理可分为三类:
- 1. 非结构化数据处理:医疗数据中存在大量文本(病历、体检报告、医生诊断),大模型可通过理解能力提取结构化特征,比如从“患者近 1 个月反复头晕,收缩压最高 160mmHg”中提取 “头晕症状:是”、“收缩压峰值:160mmHg”;
- 2. 结果解读与生成:将模型、规则引擎的结构化输出,如“风险等级:高,异常指标:收缩压、家族史”,通过语言生成转化为自然语言,如“你的高血压风险等级为高风险,主要因收缩压偏高且有家族遗传史,建议每周监测血压并就诊心内科”;
- 3. 交互式问答:基于检索增强生成(RAG)技术,将患者数据、规则库、医疗知识库作为上下文,回答用户的问题,比如“为什么我的风险等级比上个月高?”、“高风险患者需要注意什么?”。
4. 核心组件的定位
4.1 XGBoost:风险打分的智能大脑
XGBoost(Extreme Gradient Boosting)是一种基于梯度提升树的集成学习算法,也是当前医疗风险预测场景中应用最广泛的模型之一。在我们的系统需求中,它的核心价值是:
- 从历史患者数据中学习特征与风险等级的关联规律,比如血压、血糖、年龄等指标如何共同影响高血压风险;
- 对新患者数据进行一键打分,输出初步的风险等级,初步判断是属于低、中、高哪一类;
- 相比传统的单一指标判定,能捕捉多特征间的非线性关系,比如“高血糖 + 肥胖”对糖尿病风险的叠加影响。
4.2 规则引擎:合规校验的安全闸
规则引擎是基于国家或地方慢病筛查标准预定义规则的逻辑判断系统,在本方案中它的核心作用是:
- 对 XGBoost 模型输出的风险结果做二次校验,确保符合国家规范,比如高风险患者必须满足≥2 条核心指标异常,若模型仅因1条指标判定高风险,规则引擎会修正结果;
- 解决机器学习模型黑箱问题,模型输出的风险等级可能无法解释,而规则引擎能提供合规的判定依据,比如“判定高风险的依据:收缩压≥160mmHg + 有家族高血压史”;
- 应对模型泛化性不足的问题,当模型遇到未见过的患者数据时,规则引擎可作为兜底方案,保证判定结果不偏离国家规范。
4.3 大模型:体验与解读的赋能器
大模型(如医疗专用大模型)在本方案中并非核心判定组件,但能显著提升系统的实用性和易用性,核心价值包括:
- 对模型、规则引擎的输出结果做自然语言解读,比如将“风险评分 85 分(高风险)”转化为“你的高血压风险等级为高风险,主要原因是收缩压持续高于 160mmHg 且伴有头晕症状,建议立即就医”;
- 自动生成患者风险报告,包含风险等级、判定依据、干预建议;
- 提供交互式咨询,比如用户问“我的风险等级为什么是中风险?”,大模型能结合数据和规则给出易懂的解释;
- 辅助特征工程,自动从非结构化数据中提取特征,比如从医生病历文本中提取“是否有吸烟史”、“是否有头晕症状”等关键信息。
5. 系统核心价值
该系统主要应用于基层医疗机构、慢病管理中心、社区卫生服务站等场景,核心价值体现在:
- 效率提升:人工筛查一名患者的风险等级约需 5-10 分钟,系统可在 10 秒内完成,且支持批量筛查;
- 准确性提升:结合机器学习的精准性和规则引擎的合规性,误判率比人工降低 60% 以上;
- 可追溯性:所有风险判定结果都有明确的依据,模型特征权重、规则引擎的判定条件,便于监管和复核;
- 早预警:能识别人工易遗漏的潜在风险,比如指标未达临界值,但多特征叠加已接近高风险,提前干预降低并发症概率。
三、执行流程
整个智能筛查与风险预警系统的执行流程可分为“离线训练”和“在线预测”两大阶段,具体流程:
1. 离线训练阶段
步骤 1:数据收集
核心是收集符合国家慢病筛查标准的历史患者数据,数据类型包括:
- 结构化数据:患者基本信息(年龄、性别)、体检指标(血压、血糖、血脂、BMI)、病史(家族史、既往病史)、风险等级标注(人工判定的低、中、高风险);
- 非结构化数据:病历文本、医生诊断记录、患者主诉,比如“经常头晕、乏力”。
数据质量要求:
- 样本量≥1000 条,保证模型泛化性,风险等级标注需符合国家规范,避免标注错误导致模型偏差,缺失值比例≤20%,过高需做缺失值处理。
步骤 2:特征工程
特征工程是XGBoost模型效果的核心,也是医疗数据处理的关键环节,具体操作:
- 1. 数据清洗:
- 处理缺失值:医疗数据中缺失值常见,比如部分患者未测 BMI,可采用“中位数填充”(数值型特征,如血压)、“众数填充”(类别型特征,如家族史)、“XGBoost 自动处理”(保留缺失值标记,让模型学习缺失值的影响);
- 处理异常值:比如血压值“300mmHg”明显是录入错误,需剔除或修正为合理范围;
- 数据标准化:对数值型特征(如血压、血糖)做归一化、标准化,避免特征量纲差异影响模型,比如血压单位是 mmHg,年龄单位是岁,量纲不同会导致模型侧重性偏差。
- 2. 特征提取:
- 基础特征:直接从结构化数据中提取,如年龄、性别、收缩压、舒张压、血糖、BMI、家族史;
- 衍生特征:基于业务逻辑生成,比如“血压是否超标”、“BMI 是否肥胖”、“是否有≥2 项核心指标异常”;
- 文本特征:大模型提取非结构化数据中的特征,比如从病历中提取“是否有头晕症状”、“是否吸烟”。
- 3. 特征筛选:
- 去除冗余特征,比如“收缩压”和“血压是否超标”高度相关,可保留其一;
- 用XGBoost的特征重要性排序,保留对风险等级影响最大的特征,比如收缩压、家族史、年龄是高血压风险的核心特征。
步骤 3:XGBoost模型训练
核心是通过训练数据让模型学习特征与风险等级的关联,具体操作:
- 1. 数据划分:将清洗后的数据集按 7:2:1 分为训练集(70%,模型训练)、验证集(20%,参数调优)、测试集(10%,效果评估);
- 2. 模型初始化:设置核心参数,基于医疗场景的经验值:
- max_depth:树的深度,建议 3-5,过深易过拟合,医疗数据特征少,无需过深;
- learning_rate:学习率,建议 0.1,控制每棵树的贡献度;
- n_estimators:树的数量,建议 100-200;
- objective:目标函数,分类场景用multi:softmax,多分类,低、中、高风险;
- eval_metric:评估指标,用mlogloss(多分类对数损失)+accuracy(准确率)。
- 3. 模型训练与调优:
- 用训练集训练模型,验证集监控效果;
- 用网格搜索、随机搜索调优参数,比如调整max_depth、learning_rate,提升验证集准确率;
- 模型评估:测试集上的准确率需≥85%,医疗场景对准确性要求高,同时关注召回率,比如高风险患者的召回率需≥90%,避免漏判。
步骤 4:规则引擎规则库构建
核心是将国家或地方慢病筛查标准转化为机器可执行的规则,以高血压筛查为例:
- 1. 规则梳理:从《国家高血压防治指南》中提取核心规则:
- 低风险:无核心指标异常,且无家族史、年龄 < 65 岁;
- 中风险:1 条核心指标异常,或年龄≥65 岁且无核心指标异常;
- 高风险:≥2 条核心指标异常,或 1 条核心指标异常 + 家族史。
- 核心指标:收缩压≥140mmHg、舒张压≥90mmHg、BMI≥28、空腹血糖≥6.1mmol/L。
- 2. 规则编码:将规则转化为规则引擎可识别的格式,比如 JSON、Drools 规则语言,示例:
{ "rule_id": "hypertension_high_risk", "rule_name": "高血压高风险判定规则", "condition": "core_abnormal_count >= 2 OR (core_abnormal_count == 1 AND family_history == '是')", "action": "risk_level = '高风险'", "description": "高风险判定需满足≥2条核心指标异常,或1条核心指标异常+有家族史" }
- 3. 规则测试:用已知风险等级的患者数据测试规则引擎,确保规则执行结果符合国家规范。
步骤 5:大模型知识库构建
核心是为大模型准备解读所需的知识,包括:
- 规则库文本:将机器规则转化为自然语言,比如 “高风险判定规则:≥2 条核心指标异常,或 1 条核心指标异常 + 有家族史”;
- 解读模板:预设不同风险等级的解读模板,比如高风险模板:“你的高血压风险等级为高风险,主要异常指标为 {异常指标},依据 {规则} 判定,建议 {干预措施}”;
- 医疗知识库:导入高血压、糖尿病的基础知识、干预建议,比如“高风险患者建议每周监测血压,低盐饮食,避免熬夜”。
2. 在线预测阶段
步骤 1:输入新患者数据
支持两种数据输入方式:
- 结构化数据:用户或医生填写的表单,包括年龄、性别、血压、血糖等;
- 非结构化数据:病历文本、患者主诉,比如“65 岁,男性,近 1 周头晕,测血压 160/100mmHg,父亲有高血压”。
步骤 2:大模型处理非结构化数据
核心是将文本转化为结构化特征,示例:
- 输入文本:“65 岁,男性,近 1 周头晕,测血压 160/100mmHg,父亲有高血压”;
- 大模型提取结果:
{ "age": 65, "gender": "男", "systolic_bp": 160, "diastolic_bp": 100, "family_history": "是", "symptom": "头晕" }
步骤 3:XGBoost 模型预测
将结构化特征输入训练好的 XGBoost 模型,输出:
- 初步风险等级:比如“高风险”;
- 风险评分:0-100 分,分数越高风险越高;
- 特征重要性:比如 “收缩压(权重 0.3)、家族史(权重 0.2)、年龄(权重 0.15)是判定的核心特征”。
步骤 4:规则引擎二次校验
核心是验证模型结果是否符合国家规则,示例:
- 模型输出:患者A为高风险;
- 规则引擎计算:核心指标异常数 = 2(收缩压 160≥140、舒张压 100≥90),满足高风险规则;
- 校验结果:合规,保留高风险等级;
- 若模型输出患者 B 为高风险,但核心指标异常数 = 1 且无家族史,规则引擎修正为中风险,并记录“修正原因:核心指标异常数不足2条,且无家族史,不符合高风险判定规则”。
步骤 5:大模型生成解读与报告
将最终风险等级、异常指标、规则依据输入大模型,生成:
- 1. 自然语言解读:
“你的高血压风险等级为高风险,判定依据:收缩压 160mmHg(≥140mmHg)、舒张压 100mmHg(≥90mmHg),共 2 条核心指标异常,符合《国家高血压防治指南》高风险判定标准。建议你立即前往心内科就诊,每周监测血压,低盐饮食,避免情绪激动。” - 2. 风险报告:包含患者基本信息、风险等级、异常指标、判定依据、干预建议、复查时间等。
步骤 6:输出结果
最终输出给用户或医生的内容包括:
- 风险等级:低、中、高;
- 风险报告,可下载 PDF;
- 自然语言解读为易懂的文字说明;
- 判定依据,规则引擎的规则匹配结果。
四、实例分析
1. XGBoost 模型训练
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder import xgboost as xgb # ---------------------- 1. 数据加载与预处理 ---------------------- # 模拟高血压患者数据(实际使用时替换为真实数据) data = pd.DataFrame({ 'age': [55, 68, 45, 70, 50, 62, 48, 75, 58, 65], 'gender': ['男', '女', '男', '女', '男', '女', '男', '女', '男', '女'], 'systolic_bp': [150, 160, 130, 170, 140, 155, 125, 165, 145, 160], # 收缩压 'diastolic_bp': [95, 100, 85, 105, 90, 98, 80, 102, 92, 100], # 舒张压 'bmi': [28, 29, 24, 30, 26, 28, 25, 31, 27, 29], 'family_history': ['是', '否', '否', '是', '否', '是', '否', '是', '否', '是'], 'risk_level': ['中风险', '高风险', '低风险', '高风险', '中风险', '高风险', '低风险', '高风险', '中风险', '高风险'] }) # 特征工程:处理类别特征 # 性别编码:男=1,女=0 le_gender = LabelEncoder() data['gender_encoded'] = le_gender.fit_transform(data['gender']) # 家族史编码:是=1,否=0 le_family = LabelEncoder() data['family_history_encoded'] = le_family.fit_transform(data['family_history']) # 衍生特征:核心指标异常数 def count_core_abnormal(row): count = 0 # 收缩压≥140mmHg 算异常 if row['systolic_bp'] >= 140: count += 1 # 舒张压≥90mmHg 算异常 if row['diastolic_bp'] >= 90: count += 1 # BMI≥28 算异常 if row['bmi'] >= 28: count += 1 return count data['core_abnormal_count'] = data.apply(count_core_abnormal, axis=1) # 风险等级编码:低风险=0,中风险=1,高风险=2 le_risk = LabelEncoder() data['risk_level_encoded'] = le_risk.fit_transform(data['risk_level']) # ---------------------- 2. 数据划分 ---------------------- # 特征列:选择核心特征 features = ['age', 'gender_encoded', 'systolic_bp', 'diastolic_bp', 'bmi', 'family_history_encoded', 'core_abnormal_count'] X = data[features] y = data['risk_level_encoded'] # 划分训练集(70%)、验证集(20%)、测试集(10%) X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42) X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=1/3, random_state=42) # ---------------------- 3. XGBoost模型训练 ---------------------- # 转换为DMatrix格式(XGBoost专用格式,提升效率) dtrain = xgb.DMatrix(X_train, label=y_train) dval = xgb.DMatrix(X_val, label=y_val) dtest = xgb.DMatrix(X_test, label=y_test) # 设置模型参数 params = { 'max_depth': 4, # 树的深度,医疗数据建议3-5 'learning_rate': 0.1, # 学习率 'n_estimators': 100, # 树的数量 'objective': 'multi:softmax', # 多分类(低/中/高风险) 'num_class': 3, # 类别数:3类(0/1/2) 'eval_metric': 'mlogloss', # 评估指标:多分类对数损失 'random_state': 42 # 随机种子,保证结果可复现 } # 训练模型 watchlist = [(dtrain, 'train'), (dval, 'val')] # 监控训练集和验证集效果 model = xgb.train(params, dtrain, num_boost_round=100, evals=watchlist, early_stopping_rounds=10) # ---------------------- 4. 模型评估 ---------------------- # 测试集预测 y_pred = model.predict(dtest) # 计算准确率 accuracy = np.mean(y_pred == y_test) print(f"测试集准确率:{accuracy:.2f}") # 特征重要性(查看哪些特征对风险判定最关键) importance = model.get_score(importance_type='weight') print("\n特征重要性:") for feat, score in sorted(importance.items(), key=lambda x: x[1], reverse=True): print(f"{feat}: {score}") # ---------------------- 5. 模型保存 ---------------------- model.save_model('hypertension_risk_model.model') print("\n模型已保存为:hypertension_risk_model.model")
代码说明:
- 1. 数据准备:模拟了10条高血压患者数据,实际使用时替换为真实数据,包含年龄、性别、血压、BMI、家族史、风险等级等核心字段;
- 2. 特征工程:
- 类别特征编码:模型只能处理数值,要将“男/女”、“是/否”“低/中/高风险”等文本特征转化为数值特征;
- 衍生特征:符合国家规则的核心指标数量,计算“核心指标异常数”,这是规则引擎校验的关键特征;
- 3. 模型训练:
- 采用 XGBoost 的multi:softmax多分类目标函数,适配低、中、高3类风险等级;
- 设置early_stopping_rounds=10,验证集效果10轮无提升则停止训练,避免过拟合;
- 输出特征重要性,可查看哪些特征对风险判定最关键,比如收缩压、核心指标异常数;
- 4. 模型保存:将训练好的模型保存为文件,方便在线预测时加载。
输出结果:
[0] train-mlogloss:1.03256 val-mlogloss:0.98087
[1] train-mlogloss:0.98270 val-mlogloss:0.95966
[2] train-mlogloss:0.93721 val-mlogloss:0.94164
[3] train-mlogloss:0.89562 val-mlogloss:0.92647
[4] train-mlogloss:0.85753 val-mlogloss:0.91385
[5] train-mlogloss:0.82257 val-mlogloss:0.90351
[6] train-mlogloss:0.79045 val-mlogloss:0.89520
[7] train-mlogloss:0.76088 val-mlogloss:0.88872
......
[21] train-mlogloss:0.55510 val-mlogloss:0.89560
[22] train-mlogloss:0.54837 val-mlogloss:0.90310
[23] train-mlogloss:0.54191 val-mlogloss:0.91082
[24] train-mlogloss:0.53572 val-mlogloss:0.91874
测试集准确率:1.00
特征重要性:
f0: 57.0
模型已保存为:hypertension_risk_model.model
2. 规则引擎实现
使用Python模拟规则引擎库实现高血压风险规则校验:
# ---------------------- 1. 定义事实(患者数据) ---------------------- class PatientFact: """患者事实类:存储患者的核心指标和模型预测结果""" def __init__(self, age, core_abnormal_count, family_history, model_risk_level): self.age = age # 年龄 self.core_abnormal_count = core_abnormal_count # 核心指标异常数 self.family_history = family_history # 家族史:True=有,False=无 self.model_risk_level = model_risk_level # 模型预测的风险等级:低/中/高 # ---------------------- 2. 规则引擎定义 ---------------------- class HypertensionRuleEngine: """高血压风险规则引擎:基于国家规范校验模型结果""" def evaluate(patient): """评估患者风险等级""" age = patient.age core_abnormal_count = patient.core_abnormal_count family_history = patient.family_history model_risk = patient.model_risk_level # 规则1:低风险判定规则 if (core_abnormal_count == 0 and not family_history and age < 65): final_risk = "低风险" reason = "无核心指标异常,无家族史,年龄<65岁" # 规则2:中风险判定规则 elif (core_abnormal_count == 1 or (age >= 65 and core_abnormal_count == 0)): final_risk = "中风险" reason = "1条核心指标异常,或年龄≥65岁且无核心指标异常" # 规则3:高风险判定规则 elif (core_abnormal_count >= 2 or (core_abnormal_count == 1 and family_history)): final_risk = "高风险" reason = "≥2条核心指标异常,或1条核心指标异常+有家族史" # 规则4:模型结果修正规则(模型结果与规则不符时) is_corrected = False corrected_reason = None if model_risk != final_risk: is_corrected = True corrected_reason = f"模型预测风险等级为{model_risk},但不符合国家规范,修正为{final_risk}" return { 'final_risk_level': final_risk, 'reason': reason, 'is_corrected': is_corrected, 'corrected_reason': corrected_reason } # ---------------------- 3. 规则引擎执行 ---------------------- def run_rule_engine(patient_data): """ 执行规则引擎校验 :param patient_data: 患者数据字典,包含age, core_abnormal_count, family_history, model_risk_level :return: 最终风险等级、判定依据、是否修正 """ # 创建患者事实对象 patient = PatientFact( age=patient_data['age'], core_abnormal_count=patient_data['core_abnormal_count'], family_history=patient_data['family_history'], model_risk_level=patient_data['model_risk_level'] ) # 执行规则评估 return HypertensionRuleEngine.evaluate(patient) # ---------------------- 4. 测试规则引擎 ---------------------- if __name__ == "__main__": # 测试案例1:模型预测高风险,规则引擎验证合规 patient1 = { 'age': 68, 'core_abnormal_count': 2, 'family_history': False, 'model_risk_level': '高风险' } result1 = run_rule_engine(patient1) print("测试案例1结果:") print(f"最终风险等级:{result1['final_risk_level']}") print(f"判定依据:{result1['reason']}") print(f"是否修正:{result1['is_corrected']}") # 测试案例2:模型预测高风险,规则引擎修正为中风险 patient2 = { 'age': 55, 'core_abnormal_count': 1, 'family_history': False, 'model_risk_level': '高风险' } result2 = run_rule_engine(patient2) print("\n测试案例2结果:") print(f"最终风险等级:{result2['final_risk_level']}") print(f"判定依据:{result2['reason']}") print(f"是否修正:{result2['is_corrected']}") print(f"修正原因:{result2['corrected_reason']}")
代码解释:
- 1. 事实定义:PatientFact类定义了规则引擎需要的患者数据,包括年龄、核心指标异常数、家族史、模型预测风险等级;
- 2. 规则定义:
- 低/中/高风险规则:严格按照国家高血压筛查标准定义;
- 修正规则:当模型结果与规则结果不符时,标记为“已修正”并记录原因;
- 3. 规则执行:run_rule_engine函数封装了规则引擎的执行逻辑,输入患者数据,输出最终风险等级、判定依据、是否修正;
- 4. 测试案例:
- 案例 1:模型预测高风险,规则引擎验证符合,核心指标异常数 = 2,输出高风险;
- 案例 2:模型预测高风险,但核心指标异常数 = 1 且无家族史,规则引擎修正为中风险,并记录修正原因。
输出结果:
测试案例1结果:
最终风险等级:高风险
判定依据:≥2条核心指标异常,或1条核心指标异常+有家族史
是否修正:False
测试案例2结果:
最终风险等级:中风险
判定依据:1条核心指标异常,或年龄≥65岁且无核心指标异常
是否修正:True
修正原因:模型预测风险等级为高风险,但不符合国家规范,修正为中风险
3. 大模型解读实现
以Qwen大模型API 为例,实现风险结果的自然语言解读:
import json import os import dashscope # ---------------------- 1. 配置大模型API ---------------------- # 从环境变量中获取 DASHSCOPE_API_KEY dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY', '') # ---------------------- 2. 大模型解读函数 ---------------------- def generate_risk_interpretation(risk_result, patient_info): """ 生成风险结果的自然语言解读 :param risk_result: 规则引擎输出的风险结果字典 :param patient_info: 患者基本信息字典 :return: 自然语言解读文本 """ # 构建提示词(Prompt):结合医疗规则和患者信息 prompt = f""" 你是一名专业的高血压慢病管理医生,需要根据以下信息为患者生成易懂的风险解读: 1. 患者基本信息: - 年龄:{patient_info['age']}岁 - 性别:{patient_info['gender']} - 收缩压:{patient_info['systolic_bp']}mmHg - 舒张压:{patient_info['diastolic_bp']}mmHg - BMI:{patient_info['bmi']} - 家族史:{'有' if patient_info['family_history'] else '无'} 2. 风险判定结果: - 最终风险等级:{risk_result['final_risk_level']} - 判定依据:{risk_result['reason']} - 是否修正:{'是' if risk_result['is_corrected'] else '否'} - 修正原因:{risk_result['corrected_reason'] if risk_result['is_corrected'] else '无'} 要求: 1. 语言通俗易懂,避免专业术语; 2. 先告知风险等级,再解释判定依据,最后给出针对性的干预建议; 3. 若有修正,需简要说明修正原因; 4. 建议具体可行(比如饮食、运动、监测频率); 5. 语气亲切,符合医疗沟通规范。 """ # 调用 Qwen API 生成解读 response = dashscope.Generation.call( model="qwen-turbo", # Qwen 轻量级模型 messages=[ {"role": "system", "content": "你是专业的慢病管理医生,擅长用通俗易懂的语言解释风险等级和干预建议。"}, {"role": "user", "content": prompt} ], result_format='message', temperature=0.3, # 温度越低,结果越稳定 max_tokens=500 # 最大生成字数 ) # 提取生成的文本 interpretation = response.output.choices[0].message.content.strip() return interpretation # ---------------------- 3. 测试大模型解读 ---------------------- if __name__ == "__main__": # 患者信息 patient_info = { 'age': 68, 'gender': '女', 'systolic_bp': 160, 'diastolic_bp': 100, 'bmi': 29, 'family_history': False } # 规则引擎输出结果 risk_result = { 'final_risk_level': '高风险', 'reason': '≥2条核心指标异常,或1条核心指标异常+有家族史', 'is_corrected': False, 'corrected_reason': None } # 生成解读 interpretation = generate_risk_interpretation(risk_result, patient_info) print("患者风险解读:") print(interpretation)
代码解释:
- 1. API 配置:需替换为自己的API Key;
- 2. 提示词设计:核心是将结构化的风险结果和患者信息转化为大模型能理解的提示词,明确输出要求,易懂、有建议、语气亲切;
- 3. 大模型调用:使用qwen大模型,成本合适、响应快,设置temperature=0.3保证结果稳定,避免生成离谱内容;
- 4. 输出结果:生成的解读文本通俗易懂,包含风险等级、判定依据、干预建议,符合医疗沟通规范。
输出结果:
患者风险解读:
首先,我要告诉您,根据您提供的信息,您的血压水平是偏高的,被判定为高风险。接下来,我会详细解释这个风险等 级的判定依据,并给您一些具体的干预建议。
### 风险等级解读
**高风险**:这意味着您在未来发生高血压相关并发症(如心脏病、中风等)的可能性相对较大。因此,需要特别关注 和管理您的血压水平。
### 判定依据
1. **收缩压和舒张压均异常**:您的收缩压(160mmHg)已经超过了正常范围(通常认为收缩压小于140mmHg才算正常),而舒张压(100mmHg)也高于正常范围(通常认为舒张压小于80mmHg才算正常)。这两项指标都显示出了高血压的特征。
2. **家族史无异常**:虽然您的家族史中没有高血压病史,但仅凭这一点还不足以完全排除高血压的风险。因为高血压的发生可能受到多种因素的影响,包括遗传、生活方式等。
### 干预建议
为了降低您的高血压风险,我建议您采取以下措施:
1. **饮食调整**:
- 减少盐的摄入量,尽量避免食用高盐食品,如腌制品、咸鱼等。
- 增加蔬菜、水果和全谷物的摄入量,这些食物富含钾、镁等有助于降低血压的营养素。
- 控制脂肪和胆固醇的摄入,选择低脂、低胆固醇的食物,如瘦肉、鱼、禽类等。
2. **增加运动**:
- 每周至少进行150分钟的中等强度有氧运动,如快走、游泳、骑自行车等。运动可以帮助降低血压、改善心血管健 康。
- 如果您身体状况允许,也可以尝试进行力量训练,以增强肌肉力量和耐力。
3. **监测血压**:
- 建议您在家中定期测量血压,至少每周测量一次。记录血压值可以帮助您更好地了解自己的血压状况,并及时调整生活方式或药物治疗。
4. **保持良好的生活习惯**:
- 戒烟限酒,避免过度劳累和精神紧张,保持充足的睡眠时间。
- 学会放松自己,可以尝试进行深呼吸、冥想等放松技巧来缓解压力。
总的来说,通过调整饮食、增加运动、监测血压以及保持良好的生活习惯,您可以有效地降低高血压的风险。如果您有 任何不适或疑虑,请及时就医咨询。
五、总结
基于慢病的智能筛查与风险预警系统,核心就是三件事:XGBoost 负责精准打分、规则引擎守住合规底线、大模型提升易用性,三者搭在一起,就能做出稳定、可落地、医生和患者都能用的慢病风险预警工具。简单说,XGBoost 从历史数据里学习规律,自动给新患者打出风险分,快速分出低、中、高风险,比人工更高效、更稳定。但模型毕竟是黑箱,所以必须配上规则引擎,严格按照国家慢病筛查标准做二次校验,确保风险等级不违规、不错判,该修正就修正,保证结果可信、可追溯。
再加上大模型,可以把病历文本转成结构化特征,把冰冷的分数和指标,翻译成普通人听得懂的风险解读,还能自动生成建议、回答疑问。我们应用过程中数据一定要干净、特征要贴合临床指标;规则必须紧跟国家指南;大模型尽量用本地或私有化部署,保护数据安全。