2025年10月版集成RagFlow和Dify的医疗知识库自动化查询(数据篇)
MySQL数据库设计
基于实体关系设计,采用以下SQL语句构建关系型数据库结构,包含主键、外键约束及索引优化:
-- MySQL 8.0+ 建议
-- 全局/库级:统一字符集与事务引擎
-- CREATE DATABASE med_kb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
-- USE med_kb;-- =====================================================================
-- 通用设置:简化审计字段 & 约束规范
-- =====================================================================-- 疾病表
CREATE TABLE diseases (disease_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL COMMENT '疾病名称(主称谓)',icd_code VARCHAR(50) UNIQUE COMMENT 'ICD-10编码(唯一)',description TEXT COMMENT '疾病描述',etiology TEXT COMMENT '病因',diagnostic_criteria TEXT COMMENT '诊断标准',-- 审计字段created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,-- 约束:名称不得为空白;ICD编码可空,但若不为空则需满足基础模式(A00.0 之类)CONSTRAINT chk_disease_name_not_blank CHECK (TRIM(name) <> ''),CONSTRAINT chk_icd_code_pattern CHECK (icd_code IS NULL OR icd_code REGEXP '^[A-TV-Z][0-9]{2}(\\.[0-9A-TV-Z]{1,4})?$'),-- 索引:名称检索、组合检索INDEX idx_disease_name (name),INDEX idx_disease_name_icd (name, icd_code),FULLTEXT INDEX ftx_disease_text (description, etiology, diagnostic_criteria)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='疾病主表';-- 症状表
CREATE TABLE symptoms (symptom_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL COMMENT '症状名称(主称谓)',description TEXT COMMENT '症状描述',body_system VARCHAR(100) COMMENT '所属系统(如Respiratory, Digestive)',created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,CONSTRAINT chk_symptom_name_not_blank CHECK (TRIM(name) <> ''),INDEX idx_symptom_name (name),INDEX idx_symptom_system (body_system),FULLTEXT INDEX ftx_symptom_text (description)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='症状主表';-- 疾病-症状 关联(多对多)
CREATE TABLE disease_symptom (disease_id INT NOT NULL,symptom_id INT NOT NULL,-- 结构化的强化属性,便于排序与推理(可选)association_strength TINYINT UNSIGNED DEFAULT 0 COMMENT '关联强度(0-100简化)',evidence_level VARCHAR(32) DEFAULT NULL COMMENT '证据等级(如A/B/C或高/中/低)',source VARCHAR(255) DEFAULT NULL COMMENT '来源(指南/文献/数据库)',last_reviewed DATE DEFAULT NULL COMMENT '最后审核日期',PRIMARY KEY (disease_id, symptom_id),CONSTRAINT fk_ds_disease FOREIGN KEY (disease_id)REFERENCES diseases(disease_id) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT fk_ds_symptom FOREIGN KEY (symptom_id)REFERENCES symptoms(symptom_id) ON DELETE CASCADE ON UPDATE CASCADE,-- 反向与筛选索引INDEX idx_ds_symptom (symptom_id),INDEX idx_ds_strength (association_strength)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='疾病-症状关联表';-- 药品表
CREATE TABLE medications (medication_id INT PRIMARY KEY AUTO_INCREMENT,generic_name VARCHAR(255) NOT NULL COMMENT '通用名称',brand_name VARCHAR(255) DEFAULT NULL COMMENT '商品名',ingredients TEXT COMMENT '主要成分',indications TEXT COMMENT '适应症(自由文本)',dosage TEXT COMMENT '用法用量',side_effects JSON COMMENT '副作用(JSON数组/对象)',created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,CONSTRAINT chk_med_generic_not_blank CHECK (TRIM(generic_name) <> ''),CONSTRAINT chk_side_effects_json CHECK (side_effects IS NULL OR JSON_VALID(side_effects)),-- 名称与检索索引UNIQUE KEY uk_med_generic_brand (generic_name, brand_name),INDEX idx_med_generic (generic_name),FULLTEXT INDEX ftx_med_text (ingredients, indications, dosage)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药品主表';-- 疾病-药品 关联(新增:多对多 + 关系类型)
CREATE TABLE disease_medication (disease_id INT NOT NULL,medication_id INT NOT NULL,relation_type ENUM('first_line','second_line','adjunct','contraindicated','other') DEFAULT 'other' COMMENT '用药关系/分层',notes TEXT COMMENT '备注/证据摘要',PRIMARY KEY (disease_id, medication_id),CONSTRAINT fk_dm_disease FOREIGN KEY (disease_id)REFERENCES diseases(disease_id) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT fk_dm_med FOREIGN KEY (medication_id)REFERENCES medications(medication_id) ON DELETE CASCADE ON UPDATE CASCADE,INDEX idx_dm_medication (medication_id),INDEX idx_dm_relation (relation_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='疾病-药品关联';-- 治疗方案表(将“方案-疾病”改为多对多,更贴合临床实际)
CREATE TABLE treatment_plans (plan_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL COMMENT '方案名称',steps JSON COMMENT '实施步骤(建议JSON结构化)',expected_effect TEXT COMMENT '预期效果',created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,CONSTRAINT chk_plan_name_not_blank CHECK (TRIM(name) <> ''),CONSTRAINT chk_steps_json CHECK (steps IS NULL OR JSON_VALID(steps)),INDEX idx_plan_name (name),FULLTEXT INDEX ftx_plan_text (expected_effect)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='治疗方案主表';-- 方案-疾病 关联(多对多)
CREATE TABLE treatment_plan_disease (plan_id INT NOT NULL,disease_id INT NOT NULL,PRIMARY KEY (plan_id, disease_id),CONSTRAINT fk_tpd_plan FOREIGN KEY (plan_id)REFERENCES treatment_plans(plan_id) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT fk_tpd_disease FOREIGN KEY (disease_id)REFERENCES diseases(disease_id) ON DELETE CASCADE ON UPDATE CASCADE,INDEX idx_tpd_disease (disease_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='治疗方案-疾病关联';-- 方案-药品 关联(可选:用于从方案直接引用药品清单)
CREATE TABLE treatment_plan_medication (plan_id INT NOT NULL,medication_id INT NOT NULL,usage_notes TEXT COMMENT '在该方案中的用法要点/注意事项',PRIMARY KEY (plan_id, medication_id),CONSTRAINT fk_tpm_plan FOREIGN KEY (plan_id)REFERENCES treatment_plans(plan_id) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT fk_tpm_med FOREIGN KEY (medication_id)REFERENCES medications(medication_id) ON DELETE CASCADE ON UPDATE CASCADE,INDEX idx_tpm_med (medication_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='治疗方案-药品关联';-- (可选)别名表:避免对主表name设置过于激进的唯一约束,同时支持同义词搜索
CREATE TABLE entity_aliases (alias_id INT PRIMARY KEY AUTO_INCREMENT,entity_type ENUM('disease','symptom','medication','treatment_plan') NOT NULL,entity_id INT NOT NULL,alias VARCHAR(255) NOT NULL,UNIQUE KEY uk_type_id_alias (entity_type, entity_id, alias),INDEX idx_alias (alias),CONSTRAINT chk_alias_not_blank CHECK (TRIM(alias) <> '')
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='实体别名/同义词';
JSON - LD语义化标记示例
为提升知识库的机器可读性与可解释性,采用JSON - LD标记实体及关系,示例如下:
{"@context": "https://schema.org","@type": "MedicalCondition","name": "2型糖尿病","icdCode": "E11","description": "一种慢性代谢疾病,特征为胰岛素抵抗或胰岛素分泌不足","symptoms": [{"@type": "MedicalSymptom","name": "多饮"},{"@type": "MedicalSymptom","name": "多尿"}],"possibleTreatment": [{"@type": "Drug","name": "二甲双胍","sideEffects": [[1]()][[1]()]}]
}
medications嵌套结构设计原因
在药品表(medications)中,将副作用(side_effects)设计为JSON嵌套结构(而非独立表),主要基于以下考量:
- 查询效率优化:副作用为药品的固有属性,嵌套存储可减少查询时的表关联操作,直接通过药品ID获取完整副作用信息;
- 数据关联性增强:副作用与药品为强关联的1对多关系,嵌套结构可确保数据完整性,避免因外键约束导致的删除异常;
- 灵活扩展:JSON格式支持动态添加副作用描述、发生率等属性,适应医疗知识的更新需求,无需频繁修改表结构。
设计要点总结:通过关系型数据库实现实体存储与关系映射,结合JSON - LD语义化标记提升可解释性,药品嵌套结构兼顾查询效率与数据关联性,为后续RagFlow和Dify的集成奠定标准化数据基础。
ETL流程实现与数据质量管控
本章节聚焦医疗知识库自动化更新的核心技术环节,通过Python脚本构建完整ETL链路,同步实现数据质量闭环管控与定时调度机制。在数据抽取阶段,采用Pandas库读取标准化医疗CSV数据集,通过pd.read_csv()
方法加载结构化数据,支持自定义分隔符与编码格式适配,确保电子病历、药品说明书等多源数据的兼容解析。数据清洗环节设计模块化函数集群,包含缺失值处理(如df.fillna()
填充临床默认值)、异常值检测(基于IQR法则识别超出正常范围的检验指标)及数据标准化(统一药品通用名称与ICD - 10编码格式),同步生成质量报告,量化呈现各字段缺失值占比(如“患者联系方式缺失率2.3%”)与异常值数量(如“血糖检测异常值17条”)。
数据加载阶段通过SQLAlchemy引擎建立与PostgreSQL数据库的高效连接,采用to_sql()
方法实现清洗后数据的批量写入,配置if_exists='append'
参数保障增量更新。为确保知识库时效性,通过crontab定时任务调度ETL脚本,典型配置如0 2 * * * /usr/bin/python3 /opt/etl/medical_etl.py
实现每日凌晨2点自动执行,配合日志监控模块实时捕获执行状态,形成“抽取 - 清洗 - 加载 - 质控 - 调度”的全链路自动化闭环。
核心技术栈:Python 3.12+(基础环境)、Pandas 1.5.3+(数据处理)、SQLAlchemy 2.0+(数据库交互)、PostgreSQL 14+(数据存储)。数据质量报告通过pandas_profiling
库生成,支持HTML格式导出,包含数据类型分布、缺失值热力图及异常值统计图表,为医疗数据治理提供可视化决策依据。
RagFlow与Dify核心集成
RagFlow自动化流程设计与节点开发
RagFlow 自动化流程设计以“疾病查询流程”为核心场景,通过节点模块化编排实现症状采集、智能分支与知识库查询的全流程闭环。以下为流程定义 JSON 示例,包含节点 ID、类型及依赖