Model: zpeng1989/COT_Medical_Qwen_Large_Language_Model Source: Original Platform
医疗思考链问答大模型
项目概述
本项目旨在构建一个针对医疗知识的思考链条的问答大模型,基于qwen2.5-7B模型作为基座模型,使用LoRA(Low-Rank Adaptation)技术进行微调。模仿DeepSeek模型增加"深度思考模式(think)"。模型训练数据涵盖了医疗问诊、咨询等权威医学领域知识信息,并通过问答题目进行微调,以提升模型在医学领域的问答能力。这种数据预处理的策略,充分挖掘了Qwen模型强大的推理能力,使其能够模拟在医疗场景中,如何发现患者记录描述信息中获取到关联性的过程。
模型架构
- 基座模型:
qwen2.5-7B - 微调方法: LoRA(Low-Rank Adaptation)
- 训练数据: 问答数据集
数据集
数据来源
参考链接:https://huggingface.co/datasets/FreedomIntelligence/medical-o1-reasoning-SFT/tree/main
数据预处理
训练数据格式:
{
"Question": "女性,34岁,双下肢麻木无力1年半,感觉障碍自下而上发展。体检:右侧胸8以下痛、温觉消失,左侧胸以下痛、温觉减退。右下肢肌力Ⅳ级,左下肢肌力Ⅲ级。左侧巴氏征阳性。病变的定性诊断应首先考虑为\nA. 脊膜瘤\nB. 神经纤维瘤\nC. 脑胶质瘤\nD. 椎管内转移瘤\nE. 脊髓髓内室管膜瘤",
"output": "<think>患者是一名34岁的女性,哎,她已经忍受了双下肢麻木无力有一年半了。她的症状是从脚下开始向上蔓延的。这听起来像是典型的神经问题,特别是脊髓的事情。\n\n在体检中,发现她的右侧胸8以下痛、温觉已经完全消失,奇怪的是,左侧则只是减退。这些提示我去考虑下,可能是脊髓的问题,尤其是可能在胸8这个区域出毛病了。\n\n她的巴氏征左侧是阳性的,这表明脊髓半侧损害,这就是所谓的Brown-Séquard综合征呀。嗯,右下肢的肌力相较左侧还稍微好一点,但情况都不妙。\n\n想到病变性质,感觉病程发展这么缓慢,说明是一种慢性病。可以是肿瘤,那肿瘤的话,髓内的或髓外的都有可能。这个就看到底是涉及到脊髓内还是外了。\n\n室管膜瘤这种病镇的可能存在脊髓内部,而且病程缓慢符合这类症状的特点。哦,不过要是脊髓外的问题,那脊膜瘤这种可能会导致脊髓半侧损害,这样就很吻合了。\n\n啊,神经纤维瘤有时候也出现类似的症状,不过更常见多发性问题和皮肤上的表现,她没有这些其他症状。这有点排除掉。\n\n脑胶质瘤或者椎管内转移瘤不太可能造成这样的表现,这个在脊髓半侧这样单纯的损害上,不是那么直接。\n\n所以,考虑到这些症状,还有病变的特性,我觉得首先还是脊膜瘤可能性最大,特别是与这种Brown-Séquard综合征这样的一侧症状损害表现最吻合。</think>\n结合患者的症状和体检结果,考虑到病变的性质以及脊髓半侧损害的特点,这些特征非常符合脊膜瘤的表现。因此,病变的定性诊断首先应考虑为脊膜瘤。\n\nA. 脊膜瘤"
}
模型训练
微调方法
使用LoRA技术对qwen2.5-7B模型进行微调。LoRA通过在预训练模型的权重矩阵中引入低秩矩阵来减少参数量,从而在保持模型性能的同时降低计算成本。
训练步骤
- 加载预训练模型: 加载
qwen2.5-7B模型。 - 应用LoRA: 在模型的关键层应用LoRA技术。
- 训练模型: 使用准备好的肿瘤知识问答数据集进行微调。
- 验证与测试: 在验证集和测试集上评估模型性能,调整超参数以优化结果。
模型评估
评估指标
- 准确率: 模型在问答任务中的准确率。
- 召回率: 模型能够正确回答的问题比例。
- F1分数: 准确率和召回率的调和平均数。
评估结果
在测试集上的评估结果如下: 待更新
使用指南
环境配置
- Python版本: 3.10+
- 依赖库:
transformerstorch
模型下载
SDK下载
#安装ModelScope
pip install modelscope
#SDK模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('zpeng1989/COT_Medical_Qwen_Large_Language_Model')
Git下载
#Git模型下载
git clone https://oauth2:eDTzbKYiKrNCswNiDx1s@www.modelscope.cn/zpeng1989/COT_Medical_Qwen_Large_Language_Model.git
模型推理
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载微调后的模型
model = AutoModelForCausalLM.from_pretrained("path_to_your_model")
tokenizer = AutoTokenizer.from_pretrained("path_to_your_model")
# 输入问题
question = "请列出所有与葡萄胎相关的症状和体征?"
inputs = tokenizer(question, return_tensors="pt")
# 生成答案
outputs = model.generate(**inputs)
answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(answer)
WEB部署
代码参考:
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import streamlit as st
import re
# 在侧边栏中创建一个标题和一个链接
with st.sidebar:
st.markdown("## 7B LLM")
max_length = st.slider("max_length", 0, 8192, 8192, step=1)
temperature = st.slider("temperature", 0.0, 1.0, 0.1, step=0.1)
# 创建一个标题和一个副标题
st.title("Model Chatbot")
st.caption("🚀 A streamlit chatbot powered by Self-LLM")
# 定义模型路径
mode_name_or_path = ''
# 文本分割函数
def split_text(text):
pattern = re.compile(r'<think>(.*?)</think>(.*)', re.DOTALL) # 定义正则表达式模式
match = pattern.search(text) # 匹配 <think>思考过程</think>回答
if match: # 如果匹配到思考过程
think_content = match.group(1).strip() # 获取思考过程
answer_content = match.group(2).strip() # 获取回答
else:
think_content = "" # 如果没有匹配到思考过程,则设置为空字符串
answer_content = text.strip() # 直接返回回答
return think_content, answer_content
# 定义一个函数,用于获取模型和 tokenizer
@st.cache_resource
def get_model():
# 从预训练的模型中获取 tokenizer
tokenizer = AutoTokenizer.from_pretrained(mode_name_or_path, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
# 从预训练的模型中获取模型,并设置模型参数
model = AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtype=torch.bfloat16, device_map="auto")
return tokenizer, model
# 加载 Qwen2.5 的 model 和 tokenizer
tokenizer, model = get_model()
# 如果 session_state 中没有 "messages",则创建一个包含默认消息的列表
if "messages" not in st.session_state:
st.session_state["messages"] = [{"role": "assistant", "content": "有什么可以帮您的?"}]
# 遍历 session_state 中的所有消息,并显示在聊天界面上
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
# 如果用户在聊天输入框中输入了内容,则执行以下操作
if prompt := st.chat_input():
# 在聊天界面上显示用户的输入
st.chat_message("user").write(prompt)
# 将用户输入添加到 session_state 中的 messages 列表中
st.session_state.messages.append({"role": "user", "content": prompt})
# 将对话输入模型,获得返回
input_ids = tokenizer.apply_chat_template(st.session_state.messages,tokenize=False,add_generation_prompt=True)
model_inputs = tokenizer([input_ids], return_tensors="pt").to('cuda')
generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=max_length, temperature=temperature)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
think_content, answer_content = split_text(response) # 调用split_text函数,分割思考过程和回答
# 将模型的输出添加到 session_state 中的 messages 列表中
st.session_state.messages.append({"role": "assistant", "content": response})
# 在聊天界面上显示模型的输出
with st.expander("模型思考过程"):
st.write(think_content) # 展示模型思考过程
st.chat_message("assistant").write(answer_content) # 输出模型回答
# print(st.session_state) # 打印 session_state 调试
运行命令:
# nohup streamlit run Run_Test_v1.py --server.address 0.0.0.0 --server.port 6006 &
生成结果案例
Case 01
输入问题:
患者信息如下:"""现病史
(1)病史摘要
病人,男,49岁,3小时前解大便后出现右下腹疼痛,右下腹可触及一包块,既往体健。
(2)主诉
右下腹痛并自扪及包块3小时。
体格检查
体温: T 37.8℃,P 101次/分,呼吸22次/分,BP 100/60mmHg,腹软,未见胃肠型蠕动波,肝脾肋下未及,于右侧腹股沟区可扪及一圆形肿块,约4cm×4cm大小,有压痛、界欠清,且肿块位于腹股沟韧带上内方。
辅助检查
(1)实验室检查
血常规:WBC 5.0×109/L,N 78%。
尿常规正常。
(2)多普勒超声检查
沿腹股沟纵切可见一多层分布的混合回声区,宽窄不等,远端膨大,边界整齐,长约4~5cm。
(3)腹部X线检查
可见阶梯状液气平。"""具体工作:简述该病人的诊断及诊断依据。
模型返回结果:
<think>这个病人是个49岁的男性,他3小时前开始出现右下腹疼痛,还摸到一个包块。先从这些症状来看,很有可能是急性阑尾炎,尤其是右下腹疼痛和包块出现在解便后。然后查了一下体温,37.8℃,稍微高了一点,心跳快,呼吸也挺快的,这些似乎说明真的有点问题。
多普勒超声给出的信息是在腹股沟有一個肿块,而且那个多层的混合回声,感觉像是一个实性肿块而不是单纯的液体或气体。这种情况让我对阑尾炎有些不确定,不过多普勒超声上的病变位置在右侧腹股沟,抓住了注意力。
再看看腹部X线,说到液气平通常是肠道梗阻的表现,但这病人的情况不同,液气平呈现阶梯状,这有点儿特别。再想想,右下腹的疼痛和包块更可能是淋巴结肿大,或许不是经典的阑尾问题。
反过来再想想,这个病人解便后痛得很明显,还有个包块,是不是可以考虑是不是阑尾出了什么问题,比如脓肿?要是盆腔淋巴结出了脓肿,也解释得通当前的症状啊。如果那个多普勒超声上的‘混合回声’是淋巴结,那就更合理了。
综合来看,现在最需要关注的还是右下腹的急性症状,如果是盆腔淋巴结脓肿,治疗上也需要迅速行动。不过,所有结论都需要医生进一步确认和处理,毕竟身体状况复杂,容不得半点差池。
</think>根据提供的患者信息,结合症状、体格检查以及各项检查结果,最需要考虑的诊断是盆腔淋巴结脓肿。
诊断依据包括:
1. **患者症状**:患者49岁男性,3小时前解便后出现显著的右下腹疼痛,伴随一个可触及的包块,提示急性过程可能。
2. **体温和心率变化**:体温37.8℃,心率101次/分,提示存在炎症反应。
3. **多普勒超声检查**:在右侧腹股沟区发现一个有压痛的圆形肿块,可能提示附近的淋巴结肿大。
4. **腹部X线检查**:呈现的液气平不符合典型的肠梗阻,且排列像阶梯,提示可能的腹腔内积液或膨胀的病变。
综合这些信息,右下腹痛及可触包块可能与盆腔淋巴结脓肿有关。因此,建议进行进一步的评估和治疗以确认脓肿的存在及处理其潜在的感染。
参考答案
诊断:嵌顿性腹股沟斜疝合并肠梗阻。
诊断依据:
①右下腹痛并自扪及包块3小时;
②有腹胀、呕吐,类似肠梗阻表现;腹部平片可见阶梯状液平,考虑肠梗阻可能;腹部B超考虑,
腹部包块内可能为肠管可能;
③有轻度毒性反应或是中毒反应,如 T 37.8℃,P 101次/分,白细胞中性分类78%;
④腹股沟区包块位于腹股沟韧带上内方。
Case 02
输入问题
患者信息如下:"""现病史
(1)病史摘要
杨XX,女,59岁,30年前无明显诱因开始出现反酸、反食、烧心,胸骨后烧灼感,伴胃胀、嗳气,弯腰后反酸加重,不规律服用“奥美拉唑、吗丁啉、莫沙必利”症状可缓解,停药反复发作。5年前开始出现咳嗽、咳痰,咳嗽严重时伴胸闷、喘息症状,无明显季节性,常于进食后1小时及凌晨发作,止咳平喘效果不佳,生活质量明显下降。2年前外院诊为“反流性食管炎LA-B、食管裂孔疝,睡眠时床头抬高及、服用“耐信 20mg BID”反流症状明显缓解,咳喘症状亦明显缓解。近10个月咳喘症状加重,伴有听力下降,调整耐信 40mg BID,咳喘症状再次改善,但仍时有发作。
(2)主诉
反酸、烧心30年,咳嗽、咳痰、喘息5年,加重10个月。
体格检查
结果 T36.8℃,P70次/分,R20次/分,Bp136/80mmHg。
自主体位,神志清楚,全身皮肤及巩膜无黄染,全身浅表淋巴结无肿大。双肺听诊呼吸音粗及散在哮鸣音。心率70次/分,律齐,未闻及病理性杂音,腹部平软,肝脏、脾脏未触及,未触及腹部包块,肠鸣音正常。
辅助检查
(1)实验室检查
出凝血功能:正常;血生化:正常;血常规:正常。
(2)胃镜
反流性食管炎:LA-C;食管裂孔疝(混合型)。
(3)上消化道造影
反流性食管炎;食管裂孔疝。
(4)食管高分辨率测压
LES压力低于正常,食管体部频繁无效,食管裂孔疝。
(5)食管高分辨率测压
1.食管pH监测:未达到胃食管病理性酸反流;卧位酸廓清能力下降。
2.食管阻抗监测:反流总次数正常,以酸反流为主;
3.症状相关性分析:监测期间咳嗽、喘息症状与弱酸反流相关。
辅助检查
胃镜:
所见:齿状线上移约4cm,可见多条纵行糜烂,底部有融合,齿状线不规整,周围可见充血、水肿、糜烂。 贲门口松弛。反转胃镜可见食管裂孔疝疝囊。
结论:反流性食管炎:LA-C;食管裂孔疝(混合型)。
辅助检查
食管pH-阻抗监测(口服PPI期间)
食管pH监测显示: DeMeester积分为8.0(正常值<14.7);酸反流时间百分比(AET)为2.1%(正常值<4.2%),卧位酸反流时间所占百分比大于正常。卧位酸清除时间延长。
食管阻抗监测显示:食团反流总时间百分比(BET)为1.2%(正常值<1.4%),立位食团反流时间百分比大于正常;反流总次数为48次(正常值<73次),其中酸反流32次,弱酸反流5次,弱碱反流3次,酸性气体反流2次,弱酸性气体反流4次,弱碱性气体反流2次。立位食团清除时间延长。
症状相关性分析:
1、患者监测期间共记录咳嗽症状17次,与弱酸反流相关4次,弱酸反流的SI为24%、SAP为99%。
2、患者监测期间共记录喘息症状5次,与弱酸反流相关2次。弱酸反流的SI为40%,SAP为 96%。
注:SI为反流/症状指数 ,参考值>50%;SAP:反流/症状相关概率,参考值>95%。
辅助检查
上消化道造影:可见巨大食管裂孔疝,贲门及胃底均疝入胸腔。
辅助检查
食管高分辨率测压:
LES压力低于正常,吞咽时松弛正常。
UES压力低于正常,松弛功能欠佳。
食管体部频繁无效蠕动 (无效吞咽百分比50%) 。
食管裂孔疝。"""具体工作:分析本例病人的病史、体格检查和辅助检查。
模型结果
<think>杨女士,59岁,有一个很明显的问题就是反酸,已经困扰她30年了。这个反酸伴随着烧心、胃胀满和嗳气。特别是弯腰或低头的时候,反酸会更严重。她之前曾不规律地服用一些药物,比如奥美拉唑、吗丁啉等,这些药物能够暂时缓解她的症状,但一停药就又复发了。哦,还有,最近5年她也开始咳嗽,有时候还会喘。这些症状好像在进食后一个小时和夜里表现得更明显。
她的体格检查显示体温略微升高,有双肺散在的哮鸣音,说明她可能有呼吸系统的一些问题。脉搏、血压都在,也不是特别异常。不过她的白细胞不是特别正常,也许有轻微感染?
辅助检查中,胃镜显示她确实有反流性食管炎和食管裂孔疝。听起来挺严重的,她的食道看起来很糟糕,糜烂这么多,贲门也松了,看来食道的粘膜损伤不轻。另外,她的出凝血功能是正常的,并没有发现什么异常。
说到这儿,她的pH阻抗监测结果有点意思。虽然卧位的酸反流时间所占百分比高于正常,但居然DeMeester积分低于正常,这有点奇怪。为什么他的呼吸道会有那么多次咳嗽和喘息呢?难不成是弱酸反流在作祟?监测期间,她的咳嗽和喘息症状确实与弱酸反流相关联,SAP值很高,真是让人怀疑是不是弱酸在搞鬼。
她的高分辨率测压结果显示, LES的压力确实低于正常,而食管体部也存在无效蠕动,这似乎解释了她反流症状的出现。同时,她的上消化道造影结果也显示巨大的食管裂孔疝,这可能进一步导致内容物反流到食管。
所以,综合她所有这些信息,似乎弱酸反流可能是引起她咳嗽和喘息症状的一个重要原因。这听上去合理,因为即使传统意义上的酸反流不是特别严重,但弱酸或非酸性的反流物质有可能刺激她的气道,导致慢性咳嗽和其他呼吸症状。
嗯,总的来说,她的症状不能单单用传统的胃食管反流来解释,可能还需要考虑气道相关的反流。这种观点能够帮助我们理解她的一些不典型表现,看来这个推测还是有一定的依据的。</think>
为了全面分析该患者的症状和检查结果,我们可以从以下几个方面进行综合:
1. **病史与症状**:患者杨女士自30年前就开始出现反酸、烧心等症状,这些典型的症状指向反流性食管炎。此外,她在近10个月出现了加重的咳嗽和喘息症状,这表明可能存在更复杂的原因。
2. **体格检查**:患者的体温略微升高,伴随散在的哮鸣音,提示可能存在呼吸道的问题或感染。
3. **辅助检查**:
- **胃镜**:显示反流性食管炎及食管裂孔疝,这与典型的反流症状一致。
- **胃肠道监测**:患者高分辨率测压和食管pH阻抗监测显示LES压力降低和酸反流增加(尽管积分异常,但仍处在正常范围),提示食管裂孔疝导致的酸反流。
- **上消化道造影**:发现巨大的食管裂孔疝,这可能导致更多的反流症状。
4. **症状的相关性分析**:患者的咳嗽和喘息与弱酸反流相关,且DeMeester积分虽低但不在异常范围,说明存在一定的酸反流。这提示传统意义上的胃食管反流可能并非唯一病因。
综上所述,虽然胃食管反流责任明确,但患者的咳嗽和喘息症状可能与“弱酸反流”或非酸性反流物质的吸入有关。这类吸入性问题被称为“反流相关呼吸症状”(GERS),强调了症状与传统反流之间的关联扩展。因此,需要患者在生活方式、管理以及可能的呼吸症状管理上予以关注,单靠PPI可能不足以完全控制症状。进一步的呼吸科评估可能也有助于她的呼吸道症状管理。
参考结果
(1)病史分析:该病例的早期症状为反酸、反食、烧心,胸骨后烧灼感、嗳气等典型胃食管反流症状为主,抗反流用药治疗可缓解症状,即可诊断为胃食管反流病。之后患者逐渐出现咳嗽、咳痰和喘息等哮喘样症状,该症状呼吸内科治疗效果不佳,再进行抗反流治疗后不但反酸、烧心得到明显缓解,而且哮喘样症状也得到明显缓解。
本病例特点为:①先出现典型胃食管反流病症状,后出现咳嗽、喘息等食管外症状;②抗反流药物治疗可同时缓解反酸、烧心以及咳喘症状。
(2)体格检查分析:体格检查方面此病例在咳喘发作间期无过多的阳性体征,肺部听诊可闻及哮鸣音。
(3)辅助检查分析:本例病人实验室检查无明显异常。通过胃镜、上消化道造影、食管高分辨率测压检查明确患者存在食管裂孔疝和反流性食管炎,食管pH-阻抗检查(口服PPI期间)进一步证实患者的咳嗽和喘息症状均与反流有显著相关性。上述客观检查确诊患者为胃食管反流病,反流性哮喘可能性大。
许可证
本项目采用 MIT 许可证。
致谢
- 感谢
qwen2.5-7B模型的开发者。 - 感谢所有为肿瘤知识问答数据集做出贡献的研究人员。
联系方式
如有任何问题,请联系 [592392714@qq.com]。
注意: 本项目仅供学术研究使用,不构成医疗建议。
Description