Files

405 lines
25 KiB
Markdown
Raw Permalink Normal View History

# 医疗思考链问答大模型
## 项目概述
本项目旨在构建一个针对医疗知识的思考链条的问答大模型基于Qwen3-8B模型作为基座模型[Qwen/Qwen3-8B]使用LoRALow-Rank Adaptation技术进行微调。模型训练数据涵盖了医疗问诊、咨询等权威医学领域知识信息并通过问答题目进行微调以提升模型在医学领域的问答能力。这种数据预处理的策略充分挖掘了Qwen3模型强大的推理能力使其能够模拟在医疗场景中如何发现患者记录描述信息中获取到关联性的过程。
## 模型架构
- **基座模型**:[`Qwen/Qwen3-8B`]<https://modelscope.cn/models/Qwen/Qwen3-8B>
- **微调方法**: LoRALow-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通过在预训练模型的权重矩阵中引入低秩矩阵来减少参数量从而在保持模型性能的同时降低计算成本。
### 训练步骤
1. **加载预训练模型**: 加载`Qwen3`8B模型。
2. **应用LoRA**: 在模型的关键层应用LoRA技术。
3. **训练模型**: 使用准备好的肿瘤知识问答数据集进行微调。
4. **验证与测试**: 在验证集和测试集上评估模型性能,调整超参数以优化结果。
## 模型评估
### 评估指标
- **准确率**: 模型在问答任务中的准确率。
- **召回率**: 模型能够正确回答的问题比例。
- **F1分数**: 准确率和召回率的调和平均数。
### 评估结果
在测试集上的评估结果如下:
待更新
## 使用指南
### 环境配置
1. **Python版本**: 3.10+
2. **依赖库**:
- `transformers`
- `torch`
### 模型下载
SDK下载
```bash
#安装ModelScope
pip install modelscope
```
```python
#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
```
### 模型推理
```python
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×109LN 78
尿常规正常。
2多普勒超声检查
沿腹股沟纵切可见一多层分布的混合回声区宽窄不等远端膨大边界整齐长约45cm。
3腹部X线检查
可见阶梯状液气平。"""具体工作:简述该病人的诊断及诊断依据。
```
模型增加<think>返回结果:
```
<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%,支持细菌感染的诊断,典型与阑尾炎相符。
综合上述信息中的炎症迹象、症状位置、影像学特征以及实验室检验结果,绞窄性阑尾炎是最符合的诊断。考虑到及时治疗的必要性,建议患者尽快进行进一步诊治。
```
模型去除<think>返回结果:
```
根据提供的患者信息,可以做出以下诊断:
诊断:急性腹股沟淋巴结炎,结合少量阶梯状液气平,需高度考虑并发肠梗阻的可能。
诊断依据:
1. **临床表现**患者49岁3小时前解大便后出现右下腹疼痛并自扪及包块。提示急性疼痛过程且与肠道活动可能存在关联。
2. **体格检查**体温升高至37.8℃提示低热可能存在轻度感染或炎症反应。右侧腹股沟区可扪及圆形肿块约4cm×4cm大小有压痛界欠清且肿块位于腹股沟韧带上内方。此与腹股沟淋巴结肿大一致提示淋巴系统炎症。
3. **实验室检查**血常规显示中性粒细胞比例为78%,提示存在明显炎症反应。结合体温略高,支持急性炎症的诊断。
4. **影像学检查**
- 多普勒超声检查显示沿腹股沟纵切可见一多层分布的混合回声区边界整齐长约45cm。此为典型的淋巴结肿大的超声表现。
- 腹部X线检查显示阶梯状液气平可能与肠道梗阻有关需进一步评估以排除肠穿孔或严重的并发症。
综上,结合临床表现、体格检查及影像学检查结果,诊断为急性腹股沟淋巴结炎,并需警惕并发肠梗阻的可能,建议密切监测病情变化。
```
参考答案
```
诊断:嵌顿性腹股沟斜疝合并肠梗阻。
诊断依据:
①右下腹痛并自扪及包块3小时
②有腹胀、呕吐类似肠梗阻表现腹部平片可见阶梯状液平考虑肠梗阻可能腹部B超考虑
腹部包块内可能为肠管可能;
③有轻度毒性反应或是中毒反应,如 T 37.8℃P 101次白细胞中性分类78
④腹股沟区包块位于腹股沟韧带上内方。
```
#### Case 02
输入问题
```
患者信息如下:"""现病史
1病史摘要
杨XX59岁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>返回结果:
```
<think>这位女士的反酸和烧心症状看起来真的很让人头疼啊从30年前就开始了。说起来这些症状听起来就像典型的反流性食管炎还伴有食管裂孔疝这让情况变得更复杂了。经过几次检查像胃镜和上消化道造影结果一致指向了这些结论看来这些是相当可能的诊断。
而且更有趣的是她的咳喘症状也很有特点。咳嗽和喘息竟然在她5年开始了而且常在吃饭后一小时和凌晨的时候发作。这跟胃食管反流的联系真是剪不断理还乱了。万万没想到她的呼吸问题竟然和反流有着这么明显的关联。
最近的检测确实揭露了不少关键信息——食管pH-阻抗监测在她服用PPI期间显示酸反流的时间还比较长尤其是晚上酸清除能力似乎不太好。这解释了她需要调整药物剂量从耐信20mg BID到40mg BID而这样做对症状又有了一定的改善。
体格检查方面,嗯,看似简单的结果其实也给出了不少提示:体温正常,心跳呼吸都还算平稳。不过,肺部那些散布的哮鸣音还真让人担心。好在腹部检查是平的,没有奇怪的发现,不过这贲门口有些松弛,就足以结合她的食管问题做出诊断了。
通过这些信息综合来看,反流性食管炎和食管裂孔疝的诊断似乎说得通。说到底,她的症状、检查结果以及与反流的联系都指向了这个方向。这一结论看起来是成立的,也不令人意外。</think>
对该病人的病史、体格检查和辅助检查结果进行分析,可以得出以下结论:
1. **疾病摘要**病人杨女士59岁长期受反酸、烧心、胸骨后烧灼感等典型的反流性食管炎症状困扰。此外她还经历了咳嗽、咳痰、喘息等与呼吸系统相关的问题这些症状在进食后及凌晨时分更明显严重影响其生活质量。
2. **体格检查结果**:生命体征基本正常,但双肺听诊时可发现呼吸音粗,散在的哮鸣音提示存在肺部问题。这与她长期的反流现象可能有一定关联。
3. **辅助检查**
- **胃镜检查**显示杨女士患有反流性食管炎LA-C级和食管裂孔疝混合型
- **食管高分辨率测压**揭示LES下食管环) 压力不足,食管体部蠕动无力,并证实食管裂孔疝的存在。
- **食管pH-阻抗监测**口服PPI期间) 显示卧位时酸反流时间较长,表明尽管药物效果总体尚可,某些时段酸反流仍需关注。
- **症状相关性分析**指出,她的咳嗽和喘息症状与弱酸反流显著相关。
综合以上信息杨女士的诊断为反流性食管炎合并食管裂孔疝是相当明确的。她的咳喘症状与胃食管反流密切相关这在同类患者中也不罕见。体格检查及各项检查结果相互支持诊断具有说服力。根据现有资料调整PPI剂量至40mg BID已对她当前的症状提供了较好的控制但未来仍需监测调整治疗方案防止其他并发症的进展。
```
模型去除<think>返回结果:
```
根据提供的信息,对该病人的病史、体格检查和辅助检查可以进行如下分析:
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 许可证](LICENSE)。
## 致谢
- 感谢 `Qwen` 模型的开发者。
- 感谢所有为医疗知识问答数据集做出贡献的研究人员。
## 联系方式
如有任何问题,请联系 [592392714@qq.com]。
---
**注意**: 本项目仅供学术研究使用,不构成医疗建议。