Fine-Tuning-LLMs-for-Medical-Entity-Extraction
architkaila/Fine-Tuning-LLMs-for-Medical-Entity-Extraction加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样的场景:清晨,某三甲医院的药房接到一批新的药物不良反应报告——厚厚一叠电子邮件,每封都要人工阅读、提取药物名称和副作用信息,然后录入系统。这项工作单调、枯燥且极易出错。药剂师们疲于应付,影响了真正应该专注的事情:保障患者用药安全。
这是 Duke 大学 AIPI 591 独立研究项目中 Archit 同学面对的真实问题。他的毕业设计选题,正是用大语言模型(LLMs)自动化地从药物不良事件报告中提取关键信息——药物名称和副作用。整个项目开源托管于 GitHub,目前收获 90 Stars,聚焦于 Llama2 和 StableLM 两款主流开源大模型的 PEFT 高效微调。
初看起来,用现成的大模型做实体提取似乎理所当然——GPT-4、Claude 都能做。但背后有几个关键制约:
一是数据隐私。 药物不良事件报告往往涉及患者信息,直接上传到第三方 API 存在合规风险。本地部署的开源模型从根本上规避了这个问题。
二是成本。 每份报告都要调用 API,积少成多费用可观。在自建 GPU 服务器上微调过的模型,推理成本趋近于零。
三是精度。 通用模型对药物领域术语「两眼一抹黑」——专业缩写、多药联用场景下,表现远不及针对性微调的领域模型。
项目采用了两种主流的参数高效微调技术:LoRA 和 Adapter V2,各有所长。
LoRA 的核心思路是「不动原始权重,只加旁路」。在微调时,模型原始权重 W 保持冻结,新训练一个低秩矩阵 ΔW = BA(其中 B 是 m×r,A 是 r×k,r 即 rank),最终权重为 W + ΔW。由于 r 通常取 4~64,相比全量微调需要更新数十亿参数,LoRA 只需训练 r×(m+n) 个参数,显存占用大幅下降。
本项目中 LoRA 配置:
Adapter 的思路是在 Transformer 层之间插入小型适配层。与 LoRA 不同,Adapter V2 的适配层串联在注意力机制中,通过残差连接与原始权重协同工作。Adapter V2 进一步优化了缩放因子和 LayerNorm,使训练更稳定。
本项目中 Adapter V2 配置:
两种方法在 700 条合成数据集上训练 5 个 epoch,全程基于 Lightning 框架和 PyTorch FSDP(Fully Sharded Data Parallel)策略实现分布式训练。
这是本项目最具创新性也最费力的环节——作者从 Drugs.com 爬取了 50 种常用药的说明书信息,然后用 ChatGPT 生成模拟不良事件报告(邮件格式),每封报告附有标准化的 JSON 输出(drug_name + adverse_events)。
数据生成使用精心设计的 prompt 模板:
"Act as an expert Analyst with 20+ years of experience in Pharma and Healthcare industry. You have to generate Adverse Event Reports in JSON format..."
最终构建了 700 条训练样本 + ~70 条测试样本,覆盖精神科、免疫抑制剂、胃肠道、降脂、糖尿病、呼吸系统等十余个药物类别。药物包括阿立哌唑(Abilify)、英夫利昔单抗(Infliximab)、艾司西酞普兰(Lexapro)等常见药。
数据脱敏说明:所有报告均为合成数据,无真实患者信息。
| 模型 | 微调方式 | Precision | Recall |
|---|---|---|---|
| Llama-2-7B | 无(Base) | 0.00 | 0.00 |
| Llama-2-7B | PEFT(LoRA) | 0.87 | 0.85 |
| Llama-2-7B | PEFT(Adapter) | 0.88 | 0.89 |
| StableLM-3B | 无(Base) | 0.00 | 0.00 |
| StableLM-3B | PEFT(LoRA) | 0.81 | 0.82 |
| StableLM-3B | PEFT(Adapter) | 0.85 | 0.83 |
关键发现:未微调的基座模型在此任务上几乎完全失效(0 分)——即使尝试 few-shot prompt,输出的 JSON 格式也无法可靠解析。经过 PEFT 微调后,两款模型均有显著提升。Llama-2-7B 的 Adapter V2 微调方案以 P=0.88、R=0.89 的成绩拔得头筹。
这揭示了一个重要规律:领域实体提取任务,finetune 是必选项而非可选项。
architkaila/Fine-Tuning-LLMs-for-Medical-Entity-Extraction/
├── finetune/
│ ├── lora.py # LoRA 微调脚本(基于 lit-gpt)
│ └── adapter_v2.py # Adapter V2 微调脚本
├── generate/
│ ├── inference_lora.py # LoRA 模型推理
│ └── inference_adapter.py # Adapter 模型推理
├── scripts/
│ ├── scrape_drugs_data.py # 爬取 Drugs.com 药品信息
│ ├── data-prepare.py # 调用 ChatGPT 生成合成报告
│ ├── prepare_entity_extraction_data.py # tokenize + 生成 torch dataset
│ └── evaluate.py # 精确率/召回率评估脚本
├── lit_gpt/ # Lightning 团队的 LIT-GPT 框架副本
└── data/
├── entity_extraction/ # 训练/测试数据集
├── entity_extraction_reports/ # 合成不良事件报告
└── predictions-*.json # 各模型推理结果
核心依赖:torch>=2.1.0、lightning(from git)、bitsandbytes==0.41.0(量化)、openai、datasets、tokenizers。
代码质量评分 7/10。整体结构清晰、注释详尽(每个函数均有 docstring),但无自动化测试用例,仅有交互式 Jupyter Notebook。文档质量优秀——README 包含完整的从数据采集到模型推理的全链路说明。
最低配置要求:
部署流程(全程命令行,无 Web UI):
不推荐理由:项目无 Docker 支持、无 Web 界面,需要手动处理 CUDA 环境、模型下载和依赖兼容性,对新手不友好。但对于有 GPU 资源的研究者,这是一份可以直接复现的高质量参考实现。
项目自身坦诚列出了以下局限:
数据集规模有限。 700 条训练样本在 LLMs 的规模面前仍然偏小,实际部署到真实医院场景中可能遇到更多边缘情况。50 种药物的覆盖面也远不够全面。
合成数据的天花板。 所有训练数据由 ChatGPT 生成,分布单一,与真实医师书写的不规范报告存在较大差距。README 中计划未来在更大规模的生物医学语料上预训练,再在真实数据上微调。
无持久化部署方案。 项目止步于 Jupyter Notebook 和命令行脚本,缺少 API 封装和服务化部署(FastAPI/Gradio),限制了实际应用场景。
PEFT 微调在医疗 NLP 领域的重要性正在快速上升。本项目验证了一个核心假设:在药物安全监控这个对数据隐私和领域精度要求极高的场景中,经过 PEFT 微调的开源 LLMs 完全有能力替代通用商业模型,且成本更低、可控性更强。
Llama-2 + Adapter V2 在 Precision 0.88 / Recall 0.89 上的表现,对于一个仅用 700 条合成数据训练出的模型来说,已经相当可观。更大的数据集、更丰富的药物类别和更长的上下文窗口,是下一步提升的关键方向。
对于想将 LLMs 落地到医疗场景的开发者,这个项目提供了从数据采集、合成数据生成、PEFT 微调、到评估的完整 pipeline 参考,是一份不可多得的实战教材。