Intelligent_Disease_Diagnosis_System

561 downloads 0 likes on ModelScope updated

Model card

智能疾病问诊模块

模块简介

现有的医疗问答系统多聚焦于专业医学场景,如手术或医学影像(如 X 光片)等,对日常健康问题的支持较为薄弱;同时,通用 RAG 检索方法在医疗场景中容易出现“语义相似但无关”的误检,对下一步操作造成误导。

为此,我基于日常医疗场景构建中文医学知识库,并设计了集成多任务医学分类器 + 分层 RAG 回退机制 + RIAG微调生成模型的一体化疾病问诊模块,支持文本形式的医疗咨询。

该模块核心包含:

  • 分层 RAG 检索与回退机制: 我们训练了自定义医学分类器,预测用户提问所属的科室(category)与疾病(disease)标签,并结合预测置信度,执行两级过滤与回退检索策略,有效提升了问答的精确度与召回率。
  • RIAG 模型微调方法: 针对通用 ChatGLM 与 ChatGLM-Med 缺乏主动追问能力的问题,我设计了 RIAG 微调方法,引导模型在医疗对话中根据上下文主动追问,增强人机交互的专业性与实用性。
  • 模块融合与推理流程: 最终将多任务分类器、分层检索器与微调后生成模型整合为一体,支持真实世界下的”症状“输入,并输出专业、个性化的医疗建议。

该模块已在真实数据构建的测试集中取得良好效果,可作为日常健康问诊场景的通用基础能力。

亮点

智能疾病问诊具有以下亮点:

  • 自定义医学分类器设计

    基于 MacBERT 编码器,设计了端到端的多任务医学分类器,采用双线性解码头结构,同时预测科室(category)与具体疾病(disease),支持层级标签体系,一级分类准确率达到 99.4%,二级分类准确率达到89.5%,为高质量检索提供可靠保障。

  • 分层 RAG 检索与回退机制

    引入分类器置信度指导下的双层次过滤策略,仅在预测标签范围内进行文档检索,支持置信度不高时回退到 coarse-grained 类别,兼顾精准率与召回率,有效缓解传统 RAG 检索偏移或误召问题。

  • RIAG 微调策略增强模型交互性

    针对原始 ChatGLM/ChatGLM-Med 不具备主动追问能力的问题,设计逆向意图感知生成(Reverse Intention-Aware Generation, RIAG) 训练方案,使得模型能够像人类医生一样展开问诊式对话,主动追问关键信息,显著提升医疗问答的自然度与上下文理解能力。

模型效果验证与对比实验

为验证所提出 RIAG 微调方法在提升医疗问答质量方面的有效性,我在自建中文日常医疗问答数据集上,使用 Qwen-Max 模型作为 evaluator,从六个维度对四个系统回答进行评分(包括信息理解能力、追问合理性、逻辑连贯性、医学专业性、表达清晰度和整体表现),实验结果表明:系统在整体回答质量上较未微调模型平均得分提升超过 13%。

模型配置 平均得分
Answer 1 (Base GLM4) 7.68
Answer 2 (+ RIAG Prompt) 8.20
Answer 3 (+ Finetuning) 8.00
Answer 4 (Finetuning + RIAG) 8.71

下图展示了 Base GLM4 与不同增强策略下模型的六维性能对比:

快速体验

测试硬件信息:

  • OS: Ubuntu 22.04
  • Memory: 150GB
  • Storage: 100 GB
  • Python: 3.12
  • CUDA Version: 12.7
  • GPU: H20-NVLink(96GB) * 1
  • GPU Driver: 565.57.01
  • CPU: 16 vCPU AMD EPYC 9K84 96-Core Processor

安装依赖:

本项目建议使用 Python 3.12,建议使用虚拟环境或 Conda 环境进行安装

# 推荐使用 Conda 创建虚拟环境
conda create -n medqa python=3.12 -y
conda activate medqa

# 安装依赖
pip install -r requirements.txt

# 如果出现 faiss 或 torch 安装失败,请参考如下:
# conda install faiss-cpu -c conda-forge
# pip install torch==2.2.2+cu124 --index-url https://download.pytorch.org/whl/cu124

项目结构说明

.
├── bge-large-zh/                          # 中文语义向量模型(用于生成embedding)
├── ChineseDataRag/                        # RAG系统相关模块与分类器
│   ├── classifier/                        # 科室与疾病分类器
│   │   ├── chinese-macbert-large/         # 基础模型(MacBERT)
│   │   ├── checkpoints/                   # 分类器训练结果(best_model.pt)
│   │   ├── category_label_encoder.pkl     # 一级分类label映射
│   │   ├── disease_label_encoder.pkl      # 二级分类label映射
│   │   └── MedicalClassifier.py           # 分类器推理脚本
│   └── faiss_medical_db/                  # 医学知识向量库(FAISS)
├── Firefly
│   ├── intent_classifier
│   │   ├── intent_classifier.pt  			# 意图识别器模型
├── GLM4/                                  # 基于ChatGLM4的问答微调模块
│   ├── finetune
│   │   ├── data/		                     # 微调数据
│   ├── finetune
│   │   ├── output
│   │   │	├── checkpoint-1000/  			# LoRA 微调后模型参数
│   └── inference/                         # 推理脚本
├── project/                               # 项目主逻辑模块
│   ├── models/
│   │   ├── medical_qa.py                  # 医学问答主流程(调用模型+分类器+RAG)
│   │   └── rag_retriever.py              # 向量检索模块
│   └── app.py                             # 主程序入口(用于部署或测试)
├── ZhipuAI
│   ├── glm-4-9b-chat/                 		# 原始ChatGLM4模型权重目录
├── README.md                              # 项目说明文档
├── requirements.txt                       # 环境依赖文件

License 和引用

本项目基于 ChatGLM4 中glm-4-9b-chat模型构建。如果您在研究中使用了本项目,或本项目对您有帮助,请引用以下文献:

@misc{glm2024chatglm,
      title={ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools},
      author={Team GLM and Aohan Zeng and Bin Xu and Bowen Wang and Chenhui Zhang and Da Yin and Diego Rojas and Guanyu Feng and Hanlin Zhao and Hanyu Lai and Hao Yu and Hongning Wang and Jiadai Sun and Jiajie Zhang and Jiale Cheng and Jiayi Gui and Jie Tang and Jing Zhang and Juanzi Li and Lei Zhao and Lindong Wu and Lucen Zhong and Mingdao Liu and Minlie Huang and Peng Zhang and Qinkai Zheng and Rui Lu and Shuaiqi Duan and Shudan Zhang and Shulin Cao and Shuxun Yang and Weng Lam Tam and Wenyi Zhao and Xiao Liu and Xiao Xia and Xiaohan Zhang and Xiaotao Gu and Xin Lv and Xinghan Liu and Xinyi Liu and Xinyue Yang and Xixuan Song and Xunkai Zhang and Yifan An and Yifan Xu and Yilin Niu and Yuantao Yang and Yueyan Li and Yushi Bai and Yuxiao Dong and Zehan Qi and Zhaoyu Wang and Zhen Yang and Zhengxiao Du and Zhenyu Hou and Zihan Wang},
      year={2024},
      eprint={2406.12793},
      archivePrefix={arXiv},
      primaryClass={id='cs.CL' full_name='Computation and Language' is_active=True alt_name='cmp-lg' in_archive='cs' is_general=False description='Covers natural language processing. Roughly includes material in ACM Subject Class I.2.7. Note that work on artificial languages (programming languages, logics, formal systems) that does not explicitly address natural-language issues broadly construed (natural-language processing, computational linguistics, speech, text retrieval, etc.) is not appropriate for this area.'}
}

分类器部分基于MacBERT模型,如果本项目中的资源对您的研究有帮助,请引用以下论文。

@journal{cui-etal-2021-pretrain,
  title={Pre-Training with Whole Word Masking for Chinese BERT},
  author={Cui, Yiming and Che, Wanxiang and Liu, Ting and Qin, Bing and Yang, Ziqing},
  journal={IEEE Transactions on Audio, Speech and Language Processing},
  year={2021},
  url={https://ieeexplore.ieee.org/document/9599397},
  doi={10.1109/TASLP.2021.3124365},
 }

本项目中向量化模型采用 bge-large-zh 模型(由 BAAI 提供),用于语义编码与检索相关任务。

@misc{bge_embedding,
      title={C-Pack: Packaged Resources To Advance General Chinese Embedding}, 
      author={Shitao Xiao and Zheng Liu and Peitian Zhang and Niklas Muennighoff},
      year={2023},
      eprint={2309.07597},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}

本项目部分医学文本数据整理自腾讯医典公开资料和丁香医生,仅用于学术研究目的,不用于任何商业用途。

为评估RIAG-Finetune后模型问答能力,使用 Qwen-Max 模型 API 对模型输出在多个维度上进行了评估,涵盖信息准确性、逻辑性、表达清晰度等。

@article{Qwen-VL,
  title={Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond},
  author={Bai, Jinze and Bai, Shuai and Yang, Shusheng and Wang, Shijie and Tan, Sinan and Wang, Peng and Lin, Junyang and Zhou, Chang and Zhou, Jingren},
  journal={arXiv preprint arXiv:2308.12966},
  year={2023}
}