ChatGLM-Med:基于中文医学知识的ChatGLM模型微调
HuaTuo:基于中文医学知识的LLaMA微调模型
ChatDoctor:基于常见医疗数据微调的LLaMA
目录
- ChatGLM-Med
- HuaTuo
- ChatDoctor
ChatGLM-Med
模型为ChatGLM-6B,微调数据集为:医学知识图谱结合GPT3.5构建的中文医学指令数据集。基于相同的数据,训练LLaMA得到HuaTuo。
ChatGLM-Med的环境与ChatGLM-6B的环境一致。采用了公开和自建的中文医学知识图谱,主要参考了cMeKG(https://github.com/king-yyf/CMeKG_tools)。 KG围绕疾病、药物、检查指标等构建,字段包括并发症,高危因素,组织学检查,临床症状,药物治疗,辅助治疗等。知识图谱示例如下:
{
"中心词": "偏头痛",
"相关疾病": ["妊娠合并偏头痛", "恶寒发热"],
"相关症状": ["皮肤变硬", "头部及眼后部疼痛并能听到连续不断的隆隆声", "晨起头痛加重"],
"所属科室": ["中西医结合科", "内科"],
"发病部位": ["头部"]
}
利用GPT3.5围绕医学知识库构建问答数据,设置了多种Prompt形式来充分利用知识。指令微调数据集示例为:
问题: "一位年轻男性长期使用可卡因,突然出现胸痛、呕吐、出汗等症状,经检查发现心电图反映心肌急性损伤,请问可能患的是什么疾病?治疗方式是什么?"
回答: "可能患的是心肌梗塞,需要进行维拉帕米、依普利酮、硝酸甘油、ß阻滞剂、吗啡等药物治疗,并进行溶栓治疗、低分子量肝素、钙通道阻滞剂等辅助治疗。此外需要及时停用可卡因等药物,以防止病情加重。"
ChatGLM-Med的微调步骤如下(支持使用自己的数据集在ChatGLM-6B上微调),这里使用的是上面展示的数据集,首先获取ChatGLM-Med项目:
$ git clone https://github.com/SCIR-HI/Med-ChatGLM
参照https://github.com/THUDM/ChatGLM-6B,将原始模型参数放入model目录下。然后就可以执行指令微调:
$ sh scripts/sft_medchat.sh
根据实际情况调整batch size等超参,默认为ChatGLM-Med使用的参数。训练显存建议选择32G及以上。
如果想用自己的数据集继续指令微调(Instruct-tuning)ChatGLM,需要构建与data目录中训练集类似的文件格式进行。可以参照ChatGLM-Instruct-Tuning(https://github.com/thinksoso/ChatGLM-Instruct-Tuning)。
这里直接下载ChatGLM-Med微调后的模型:https://drive.google.com/drive/folders/1ZQSN56DloRGQ-Qj7IwzY4jV3ZHKMe9Bc,在infer.py中修改模型路径:
import torch
from transformers import AutoTokenizer, AutoModel
from modeling_chatglm import ChatGLMForConditionalGeneration
tokenizer = AutoTokenizer.from_pretrained("/data/temp/ChatGLM-Med/", trust_remote_code=True)
model = ChatGLMForConditionalGeneration.from_pretrained("/data/temp/ChatGLM-Med").half().cuda()
while True:a = input("请输入您的问题:(输入q以退出)")if a.strip() == 'q':exit()response, history = model.chat(tokenizer, "问题:" + a.strip() + '\n答案:', max_length=256, history=[])print("回答:", response)
HuaTuo
首先获取项目:
$ git clone https://github.com/SCIR-HI/Huatuo-Llama-Med-Chinese
用ChatGLM-Med相同的数据,微调LLaMA-7B,此外,HuaTuo收集了2023年关于肝癌疾病的中文医学文献,利用GPT3.5围绕医学文献的【结论】构建多轮问答数据。在data_literature/liver_cancer.json中提供了其中的1k条训练样例:
[
{"instruction": " <user>: 我听说免疫疗法是治疗晚期肝癌的一种很有效的方法,真的吗? <bot>: 是的,免疫疗法是一种新兴的治疗方法,它可以提高人体免疫系统对癌细胞的反应能力。对于晚期肝癌患者,免疫疗法已证明具有很高的治疗效果。 <user>: 但是,这是否适用于所有的肝癌患者?",
"output": "不是所有的肝癌患者都适合进行免疫疗法。根据患者的临床表现和病情,医生会对患者进行评估,从而选择最适合的治疗方案。",
"input": ""},
...
{"instruction": " <user>: 你好,请问你知道大黄虫丸治疗原发性肝癌的作用机制吗? <bot>: 对于大黄虫丸在原发性肝癌治疗中的作用机制,目前还没有明确的研究结果。但是,根据一些与其成份相关的研究,大黄含有大黄素等成分,可通过调节肝细胞凋亡、增殖等方式抑制肿瘤细胞的生长和扩散,达到一定的治疗效果。 <user>: 那这项研究中观察组的总有效率为什么高于对照组呢? <bot>: 观察组使用了大黄虫丸辅助肝动脉栓塞术进行治疗,相对于对照组仅仅行肝动脉栓塞术,大黄虫丸可能通过增强治疗的综合效果,促进肝癌的消退和治愈。同时,大黄虫丸可能还能够增强肝细胞的代谢和排毒能力,从而改善肝功能指标。 <user>: 这项研究中肝功能指标的差异对患者的治疗效果有何影响?",
"output": "肝功能是评估患者病情和预后的重要指标,肝动脉栓塞术等治疗可能会对肝功能产生影响。观察组在治疗期间使用大黄虫丸进行辅助治疗,减轻了肝功能指标的恶化,可能对患者的长期预后产生积极的影响。",
"id": 924,
"input": ""}
直接获取已经训练好的LoRA权重:
$ git clone https://huggingface.co/thinksoso/lora-llama-med
上面是基于医学知识图谱构建指令再微调后的LoRA权重,还有基于医学文献的LoRA权重,基于医学文献的模型分为单轮或多轮脚本:
#基于医学知识库
$ bash ./scripts/infer.sh#基于医学文献
#单轮
$ bash ./scripts/infer-literature-single.sh#基于医学文献
#多轮
$ bash ./scripts/infer-literature-multi.sh
以基于医学知识库为例,修改 scripts/infer.sh 中的路径如下:
python infer.py \--base_model '/data/temp/llama-7b-hf' \--lora_weights '/data/temp/huatuo/lora-llama-med' \--use_lora True \--instruct_dir './data/infer.json' \--prompt_template 'med_template'
在基于医学知识图谱的HuaTuo微调指令数据集中,没有特别考虑多轮对话的history,所以,基于医学文献生成多轮对话数据后,能提高HuaTuo的多轮对话能力。
ChatDoctor
ChatDoctor是使用LLaMA模型并结合医学知识进行训练的医疗助手,研究人员先收集了50多万条真实医患对话,然后使用这些数据对LLaMA模型进行微调。用户只需描述症状,ChatDoctor就会像真人医生一样询问其他症状与体征,然后给出初步诊断和治疗建议。ChatDoctor是英文的医学问答LLM。
ChatDoctor微调数据集包括:
- 来自HealthCareMagic.com的10万例实际患者与医生之间的对话HealthCareMagic-100k(https://drive.google.com/file/d/1lyfqIwlLSClhgrCutWuEe_IACNq6XNUt/view)
- 来自icliniq.com的1万例实际患者与医生之间的对话icliniq-10k(https://drive.google.com/file/d/1ZKbqgYqWc7DJHs3N9TQYQVPdDQmZaClA/view)
- 5k例由ChatGPT生成的患者与医生之间的对话GenMedGPT-5k(https://drive.google.com/file/d/1nDTKZ3wZbZWTkFMBkxlamrzbNz0frugg/view)和疾病数据库(https://github.com/Kent0n-Li/ChatDoctor/blob/main/format_dataset.csv)
首先获取项目:
$ git clone https://github.com/Kent0n-Li/ChatDoctor
项目中提供了两种微调方式:一种是全量微调,一种是基于lora的微调,我们使用LoRA在HealthCareMagic-100k上微调,占用显存11GB:
python train_lora.py \--base_model '/data/temp/llama-7b-hf' \--data_path 'HealthCareMagic-100k.json' \--output_dir './lora_models/' \--batch_size 1 \--micro_batch_size 1 \--num_epochs 1 \--learning_rate 3e-5 \--cutoff_len 256 \--val_set_size 120 \--adapter_name lora
然后用微调后的模型进行推理:
$ python chat.py