大家好,我是微学AI,今天给大家介绍一下深度学习实战54-基于ChatGLM2大模型构建智能自助用药问答系统与药物智能管理实战的应用。 随着人工智能技术的发展,我们的生活在许多方面都得到了改善。医疗领域也不例外。本文将介绍如何利用大模型(例如ChatGLM2-6b,百川,通义千问)构建一个智能自助用药问答系统与智能管家。该系统旨在提供更有效、安全和便捷的个性化药物管理服务,以提高患者的生活质量和健康状况。
在当今社会,人们对医疗健康问题越来越关注,但由于时间、地点等因素限制,患者无法及时获得医生的指导和帮助。此外,许多老年人和慢性病患者需要长期服药,但他们可能会忘记服药或混淆不同类型的药物,需求咨询与问答与他们沟通。因此, 智能自助用药管理系统具有广阔的应用前景。
我们的系统可以通过AI技术对用户上传的处方进行图像识别和语义理解。例如,当用户拍摄并上传一张处方图片时,系统会自动扫描并解析出药品名称、剂量以及服用方式等信息。这一功能不仅可以减少手动输入错误,还能大大提高用户在管理多种药物时的便利性。
实际场景示例:李先生是一个高血压患者,需要定期服用多种药物。他可以将医生开具的处方拍照上传到我们的系统中,系统会自动读取并记录各种药物及其使用方法,传输到系统中,并记录下药品使用情况,整理数据输入大模型。
系统使用知识图谱技术检查用户正在使用或计划使用的所有药物之间是否存在可能危险的相互作用。如果发现有潜在风险,系统会立即提醒用户,并建议他们寻求医生建议。
后台构建了药物相互作用知识图谱,帮助用户快速提示药物之间的危险因素。
实际场景示例:若李先生新添加了一种抗抑郁药,在保存后,系统立即发现这款新加入的抗抑郁药与他原本正在服用的某种高血压药可能产生不良反应。于是, 系统马上向李先生发送警告,并建议他咨询医生。
根据用户设定或从处方中获取到的信息,我们的智能提醒功能可帮助用户按时正确地服用各类荐品。它可以自动设置提醒时间,并根据个人需求进行调整。
实际场景示例:李先生需要每天早晚各服用一次某种心脏病治疗荐品。由于工作繁忙, 李先生经常忘记按时服用, 系统就会在设定时间(比如早上7点和晚上7点)向李先生发送提示消息.
我们还收集并分析用户对各类推介产品效果反馈数据,并根据数据进行持续优化和改进服务质量。这些信息都已经输入大模型,通过与模型对话进行提醒与减少风险。
实际场景示例:李先生在使用一段时间的药物后,可以在我们的系统中为这款药品打分和写下他的使用感受。这些信息将被用于改进我们的产品和服务,以更好地满足用户需求。
为了使我们基于ChatGLM2-6b构建出来的智能自助用药管理系统更加适应实际需求,并且可以处理具体问题,我们需要使用真实世界中收集到的数据对模型进行微调。以下是一些样例数据:
prescription_id | drug_name | dosage | frequency | start_date | end_date | patient_feedback |
---|---|---|---|---|---|---|
001 | 阿莫西林 | 500mg | 每日三次 | 2023-01-05 | 2023-02-05 | 胃部不适 |
002 | 糖尿病药 | 10mg | 每日一次 | 2023-02-15 | - | - |
003 | 阿托伐他汀 | 20mg | 每晚一次 | 2023-01-15 | 2023-04-15 | 效果显著 |
004 | 降脂药_ | 40mg | 每日一次 | 2023-03-01 | -_ _ | 偶有恶心 |
005 | 奥美拉唑_ _ | 20mg_ | 每日一次_ | _2023-03-05 | 不限__ | 胃部舒适 |
006 | 抗抑郁药_ _ | 50mg_ | 每日两次___ | 2023-02-10 | 不限___ | 偶有失眠 |
007 | 维生素D_ | 1000IU_ | 每周两次_ | 2023-01-30 | 不限 | 无显著改善 |
import torch
from transformers import AutoTokenizer,AutoConfig, AutoModel, BitsAndBytesConfig
model_name_or_path = 'THUDM/chatglm2-6b'
bnb_config=BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True, #QLoRA 设计的 Double Quantization
bnb_4bit_quant_type="nf4", #QLoRA 设计的 Normal Float 4 量化数据类型
llm_int8_threshold=6.0,
llm_int8_has_fp16_weight=False,
)
tokenizer = AutoTokenizer.from_pretrained(
model_name_or_path, trust_remote_code=True) # cache_dir='./' 缓存到当前工作路径
model = AutoModel.from_pretrained(model_name_or_path,
quantization_config=bnb_config,
trust_remote_code=True) # cache_dir='./'
模型测试:
text = '高血压主要的症状是什么'
response,history= model.chat(tokenizer,query=text,history=[])
print(response)
生成文本:
高血压(也称为高血压症或高血压)的主要症状包括:
高血压的典型症状是高血压,通常表现为持续的头痛、头晕、心悸、气短、耳鸣、视力模糊、失眠等。
高血压可能导致心绞痛或心肌梗塞,因此在某些情况下,高血压可能会引起严重的胸痛或呼吸困难。
高血压还可能导致动脉硬化和心血管疾病,如心肌炎、心律失常、中风等。
高血压的症状因个体差异、血压水平、心血管健康状况和病情严重程度而异,因此有些人可能没有明显的症状。
添加大量用户专项数据,这里举个样例数据介绍:
keyword = '我的病情与药情况是什么样'
description = '''您目前患有高血压,糖尿病,慢性肾病,冠心病,目前用药情况:使用倍他乐克每天一次,硝苯地平每天一次,二甲双胍缓释片每天一次,我将根据您的病情给出病情管理方案,时刻关注您的用药情况'''
#对prompt使用一些简单的数据增强的方法,以便更好地收敛。
def get_prompt_list(keyword):
return [f'{keyword}',
f'本人叫**,{keyword}?',
f'{keyword},详细说一下?',
f'介绍一下{keyword}',
f'告诉我{keyword}?',
f'想知道{keyword}',
f'说一下{keyword}?',
]
data =[{'prompt':x,'response':description} for x in get_prompt_list(keyword) ]
dfdata = pd.DataFrame(data)
display(dfdata)
LoRA(Low Rank Adaption)是一种能够相比全参微调可以大幅节约训练时间和显存,同时微调效果基本可以相当于全参微调的算法。他其实是低秩适配方法, LoRA的思想非常简单,有些像SVD奇异值分解的想法。
而QLoRA并没有对LoRA的逻辑作出修改,而是通过将预训练模型量化为4-bit以进一步节省计算开销。QLoRA可以将650亿参数的模型在单张48 GB GPU上微调并保持原本16-bit微调的性能。QLORA的主要技术为:
(1)新的数据类型4-bit NormalFloat(NF4);
(2)双重量化(Double Quantization);
(3)分页优化器(Paged Optimizers)。其中分页优化器指在训练过程中显存不足时自动将优化器状态移至内存,需要更新优化器状态时再加载回来。
QLoRA中的量化过程:
NF4基于分位数量化构建而成,该量化方法使得使原数据经量化后,每 个量化区间中的值的数量相同。具体做法是对数据进行排序并找出所有
k
k
k分之一位数组成数据类 型(Data type)。对于
4
−
b
i
t
4-bit
4−bit来说,
k
=
2
4
=
16
k=2^4=16
k=24=16。然而该过程的计算代价对于大语言模型的参数来说是不可接受的。考虑到预训练模型参数通常呈均值为0的高斯分布,因此可以首先对一个标准高斯分布
N
(
0
,
1
)
N(0,1)
N(0,1)按上述方法得到其
4
−
b
i
t
4-bit
4−bit分位数量化数据类型,并将该数据类型的值缩放至
[
−
1
,
1
]
[-1,1]
[−1,1]。随后将参数也缩放至
[
−
1
,
1
]
[-1,1]
[−1,1]即可按通常方法进行量化。该方法存在的一个问题是数据类型中缺少对0的表征,而0在模型参数中有着表示填充、掩码等特殊含义。接着分别对标准正态分布的非负和非正部分取分位数并取它们的并集,组合成最终的数据类型F4。
import torch
from transformers import AutoTokenizer,AutoConfig, AutoModel, BitsAndBytesConfig
model_name_or_path = 'chatglm2-6b-medical'
config = AutoConfig.from_pretrained(model_name_or_path, trust_remote_code=True)
bnb_config=BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True, #QLoRA 设计的 Double Quantization
bnb_4bit_quant_type="nf4", #QLoRA 设计的 Normal Float 4 量化数据类型
llm_int8_threshold=6.0,
llm_int8_has_fp16_weight=False,
)
tokenizer = AutoTokenizer.from_pretrained(
'THUDM/chatglm2-6b' , trust_remote_code=True) # cache_dir='./' 缓存到当前工作路径
model = AutoModel.from_pretrained(model_name_or_path,
config=config,
quantization_config=bnb_config,
trust_remote_code=True) # cache_dir='./'
text = '现在我的病情与药情况是什么样,详细说一下?'
response,history= model.chat(tokenizer,query=text,history=[])
print(response)
输出结果:
您目前患有高血压,糖尿病,慢性肾病,冠心病,目前用药情况:使用倍他乐克每天一次,硝苯地平每天一次,二甲双胍缓释片每天一次,我将根据您的病情给出病情管理方案,时刻关注您的用药情况。
text = '我用的的几种药,详细介绍一下?'
response,history= model.chat(tokenizer,query=text,history=[])
print(response)
输出结果:
1.倍他乐克(Betaloc)是一种β受体阻滞剂,主要用于治疗高血压、心绞痛和心律失常等心血管疾病。它的主要成分是美托洛尔(Metoprolol)。倍他乐克通过阻断β受体,减慢心率、降低血压和减少心脏的收缩力,从而达到控制心血管疾病症状的目的。
2.硝苯地平(Nitrendipine)是一种钙通道阻滞剂,属于二氢吡啶类药物。它主要用于治疗高血压和心绞痛。硝苯地平通过抑制细胞膜上的L型钙通道,阻断钙离子进入细胞,从而放松血管平滑肌,扩张血管,降低外周血管阻力,降低血压。
3.二甲双胍缓释片(Metformin Extended-Release Tablets)是一种口服降糖药物,广泛用于治疗2型糖尿病。它的主要成分是二甲双胍(Metformin),通过提高组织对葡萄糖的摄取和利用,减少肝脏对葡萄糖的合成,降低血糖水平。缓释片剂型使药物在胃肠道中缓慢释放,提供持续的药效,有助于控制血糖的稳定性。
以上是系统调取倍他乐克、硝苯地平、二甲双胍缓释片用药介绍数据。