Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

NanoUro-LLM:A fine-tuned large language model framework for urology clinical scenarios.

Notifications You must be signed in to change notification settings

yufan-pu/NanoUro-LLM

Repository files navigation

🧬 NanoUro-LLM

泌尿专科微调推理大语言模型

License Python Framework Model

NanoUro-LLM 是一个专为泌尿科 (Urology) 临床场景设计的轻量级大语言模型微调框架。 基于 Unsloth 加速引擎与 RJUA-QADatasets,致力于将 DeepSeek-R1、Gemma 3 等通用模型转化为具备一定泌尿临床知识的专科 AI 助手。

English中文项目特点安装部署微调指南演示案例免责声明


🏥 项目背景

通用大语言模型(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)。

1. 克隆项目

git clone [https://github.com/yufan-pu/NanoUro-LLM.git](https://github.com/yufan-pu/NanoUro-LLM.git)
cd NanoUro-LLM

2. 环境配置 (推荐 Mamba/Conda)

Anaconda 在处理部分依赖时可能较慢,推荐使用 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)"

3. 安装 PyTorch

请根据你的 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)

4.安装 Unsloth 及其他依赖

  • 在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岁且有心脏病史,面临小便带血情况下的临床困境,需综合考虑膀胱感染、肾盂腔炎、肾结石等多种可能性。建议进行必要的影像学和实验室检查以明确病因,并依据具体诊断结果采取相应的治疗措施。同时,需密切关注心肾功能变化,以确保治疗过程中的安全性和有效性。

最终建议:

  1. 进行尿液培养和膀胱核酸检测:判断是否有膀胱细菌感染,指导治疗。
  2. 进行腹部超声或CT扫描:评估膀胱和肾盂的形态结构,排除肾盂结石等隐患。
  3. 定期监测肾功能和血液指标:确保治疗不会损害肾脏功能和心脏健康。
  4. 根据诊断调整治疗方案:如果病情稳定,可以在控制心脏病的前提下恢复正常生活方式。

⚠️ 局限性与免责声明

本框架及模型仅供医学 AI 研究与技术验证使用。

局限性 说明
🧠 模型幻觉 大型语言模型本质上是一种概率生成模型,可能生成看似合理但事实上不准确、不完整或完全错误(即“幻觉”)的医学信息。这包括但不限于:编造不存在的症状、推荐错误的治疗方案、误诊病情等。不可将其输出视为最终的医学诊断或治疗依据。
📊 未经系统性临床评估 模型尚未经过严格的、大规模的临床前瞻性试验或由权威医学专家委员会的全面评估。其有效性和安全性仍未得到充分验证。模型表现基于有限的测试数据,在真实世界的复杂医疗环境中可能表现不佳。
🔬 知识截止与覆盖范围 模型的训练数据存在知识截止日期,无法涵盖最新的医学研究、临床指南、药品信息或疾病发现。同时,其知识库可能无法覆盖所有罕见病、复杂病症或特定人群的医学情况。
🤖 小模型的固有缺陷 轻量级模型(如 qwen3-0.6bgemma3-270m表达能力有限。更可能出现逻辑混乱、事实错误、前后矛盾或“胡言乱语”的情况,在医学领域的实用性低,仅建议用于技术演示或非关键场景的探索
⚖️ 泛化能力与偏见 模型的性能严重依赖于其训练数据。如果训练数据存在分布偏差(例如,某些人群或疾病的数据不足),模型在相应领域的表现会下降,甚至可能放大数据中存在的社会偏见或医学实践差异。

📜 许可证

  • 代码:Apache 2.0 License
  • 数据集:遵循 RJUA / OpenKG 原始协议
  • 模型权重:遵循基础模型(DeepSeek/Google/Qwen)的使用协议

Made with 奶牛猫 | Powered by Unsloth 和医学热情

About

NanoUro-LLM:A fine-tuned large language model framework for urology clinical scenarios.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published