25 KiB
25 KiB
医疗思考链问答大模型
项目概述
本项目旨在构建一个针对医疗知识的思考链条的问答大模型,基于Qwen3-8B模型作为基座模型[Qwen/Qwen3-8B],使用LoRA(Low-Rank Adaptation)技术进行微调。模型训练数据涵盖了医疗问诊、咨询等权威医学领域知识信息,并通过问答题目进行微调,以提升模型在医学领域的问答能力。这种数据预处理的策略,充分挖掘了Qwen3模型强大的推理能力,使其能够模拟在医疗场景中,如何发现患者记录描述信息中获取到关联性的过程。
模型架构
- 基座模型:[
Qwen/Qwen3-8B]https://modelscope.cn/models/Qwen/Qwen3-8B - 微调方法: 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技术对Qwen3模型进行微调。LoRA通过在预训练模型的权重矩阵中引入低秩矩阵来减少参数量,从而在保持模型性能的同时降低计算成本。
训练步骤
- 加载预训练模型: 加载
Qwen38B模型。 - 应用LoRA: 在模型的关键层应用LoRA技术。
- 训练模型: 使用准备好的肿瘤知识问答数据集进行微调。
- 验证与测试: 在验证集和测试集上评估模型性能,调整超参数以优化结果。
模型评估
评估指标
- 准确率: 模型在问答任务中的准确率。
- 召回率: 模型能够正确回答的问题比例。
- F1分数: 准确率和召回率的调和平均数。
评估结果
在测试集上的评估结果如下: 待更新
使用指南
环境配置
- Python版本: 3.10+
- 依赖库:
transformerstorch
模型下载
SDK下载
#安装ModelScope
pip install modelscope
#SDK模型下载
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('zpeng1989/Medical_Qwen3_8B_Large_Language_Model')
Git下载
#Git模型下载
git clone https://oauth2:eDTzbKYiKrNCswNiDx1s@www.modelscope.cn/zpeng1989/Medical_Qwen3_8B_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
# 加载 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℃,有点发烧,虽然不很高,但总觉得不对劲儿。多普勒超声显示在腹股沟有个多层分布的肿块,有压痛,而且边界也不是特别清楚。这个看起来有点像感染,或者是 something 肿胀着。
说到感染,考虑到他是右下腹痛,首先会想到阑尾炎,毕竟这个地方容易出状况。不过,这个包块的位置在腹股沟韧带上方,这又好像更偏向直肠末端或者盆腔的问题了。
接着看看实验室检查,血常规显示白细胞计数是5.0×10^9/L,中性粒细胞占78%。嗯,这个中性粒细胞比例确实偏高,说明可能有细菌参与。不过也奇怪,为什么白细胞不高的?
再说说那些古怪的检查结果。多普勒超声描述的多层混合回声区,还有腹部X线的阶梯状液气平,嗯,这些特征总是导引我们去想绞窄性阑尾炎。绞窄性阑尾因为肿胀和缺血,很容易导致肠道梗阻和坏死,这些描述就越来越符合了。
从新理清一下,右下腹疼痛,腹股沟上方的包块,发热,多普勒超声的特征,再加上中性粒细胞增高,所有这些东西放在一起看,确实更像是绞窄性阑尾炎。
不再怀疑了,综合所有信息,这就是绞窄性阑尾炎,基于那些水乳交融的特征的符合,再加上诊断目的很吻合,应该就是它了。</think>
该病人的诊断为绞窄性阑尾炎。诊断依据包括:
1. 临床表现:患者为49岁男性,主要症状为右下腹痛3小时,并可触及包块。伴随轻微发热(37.8℃),提示可能存在感染或炎症。
2. 多普勒超声检查:显示腹股沟区域存在多层分布的混合回声区,边界整齐,长度约为4-5cm,提示可能有肿胀或组织坏死。
3. 腹部X线检查:出现阶梯状液气平,这一特征通常与肠道梗阻相关,可能进一步支持绞窄性变化的判断。
4. 实验室检查:血常规显示中性粒细胞比例高达78%,支持细菌感染的诊断,典型与阑尾炎相符。
综合上述信息中的炎症迹象、症状位置、影像学特征以及实验室检验结果,绞窄性阑尾炎是最符合的诊断。考虑到及时治疗的必要性,建议患者尽快进行进一步诊治。
模型去除返回结果:
根据提供的患者信息,可以做出以下诊断:
诊断:急性腹股沟淋巴结炎,结合少量阶梯状液气平,需高度考虑并发肠梗阻的可能。
诊断依据:
1. **临床表现**:患者,男,49岁,3小时前解大便后出现右下腹疼痛,并自扪及包块。提示急性疼痛过程,且与肠道活动可能存在关联。
2. **体格检查**:体温升高至37.8℃,提示低热,可能存在轻度感染或炎症反应。右侧腹股沟区可扪及圆形肿块,约4cm×4cm大小,有压痛,界欠清,且肿块位于腹股沟韧带上内方。此与腹股沟淋巴结肿大一致,提示淋巴系统炎症。
3. **实验室检查**:血常规显示中性粒细胞比例为78%,提示存在明显炎症反应。结合体温略高,支持急性炎症的诊断。
4. **影像学检查**:
- 多普勒超声检查显示沿腹股沟纵切可见一多层分布的混合回声区,边界整齐,长约4~5cm。此为典型的淋巴结肿大的超声表现。
- 腹部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>哦,这位女士的反酸和烧心症状看起来真的很让人头疼啊,从30年前就开始了。说起来,这些症状听起来就像典型的反流性食管炎,还伴有食管裂孔疝,这让情况变得更复杂了。经过几次检查,像胃镜和上消化道造影,结果一致指向了这些结论,看来这些是相当可能的诊断。
而且更有趣的是,她的咳喘症状也很有特点。咳嗽和喘息竟然在她5年开始了,而且常在吃饭后一小时和凌晨的时候发作。这跟胃食管反流的联系真是剪不断理还乱了。万万没想到,她的呼吸问题竟然和反流有着这么明显的关联。
哦,最近的检测确实揭露了不少关键信息——食管pH-阻抗监测在她服用PPI期间显示酸反流的时间还比较长,尤其是晚上,酸清除能力似乎不太好。这解释了她需要调整药物剂量从耐信20mg BID到40mg BID,而这样做对症状又有了一定的改善。
体格检查方面,嗯,看似简单的结果其实也给出了不少提示:体温正常,心跳呼吸都还算平稳。不过,肺部那些散布的哮鸣音还真让人担心。好在腹部检查是平的,没有奇怪的发现,不过这贲门口有些松弛,就足以结合她的食管问题做出诊断了。
通过这些信息综合来看,反流性食管炎和食管裂孔疝的诊断似乎说得通。说到底,她的症状、检查结果以及与反流的联系都指向了这个方向。这一结论看起来是成立的,也不令人意外。</think>
对该病人的病史、体格检查和辅助检查结果进行分析,可以得出以下结论:
1. **疾病摘要**:病人,杨女士,59岁,长期受反酸、烧心、胸骨后烧灼感等典型的反流性食管炎症状困扰。此外,她还经历了咳嗽、咳痰、喘息等与呼吸系统相关的问题,这些症状在进食后及凌晨时分更明显,严重影响其生活质量。
2. **体格检查结果**:生命体征基本正常,但双肺听诊时可发现呼吸音粗,散在的哮鸣音提示存在肺部问题。这与她长期的反流现象可能有一定关联。
3. **辅助检查**:
- **胃镜检查**显示杨女士患有反流性食管炎LA-C级和食管裂孔疝(混合型)。
- **食管高分辨率测压**揭示LES(下食管环) 压力不足,食管体部蠕动无力,并证实食管裂孔疝的存在。
- **食管pH-阻抗监测**(口服PPI期间) 显示卧位时酸反流时间较长,表明尽管药物效果总体尚可,某些时段酸反流仍需关注。
- **症状相关性分析**指出,她的咳嗽和喘息症状与弱酸反流显著相关。
综合以上信息,杨女士的诊断为反流性食管炎合并食管裂孔疝是相当明确的。她的咳喘症状与胃食管反流密切相关,这在同类患者中也不罕见。体格检查及各项检查结果相互支持,诊断具有说服力。根据现有资料,调整PPI剂量至40mg BID已对她当前的症状提供了较好的控制,但未来仍需监测调整治疗方案,防止其他并发症的进展。
模型去除返回结果:
根据提供的信息,对该病人的病史、体格检查和辅助检查可以进行如下分析:
1. **病史分析**
- 杨女士,59岁,女性,长期(已有30年)遭受胃食管反流的困扰,主要表现为反酸、烧心、胸骨后烧灼感等。这些症状在服用PPI(如耐信)和促胃肠动力药后能够暂时缓解,但停药后又会反复发作。
- 此外,她还经历了5年的咳嗽、咳痰和喘息症状,这些呼吸道症状与胃食管反流明显相关。症状常在胸骨后反酸或嗳气时加重,尤其是站立或弯腰时。
- 2年前,通过抬高睡眠时的床头和调整用药(使用耐信 20mg BID),反流及相关咳喘症状有所改善。然而,近1年咳喘症状加重,并伴随听力下降。
- 调整用药为耐信 40mg BID后,反流和咳喘症状再次改善,但仍未完全控制,时有发作。这表明胃食管反流问题仍然严重,对呼吸道有持续影响。
2. **体格检查结果**
- 病人生命体征基本正常,体温 36.8 ℃,心率 70 次/分,呼吸频率 20 次/分,血压 136/80 mmHg。
- 双肺听诊时可闻及呼吸音粗糙及散在的哮鸣音,提示存在明显的呼吸道分泌增加或支气管痉挛。
- 腹部检查显示平坦柔软,未触及异常。
3. **辅助检查结果**
- **胃镜检查**显示:反流性食管炎 LA-C 级和食管裂孔疝(混合型)。这解释了她长期的胃食管反流症状,同时也为呼吸道症状提供了一个可能的机制,即反流物质上移刺激迷走神经所致。
- **上消化道造影**结果与胃镜一致,进一步确诊了食管裂孔疝和反流性食管炎。
- **食管高分辨率测压**指出 LES(食管下括约肌)和 UES(上食管括约肌)压力均低于正常,且食管体部存在无效蠕动频率增加,这为胃食管反流提供了解剖学基础。
- **食管 pH-阻抗监测**(口服 PPI 期间)结果显示酸反流时间百分比略低于正常,但卧位酸反流时间增加,酸清除时间延长,提示夜间反流严重。
- 阻抗监测进一步显示立位食团反流时间增加,证实食物团块的反流也是重要因素。
- **症状相关性分析**表明,患者的咳嗽和喘息症状主要与弱酸反流相关。根据标准,反流/症状指数(SI)大于 50% 和症状/反流相关概率(SAP)大于 95% 即表明症状与反流具有统计学显著的相关性。
综合以上分析,杨女士的主要问题为严重的胃食管反流合并食管裂孔疝,且已对呼吸道造成显著影响。改善反流控制,可能对呼吸道症状产生积极效果。同时,还需考虑多学科治疗方案,结合消化系统和呼吸系统的问题进行综合管理。
参考结果
(1)病史分析:该病例的早期症状为反酸、反食、烧心,胸骨后烧灼感、嗳气等典型胃食管反流症状为主,抗反流用药治疗可缓解症状,即可诊断为胃食管反流病。之后患者逐渐出现咳嗽、咳痰和喘息等哮喘样症状,该症状呼吸内科治疗效果不佳,再进行抗反流治疗后不但反酸、烧心得到明显缓解,而且哮喘样症状也得到明显缓解。
本病例特点为:①先出现典型胃食管反流病症状,后出现咳嗽、喘息等食管外症状;②抗反流药物治疗可同时缓解反酸、烧心以及咳喘症状。
(2)体格检查分析:体格检查方面此病例在咳喘发作间期无过多的阳性体征,肺部听诊可闻及哮鸣音。
(3)辅助检查分析:本例病人实验室检查无明显异常。通过胃镜、上消化道造影、食管高分辨率测压检查明确患者存在食管裂孔疝和反流性食管炎,食管pH-阻抗检查(口服PPI期间)进一步证实患者的咳嗽和喘息症状均与反流有显著相关性。上述客观检查确诊患者为胃食管反流病,反流性哮喘可能性大。
许可证
本项目采用 MIT 许可证。
致谢
- 感谢
Qwen模型的开发者。 - 感谢所有为医疗知识问答数据集做出贡献的研究人员。
联系方式
如有任何问题,请联系 [592392714@qq.com]。
注意: 本项目仅供学术研究使用,不构成医疗建议。