Files
COT_Medical_Qwen_Large_Lang…/README.md
ModelHub XC e0ad8d9840 初始化项目,由ModelHub XC社区提供模型
Model: zpeng1989/COT_Medical_Qwen_Large_Language_Model
Source: Original Platform
2026-09-19 15:43:14 +08:00

369 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 医疗思考链问答大模型
## 项目概述
本项目旨在构建一个针对医疗知识的思考链条的问答大模型,基于`qwen2.5-7B`模型作为基座模型使用LoRALow-Rank Adaptation技术进行微调。模仿DeepSeek模型增加"深度思考模式(think)"。模型训练数据涵盖了医疗问诊、咨询等权威医学领域知识信息并通过问答题目进行微调以提升模型在医学领域的问答能力。这种数据预处理的策略充分挖掘了Qwen模型强大的推理能力使其能够模拟在医疗场景中如何发现患者记录描述信息中获取到关联性的过程。
## 模型架构
- **基座模型**: `qwen2.5-7B`
- **微调方法**: 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技术对`qwen2.5-7B`模型进行微调。LoRA通过在预训练模型的权重矩阵中引入低秩矩阵来减少参数量从而在保持模型性能的同时降低计算成本。
### 训练步骤
1. **加载预训练模型**: 加载`qwen2.5-7B`模型。
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/COT_Medical_Qwen_Large_Language_Model')
```
Git下载
```
#Git模型下载
git clone https://oauth2:eDTzbKYiKrNCswNiDx1s@www.modelscope.cn/zpeng1989/COT_Medical_Qwen_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
# 加载 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×109LN 78
尿常规正常。
2多普勒超声检查
沿腹股沟纵切可见一多层分布的混合回声区宽窄不等远端膨大边界整齐长约45cm。
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病史摘要
杨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>杨女士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 许可证](LICENSE)。
## 致谢
- 感谢 `qwen2.5-7B` 模型的开发者。
- 感谢所有为肿瘤知识问答数据集做出贡献的研究人员。
## 联系方式
如有任何问题,请联系 [592392714@qq.com]。
---
**注意**: 本项目仅供学术研究使用,不构成医疗建议。