Course Project · Human-Computer Interaction

中文医疗领域大语言模型微调

在机器人感知与人机交互课程项目中复现 Huatuo-Llama-Med-Chinese,基于 TinyLlama 与 LoRA 完成中文医疗问答数据的微调、推理与效果复盘,并整理环境配置、GPU 支持、路径硬编码和依赖冲突等调试过程。

TinyLlama 使用 1.1B 级别基座模型跑通课程实验
8658 条 项目自带中文医疗问答 JSONL 数据
LoRA r=8、alpha=16、dropout=0.05
3 epoch 第二轮训练用于观察输出质量变化

Overview

项目概览

项目以现有开源代码为基础,完成从环境准备、模型下载、数据加载、LoRA 微调、推理测试到实验报告整理的完整课程复现流程。页面内容来自当前项目文件夹中的源码、实验报告和课程展示材料,重点展示已经跑通的技术链路与遇到的问题,而不是夸大为医疗模型生产系统。

Llama TinyLlama LoRA Transformers PEFT PyTorch datasets 中文医疗问答

Pipeline

实验流程

环境与依赖整理

在 Ubuntu 20.04 中创建 Python 3.9 虚拟环境,排查 requirements.txt 混入 ROS、Gazebo、无人机等无关依赖的问题,保留 torchtransformerspeftdatasets 等核心库。

模型下载与路径调整

使用 TinyLlama 作为基座模型,并处理 model_download.py 中默认写入 /home/ubuntu 的路径权限问题,将缓存和模型目录调整到可写位置。

数据与医疗模板

训练数据来自 data/llama_data.json,共 8658 条中文医疗问答样本;训练阶段使用 med_template.json 将问题拼接为“问题 / 回答”格式。

LoRA 参数高效微调

finetune.py 加载 Llama 模型和 tokenizer 后,对 q_projv_proj 注入 LoRA 适配器,使用较小可训练参数完成课程实验级微调。

GPU 支持排查

第一次训练因 PyTorch 和 bitsandbytes 缺少 GPU 支持而退回 CPU,训练进度极慢;安装 NVIDIA 驱动和 CUDA 对应 PyTorch 后,torch.cuda.is_available() 正常返回。

推理与结果复盘

使用 infer.py 加载基座模型和 LoRA 权重,对感冒、肝衰竭、阑尾炎与心动过速等测试问题生成回答,并对重复输出和医学准确性不足进行复盘。

Modules

模块拆解

训练主脚本

finetune.py 负责参数解析、模型加载、tokenizer 配置、LoRA 注入、数据集划分、Trainer 配置和适配器保存。

提示词模板

utils/prompter.py 读取 templates/med_template.json,生成训练 prompt;generate.py 也可复用模板系统截取回答。

中文医疗数据

样本字段包含 instructioninputoutput,多数输入为空,任务形式接近中文医疗问答指令微调。

推理脚本

infer.py 使用 PeftModel.from_pretrained 加载 LoRA 权重,并通过 GenerationConfig 控制采样温度、top-p、top-k 和输出长度。

导出工具

export_hf_checkpoint.pyexport_state_dict_checkpoint.py 为后续导出 Hugging Face 格式或 state_dict 权重预留工具链。

实验排错

复现过程中处理了依赖污染、GPU 驱动、数据集版本兼容、模型下载权限和 LoRA 权重路径硬编码等问题。

Code Highlights

框架、参数与关键实现

这一部分从 huatuo-llama-med-chinese 源码中提炼,展示训练、prompt、LoRA 配置和推理阶段的具体实现细节。

LoRA 训练入口

文件:finetune.py
入口函数:train(...)
基座模型:TinyLlama-1.1B-Chat-v1.0
数据路径:data/llama_data.json
输出目录:./my-lora-model

核心加载:
LlamaForCausalLM.from_pretrained()
LlamaTokenizer.from_pretrained()
get_peft_model(model, LoraConfig)

医疗问答 Prompt

模板:templates/med_template.json
prompt_input / prompt_no_input:
下面是一个问题,运用医学知识来正确回答提问.
### 问题:{instruction}
### 回答:

数据字段:
instruction 问题或指令
input 可选补充输入
output 期望回答
样本数量:8658

训练参数与标签处理

LoRA:r=8, alpha=16, dropout=0.05
目标模块:q_proj, v_proj
学习率:2e-4
训练轮数:3
最大长度:cutoff_len=256
微批大小:micro_batch_size=2train_on_inputs=False:
用户 prompt 部分标签写为 -100
只让模型学习回答段。

推理采样配置

文件:infer.py
LoRA 加载:PeftModel.from_pretrained()
回答函数:evaluate(instruction, input_text='')

GenerationConfig:
temperature=0.7
top_p=0.9
top_k=40
num_beams=1
max_new_tokens=256

输出截取:按 ### Response: 分离回答。

Implementation

关键实现与调试点

Result

实验结果与复盘

第一次训练使用较短轮数跑通流程后,模型输出存在重复文本、语义不稳和医学知识不准确的问题。随后将训练轮数调整为 3 个 epoch,并把学习率从 3e-4 降到 2e-4,模型回答的流畅度和结构完整性有所提升,重复输出明显减少。

测试问题覆盖感冒治疗、肝衰竭综合征体征、急性阑尾炎与缺血性心脏病人群差异、心动过速伴心电异常等场景。第二轮训练后,回答的表达更清楚,但仍出现医学概念混淆、过度泛化和事实错误,说明小参数基座模型与有限训练数据难以支撑可靠医疗问答。

这个项目的价值主要在于完整走通大语言模型微调实验链路:从依赖环境、模型下载、数据格式、LoRA 参数、训练脚本到推理测试和错误分析。页面展示的是课程项目实践经验,不作为医疗建议或真实医疗问答系统使用。

项目根目录保留源码目录 huatuo-llama-med-chinese。页面内容已从上传的实验材料和源码中提炼为项目级描述,不依赖 Word 或 PPT 文件。