/DISC-MedLLM

Repository of DISC-MedLLM, it is a comprehensive solution that leverages Large Language Models (LLMs) to provide accurate and truthful medical response in end-to-end conversational healthcare services.

Primary LanguagePythonApache License 2.0Apache-2.0

DISC-MedLLM

Generic badge license

Demo | 技术报告
中文 | EN

DISC-MedLLM 是一个专门针对医疗健康对话式场景而设计的医疗领域大模型,由复旦大学数据智能与社会计算实验室 (Fudan-DISC) 开发并开源。

该项目包含下列开源资源:

您可以通过访问这个链接来试用我们的模型。

概述

DISC-MedLLM 是一个专为医疗健康对话场景而打造的领域大模型,它可以满足您的各种医疗保健需求,包括疾病问诊和治疗方案咨询等,为您提供高质量的健康支持服务。

DISC-MedLLM 有效地对齐了医疗场景下的人类偏好,弥合了通用语言模型输出与真实世界医疗对话之间的差距,这一点在实验结果中有所体现。

得益于我们以目标为导向的策略,以及基于真实医患对话数据和知识图谱,引入LLM in the loop 和 Human in the loop的多元数据构造机制,DISC-MedLLM 有以下几个特点:

  • 可靠丰富的专业知识,我们以医学知识图谱作为信息源,通过采样三元组,并使用通用大模型的语言能力进行对话样本的构造。
  • 多轮对话的问询能力,我们以真实咨询对话纪录作为信息源,使用大模型进行对话重建,构建过程中要求模型完全对齐对话中的医学信息。
  • 对齐人类偏好的回复,病人希望在咨询的过程中获得更丰富的支撑信息和背景知识,但人类医生的回答往往简练;我们通过人工筛选,构建符合人类偏好的高质量的小规模行为微调样本,对齐病人的需求。

<数据构造图> data-construction

模型效果演示

疾病问诊

sample1

治疗方案咨询

sample2

数据集

为了训练 DISC-MedLLM ,我们构建了一个高质量的数据集,命名为 DISC-Med-SFT,其中包含了超过47万个从现有的医疗数据集中蒸馏得到的样本。我们采用了目标导向的策略,通过对于精心选择的几个数据源进行重构来得到指令微调数据集。这些数据的作用在于帮助模型学习医疗领域知识,将行为模式与人类偏好对齐,并对齐真实世界在线医疗对话的分布情况。


数据集

数据来源

样本量
利用AI重构的医患对话 MedDialog 400k
cMedQA2 20k
知识图谱问答对 CMeKG 50k
行为偏好数据集 人为筛选 2k
其他 MedMCQA 8k
MOSS-SFT 33k
Alpaca-GPT4-zh 1k

下载

我们总共发布了近47万条训练数据,其中包括重新构建的对话和知识图谱问答对。您可以访问这个链接下载数据集。


部署

当前版本的 DISC-MedLLM 是基于Baichuan-13B-Base训练得到的。您可以直接从 Hugging Face 上下载我们的模型权重,或者根据下列代码样例中的方式自动获取。

首先,您需要安装项目的依赖环境。

pip install -r requirements.txt

利用Hugging Face的transformers模块来进行推理

>>> import torch
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> from transformers.generation.utils import GenerationConfig
>>> tokenizer = AutoTokenizer.from_pretrained("Flmc/DISC-MedLLM", use_fast=False, trust_remote_code=True)
>>> model = AutoModelForCausalLM.from_pretrained("Flmc/DISC-MedLLM", device_map="auto", torch_dtype=torch.float16, trust_remote_code=True)
>>> model.generation_config = GenerationConfig.from_pretrained("Flmc/DISC-MedLLM")
>>> messages = []
>>> messages.append({"role": "user", "content": "我感觉自己颈椎非常不舒服,每天睡醒都会头痛"})
>>> response = model.chat(tokenizer, messages)
>>> print(response)

运行命令行Demo

python cli_demo.py

运行网页版Demo

streamlit run web_demo.py --server.port 8888

此外,由于目前版本的 DISC-MedLLM 是以 Baichuan-13B 作为基座的,您可以参考 Baichuan-13B 项目的介绍来进行 int8 或 int4 量化推理部署。然而需要注意的是,使用模型量化可能会导致性能的下降。

对模型进行微调

您可以使用与我们的数据集结构相同的数据对我们的模型进行微调。我们的训练代码在 Firefly 的基础上进行了修改,使用了不同的数据结构和对话格式。这里我们只提供全参数微调的代码:

deepspeed --num_gpus={num_gpus} ./train/train.py --train_args_file ./train/train_args/sft.json

请在您在开始进行模型训练前检查 sft.json 中的设置。


如果您想使用其他训练代码来微调我们的模型,请使用如下对话格式。

<\b><$user_token>content<$assistant_token>content<\s><$user_token>content ...

我们使用的 user_tokenassistant_token 分别为 195 and 196,这和 Baichuan-13B-Chat 是相同的。

模型评测

我们从两个角度评估了模型的性能,包括检测其在单轮对话中提供准确答案的能力以及在多轮对话中进行系统性问诊的能力。

  • 在单轮对话评测中,我们构建了一个基准测试数据集,其中包含从两个公开医疗数据集中收集的多项选择题,并评估模型回答的准确性。
  • 对于多轮对话评测,我们首先构建了一些高质量的诊疗对话案例,然后让 GPT-3.5 扮演这些案例中的患者角色,并与扮演医生角色的模型进行对话。我们利用 GPT-4 来评估了模型的主动性准确性, 帮助性语言能力

您可以在 eval/ 目录下查看测试数据集、各个模型生成的对话结果以及 GPT-4 提供的打分结果。

单轮对话评测

我们在评测中选用了 MLEC-QA 和考研306(西医综合)的单项选择题。

Few-shot

模型 MLEC-QA 临床 MLEC-QA 中西医结合 MLEC-QA 公共卫生 MLEC-QA 口腔 MLEC-QA 中医 考研306西医综合 平均
GPT-3.5 58.63 45.9 53.51 51.52 43.47 44.81 49.64
Baichuan-13b-Chat 31.25 37.69 28.65 27.27 29.77 24.81 29.91
Huatuo(13B) 31.85 25 32.43 32.95 26.54 24.44 28.87
DISC-MedLLM 44.64 41.42 41.62 38.26 39.48 33.33 39.79

Zero-shot

模型 MLEC-QA 临床 MLEC-QA 中西医结合 MLEC-QA 公共卫生 MLEC-QA 口腔 MLEC-QA 中医 考研306西医综合 平均
GPT-3.5 47.32 33.96 48.11 39.77 38.83 33.33 40.22
Baichuan-13b-Chat 44.05 43.28 39.92 31.06 41.42 32.22 38.66
Huatuo(13B) 27.38 21.64 25.95 25.76 24.92 20.37 24.34
DISC-MedLLM 44.64 37.31 35.68 34.85 41.75 31.11 37.56

多轮对话能力评测

我们的评测基于三个不同的数据集:Chinese Medical Benchmark (CMB-Clin)、Chinese Medical Dialogue Dataset (CMD) 和 Chinese Medical Intent Dataset (CMID),其中 CMB-Clin 模拟了现实世界的问诊过程,而 CMD 和 CMID 则分别着重从科室专业性和用户意图的角度进行评估。

CMB-clin数据集的评测结果:

模型 主动性 准确性 帮助性 语言能力 平均
GPT3.5 4.30 4.53 4.55 5.00 4.60
GPT4 4.15 4.70 4.75 4.96 4.64
Baichuan-13b-Caht 4.30 4.58 4.73 4.95 4.64
BianQue-2 3.97 4.36 4.37 4.81 4.38
Huatuo(13B) 4.40 4.62 4.74 4.96 4.68
DISC-MedLLM 4.64 4.47 4.66 4.99 4.69

CMD数据集的评测结果

cmd

CMID数据集的评测结果

cmid

致谢

本项目基于如下开源项目展开,在此对相关项目和开发人员表示诚挚的感谢:

同样感谢其他限于篇幅未能列举的为本项目提供了重要帮助的工作。

声明

由于语言模型固有的局限性,我们无法保证 DISC-MedLLM 模型所生成的信息的准确性或可靠性。该模型仅为个人和学术团体的研究和测试而设计。我们敦促用户以批判性的眼光对模型输出的任何信息或医疗建议进行评估,并且强烈建议不要盲目信任此类信息结果。我们不对因使用该模型所引发的任何问题、风险或不良后果承担责任。

引用

如果我们的工作有帮助到您的研究,请引用我们:

@misc{bao2023discmedllm,
      title={DISC-MedLLM: Bridging General Large Language Models and Real-World Medical Consultation}, 
      author={Zhijie Bao and Wei Chen and Shengze Xiao and Kuang Ren and Jiaao Wu and Cheng Zhong and Jiajie Peng and Xuanjing Huang and Zhongyu Wei},
      year={2023},
      eprint={2308.14346},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}