第一部分 各种医疗类ChatGPT:或中英文数据微调LLaMA、或中文数据微调ChatGLM
1.1 基于LLaMA微调的国内外医疗问答模型
1.1.1 ChatDoctor:通过self-instruct技术提示API的数据和医患对话数据集微调LLaMA
Github上有一个基于LLaMA模型的医疗微调模型:ChatDoctor『对应的论文为:ChatDoctor: A Medical Chat Model Fine-tuned on LLaMA Model using Medical Domain Knowledge』,该模型有2个主要亮点:
- 由于通用语言模型尚未适应医疗领域,导致响应的准确性差,无法就医疗诊断、药物等提供合理的建议
为解决这个问题,作者团队根据在线医疗咨询网站的10万真实世界的患者-医生对话,对LLaMA模型进行了微调,使得最终得到的ChatDoctor在了解患者需求和提供明智的建议方面有了显著改善 - 其次,ChatDoctor通过使用Wikipedia和medical-domain databases构建了一个外部知识库,扩展了模型的知识边界,使得ChatDoctor模型可以访问最新的和权威信息,并根据这些信息回答患者的问题,显著提高了模型响应的准确性 具体而言,通过维基百科或构建的涵盖700多种疾病的医疗数据库,ChatDoctor可以检索相应的知识和可靠来源,以更准确地回答患者的询问。在具体检索上,这通常可以通过构建适当的提示在大型语言模型中实现
首先,为了使这个过程自动化,为ChatDoctor设计了关键字挖掘提示,以提取相关知识寻求的关键术语 然后,使用术语匹配检索系统从知识大脑中检索排名靠前的相关段落。至于疾病数据库,由于模型无法同时读取所有数据,首先让模型批量读取数据,并为自己选择可能有助于回答患者问题的数据条目
最后,模型选择的所有数据条目都提供给模型以获得最终答案,更好地确保患者获得由可信参考资料支持的知情且准确的响应
实际微调时包括以下4个步骤
- 首先使用 Stanford Alpaca 提供的 52K instruction-following 数据训练了一个通用的对话模型
对于数据集构建这块,用的instruction, input, output的结构
instruction 可以是类似 '你现在的身份是医生,请以这个身份跟我对话'
input,output 就是问答对
————————————————
至于斯坦福团队微调LLaMA 7B所用的52K指令数据咋来的呢,
说来也有趣,它是通过Self-Instruct『Self-Instruct是来自华盛顿大学Yizhong Wang等22年12月通过这篇论文《SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions》提出的』提示GPT3的API拿到的
具体可以看下此文的2.1.1节:类ChatGPT模型LLaMA的解读与其微调:Alpaca-LoRA/Vicuna/BELLE - 在已有的疾病数据库 (包含大约 700 种疾病及其相关症状、医学检查和推荐药物 ) 的基础上,通过self-instruct的方式提示ChatGPT API生成的患者和医生之间的5K对话数据集GenMedGPT-5k (将疾病数据库中的每条消息提示 ChatGPT API 以自动生成指令数据,且对ChatGPT API的提示包含了疾病和症状、药物的标准),再次微调模型
数据格式继续用的instruction, input, output的结构,比如{ "instruction": "If you are a doctor, please answer the medical questions based on the patient's description.", "input": "Doctor, I have been experiencing sudden and frequent panic attacks. I don't know what to do.", "output": "Well, based on what you're telling me, it sounds like you may be suffering from panic disorder. The best course of action is to start with psychotherapy and mental health counseling. Additionally, we should conduct an electrocardiogram to make sure that there are no physical issues causing your panic attacks. We will also need to perform a depression screen and a toxicology screen to rule out any other underlying causes. Finally, I would recommend a comprehensive psychological and psychiatric evaluation and therapy to help manage your symptoms." }
- 通过HealthCareMagic-100k (来自在线问答的医疗咨询服务网站HealthCareMagic.com)的患者和医生之间的真实对话进行第三轮微调
本轮微调使用的 6 个 A*100 GPU 进行,持续时间为3小时 (The fine-tuning process on HealthCareMagic-100kwas conducted using 6 * A100 GPUs for a duration of 3 hours)
训练过程中使用的超参数如下:
总的batch size 192
学习率(learning rate)设为2e-5
总共3个epoch
最大序列长度512个token
warmup ratio 0.03
无权重衰减 - 通过icliniq-15k的患者和医生之间的真实对话进行第四轮微调
且为了定量评估ChatDoctor的性能,作者团队使用了iCliniq中的问题作为ChatDoctor的输入,然后使用iCliniq中对应的真实医生的答案作为ground truth,并将相同的输入给基于GPT3.5的ChatGPT并记录其响应
最终分别计算ChatDoctor和ChatGPT的后期精度、召回率和F1分数,经过结果对比,发现经过微调的ChatDoctor模型在Precision、召回率和F1方面优于ChatGPT (Comparing the results in Fig. 11, we find that the fine-tuned ChatDoctor modeloutperforms ChatGPT in Precision, Recall and F1, and some dialogue examplesare shown in the Fig)
当然,也有业内研究者基于BART-base,且利用他们自己公司的数据,微调出他们版本的ChatDoctor (截取自邓老师朋友圈)
1.1.2 哈工大华驼/本草:通过中文医学数据指令微调LLaMA
华驼模型仓库,是经过中文医学指令精调/指令微调(Instruct-tuning) 的LLaMA-7B模型(Llama-7B tuned with Chinese medical knowledge),这是其GitHub地址
- 该项目通过医学知识图谱和GPT3.5 API构建了中文医学指令数据集,并在此基础上对LLaMA进行了指令微调,提高了LLaMA在医疗领域的问答效果,且基于相同的数据,还训练了医疗版本的ChatGLM模型: ChatGLM-6B-Med(具体见下节)
- 此外,该团队还尝试利用GPT3.5 API将医学文献中的“结论”作为外部信息融入多轮对话中,在此基础上对LLaMA进行了指令微调
目前,只开放针对"肝癌"单个疾病训练的模型参数。在未来,该团队计划发布融入文献结论的医学对话数据集,并且会针对“肝胆胰”相关16种疾病训练模型
在数据集的构建上,
- 该团队采用了公开和自建的中文医学知识库,主要参考了cMeKG
医学知识库围绕疾病、药物、检查指标等构建,字段包括并发症,高危因素,组织学检查,临床症状,药物治疗,辅助治疗等
知识库示例如下:
{"中心词": "偏头痛", "相关疾病": ["妊娠合并偏头痛", "恶寒发热"], "相关症状": ["皮肤变硬", "头部及眼后部疼痛并能听到连续不断的隆隆声", "晨起头痛加重"], "所属科室": ["中西医结合科", "内科"], "发病部位": ["头部"]} - 我们利用GPT3.5接口围绕医学知识库构建问答数据,设置了多种Prompt形式来充分利用知识
指令微调的训练集数据示例如下:
"问题:一位年轻男性长期使用可卡因,突然出现胸痛、呕吐、出汗等症状,经检查发现心电图反映心肌急性损伤,请问可能患的是什么疾病?治疗方式是什么?"
回答: 可能患的是心肌梗塞,需要进行维拉帕米、依普利酮、硝酸甘油、ß阻滞剂、吗啡等药物治疗,并进行溶栓治疗、低分子量肝素、钙通道阻滞剂等辅助治疗。此外需要及时停用可卡因等药物,以防止病情加重。"
我们提供了模型的训练数据集,共计8000余条,需要注意的是,虽然训练集的构建融入了知识,但是仍存在错误和不完善的地方,后续我们会利用更好的策略迭代更新数据集
当然,指令微调数据集质量仍有限,后续将进行不断迭代,同时医学知识库和数据集构建代码还在整理中,整理完成将会发布 - 此外,我们收集了2023年关于肝癌疾病的中文医学文献,利用GPT3.5接口围绕医学文献多轮问答数据。在
./data_literature/liver_cancer.json
中我们提供了其中的1k条训练样例。当然,训练样本的质量仍然有限,据称后续会进一步迭代数据,会以公开数据集
的形式对外进行发布。训练样本的示例如下:
最后,我司杜老师写了一份微调部署的教程,见:基于ChatGLM-Med与HuaTuo的微调部署_dzysunshine的博客-CSDN博客
1.1.3 上海交大PMC-LLaMA:用480万篇生物医学论文微调LLaMA模型
上海交大用480万篇生物医学论文微调LLaMA模型(论文地址、代码地址),在QA上取得了很好的效果
其训练数据采用S2ORC数据集,从S2ORC[Lo et al., 2020]数据集的8110万篇英文学术论文开始 (S2ORC数据集地址:https://github.com/allenai/s2orc),用PubMed Central (PMC)-id进行过滤。结果,剩下大约490万篇论文,这些论文与医学知识高度相关,总计超过750亿token。
样例如下
{"paper_id": "77490025", "title": "State of external ocular muscles in strabismus of different duration", "authors": [{"first": "Pen'kov", "middle": [], "last": "Ma", "suffix": ""}, {"first": "Konstantinovskaia", "middle": [], "last": "Ke", "suffix": ""}, {"first": "Zhukova", "middle": [], "last": "Sv", "suffix": ""}], "abstract": null, "year": 1975, "arxiv_id": null, "acl_id": null, "pmc_id": null, "pubmed_id": null, "doi": null, "venue": null, "journal": "Oftalmologicheskii\u0306 zhurnal", "mag_id": "2426173123", "mag_field_of_study": ["Medicine"], "outbound_citations": [], "inbound_citations": [], "has_outbound_citations": false, "has_inbound_citations": false, "has_pdf_parse": false, "s2_url": "https://api.semanticscholar.org/CorpusID:77490025"}
{"paper_id": "77490084", "title": "Management of uterine fibromyoma", "authors": [{"first": "Landau", "middle": [], "last": "IaM", "suffix": ""}, {"first": "Karpushin", "middle": [], "last": "Vp", "suffix": ""}], "abstract": null, "year": 1972, "arxiv_id": null, "acl_id": null, "pmc_id": null, "pubmed_id": null, "doi": null, "venue": null, "journal": null, "mag_id": "2425602342", "mag_field_of_study": ["Medicine"], "outbound_citations": [], "inbound_citations": [], "has_outbound_citations": false, "has_inbound_citations": false, "has_pdf_parse": false, "s2_url": "https://api.semanticscholar.org/CorpusID:77490084"}
以下是该项目的几点结论
- PMC-LaMA-7B PEFT表现出比LLaMA-7B PEFT更好的性能,特别是在领域内数据集上,在USMLE上提高了1.22%,在MedMCQA上提高了1.96%,在PubMedQA上提高了2.42%。这些结果表明,原始的LLaMA只为医学质量保证提供了次优的嵌入空间,在生物医学语料库上进一步微调有利于模型领域的适应
- 无论训练设置是 "完全微调 "还是 "PEFT",PMC-LaMA-7B都能在USMLE ID测试中取得更好的结果
具体来说,在完全微调下,我们将ACC分数从35.66%提高到40.61%,在PEFT下,ACC分数从27.34%提高到28.52%。相当于无论是全量微调,还是lora微调,加了领域数据就是更好 - InstructGPT和chatGPT即使在zeroshot评估中也取得了很好的结果,但由于它们没有开源,也没有透露任何训练细节,因此无法保证评估数据是否被用于训练它们的模型,因此它们的结果在这里只能作为参考,而不应该被用来进行公平的比较
1.2 基于中文医学数据微调ChatGLM-6B
1.2.1 哈工大ChatGLM-Med: 基于中文医学知识的微调ChatGLM-6B
各项准备:数据集、环境、项目和模型文件
项目地址:GitHub - SCIR-HI/Med-ChatGLM: Repo for Chinese Medical ChatGLM 基于中文医学知识的ChatGLM指令微调
- 所用微调数据集:医学知识图谱和GPT3.5 API构建的中文医学指令数据集(参考自CMeKG数据集)
- 环境准备:因为该项目使用的是ChatGLM-6B模型,因此环境也与ChatGLM-6B模型的环境一致
- 文件准备:将项目和模型文件下载下来
模型文件下载:git clone https://github.com/SCIR-HI/Med-ChatGLM.git
该项目已经提供了训练微调好的模型参数,直接通过百度云盘链接或Google云盘链接下载即可
我这里将模型文件下载到 /data/sim_chatgpt/ChatGLM-Med/ 下
修改 infer.py 文件中的文件加载路径,如下:import torch from transformers import AutoTokenizer, AutoModel from modeling_chatglm import ChatGLMForConditionalGeneration tokenizer = AutoTokenizer.from_pretrained( "/data/sim_chatgpt/ChatGLM-Med/", trust_remote_code=True) model = ChatGLMForConditionalGeneration.from_pretrained( "/data/sim_chatgpt/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)
推理过程
python infer.py
如果运行出错
修改 modeling_chatglm.py 文件的831行,975行,如下:
MASK, gMASK = 150000, 150001
修改后即可成功运行
微调过程
安装evaluate包
pip install evaluate
pip install wandb
修改要运行文件中的model_name_or_path,修改为 /data/sim_chatgpt/chatglm-6b,如下:
vi scripts/sft_medchat.sh
wandb online
exp_tag="chatglm_tuning"
python run_clm.py \
--model_name_or_path /data/sim_chatgpt/chatglm-6b \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 8 \
--train_file ./data/train.txt \
--max_seq_length 256 \
--output_dir ./output/ \
--do_train \
--logging_steps 30 \
--log_file ./log/$exp_tag \
--gradient_accumulation_steps 2 \
--learning_rate 5e-5 \
--group_by_length False \
--num_train_epochs 3 \
--lr_scheduler_type linear \
--warmup_ratio 0.1 \
--logging_dir ./log \
--logging_steps 10 \
--save_strategy epoch \
--seed 2023 \
--remove_unused_columns False \
--torch_dtype auto \
--adam_epsilon 1e-3 \
--report_to wandb \
--run_name $exp_tag
执行命令
sh scripts/sft_medchat.sh
尝试调小batch_size,将per_device_train_batch_size改为1试下,仍然cuda of memory,后面再想下别的办法
官方是在一张A100-SXM-80GB显卡上进行了微调训练,根据经验,训练显存建议选择32G及以上
1.2.2 DoctorGLM:基于 ChatGLM-6B的中文问诊模型
项目地址:https://github.com/xionghonglin/DoctorGLM
1、训练数据
训练数据使用CMD.、MedDialog、ChatDoctor、以及HearlthcareMagic
Dataset | Department | Language | Q&A | Chat | Number | Syn. | Size | Weight |
---|---|---|---|---|---|---|---|---|
CMD. | Surgical | CN | ✔ | × | 116K | × | 52MB | |
Obstetrics and Gynecology | CN | ✔ | × | 229K | × | 78MB | ||
Pediatrics | CN | ✔ | × | 117K | × | 47MB | ||
Internal Medicine | CN | ✔ | × | 307K | × | 102MB | ||
Andriatria | CN | ✔ | × | 113K | × | 44MB | ||
Merged | CN | ✔ | × | 1.9M | × | Doctor_GLM/ckpt | ||
MedDialog | Multiple | CN&EN | ✔ | ✔ | 3.4M | × | 1.5GB | ptuning_weight |
ChatDoctor | Multiple | EN | ✔ | × | 5.4K | ✔ | 2.9MB | Coming soon |
HearlthcareMagic | Multiple | EN | ✔ | × | 200K | × | 216MB | Coming soon |
其中,Chinese medical dialogue data 中文医疗对话数据集:https://github.com/Toyhom/Chinese-medical-dialogue-data
数据包括:
- <Andriatria_男科> 94596个问答对
- <IM_内科> 220606个问答对
- <OAGD_妇产科> 183751个问答对
- <Oncology_肿瘤科> 75553个问答对
- <Pediatric_儿科> 101602个问答对
- <Surgical_外科> 115991个问答对
总计 792099个问答对
2、模型效果
1)chatglm效果
"0": {
"question": "近一个多月来,本人两肋、前胸包括胸口及两旁、后背两边、脊椎骨上段、包括扇子骨等处,就是上半身,发生不适隐痛,上半身很纠结,好像里面有手揪住一样,不舒展爽朗,十分难受,一会儿前胸和两肋不适难受,一会儿后背两边不适难受,同时发生隐痛。扭动身体,做做伸展活动,或者用拳头抵住揉搓不适隐痛处,身体就会舒展一些好受一些。总的来说就是上半身有肋骨的地方和上半段脊椎骨范围内发生不适和隐痛,一般同时两三个隐痛点,就是肋骨最下段的骨梢也发生不适隐痛。没有肋骨地方不痛,如肚子处就不隐痛。本人于2011年11月做了胆囊摘除和胆总管结石手术。不是腹腔镜,是开了一条约18公分的大口子和两个导流小洞。此种不适难受隐痛情况2012年春天发生过一次,时间不长自动好了。但这次严重时间又长,不适和隐痛感觉有时呈块状,有时呈条状,一般同时有两三处不适隐痛,让人很难受,还有越来越重的感觉。",
"response": "所述症状可能是由多种原因引起的,包括身体、心理和情绪等方面。根据所述症状,建议进行以下检查和测试:\n\n1. 医生体检:进行全面的身体检查,包括心肺听诊、血压测试、视力、听力、皮肤测试等,以确定任何潜在的健康问题。\n\n2. 心电图(EKG):测试心脏健康,评估是否有潜在的心脏问题。\n\n3. 核磁共振(MRI):测试骨骼和肌肉系统的健康,以及评估是否有潜在的神经问题。\n\n4. 血液检查:测试贫血、感染、肿瘤等问题。\n\n5. 心理健康测试:测试情绪和心理健康,例如压力测试、焦虑测试等。\n\n如果症状持续存在或变得更加严重,请尽快咨询医生以获取专业建议和治疗。"
},
"1": {
"question": "有糖尿病需要节制性生活吗",
"response": "有糖尿病的人需要节制性生活,因为糖尿病是一种代谢性疾病,会影响身体对葡萄糖的吸收和利用。如果性生活过于频繁或过于剧烈,可能会加重身体的糖分负担,导致血糖升高,甚至可能对心脏、肾脏等重要器官造成伤害。\n\n所以有糖尿病的人需要适度地控制自己的性生活。建议每周的性生活次数在1-2次之间,并且尽量选择在空腹或血糖控制较好的状态下进行。此外,糖尿病患者还应该注意保护自己的生殖健康,避免使用药物或酒精等因素对血糖的影响,并定期进行生殖系统的体检和清洁。\n\n如果有糖尿病,需要根据医生的建议来节制性生活,并遵循医生的建议来管理自己的血糖水平。"
},
"2": {
"question": "我爷爷高血压可以喝咖啡吗",
"response": "高血压和喝咖啡之间关系不确定。高血压可能是由多种因素引起的,包括遗传、生活方式、饮食、药物等。喝咖啡本身也可能对血压产生影响,但具体情况取决于个体。\n\n建议咨询医生或心血管专家,了解爷爷的高血压是否与喝咖啡有关,并听从专业建议。同时,可以尝试控制高血压的生活方式,如减少钠的摄入、保持足够的运动和睡眠、避免吸烟和饮酒等。"
},
2)DoctorGLM效果
"0": {
"question": "近一个多月来,本人两肋、前胸包括胸口及两旁、后背两边、脊椎骨上段、包括扇子骨等处,就是上半身,发生不适隐痛,上半身很纠结,好像里面有手揪住一样,不舒展爽朗,十分难受,一会儿前胸和两肋不适难受,一会儿后背两边不适难受,同时发生隐痛。扭动身体,做做伸展活动,或者用拳头抵住揉搓不适隐痛处,身体就会舒展一些好受一些。总的来说就是上半身有肋骨的地方和上半段脊椎骨范围内发生不适和隐痛,一般同时两三个隐痛点,就是肋骨最下段的骨梢也发生不适隐痛。没有肋骨地方不痛,如肚子处就不隐痛。本人于2011年11月做了胆囊摘除和胆总管结石手术。不是腹腔镜,是开了一条约18公分的大口子和两个导流小洞。此种不适难受隐痛情况2012年春天发生过一次,时间不长自动好了。但这次严重时间又长,不适和隐痛感觉有时呈块状,有时呈条状,一般同时有两三处不适隐痛,让人很难受,还有越来越重的感觉。",
"response": "病情分析:您好,这种情况考虑是肋间神经炎引起的疼痛\n指导意见:建议口服消炎药,止痛药,维生素B族,按疗程治疗,疼痛缓解后,练习抬胸运动,可缓解疼痛,除了正规治疗胆石症外,患者需要多咨询专家建议,和医生保持沟通,患者还需要重视护理方面,例如合理饮食,保持心情愉快与此同时患者还要注意选择一家专业医院诊治,这样才能得到良好的治疗效果"
},
"1": {
"question": "有糖尿病需要节制性生活吗",
"response": "糖尿病对性生活没有影响的,但是需要控制饮食和注意运动,饮食要均衡,可以多吃蔬菜,水果,低糖水果如香蕉,葡萄,西瓜等,戒烟酒,生活规律,注意休息,避免劳累和熬夜,避免剧烈运动,定期复查血糖,如果有血糖控制不好的情况建议去医院查查血糖。"
},
"2": {
"question": "我爷爷高血压可以喝咖啡吗",
"response": "高血压可以喝咖啡,但不宜喝太多,最好每天不超过3杯\n高血压是常见的心血管疾病,如果高血压长期得不到控制,会诱发其他并发症,如心脏衰竭,脑水肿,脑血管疾病等\n建议平时保持合理的饮食习惯,适当锻炼身体,避免过度劳累,保持心态平和,定期监测血压,如果血压控制不好,可以服用药物治疗"
},
1.2.3 MedicalGPT-zh:基于ChatGLM-6B LoRA 16-bit指令微调
本项目开源了基于ChatGLM-6B LoRA 16-bit指令微调的中文医疗通用模型 (本项目训练代码采用模型并行算法,可以在最少4张3090显卡上完成)。基于共计28科室的中文医疗共识与临床指南文本,我们生成医疗知识覆盖面更全,回答内容更加精准的高质量指令数据集,以此提高模型在医疗领域的知识与对话能力
本项目数据主要分为两个部分:情景对话与知识问答
数据类型 | 描述 | 数量 | 占比(%) |
---|---|---|---|
情景对话 | 在具体场景下的医患诊疗对话 | 52k | 28.57 |
知识问答 | 医学知识问题的解释性回答 | 130k | 71.43 |
总计 | - | 182k | 100 |
情景对话
主要参考BELLE的指令数据集生成方式,我们将医学指令按照诊疗情景的不同主要分为16种大类,通过100条情景对话种子任务生成的52k条情景对话数据
- 情景对话种子任务详见
./data/dialogue_seed_task.json,以下是两个数据示例
{ "instruction": "治疗方案", "input": "右肺中叶中央型肺癌并肺不张,右侧胸膜,右肺门及纵隔淋巴结肿瘤多发转移,身体体差,不能接受化疗", "output": "尊敬的患者,非常抱歉,您现在的情况不能接受化疗治疗。然而,仍可以尽可能提高您的生活质量,积极抗击病症,使您更好地面对疾病。建议您可以根据您自身情况进行中医治疗,了解自身病情,制定中医治疗和保健方案,调养机能、增强自身抵抗力,减少药物的依赖性,尽可能地延长、稳定患者的生活质量。同时,正确地食补疗法和有氧运动也很重要。此外,您还可以进行综合护理,及时应对必要的辅助治疗,以及定期的体检和体液调养,在病情控制中发挥作用,从而延长患者的生活质量。" }, { "instruction": "病因分析", "input": "公公肺癌晚期今天鼻子出了好多血怎么回事?", "output": "您好,您公公流鼻血可能是由于肺癌侵犯裂而引起的,为了确保您公公的安全,请积极接受治疗,且考虑到患者年纪的问题,建议选择保守的治疗,温和的生物治疗可能更符合实际情况。在肿瘤得到控制的情况下,希望您公公注意补充营养,均衡饮食,多吃含有高营养的清淡食物,减少摄取烧烤和油腻的食物,千万不要太快下手动手手术。如果确定要进行手术治疗,术后一定要重视自身的护理工作,加强抗病营养,以能补充您公公的体力为主。" },
- 此外,我们还提供了生成情景对话数据的pipeline
./data/dialogue_generation.py
,其中的核心也在于基于种子的问题生成,对应的prompt为:prompt = f"你被要求提供7个多样化的任务指令。这些任务指令将被提供给GPT模型,我们将评估GPT模型完成指令的能力。\n \ 以下是你提供指令需要满足的要求:\n \ 1.指令用中文书写,指令应该是一个医疗任务。\n \ 2.指令类型应该是多样化的,包括各种类型的任务,类别种类例如:病情诊断,病因分析,病理诊断,治疗方案,就医建议,指标解读,药物剂量,用药建议,医疗建议,医学知识,疾病描述,后果表述,注意事项,功效作用,医疗费用,预防措施,预后评估,其他\n \ 3.你应该给指令生成适当的输入,输入字段应包含为指令提供的具体示例,它应该是一个医疗问题,含有有用的医学信息,例如病灶描述,体检指标数值,药物剂量等,不应包含简单的占位符。输入应提供充实的内容,使指令具有挑战性。\n \ 4.输出应该是针对指令和输入的恰当回答,如果输入的信息不足以进行判断需要进一步询问。\n \ 5.输入输出相关的疾病应该是多样化的,包含各种类型的疾病和药品信息。\ 下面是7个任务指令的列表: \n"
最终生成的52k情景对话数据医学指令类型及其分布如下图所示
知识问答
医学知识来源于我们自建的医学数据库,通过提供具体的医疗共识与临床指南文本,先让ChatGPT生成与该段医学知识内容与逻辑关系相关的若干问题,再通过“文本段-问题”对的方式让ChatGPT回答问题,从而使ChatGPT能够生成含有医学指南信息的回答,保证回答的准确性
- 知识问答与医疗指南的例子详见
./data/book_data.json
- 依据医疗指南生成的知识问答样例详见
./data/book_based_qa.json
- 此外,我们还提供了知识问答数据生成的pipeline
./data/book_based_question_generation.py
from transformers import AutoTokenizer, AutoModel from langchain.text_splitter import RecursiveCharacterTextSplitter, TextSplitter from langchain.document_loaders import TextLoader import os import json # loader = TextLoader("内科学.txt", encoding='utf-8') # doc = loader.load()[0] # QA_generation(doc.page_content) model_path = '6b/' tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda() model = model.eval() idx = 0 data_path = 'zh_sentence/' qa_dict = {} for file_name in os.listdir(data_path): file_path = data_path + file_name print(file_name) loader = TextLoader(file_path, encoding='utf-8') doc = loader.load()[0] inputs = {"text": doc.page_content} text_splitter = TextSplitter docs = text_splitter.create_documents(RecursiveCharacterTextSplitter(chunk_size = 2000, chunk_overlap=200), [inputs["text"]]) # print([{"text": d.page_content} for d in docs]) for d in docs: idx += 1 text = d.page_content templ = f"""你是一个聪明的助理。 给你一段医学相关的文本,你必须依据文本想出一个问题和一个对应的答案。 你想出的问题可以被用来测试医生的专业能力。 你想出的问题和答案必须和所给文本相关。 当你想出问题和答案后,你必须用以下格式回复: ``` [ "问题": "$你想出的问题放在这", "答案": "$你想出的答案放在这" ] ``` 所有在 ``` 中间的内容就是你要回答的格式。 请想出一个问题与一个答案,用以上指定的列表回复,对于以下文本: ---------------- {text}""" response, history = model.chat(tokenizer, templ, history=[],max_length=2048) while_count = 0 if_good = True while ('以下哪' in response) or ('语言模型' in response) or ('文本' in response) or ('以下是' in response): response, history = model.chat(tokenizer, templ, history=[],max_length=2048) while_count += 1 if while_count > 10: if_good = False break print(response) try: if if_good: question = response.split('答案:')[0][3:] answer = response.split('答案:')[1] qa = {} qa['问题'] = question qa['答案'] = answer qa_dict[idx] = qa else: pass except: pass json.dump(qa_dict, open('qa_dict.json', 'w', encoding='utf-8'), indent=4, ensure_ascii=False)
其中,医疗共识与临床指南中文本段涵盖28个科室共计32k个文本段。各科室及其分布如下
1.3 医联MedGPT(未开源):国内首款商业化达到一定规模的医疗LLM应用
医联MedGPT基于transformer架构(参数规模为100B),并在模型微调训练阶段采⽤⼤量真实医⽣参与的RLHF(Reinforcement Learning from Human Feedback) 监督微调
此外,据说其预训练阶段使⽤了超过20亿的医学文本数据,微调训练阶段使⽤了800万条的高质量结构化临床诊疗数据,并投⼊超过100名医⽣参与⼈⼯反馈监督微调训练
更多解读参见:医疗版ChatGPT直播评测!治疗方案与真人医生96%一致
第二部分 金融领域大模型:从FinBERT到BloombergGPT
2.1 FinBERT:与BERT相同的结构 + 三类金融语料 + 两大预训练方式
熵简FinBERT在网络结构上采用与 Google 发布的原生BERT 相同的架构 (代码地址:GitHub - valuesimplex/FinBERT),其包含了两个不同规模的版本,一个是FinBERT-Base, 采用了 12 层 Transformer 结构,一个是FinBERT-Large,采用了 24 层 Transformer 结构
相对于Google发布的原生中文BERT、哈工大讯飞实验室开源的BERT-wwm 以及 RoBERTa-wwm-ext 等模型,本次开源的 FinBERT 1.0 预训练模型在多个金融领域的下游任务中,比如
- 金融短讯类型分类任务
- 金融短讯行业分类
- 金融情绪分类
- 金融命名实体识别任务 (其核心任务是对金融类文本中出现的实体(公司或人名)进行实体识别和提取,主要用在知识图谱的实体提取和实体链接环节)
获得了显著的性能提升,在不加任何额外调整的情况下,F1-score 直接提升至少 2~5.7 个百分点
2.1.1 训练语料
FinBERT 1.0 所采用的预训练语料主要包含三大类金融领域的语料,分别如下:
- 金融财经类新闻: 从公开渠道采集的最近十年的金融财经类新闻资讯,约 100 万篇
- 研报/上市公司公告: 从公开渠道收集的各类研报和公司公告,来自 500 多家境内外研究机构,涉及 9000 家上市公司,包含 150 多种不同类型的研报,共约 200 万篇
- 金融类百科词条: 从 Wiki 等渠道收集的金融类中文百科词条,约 100 万条
对于上述三类语料,在金融业务专家的指导下,对各类语料的重要部分进行筛选、预处理之后得到最终用于模型训练的语料,共包含 30亿 Tokens,这一数量超过了原生中文BERT的训练规模
2.1.2 预训练方式
FinBERT 采用了两大类预训练任务,分别是字词级别的预训练和任务级别的预训练
- 在字词级别的预训练上
字词级别的预训练首先包含两类子任务,分别是
Finnacial Whole Word MASK(FWWM)
简单来说,原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词,在生成训练样本时,这些被分开的子词会随机被mask
而在全词Mask中,如果一个完整的词的部分WordPiece子词被 Mask,则同属该词的其他部分也会被 Mask,即全词Mask
Next Sentence Prediction(NSP)
简言之,即是为了训练一个理解句子间关系的模型,引入一个下一句预测任务
同时,在训练中,为了节省资源,我们采用了与 Google 类似的两阶段预训练方式,第一阶段预训练最大句子长度为128,第二阶段预训练最大句子长度为 512 - 在任务级别的预训练上
为了让模型更好地学习到语义层的金融领域知识,更全面地学习到金融领域词句的特征分布,同时引入了两类有监督学习任务,分别是研报行业分类和财经新闻的金融实体识别任务
1)研报行业分类
对于公司点评、行业点评类的研报,天然具有很好的行业属性,因此我们利用这类研报自动生成了大量带有行业标签的语料。并据此构建了行业分类的文档级有监督任务,各行业类别语料在 5k~20k 之间,共计约40万条文档级语料
2)财经新闻的金融实体识别
与研报行业分类任务类似,我们利用已有的企业工商信息库以及公开可查的上市公司董监高信息,基于金融财经新闻构建了命名实体识别类的任务语料,共包含有 50 万条的有监督语料
整体而言,为使 FinBERT 1.0 模型可以更充分学习到金融领域内的语义知识,我们在原生 BERT 模型预训练基础上做了如下改进:
- 训练时间更长,训练过程更充分。 为了取得更好的模型学习效果,我们延长模型第二阶段预训练时间至与第一阶段的tokens总量一致
- 融合金融领域内知识。引入词组和语义级别任务,并提取领域内的专有名词或词组,采用全词 Mask的掩盖方式以及两类有监督任务进行预训练
- 为了更充分的利用预训练语料,采用类似Roberta模型的动态掩盖mask机制,将dupe-factor参数设置为10
2.2 哥大FinGPT:对标BloombergGPT,可预测股价
继Bloomberg提出了500亿参数的BloombergGPT (下节之后会介绍),GPT在金融领域的应用受到了广泛关注,但BloombergGPT是一个非开源的模型,而且用到了Bloomberg自身独有的数据储备,并不利于金融大模型的广泛普及。
FinGPT: Open-Source Financial Large Language Models(论文地址、GitHub地址),是由哥伦比亚大学和纽约大学(上海)的研究人员开发的金融大型语言模型(FinLLMs)的端到端开源框架
- 完全开源:开源的训练数据、开源的模型
- 数据中心化:尽管没有Bloomberg用到的独有数据,但FinGPT所用的所有数据都被集中、严格地清洗,保证了数据的质量,并向大众开放
- 端到端的设计:包括输入层、数据加工层、大语言模型微调层和应用层
- BloombergGPT中缺少人类反馈强化学习,但这是GPT模型成功的关键,而FinGPT应用了这项技术
- 轻量级的部署和微调,为了普及金融大模型,降低应用成本,应用了the Low-Rank Adaptation (LoRA) of LLMs技术,将可训练参数从61.7亿减少为367万
FinGPT运用了各种各样的金融训练数据,包括金融新闻、公司公告、社交媒体、金融专业网站、学术资料等,多种多样的数据保证了FinGPT可以理解金融市场和做出金融决策
值得注意的是,FInGPT提供了一套完善的机制应对实时数据,做出实时决策;使用者也可以很轻松地对下游任务进行微调
还可以微调FinGPT来预测股价,由于股价预测任务微调时可以简单利用股价变动作为反馈,因此微调成本相对其它需要人类反馈的任务低得多
2.3 BloombergGPT(未开源)
// 待更
第三部分 法律模型:从ChatLaw到LawGPT_zh
3.1 ChatLaw-法律大模型
3.1.1 ChatLaw-13B:基于姜子牙Ziya-LLaMA-13B-v1训练而来
ChatLaw法律大模型(其GitHub地址)目前开源的仅供学术参考的版本底座为姜子牙-13B、Anima-33B,我们使用大量法律新闻、法律论坛、法条、司法解释、法律咨询、法考题、判决文书等原始文本来构造对话数据
- 基于姜子牙-13B的模型是第一版模型,得益于姜子牙的优秀中文能力和我们对数据清洗、数据增强过程的严格要求,我们在逻辑简单的法律任务上表现优异,但涉及到复杂逻辑的法律推理任务时往往表现不佳
- 随后基于Anima-33B,我们增加了训练数据,做成了ChatLaw-33B,发现逻辑推理能力大幅提升,由此可见,大参数的中文LLM是至关重要的
至于数据则主要由论坛、新闻、法条、司法解释、法律咨询、法考题、判决文书组成,随后经过清洗、数据增强等来构造对话数据
3.1.2 模型效果:微调之后的ChatLaw可以胜过GPT-4
收集了十余年的国家司法考试题目,整理出了一个包含2000个问题及其标准答案的测试数据集,用以衡量模型处理法律选择题的能力: 评测数据demo
然而,我们发现各个模型的准确率普遍偏低。在这种情况下,仅对准确率进行比较并无多大意义。因此,我们借鉴英雄联盟的ELO匹配机制,做了一个模型对抗的ELO机制,以便更有效地评估各模型处理法律选择题的能力。以下分别是ELO分数和胜率图
有以下结论:(1)引入法律相关的问答和法规条文的数据,能在一定程度上提升模型在选择题上的表现;(2)加入特定类型任务的数据进行训练,模型在该类任务上的表现会明显提升。例如,ChatLaw模型之所以能胜过GPT-4,是因为我们使用了大量选择题作为训练数据;(3)法律选择题需要进行复杂的逻辑推理,因此,参数量更大的模型通常表现更优。
3.2 LawGPT_zh:基于ChatGLM-6B LoRA 16-bit指令微调得到的中文法律大模型
本项目开源的中文法律通用模型由ChatGLM-6B LoRA 16-bit指令微调得到。数据集包括现有的法律问答数据集和基于法条和真实案例指导的self-Instruct构建的高质量法律文本问答,提高了通用语言大模型在法律领域的表现,提高了模型回答的可靠性和专业程度。
3.2.1 数据集构建
本项目数据主要分为两个部分:1.律师和用户之间的情景对话 2.对特定法律知识的问答
数据类型 | 描述 | 数量 | 占比(%) |
---|---|---|---|
情景对话 | 真实的律师用户问答 | 200k | 100 |
知识问答 | 法律知识问题的解释性回答 | coming soon | 0 |
总计 | - | 200k | 100 |
情景对话
真实的中文律师用户问答数据,来自CrimeKgAssitant收集的200k条情景对话数据。
利用ChatGPT清洗CrimeKgAssitant数据集得到52k单轮问答
下载(提取码:MYTT)
利用ChatGPT根据CrimeKgAssitant的问答重新生成,使得生成的回答比原回答更详细,语言组织更规范。
带有法律依据的情景问答92k
下载(提取码:MYTT)
我们根据中华人民共和国法律手册上最核心的9k法律条文,利用ChatGPT联想生成具体的情景问答,从而使得生成的数据集有具体的法律依据。数据格式如下
"question": "在某家公司中,一名员工对女同事实施了性骚扰行为,女同事向公司进行举报,但公司却没有采取必要的措施来制止这种行为。\n\n公司未采取必要措施预防和制止性骚扰,导致女同事的权益受到侵害,该公司是否需要承担责任?" "answer": "根据《社会法-妇女权益保障法》第八十条规定,“学校、用人单位违反本法规定,未采取必要措施预防和制止性骚扰,造成妇女权益受到侵害或者社会影响恶劣的,由上级机关或者主管部门责令改正;拒不改正或者情节严重的,依法对直接负责的主管人员和其他直接责任人员给予处分。”因此,该公司因为未采取必要措施预防和制止性骚扰行为,应该承担责任,并依法接受相关的处分。女同事可以向上级机关或主管部门进行申诉,要求该公司被责令改正,并对相关负责人员给予处分。" "reference": [ "社会法-妇女权益保障法2022-10-30: \"第七十九条 违反本法第二十二条第二款规定,未履行报告义务的,依法对直接负责的主管人员和其他直接责任人员给予处分。\",\n", "社会法-妇女权益保障法2022-10-30: \"第八十条 违反本法规定,对妇女实施性骚扰的,由公安机关给予批评教育或者出具告诫书,并由所在单位依法给予处分。\",\n", "社会法-妇女权益保障法2022-10-30: \"学校、用人单位违反本法规定,未采取必要措施预防和制止性骚扰,造成妇女权益受到侵害或者社会影响恶劣的,由上级机关或者主管部门责令改正;拒不改正或者情节严重的,依法对直接负责的主管人员和其他直接责任人员给予处分。\",\n", "社会法-妇女权益保障法2022-10-30: \"第八十一条 违反本法第二十六条规定,未履行报告等义务的,依法给予警告、责令停业整顿或者吊销营业执照、吊销相关许可证,并处一万元以上五万元以下罚款。\",\n" ]
3.2.2 知识问答
作者团队计划收集法律领域的教科书,经典案例等数据,自建一个法律专业知识数据库。
针对Self-Instruct的可靠性和安全性漏洞,他们使用了基于特定知识的Reliable-Self-Instruction:通过提供具体的法律知识文本,先让ChatGPT生成与该段法律知识内容与逻辑关系相关的若干问题,再通过“文本段-问题”对的方式让ChatGPT回答问题,从而使ChatGPT能够生成含有法律信息的回答,保证回答的准确性
其中,计划法律知识数据包含民法商法、行政法、经济法、社会法、刑法等各个细分法律的条例,分析和题库
第四部分 可商用的数据集与可商用的模型
有的朋友可能已经注意到了,我们已经部署/微调了不少模型,包括且不限于LLaMA、以及基于LLaMA做各种微调的Alpaca、Vicuna、BELLE、Chinese-LLaMA/Chinese-Alpaca,以及LLaMA的RLHF版:ChatLLaMA(英文版)、ColossalChat,甚至包括国内的ChatGLM等模型
但感到遗憾的是,目前这些模型 都不能商用,当然 对于其中有些模型不允许商用也能理解,比如Alpaca扩展数据集的方式毕竟是通过self-instruct技术提示OpenAI的API生成数据,如果去商用,则和OpenAI本身产生不可避免的直接商业冲突
很多模型不允许商用还只是一方面,另一方面,数据集也是很大的一个问题,既然通过self-instruct技术提示OpenAI的API生成数据没法商用,那什么样的数据集允许商用呢,本部分便为大家探讨可以商用的数据集和可以商用的模型
4.1 4.12发布的Dolly 2.0:数据集由数千名 Databricks 员工生成的超过 1.5 万条记录的语料库
2023年4 月 12 日,Databricks 发布了Dolly 2.0 ,表示这是业内第一个开源、遵循指令的 LLM,它在透明且免费提供的数据集上进行了微调,该数据集也是开源的,可用于商业目的。这意味着 Dolly 2.0 可用于构建商业应用程序,无需支付 API 访问费用或与第三方共享数据。
项目链接:https://huggingface.co/databricks/dolly-v2-12b
数据集:https://github.com/databrickslabs/dolly/tree/master/data
以下是它的一些特点
- Dolly 2.0 是一个 120 亿参数的语言模型,它基于开源 EleutherAI pythia 模型系列
- Databricks 还发布了 Dolly 2.0 在其上进行微调的数据集,称为 databricks-dolly-15k。这是由数千名 Databricks 员工生成的超过 1.5 万条记录的语料库。
数据集包含7 项非常具体的任务:
1 公开问答:例如「为什么人们喜欢喜剧电影?」或「法国的首都是什么?」在某些情况下,没有一个正确的答案,而在其他情况下,需要借助于整个世界的知识;
2 封闭式问答:这些问题只用一段参考文献中的信息就可以回答。例如,给定维基百科中关于原子的一段,人们可能会问:「原子核中质子和中子的比例是多少?」;
3 从维基百科中提取信息:在这里,标注者会从维基百科上复制一个段落,并从该段落中提取实体或其他事实信息,如重量或测量;
4 总结维基百科上的信息:对于这一点,注释者从维基百科上提供了一段话,并被要求将其提炼为一个简短的摘要;
5 集思广益:这项任务要求进行开放式的构思,并列出相关的可能选项。例如「这个周末我可以和我的朋友做哪些有趣的活动?」;
6 分类:在这项任务中,标注者被要求对类别成员进行判断(例如,列表中的项目是动物、矿物还是蔬菜),或者判断一段短文的属性,例如电影评论的情绪;
7 创意写作:这项任务将包括写一首诗或一封情书等内容。 - 模型权重及微调数据集均可下载,要下载 Dolly 2.0 模型的权重,只需访问 Databricks Hugging Face 页面,并访问 databricks-labs 的 Dolly repo,下载 databricks-dolly-15k 数据集。
4.2 4.17发布的RedPajama开源数据集:1.2万亿token 容量5个T
2023年4月17日,RedPajama开源1.2万亿token数据集,帮助开发者训练类ChatGPT大语言模型。这也是目前类ChatGPT领域,全球最大的开源训练数据集(地址:https://huggingface.co/datasets/togethercomputer/RedPajama-Data-1T)
RedPajama完美复制了LLaMA模型上的1.2万亿训练数据集,由维基百科、GitHub、普通抓取、C4、图书、ArXiv(知名论文网站)、Stack Exchange七部分组成。完整数据集容量约5T,根据数据使用条例已经允许商业化
4.3 4.17发布的COIG:首个大规模、可商用的中文开源指令数据
https://hub.baai.ac.cn/view/25750
2023年4月17日,北京智源人工智能研究院第一期总共发布了 5 个子数据集,包括翻译指令、考试指令、人类价值观对齐指令、反事实修正多轮聊天、Leetcode指令,总计 191k 数据,聚焦中文语料、数据类型多样、经过了人工质检与修正、数据质量可靠,而且可以商用。
- 对应的论文:Chinese Open Instruction Generalist: a Preliminary Release
https://arxiv.org/pdf/2304.07987.pdf
对应的数据链接:
https://huggingface.co/datasets/BAAI/COIG
包括翻译指令、考试指令、人类价值观对齐指令、反事实修正多轮聊天、Leetcode指令,总计 191k 数据,聚焦中文语料、数据类型多样、经过了人工质检与修正、数据质量可靠,而且可以商用
4.4 4.19 发布的StableLM
2023年4月19日,Stability AI发布了一款名为StableLM的开源语言模型,旨在让基础AI技术更加透明、易于访问和支持。该模型可以生成文本和代码,并将支持一系列下游应用。它们展示了如何通过适当的训练,小型且高效的模型可以实现高性能
github链接:https://github.com/Stability-AI/StableLM
huggingface链接:https://huggingface.co/stabilityai/stablelm-base-alpha-7b
- 参数规模上
StableLM 模型的alpha版本有3B和7B参数,接着会推出14B和65B的模型。在CC BY-SA-4.0许可条款的约束下,开发者可以自由查看、使用并调整我们的StableLM基础模型,用于商业或研究目的。 - 数据集上
StableLM是在一个基于The Pile的新实验数据集上进行训练的,但其规模是The Pile的三倍,包含1.5万亿个内容标记。The Pile这个数据集包含的数据来源就有维基百科、Stack Exchange 和 PubMed。不过,Stability AI 在 the Pile 的基础上进行了扩展,所使用的数据集大小是标准 the Pile 的 3 倍。 - 模型架构上
StableLM使用了一些常用的模型架构,比如LSTM、Transformer等,还使用了一些先进的技术,比如自注意力机制、残差连接等,以提高模型的效果和精度 - 应用上
StableLM已经被广泛应用于自然语言处理任务,比如机器翻译、情感分析、文本分类和问答系统等,但StableLM 会说中文,但只会一点点(回复内容对应不上,语句也不通顺)。
4.5 其他可商用的模型
部分可商用模型的汇总链接
- github.com/eugeneyan/open-llms