简介面向大型语言模型微调训练的医疗数据集适合算法工程师、医学信息研究者及有一定机器学习基础的初学者。资源整合了内科、外科、儿科、肿瘤科等科室的中文问诊对话以及妇产科、男科、肝病等专科数据并包含huatuo、llama、medicalgpt、doctorchat等多来源语料可用于指令微调、领域问答与医学对话生成等实践。压缩包共34个文件整体224.51MB主要为json、csv格式的结构化数据辅以py脚本用于数据转换与生成另有zip子包、txt说明和README文档便于按需取用。已有204人学习。使用时能获得可直接加载的医疗问答数据、数据处理脚本、中英翻译与对话生成工具以及目录组织清晰的完整语料集合帮助降低构建医疗大模型训练数据的门槛。1. llm-medical-data医疗大模型微调前先把这份语料库的底细摸清想微调一个医疗问答模型最难的不是训练脚本而是找到一份能用的训练语料。llm-medical-data 这份医疗数据集在本地社区流传有一阵子了解压开是几十个文件中文科室对话、英文 NHS QA、华佗 llama 数据混在一起还带着一堆.zbak备份脚本第一眼容易看懵。它的定位很明确给大模型微调训练提供多来源、多语言、可直接转换的医疗对话语料覆盖妇产科、外科、儿科、肿瘤科、内科、男科这些常见科室同时搭好了 csv 转 json 和英文翻译脚本减少预处理工作量。这份资源特别适合个人学习和独立做实验的从业者——数据量不至于大到烧不起训练卡结构又没有干净到让你忽略预处理是练习微调全流程的好样本。如果你正准备用 LLaMA、Qwen 这类底座做医疗问答或者想把通用模型往某个科室方向掰一掰这份数据值得先看明白再下手。2. 拆开数据包四大数据族与各自的训练定位2.1 中文科室对话chinese_medical_dialogue_data 是主力chinese_medical_dialogue_data目录下是按科室拆好的文件obgyn_妇产科.zip、surgical_外科.csv、pediatric_儿科.csv、oncology_肿瘤科.csv、IM_内科.zip、andriatria_男科.csv外加一个sample_h100.csv。注意妇产科和内科是 zip 压缩包原整理者应该是按数据量做了分卷归档用之前先解压看内部结构别直接拿 zip 路径去喂脚本。这批数据是整个数据集的“底座”。每条记录通常包含科室、患者主诉、医生回复这类字段格式是 CSV 表格适合先用 pandas 读一遍做统计。我一般会先跑一个df.describe()或者直接看前 20 行确认表头字段到底叫input/output还是问/答——不同科室文件的字段命名不一定统一这个差异在转格式的时候会坑你。这批数据的主要用途是单轮问诊 SFT 和多轮对话微调。它的问答结构是“患者描述症状、医生给出建议”跟线上问诊场景最接近。但不同科室文件之间可能有相似样本比如“腹痛”这种主诉会同时出现在内科和外科里混进训练集会让模型对同一主诉学出多套回答后面配比时要做去重或按科室分层采样。2.2 英文医疗 QANHS UK 与在线问诊平台数据的定位prepared_generated_data_for_nhs_uk_qa.csv和prepared_generated_data_for_nhs_uk_conversations.csv是把英国 NHS 的公开问答整理成可训练格式的结果字段已经对齐可以直接读。doctorchat_data里的iCliniq.json、GenMedGPT-5k.json和HealthCareMagic-100k.zip则来自海外在线问诊平台能补充英文医疗术语和问诊表达。国内多数微调实验是纯中文语料混入英文 QA 数据有两个价值一是扩大模型对英文医学名词的理解二是有些疾病描述尤其是罕见病的中文语料极少英文问诊文本能兜底。代价是这几种英文数据格式各不相同iCliniq.json和GenMedGPT-5k.json是 JSON 但结构不一样HealthCareMagic-100k.zip还需要解压看内部层级格式统一这件事落到第 3 章解决。2.3 生成式增强数据脚本与种子任务的边界huatuo_llama_med_chinese_data里其实套着liver_cancer.json、llama_data.json、opengpt_data这些子目录跟medicalgpt_data下的dialogue_generation.py、dialogue_seed_task.json、dialogue_task.json是一套东西——用种子任务和生成脚本批量制造对话样本。book_data.json、book_based_question_generation.py、book_based_qa.json则是从医学书籍文本里抽问句生成 QA适合补充长尾症状和机制解释类问题。这类生成数据的训练价值在于多样性但质量上下限差距很大使用时最好过滤掉空输出和明显答非所问的记录。test_result.json是脚本跑完的中间产物别当训练数据用。全套文件按数据族归纳如下方便你对照清单做取舍数据族典型文件格式训练定位中文科室对话obgyn_妇产科.zip、surgical_外科.csv、pediatric_儿科.csv、oncology_肿瘤科.csv、IM_内科.zip、andriatria_男科.csv、sample_h100.csvCSV / ZIP中文问诊 SFT 主力英文医疗 QAprepared_generated_data_for_nhs_uk_qa.csv、prepared_generated_data_for_nhs_uk_conversations.csv、iCliniq.json、GenMedGPT-5k.json、HealthCareMagic-100k.zipCSV / JSON / ZIP英文医疗语料补充生成增强数据liver_cancer.json、llama_data.json、opengpt_data、book_based_qa.json、dialogue_task.jsonJSON多样性增强、长尾补充配套脚本csv2json_*.py、en2zh_trans_google.py、dialogue_generation.py、book_based_question_generation.pyPython格式转换与数据生成先按数据族各过一遍再决定“这轮训练到底用哪些文件”比把全部数据一股脑灌进模型里稳妥得多。3. 统一格式与语料清洗csv2json 和翻译脚本的正确打开方式3.1 先搞清楚为什么要统一格式很多人微调翻车不是卡在模型而是把 CSV 直接喂给 Trainerprompt 拼装全靠临场正则跑一半才发现字段对不上。训练框架LLaMA-Factory、transformers Trainer 都一样读数据时要么读 JSON 数组要么读 JSONL每条样本都需要稳定的instruction/output/input结构CSV 里表头一旦有差异代码里row[dialogue]取到的就是 None模型学到的全是空输出。数据包里的csv2json_chinese_medical_dialogue_data.py就是干这个的把按科室拆好的 CSV 统一转成 JSON 数组再套统一的系统提示词模板。csv2json_opengpt_data.py本质一样只是目标数据源换成 opengpt 导出的记录。核心转换逻辑不复杂但有几个兼容细节不能省。3.2 csv2json_chinese_medical_dialogue_data.py 的兼容写法import csv import json def convert_chinese_medical_csv(csv_path, json_path, system_promptNone): 将科室CSV转成微调用的JSON数组。 csv_path: 妇产科/外科等科室CSV的路径 json_path: 输出JSON的路径 system_prompt: 兜底的系统提示词不同科室可传入不同模板 if system_prompt is None: system_prompt 你是一名专业的临床医生请根据患者的描述给出诊断建议。 samples [] with open(csv_path, r, encodingutf-8) as f: # 用 DictReader 而不是 split(,)避免引号内逗号把字段切碎 reader csv.DictReader(f) for row in reader: # 字段名在不同科室文件里不统一用 or 链做兜底 user_turn row.get(input) or row.get(问) or row.get(patient) doctor_turn row.get(dialogue) or row.get(output) or row.get(答) or row.get(doctor) if not user_turn or not doctor_turn: # 空行直接丢弃不占训练预算 continue samples.append({ system: system_prompt, instruction: user_turn.strip(), output: doctor_turn.strip(), department: row.get(department, row.get(科室, general)) }) with open(json_path, w, encodingutf-8) as f: json.dump(samples, f, ensure_asciiFalse, indent2) return len(samples)这段代码的关键在三个地方。字段名用 or 链兜底是为了兼容不同科室文件表头不统一的问题input取不到时自动落到问或patient不会因为一个字段缺失整个脚本崩掉。csv.DictReader能正确处理引号内逗号比手写line.split(,)安全得多。ensure_asciiFalse保证中文以可读形式写进 JSONindent2方便人工抽查 diff。参数方面system_prompt建议按科室差异化设置例如肿瘤科可以加一句“回答时说明可能的治疗方案适用范围”外科可以强调“先评估急诊指征”。转换完看一眼返回的条数跟你wc -l统计的原始行数对得上再进下一步对不上就去查丢的是不是全是空表头行。3.3 en2zh_trans_google.py英文语料汉化的取舍数据包里带了一个en2zh_trans_google.py还有.zbak备份版作用是把英文问答翻译成中文。为什么要做汉化很多人的实验是纯中文跑直接混入英文语料tokenizer 的词表会被英文占掉大量位置中文表达反而被压缩。但翻译这件事也有代价——机器翻译出来的医学术语经常是翻译腔比如“chest pain”被直译成“胸部疼痛”而中文临床更常说“胸痛”。import time def translate_batch(en_texts, translator, sleep_interval0.5): 批量翻译英文医疗QA带单条失败跳过和限速。 en_texts: 英文文本列表 translator: googletrans或官方云翻译的客户端实例 sleep_interval: 两次请求之间的间隔秒数防止触发限流 zh_results [] for i, text in enumerate(en_texts): try: zh_results.append(translator.translate(text, srcen, destzh-cn).text) except Exception as e: # 单条失败不要中断整批记录下来最后统一重试 zh_results.append(None) print(f[skip] row {i}: {e}) time.sleep(sleep_interval) return zh_results免费接口有 QPS 限制示例里的sleep_interval0.5是保守值批量 5000 条以上建议改成 1 秒并断点续传处理到一半挂了至少能接着跑。我的习惯是翻译结果不直接覆盖原英文字段而是保留英文原文本做对照训练时按需二选一。翻译完抽 50 条人工看一眼术语质量如果“胸痛”全变成“胸部疼痛”说明翻译链路需要调 prompt 或者换术语表。提示脚本里的.zbak后缀是文本编辑器自动生成的备份正式路径是.py结尾的版本先看 README 确认再用。3.4 转换后的一致性校验格式转换完不能直接开训先跑一遍校验脚本检查三类常见问题空字段、重复文本、输出长度异常。这类问题在原始 CSV 里看不出来转成 JSON 后会直接变成训练样本的噪音。import json def validate_samples(path): 校验转换后的JSON数组输出问题清单。 path: 转换脚本产出的JSON文件路径 with open(path, r, encodingutf-8) as f: data json.load(f) issues [] for idx, item in enumerate(data): instruction item.get(instruction, ) output item.get(output, ) if not instruction or not output: issues.append(frow {idx}: empty field) elif len(instruction) 4: issues.append(frow {idx}: instruction too short) elif len(output) len(instruction) * 0.3: issues.append(frow {idx}: output too short) print(ftotal{len(data)}, issues{len(issues)}) return issues判断逻辑里len(output) len(instruction) * 0.3这个阈值要宽松因为有些科室问诊回答本来就简短比如“注意休息多喝水”这种医嘱。阈值定太严会把正常样本误杀。校验完如果有问题回到源 CSV 查那几行的原始内容大概率是表头错位或多行文本被错误切割。4. 数据配比与采样策略混合语料不打架的一套参数模板4.1 为什么配比比堆数据更关键如果直接把所有 CSV 和 JSON 拼在一起丢进模型会发生两件事一是中文科室数据占绝对大头英文和生成数据被淹没模型只会输出中文二是单轮 QA 多、多轮对话少模型学会的是“一问一答”的短回答模式遇到连续追问就卡壳。配比是混合数据微调里最影响最终行为的一步比无脑加数据管用。我做医疗微调的默认配比是单轮问诊 QA 占 50%多轮对话占 30%生成式增强占 20%。英文语料在纯中文实验里控制在 15% 以内超过这个比例loss 曲线大概率开始震荡。这个比例不是拍脑袋定的来自一个朴素的观察——线上问诊场景里患者一次提问、医生一次回答是主流多轮追问是少数生成式数据只是用来补长尾不该反客为主。4.2 采样参数怎么设import random def build_mix(qa_samples, chat_samples, gen_samples, total20000, chat_ratio0.3, qa_ratio0.5, seed42): 按比例从三类数据中采样并打散返回训练集。 qa_samples: 单轮问答样本列表 chat_samples: 多轮对话样本列表 gen_samples: 生成式增强样本列表 total: 目标训练样本总数 chat_ratio / qa_ratio: 多轮与单轮占比生成式占比自动取剩余 random.seed(seed) n_chat int(total * chat_ratio) n_qa int(total * qa_ratio) n_gen total - n_chat - n_qa picked ( random.sample(chat_samples, min(n_chat, len(chat_samples))) random.sample(qa_samples, min(n_qa, len(qa_samples))) random.sample(gen_samples, min(n_gen, len(gen_samples))) ) random.shuffle(picked) return picked几个参数的实际意义seed固定是为了实验可复现换了随机种子同样代码跑出的数据分布不同模型效果差异没法归因。各列表样本不足时用min(n, len(...))取全部绝不补重复样本凑数重复数据会让模型加速过拟合。random.shuffle打散样本避免同一个科室的样本连成一长块导致训练前期梯度方向单一。语言过滤可以在传入前做qa_samples [s for s in qa_samples if s[output] and is_chinese(s[output])]。这样英文语料在纯中文实验里直接被挡在门外不参与配比。4.3 一份可以直接套用的配比清单数据族默认占比调参方向适用实验中文单轮 QA科室 CSV50%偏低时模型回答偏短偏空通用医疗问答中文多轮对话科室 CSV 多轮部分30%过高会导致训练变慢、幻觉增加多轮问诊客服生成式增强book_based_qa 等20%质量不确定时先降到 10%冷门症状扩展英文 QANHS / iCliniq / HealthCareMagic≤15%纯中文实验直接设 0%英文医疗问答配比定好后样本总数控制在 2 万条左右、训练 16 轮以内比较稳妥。别一上来就全量 10 万条烧卡先用小配比跑通一次完整训练确认 loss 能降、生成结果不乱再逐步加量。数据配比这步没有绝对正确答案最终要以验证集效果为准但这个模板能帮你把第一次实验的成本压到最低。5. 避坑排查医疗数据微调常见的五个现场问题5.1 中英混训导致 loss 曲线锯齿状不下降现象怎么调学习率loss 都在 0.7 到 1.2 之间来回抖像锯齿一样降不下去。原因中英文在 embedding 空间分布差异太大同一个 batch 里中英文混合梯度方向互相拉扯模型还没学会中文就跑去学英文。解决纯中文实验把prepared_generated_data_for_nhs_uk_*、iCliniq.json这些英文文件直接摘出去必须保留英文时按语言分 batch 交替训练或者对英文数据先做汉化走第 3.3 节的翻译链路。5.2 模型开始复读训练样本现象验证集生成的结果跟某条训练样例一字不差甚至连原科室名都带出来。原因数据里重复文本太多尤其生成式增强数据会把某些种子问题扩散成大量相似样本模型直接背下来了。解决先按文本 hash 做全局去重把生成式数据占比压到 20% 以内学习率从常见的 3e-5 降到 2e-5并加大weight_decay压制过拟合。5.3 字段错位导致训练崩溃或答非所问现象训练不报错但生成内容经常把“患者问题”和“医生回答”串着说。原因不同科室文件的字段名不一致转换脚本用了固定的row[dialogue]取到 None 之后样本结构就乱了。解决转换时用 or 链兜底也就是第 3.2 节代码里的写法转换完跑一遍validate_samples确认instruction和output全部非空、长度合理。5.4 .zbak 备份文件引发的依赖错乱现象照着包内requirements.txt装依赖失败仔细一看文件名后缀是.zbak。原因仓库打包时没清理编辑器自动生成的备份文件备份内容可能比正式版更新让人分不清该信哪个。解决先看 README 对依赖的说明把.zbak后缀去掉后对比两份文件内容以较新版为准装完跑一次import冒烟测试缺什么补什么。5.5 版权与合规边界现象不知道这批数据能不能商用、要不要署名训练出的模型能不能对外发布。原因数据来源是公开医疗问答平台、生成脚本和书籍文本版权归属复杂数据集标注的使用场景是“个人学习”。解决个人实验、学习对比随便用商用或对外发布衍生模型前逐文件核对来源授权不确定性高的直接剔除涉及患者隐私的信息一律不灌进模型。医疗数据不是普通文本这条边界守住了后面才不会出大问题。6. 验证与增量把自家科室语料补进微调管线微调之前先做留出验证。我从整个配比好的数据集里抽 5% 当验证集训练中每 200 步做一次生成测试用 ROUGE-L 看回答覆盖度。验证集别从同一个科室文件里抽——抽一个内科的验证集放到外科训练数据里指标会虚高换科室就露馅。按科室分层抽样每个科室留出对应比例才能反映真实效果。跑通基础流程后增量补充自家语料是常见需求。数据包里book_based_question_generation.py的思路是把书稿文本切段按种子问题模板生成 QA。如果你想补某个冷门科室可以写一个简化版def generate_qa_from_paragraph(paragraph, seed_questionsNone): 从一段医学文本生成QA对用于补充冷门科室数据。 paragraph: 教材/指南里切出来的段落文本 seed_questions: 问句模板列表 if seed_questions is None: seed_questions [ 请解释一下这段内容中的关键概念。, 针对这个情况临床上通常如何处理, 患者如果出现相关症状需要注意什么 ] text paragraph.strip() if len(text) 30: # 太短的段落生成不出有效QA直接跳过 return [] return [{instruction: q, output: text} for q in seed_questions]这段生成逻辑很朴素一段文本套三个问题模板生成三条 QA。它的问题在于生成质量的上限不会超过原文——原文写得不清楚生成出来的 QA 也救不回来。所以段落要切短聚焦单一知识点比如“黄疸的鉴别诊断”单独切一段而不是把整个内科章节扔进去。生成完必须做一轮人工抽检每 100 条抽 10 条看有没有答非所问。我从那以后养成了一个习惯每次准备医疗微调数据都强制走一遍“字段校验 → 配比采样 → 小批次冒烟训练 → ROUGE 验证”四步。中间任何一步发现问题回头修数据不硬着头皮往下跑。数据这关翻车了模型不会给你解释的机会它只会安静地产出看起来合理实则荒谬的回答。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Blender插件精选:模型格式转换FBX/GLB/USD避坑指南 Blender插件精选:模型格式转换FBX/GLB/USD避坑指南 【免费下载链接】awesome-blender 🪐 A curated list of awesome Blender addons, tools, tutorials; and 3D resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-b… · 2026/9/25 2:44:26
猫抓浏览器扩展最短路径实操:网页媒体嗅探与 M3U8 离线保存 猫抓浏览器扩展最短路径实操:网页媒体嗅探与 M3U8 离线保存 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch
猫抓(cat-catch… · 2026/9/25 2:44:26
东软防火墙配置实战:从初装到上线运维的完整指南 简介:东软NetEye防火墙用户配置手册是面向网络管理员、安全运维人员及防火墙初学者的官方技术文档,对应V3.2.4版本,系统讲解设备工作原理、会话机制、工作模式以及数据包处理流程,并围绕虚拟系统、高可用性、虚拟专用网、攻击防御… · 2026/9/25 2:44:26
YOLO12复现报错 参考文章:
YOLOv12快速复现部署&训练测试_yolov12复现-CSDN博客https://blog.csdn.net/WhiffeYF/article/details/145866853
运行这个命令时报错 报错内容:ERROR: flash_attn-2.7.3cu11torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl is not… · 2026/9/25 2:44:26
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37