心血管专科医疗问答 LoRA 模型 (Qwen3-8B-CV-LoRA)

基于 Qwen3-8B 的参数高效微调(PEFT + LoRA)得到的心血管(心血管内科)专科医疗问答助手,配套 RAG(检索增强生成) 索引,同时服务 C端(患者/家属/公众) 与 B端(医生/医学生/药师) 两类用户。

核心能力

C端(患者/家属/公众)

  • 健康科普问答:用通俗语言解释病因、机制、症状
  • 健康自查/有效追问:该注意哪些信号、何时就医
  • 医嘱与用药解读:服药方法、注意事项(禁忌、相互作用)
  • 康复计划建议:生活方式、运动、饮食、随访
  • 检查/报告解读:常见指标与检查结果的通俗解释

B端(医生/医学生/药师)

  • 循证推理/机制:病理生理机制、药理学机制
  • 诊断推测(DDx):症状/体征/检查的鉴别诊断
  • 干预提示:治疗选择、用药注意、药物相互作用(DDI)、禁忌
  • Guideline/方案:诊疗流程、分期分级、随访(SOAP)
  • 检查解读:心电/影像/实验室检查的临床意义

训练数据

训练语料来自 6 本心血管医学相关书籍(已按章节切分为 5781 个语料块),生成 75,198 条 QA 覆盖 4 类任务:

  • Grounded(科普+专业):28,259 条(严格基于文本)
  • Multihop(跨章节推理):19,499 条(综合两段文本)
  • Reviewer(审核官):17,685 条(审核/纠正回答,核查 DDI 与禁忌)
  • General(防灾难性遗忘):9,755 条(通用能力保持)

训练/评估切分:train 61,219 / eval 1,893(聊天格式,带角色标签与资料来源标注,支撑 RAG)。

LoRA 配置

  • 基础模型:Qwen/Qwen3-8B
  • 方法:QLoRA(4-bit + LoRA),r=16, alpha=16
  • 目标模块:q/k/v/o/gate/up/down_proj
  • 优化器:adamw_8bit,学习率 2e-4,cosine 调度,2 epochs
  • 最终训练 loss:约 0.98

RAG 索引

  • 嵌入模型:BAAI/bge-small-zh-v1.5(512 维,中文友好)
  • 索引:faiss.IndexFlatIP(余弦相似度)
  • 语料:6 本书 → 5781 个带章节/页码的语料块
  • 文件:index.faiss / docs.json / doc_meta.json / meta.json

使用方式

加载 LoRA 适配器

from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="Qwen/Qwen3-8B", max_seq_length=2048,
    dtype=None, load_in_4bit=True)
model.load_adapter("chenhaodev/qwen3-8b-cv-lora")
FastLanguageModel.for_inference(model)

prompt = "我爸爸60岁有高血压,最近晚上睡觉突然憋醒坐起来才舒服,还老觉得心慌,这是不是心脏出问题了?"
msgs = [{"role": "user", "content": prompt}]
text = tokenizer.apply_chat_template(msgs, add_generation_prompt=True, tokenize=False)
enc = tokenizer(text, return_tensors="pt").to("cuda")
out = model.generate(**enc, max_new_tokens=300)
print(tokenizer.decode(out[0][enc.input_ids.shape[1]:], skip_special_tokens=True))

使用 RAG 检索增强

先下载本仓库 rag/ 下的 4 个文件到本地(index.faiss、docs.json、doc_meta.json、meta.json),然后:

import json
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer

emb_model = SentenceTransformer("BAAI/bge-small-zh-v1.5")
index = faiss.read_index("index.faiss")
docs = json.load(open("docs.json", encoding="utf-8"))
meta = json.load(open("doc_meta.json", encoding="utf-8"))

def retrieve(query, k=4):
    q = emb_model.encode([query], normalize_embeddings=True)
    scores, idxs = index.search(np.asarray(q, dtype="float32"), k)
    results = []
    for j, i in enumerate(idxs[0]):
        if i >= 0:  # faiss 会为缺失近邻返回 -1
            doc = docs[i]
            src = meta[i].get("label", "")
            content = doc[len(src) + 2:] if doc.startswith("【" + src) else doc
            results.append((float(scores[0][j]), content))
    return results

query = "阵发性夜间呼吸困难 心力衰竭 治疗"
retrieved = retrieve(query)
prompt = "参考资料:\n" + "\n".join(c for _, c in retrieved) + "\n\n请基于以上资料回答:" + query

提示:检索结果每个块默认带 【书名】 前缀(用于溯源)。如不需要,可按上例 content 的写法去除。

使用合并模型(已融合 LoRA,本地)

合并模型(融合 LoRA 后的完整权重 ~16GB,未上传到 Hub,仅保存在本地):

from transformers import AutoModelForCausalLM, AutoTokenizer
model_path = "/workspace/task13/checkpoints/qwen3-8b-cv-merged"
model = AutoModelForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)

如需在 Hub 上独立使用完整模型,请先用 merge_lora.py 合并后自行上传到你的仓库:huggingface-cli upload <你的仓库> checkpoints/qwen3-8b-cv-merged --repo-type model。

免责声明

医疗免责声明:本模型基于有限书籍语料微调与检索增强生成,不能替代专业医师诊断。输出仅供参考,具体诊疗请务必咨询执业医师。非紧急情况仅作一般建议,若出现胸痛、呼吸困难、晕厥等急症请立即就医(拨打 120)。

版版权说明:训练数据源自公开医学书籍的文本切片(用于构建科普/专业 QA),本仓库仅上传 LoRA 适配器、RAG 索引构建脚本与模型卡片,不包含书籍原始长文本,请遵守所用书籍的版权许可。

相关资源

  • 训练/数据处理脚本:scripts/(extract / gen / prep / train / merge / build_rag / infer)
  • RAG 索引:index.faiss、docs.json、doc_meta.json、meta.json(见 rag/)
  • 合并模型(本地,未上传):checkpoints/qwen3-8b-cv-merged/
Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for chenhaodev/qwen3-8b-cv-lora

Finetuned
Qwen/Qwen3-8B
Adapter
(2411)
this model