ChatGLM-Med,HuaTuo,ChatDoctor

ChatGLM-Med:基于中文医学知识的ChatGLM模型微调
HuaTuo:基于中文医学知识的LLaMA微调模型
ChatDoctor:基于常见医疗数据微调的LLaMA

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

fig1

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值