NanoUro-LLM 是一个专为泌尿科 (Urology) 临床场景设计的轻量级大语言模型微调框架。 基于 Unsloth 加速引擎与 RJUA-QADatasets,致力于将 DeepSeek-R1、Gemma 3 等通用模型转化为具备一定泌尿临床知识的专科 AI 助手。
通用大语言模型(General LLMs)在处理特定医学专科问题时,常面临专业知识匮乏与推理成本过高的双重挑战。
NanoUro-LLM 针对仁济医院泌尿科问答数据集构建了一套完整的 ETL -> LoRA Fine-tuning -> Inference 流水线。低成本训练垂直领域医学推理模型的试验方案。
- ⚡ 微调加速:基于
Unsloth框架,显存占用降低,训练速度提升。 - 🧠 医学思维链:引入 "Medical CoT" 数据结构,训练模型在回答前先进行病理分析与鉴别诊断。
- 🧹 智能清洗:内置针对临床文本的正则预处理引擎,自动去除学术引用(如
[12-15])与格式噪声。 - 🔄 模块化架构:统一接口支持多模态家族:
DeepSeek-R1-Distill(Llama/Qwen) - 推荐 🔥Gemma-3/Qwen-3
- 📦 灵活部署:原生支持 ModelScope、HuggingFace 及本地加载。
本模型基于 RJUA-QADatasets(蚂蚁集团-仁济医院泌尿科问答推理数据集)构建。
- 结构:
{问题, 上下文(医学知识), 答案, 疾病, 建议} - 预处理:针对非结构化医学文本进行标准化清洗与去噪。
框架目前支持以下经过优化的模型架构,同时兼容其他在huggingface /modelscope中的unsloth/[models]模型:
| 模型系列 | 基础架构 | 参数 | 适用场景 |
|---|---|---|---|
| DeepSeek-R1 | Distill-Llama | 8B | 较优逻辑推理能力,适用于需要一定准确性的医学问答和辅助诊断场景 |
| DeepSeek-R1 | Distill-Qwen | 1.5B | 较优推理速度,适合资源受限的问答 |
| Gemma 3 | Google Gemma 3 | 4B | 均衡,响应质量一般 |
| Qwen 3 | Qwen 3 | 0.6B | 小参数量,移动端/边缘设备原型验证,生成质量有限 |
| Gemma 3 | Google Gemma 3 | 270M | 最小参数量,质量较低,仅建议用于演示或非关键任务 |
推荐使用 NVIDIA GPU 环境(显存 ≥ 16GB 推荐,支持 A100/4090D)。
git clone [https://github.com/yufan-pu/NanoUro-LLM.git](https://github.com/yufan-pu/NanoUro-LLM.git)
cd NanoUro-LLMAnaconda 在处理部分依赖时可能较慢,推荐使用 Mamba。
# 创建环境 (Python 3.12)
mamba create -n nanouroLLM python=3.12 ipykernel jupyterlab -y
mamba activate nanouroLLM
# 注册 Jupyter Kernel
python -m ipykernel install --user --name nanouroLLM --display-name "Python 3.12 (nanouroLLM)"请根据你的 CUDA 版本安装:
# 示例:安装兼容 CUDA 12.8 的 PyTorch (请根据 pytorch.org 实际情况调整)
# 确定GPU和cuda支持版本,CUDA Version: 12.8 → 对应安装cu128版本Torch
nvidia-smi
# 安装torch,参考官方示例
[https://pytorch.org/get-started/previous-versions/](https://pytorch.org/get-started/previous-versions/)
# 例:安装torch 2.9.0+cu128
pip install torch==2.9.0 torchvision==0.24.0 torchaudio==2.9.0 --index-url [https://download.pytorch.org/whl/cu128](https://download.pytorch.org/whl/cu128)- 在IDE打开项目文件
NanoUrollm.ipynb
然后运行install required libraries安装
- 打开
NanoUrollm.ipynb运行,项目通过Data curation,MedicalFineTuningFramework类封装了数据清洗及LoRA微调等流程。
RJUA的原始JSON数据包含学术引用和格式噪声,运行Data curation模块
- 输入
RJUA_train.json - 输出
RJUA_train_cleaned.json文件
配置 LoRA 参数一键运行开始训练,框架自动处理分词器和对话模板对齐。
# 1. 初始化框架与模型 (支持 ModelScope/HF)
framework = MedicalFineTuningFramework()
framework.setup_model(
model_key="deepseek-8b",
download_source="modelscope"
)
# 2. 配置 LoRA 适配器 (根据显存调整 r/alpha/dropout 值)
framework.setup_lora(r=16, alpha=16, dropout=0.05)
# 3. 加载数据并训练保存
framework.setup_data("data/RJUA_train_cleaned.json")
stats = framework.train(
output_dir="outputs/deepseek-8b_lora_v1",
max_steps=300, # samples size=1705 /batchsize=4/gradient_accumulation_steps=2 → 214+ steps(1 epoch)
batch_size=4
)使用微调好的 LoRA adapter 进行推理,建议使用绝对路径,
# Configure model paths 配置模型路径
BASE_MODEL_DIR = "./model_cache/unsloth/DeepSeek-R1-Distill-Llama-8B"
LORA_OUTPUT_DIR = "./outputs/deepseek-8b_lora"
# Create DeepSeek specific configuration 创建DeepSeek专用配置
config = ModelConfig.create_deepseek_config()
# Initialize loader 初始化加载器
loader = UnifiedModelLoader(config)
try:
# Load model 加载模型
loader.load_local_lora(BASE_MODEL_DIR, LORA_OUTPUT_DIR)
# System prompt 系统提示词
system_prompt = "你是一个泌尿科医学专家,请根据患者描述和医学知识,详细推理后给出专业诊断和治疗建议。"
# Test inference 测试推理
user_input = "医生您好,我父亲70岁,平时晚上上厕所次数有点多,大概3-4次,白天也比较频繁,平时一直口服多沙唑嗪、非那雄胺,因为3年前装了心脏支架,一直长期口服阿司匹林、波立维,这次因为小便有血已经2天了就去了医院看病,做了检查膀胱血块7*7cm,血指标:白细胞:5.21,血红蛋白:151,血肌酐:71,PT:11.3,INR:0.96,请问我父亲这是什么情况?应该怎么处理?"
print("🧪 Testing DeepSeek inference (with thinking chain enabled): 测试DeepSeek推理(启用思维链):")
response = loader.chat(
user_input,
system_prompt=system_prompt,
enable_thinking=True,
max_new_tokens=4096
)
print(f"🤖 NanoUro-LLM: {response}")来自基于此数据集微调的DeepSeek-8B模型的实际输出:
用户(患者): "医生您好,我父亲70岁,平时晚上上厕所次数有点多,大概3-4次,白天也比较频繁,平时一直口服多沙唑嗪、非那雄胺,因为3年前装了心脏支架,一直长期口服阿司匹林、波立维,这次因为小便有血已经2天了就去了医院看病,做了检查膀胱血块7*7cm,血指标:白细胞:5.21,血红蛋白:151,血肌酐:71,PT:11.3,INR:0.96,请问我父亲这是什么情况?应该怎么处理?"
NanoUro-LLM:
(思维过程) 首先,考虑到您的父亲年龄较大且存在心脏疾病史(冠状动脉旁路手术),这将影响他的整体健康状况。出现小便带血可能提示膀胱或尿道感染,或更严重的问题如肾癌、急性肾盂腔炎或其他泌尿系统疾病。结合膀胱血块大小为7×7 cm,白细胞略升(5.21),血肌酐稍高(71),以及正常的凝血功能(PT: 11.3, INR: 0.96),初步判断可能的原因包括:...综上所述,您父亲的情况需要综合考虑膀胱病变、肾脏功能、心脏病历史和自身代谢状况的多方面因素,通过精准的实验室检验、影像学评估和临床试验来明确病因诊断,进而制定合适的治疗方案...(回答) 临床结论与治疗决策: 鉴于您的父亲70岁且有心脏病史,面临小便带血情况下的临床困境,需综合考虑膀胱感染、肾盂腔炎、肾结石等多种可能性。建议进行必要的影像学和实验室检查以明确病因,并依据具体诊断结果采取相应的治疗措施。同时,需密切关注心肾功能变化,以确保治疗过程中的安全性和有效性。
最终建议:
- 进行尿液培养和膀胱核酸检测:判断是否有膀胱细菌感染,指导治疗。
- 进行腹部超声或CT扫描:评估膀胱和肾盂的形态结构,排除肾盂结石等隐患。
- 定期监测肾功能和血液指标:确保治疗不会损害肾脏功能和心脏健康。
- 根据诊断调整治疗方案:如果病情稳定,可以在控制心脏病的前提下恢复正常生活方式。
本框架及模型仅供医学 AI 研究与技术验证使用。
| 局限性 | 说明 |
|---|---|
| 🧠 模型幻觉 | 大型语言模型本质上是一种概率生成模型,可能生成看似合理但事实上不准确、不完整或完全错误(即“幻觉”)的医学信息。这包括但不限于:编造不存在的症状、推荐错误的治疗方案、误诊病情等。不可将其输出视为最终的医学诊断或治疗依据。 |
| 📊 未经系统性临床评估 | 模型尚未经过严格的、大规模的临床前瞻性试验或由权威医学专家委员会的全面评估。其有效性和安全性仍未得到充分验证。模型表现基于有限的测试数据,在真实世界的复杂医疗环境中可能表现不佳。 |
| 🔬 知识截止与覆盖范围 | 模型的训练数据存在知识截止日期,无法涵盖最新的医学研究、临床指南、药品信息或疾病发现。同时,其知识库可能无法覆盖所有罕见病、复杂病症或特定人群的医学情况。 |
| 🤖 小模型的固有缺陷 | 轻量级模型(如 qwen3-0.6b 和 gemma3-270m)表达能力有限。更可能出现逻辑混乱、事实错误、前后矛盾或“胡言乱语”的情况,在医学领域的实用性低,仅建议用于技术演示或非关键场景的探索。 |
| ⚖️ 泛化能力与偏见 | 模型的性能严重依赖于其训练数据。如果训练数据存在分布偏差(例如,某些人群或疾病的数据不足),模型在相应领域的表现会下降,甚至可能放大数据中存在的社会偏见或医学实践差异。 |
- 代码:Apache 2.0 License
- 数据集:遵循 RJUA / OpenKG 原始协议
- 模型权重:遵循基础模型(DeepSeek/Google/Qwen)的使用协议
Made with 奶牛猫 | Powered by Unsloth 和医学热情