MedQuAD — 消费者健康问答权威数据集 AI-Ready Wikipedia | 千方病案医数集

47,457 对 NIH 权威来源消费者健康问答数据集

来源 美国国立卫生研究院国家医学图书馆(NIH/NLM,Lister Hill 中心) url: https://github.com/abachaa/MedQuAD发布时间: 2026-09-08最后更新: 2026-09-08 阅读 6

信息速览

数据集名称MedQuAD — 消费者健康问答权威数据集 AI-Ready Wikipedia | 千方病案医数集
数据类型47,457 个问答对,12 个 NIH 权威来源,37 种问题类型,约 16,428 对含答案文本,CC BY 4.0 免费公开
规模非患者数据:47,457 个公开医学问答对
接入方式美国国立卫生研究院国家医学图书馆(NIH/NLM,Lister Hill 中心) url: https://github.com/abachaa/MedQuAD
AI 就绪度

数据集封面

MedQuAD — 消费者健康问答权威数据集 AI-Ready Wikipedia


INFOBOX

数据集名称 MedQuAD
英文全称 Medical Question Answering Dataset
别名/简称 MedQuAD、Medical QA Dataset、NLM Medical QA Collection
疾病分类 全疾病谱消费者健康主题(ICD-11:2A00-2F9Z 肿瘤 / 5A11 2 型糖尿病 / 8A00 阿尔茨海默病 / BA00 原发性高血压等,详见 §2.1)
SNOMED CT 64572001 Disease (disorder) / 373873005 Pharmaceutical or biologic product / 404684003 Clinical finding(详见 §2.1b)
数据模态 文本(结构化 XML 问答对 + UMLS 自动标注)
AI 任务类型 医疗问答检索、问题类型分类、问题蕴含(RQE)、答案排序、RAG 语料库、消费者健康聊天机器人
样本总数 47,457 个问答对(约 16,428 对含答案文本,31,029 对仅含问题元数据)
数据大小 全量 XML 仓库直接 git clone;Kaggle CSV 转换版 22.84 MB(不含 MedlinePlus 3 个子集)
数据格式 XML(原生)/ CSV(社区转换)
许可证 Creative Commons Attribution 4.0 International(CC BY 4.0)
访问级别 开放(GitHub 直接克隆,无注册与申请)
DUO 标签 NRES(无限制使用)
语言 英文
首发日期 2019-01-26(GitHub 首次提交)/ 2019-01-23(arXiv 预印本)
最后更新 2019-01-26(master 分支此后冻结)
发布机构 美国国立卫生研究院国家医学图书馆 Lister Hill 中心(NLM/NIH Lister Hill Center)
官方主页 https://github.com/abachaa/MedQuAD
下载地址 git clone https://github.com/abachaa/MedQuAD
DOI 10.1186/s12859-019-3119-4(论文)
引用次数 340+(Google Scholar,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐(3/5)— 标注体系完整(37 问题类型 + UMLS CUI)、CC BY 4.0 无门槛获取;扣分项:无官方划分、XML 需自行解析、约 65% 对无答案文本
页面状态 published

§0 E-E-A-T 信任声明与免责声明

医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(全疾病谱主题与 ICD-11/SNOMED CT 映射、消费者健康任务定义、金标准描述)、§7 偏倚分析。

数据工程审核者:千方病案医学编辑部交叉审核:§4 DAIMS 数据字典(XML 层级结构与标注字段)、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

审核日期:2026-09-05

审核方式:交叉审核

利益冲突声明:千方病案医数集与美国国立卫生研究院(NIH)、国家医学图书馆(NLM)及原作者无任何商业利益关联。本页面不销售 MedQuAD 数据集本身,仅提供 AI 就绪指南与学术信息服务。编辑者未接受 NIH、NLM 或原作者的任何形式资助。

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。MedQuAD 以 CC BY 4.0 发布,允许自由使用、共享与改编,但必须给出适当的作者署名(Ben Abacha & Demner-Fushman, 2019, BMC Bioinformatics)与许可链接。注意:3 个 MedlinePlus 子集因版权移除了答案文本,禁止绕过版权约束进行未授权的内容再分发。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。


§1 数据集概览

§1.0 📌 30 秒速览

这是什么? MedQuAD(Medical Question Answering Dataset)是美国国立卫生研究院国家医学图书馆(NLM)于 2019 年发布的大规模消费者健康问答数据集。研究团队为 12 个权威健康网站(如 cancer.gov、GARD、MedlinePlus Health Topics、NIDDK、CDC)分别编写了抽取模式,从这些网站的 FAQ 结构中自动生成了 47,457 个"问题—答案"对,并为每个问题标注了 37 种问题类型、问题焦点及其 UMLS 概念唯一标识符(CUI)与语义类型。

为什么重要? 在 MedQuAD 之前,医疗问答研究缺乏大规模、来源可信、标注规范的答案语料。MedQuAD 全部答案来自政府权威健康信息网站,论文中基于它的检索+蕴含系统比 TREC 2017 LiveQA 医学任务最佳官方成绩相对提高 29.8%,证明了"受限可信答案源"路线的价值。它随后成为医疗 QA、RAG 语料库与症状检查器研究的常用基准,被引用 340+ 次(Google Scholar,截至 2026-09)。

我能用它做什么? 你可以把它用作:检索式医疗问答系统的答案库(BM25/DPR 检索 + 重排);医疗领域 LLM 的 RAG 挂载语料;问题类型分类器与问题蕴含(RQE)模型的训练集;症状检查器与患者教育场景的知识源。注意:需要自行做训练/验证/测试划分,且 3 个 MedlinePlus 子集只有问题元数据而无答案文本。

§1.1 技术摘要

MedQuAD 的构建方法可概括为"分站模式化抽取 + 自动标注 + 人工评判测试集"。研究者针对 12 个 NIH 网站各自的 HTML 文档结构与章节标题(如 MedlinePlus 的 Health Topics 页面、GHR 的基因条目页)手工设计了分站抽取模式,将网页中的 FAQ 式内容转换为规范化的问答对,并以 XML 格式存储。每个问答对自动附加了问题类型(共 37 种,由分站模式直接产生)、问题焦点(focus,即网页主题)、焦点同义词、UMLS CUI(由 UMLS Metathesaurus 精确字符串匹配与 MetaMap Lite 两种方法结合得到)以及 UMLS 语义类型。整个类型体系基于对 1,721 个消费者健康问题的人工评估归纳而来。数据集同时附带一个测试集:对 TREC 2017 LiveQA 医学任务的 104 个真实消费者问题,研究者在 MedQuAD 上检索并人工评判了 2,479 条候选答案,评分沿用 LiveQA 的 1-4 级(Incorrect/Related/Incomplete/Excellent)。该 QA 系统取得 avgScore 0.827,超过该任务最佳官方成绩 0.637 达 29.8%(相对提升)Ben Abacha & Demner-Fushman, 2019, BMC Bioinformatics. DOI: 10.1186/s12859-019-3119-4

§1.2 战略价值

维度一:可信来源稀缺性。 大多数医疗 QA 语料(如 Stack Exchange 医学区、HealthTap)答案质量参差且无审核;MedQuAD 的全部内容来自 NIH 体系网站的编辑审校流程,天然规避了"答案可信度"这一医疗 QA 最致命的问题。对构建面向患者的对话系统或 RAG 应用而言,它提供了一个"无需额外事实核查即可挂载"的高质量知识底座——这是同类数据集中几乎唯一的存在。论文结论明确指出:仅依赖这一受限可信来源集合(约 4.7 万对),检索系统的得分反而超过依赖整个万维网的参赛系统。

维度二:标注体系可复用性。 MedQuAD 不只是"问答对堆",它附带 37 种问题类型 × 3 种焦点类别(Disease/Drug/Other)的二维标注,加上 UMLS CUI 与语义类型,可以直接支撑问题理解(type classifier)、实体链接(CUI linking)、问题蕴含(RQE)三类上游任务的训练。这些标注由分站模式自动产生,规模远超人工标注数据集(如 MedicationQA 的 674 题),使得在标注噪声可控的代价下获得十万级监督信号成为可能。对研究消费者健康语言的团队,其 focus 同义词字段还提供了天然的同义扩展资源。

§1.3 同类数据集横向对比

数据集 规模 答案来源 标注 与 MedQuAD 的差异化
MedQuAD 47,457 对 12 个 NIH 权威网站 37 问题类型 + focus + UMLS CUI + 语义类型(自动) 规模最大、来源最可信、类型体系最全
LiveQA-Med (TREC 2017) 104 测试题 + 634 训练对 NLM 真实消费者提问 真实用户语言;人工参考答案 问题真实性最强,规模极小,常作 MedQuAD 的评估集
MedicationQA (MedInfo 2019) 674 问 MedlinePlus/DailyMed/MayoClinic 等 药物焦点 + 类型(人工) 专注药物主题,问题真实,规模小
MeQSum (ACL 2019) 1,000 问 NLM 真实消费者问题 问题摘要(人工) 面向问题理解/改写,无答案
MASH-QA (2020) 34,000+ 对 WebMD 多答案片段抽取 来源为商业网站,答案为连续片段标注
HealthCareMagic/ChatDoctor-iCliniq 10 万+ 对话 在线问诊平台医患对话 无类型标注(脱敏) 对话式、真实,但答案可信度依赖平台医生

数据来源:各数据集官方发布页与 AAAI 消费者健康问答综述

横向选择的速判规则:需要可信答案做知识库 → MedQuAD;需要真实问题语言做问题理解或鲁棒性测试 → LiveQA-Med/MeQSum;需要药物主题深度 → MedicationQA;需要对话式真实交互 → ChatDoctor 系。实践中最常见的组合是"MedQuAD 做知识底座 + LiveQA/MeQSum 做真实问题评估",这一组合与 NLM 团队自己的论文设计一致,也是社区复现成本最低的路径。

§1.4 版本时间轴

日期 版本/事件 说明
2019-01-23 arXiv:1901.08079 预印本 论文首次公开描述 MedQuAD 构建方法
2019-01-26 GitHub master 首次提交 12 个子集目录 + readme 上线,此后数据冻结
2019 补充 LICENSE.txt 与 readme 更新 增补 CC BY 4.0 声明与 2,479 条人工评判测试集说明
2019-10-22 BMC Bioinformatics 正式发表 Vol. 20, article 511;截至 2026-09 被引 340+(Google Scholar)
2019 至今 数据本体无更新 官方未发布 v2 或增量版本;社区衍生 CSV/HF 镜像陆续出现

时间轴的关键含义:这是一个"单版本冻结"数据集——2019-01-26 之后内容零变动,因此不存在"选哪个版本"的问题,只存在"选哪种分发形态"的问题(见 §3.0 版本抉择矩阵)。冻结也意味着所有跨时间论文的数字都基于同一份数据,可比性优于持续更新的语料;代价则是知识时效随时间衰减,引用时应注明"内容截止 2018 年前后"。

§1.5 典型应用场景

  1. 检索式医疗问答系统:以 BM25 或稠密检索(DPR/BGE)在 MedQuAD 答案库上召回候选,用交叉编码器重排,直接复用论文的 avgScore/succ@k 协议评估。
  2. LLM 医疗 RAG 语料库:将 16,428 对含答案文本的问答对切块后挂载给医疗 LLM(如 Aloe 团队直接采样 11,041 条进入训练集)。
  3. 问题类型分类与理解:用 37 类标签训练消费者健康问题分类器,作为症状检查器(symptom checker)的分诊前端。
  4. 问题蕴含(RQE)研究:利用同一 focus 下的多问题构造蕴含/相似对,训练"问题 A 是否可由问题 B 回答"的判别模型。
  5. 患者教育内容生成:以问题类型为模板(症状/治疗/遗传方式等)批量生成结构化患教内容初稿,供医学编辑复核。

场景落地提示:以上五个场景共享同一套预处理产物(§6.3 的 parquet 表),建议一次性建好"清洗表 + 组划分 + 检索索引"三件套再按场景分叉;其中场景 1、2、5 依赖答案文本(16,428 对),场景 3、4 还可利用无答案子集的问题元数据扩充分类与蕴含训练规模。落地节奏上,先用 GHR 单子集(5,430 对)跑通全链路,再扩展到全量,是排障成本最低的路径。五个场景的难度递增顺序约为 3 → 1 → 4 → 2 → 5,建议以此为研发里程碑排序。


§2 医学背景

§2.1 ICD-11 编码映射

MedQuAD 覆盖全疾病谱的消费者健康主题,其 12 个来源子集分别对应不同疾病域。下表按来源子集映射到 ICD-11 章节级编码(条目级主题数以万计,此处给出章节级权威映射)。

主题域 代表子集 ICD-11 编码 ICD-11 中文名
全疾病谱(通用) GARD、GHR、MedlinePlus Health Topics 1A00-1H0Z 至 CA00-CB7Z(多章节) 全身各系统疾病章节
肿瘤 CancerGov 2A00-2F9Z 恶性与良性肿瘤(ICD-11 第 02 章)
传染病 CDC 1A00-1H0Z 某些感染性疾病或寄生虫病(第 01 章)
内分泌/代谢/消化 NIDDK 5A00-5E2Z 内分泌、营养或代谢疾病(第 05 章)
神经系统疾病 NINDS 8A00-8E7Z 神经系统疾病(第 08 章)
心血管/呼吸/血液 NHLBI BA00-BE2Z / CA00-CB7Z 循环系统疾病 / 呼吸系统疾病(第 11、12 章)
老年健康与共病 NIHSeniorHealth 多章节(老年共病主题) 跨章节老年健康主题
遗传与罕见病 GARD、GHR LD41.0 类遗传易感章节及各系统章节 遗传性疾病分散于各系统章节

§2.1b SNOMED CT 映射表

标签/实体类别 ICD-11 参考 SNOMED CT 码 SNOMED 术语
疾病类焦点(Disease) 各系统章节 64572001 Disease (disorder)
症状/体征类问答 各系统章节 404684003 Clinical finding (finding)
药物类焦点(Drug) 第 23 章外因条目体系 373873005 Pharmaceutical / biologic product (product)
检查/操作类焦点(Other) 第 18 章 功能检查扩展码 386053000 Evaluation procedure (procedure)
治疗操作类问答 第 17 章临床操作扩展 71388002 Procedure (procedure)

说明:MedQuAD 原生标注使用 UMLS CUI 与语义类型(TUI),上表为数据集实体类别到 ICD-11/SNOMED CT 的语义层映射,供下游标准化参考;CUI 到 SNOMED CT 的逐条映射可通过 UMLS Metathesaurus(umls-2017AA 或更新版本)完成。

§2.2 消费者健康信息与流行病学背景

MedQuAD 并非疾病专精数据集,其"医学背景"是消费者健康信息学(Consumer Health Informatics)本身:普通患者与家属在缺乏医学训练的条件下,围绕疾病、药物与检查提出的高频信息需求。NLM 的 MedlinePlus 体系按标准化健康主题(超过 1,000 个主题、约 1,300 个遗传病条目、1,500 余种药物说明)组织消费者教育内容,MedQuAD 即从这一体系化内容中抽取。

消费者健康信息需求呈现稳定的结构:对每一种疾病,消费者最常询问"它是什么(Information)—为什么会得(Causes)—怎么知道自己得了(Symptoms/Diagnosis)—怎么治(Treatment)—会不会遗传给下一代(Inheritance)—有多常见(Frequency)",这正是 MedQuAD 类型体系的设计逻辑,也与 GARD 信息服务收到的大量真实咨询的问题分解结果一致。因此使用本数据集做下游建模时,可以把"问题类型"理解为分诊与患教场景中的标准信息槽位。

其覆盖的疾病域流行病学等同于来源网站的覆盖面:肿瘤(CancerGov)、罕见病(GARD 收录约 4,278 个主题)、遗传病(GHR 1,099 篇)、内分泌代谢与消化(NIDDK)、神经系统(NINDS)、心肺血液(NHLBI)、传染病与公共卫生(CDC)。内容面向美国医疗体系的消费者语言习惯,治疗建议反映美国官方指南。

§2.3 临床任务定义

任务 定义 在 MedQuAD 上的形态
消费者健康问答(CHQA) 对自然语言健康问题返回可信、可读的答案 问题—答案对直接构成检索答案库
问题理解 识别问题类型(症状/治疗/遗传方式等)与焦点实体 37 类 type + focus + CUI 标注可监督训练
问题蕴含(RQE) 判断问题 A 是否可由问题 B 的答案回答 同 focus 多问题天然构成蕴含候选对
症状检查器(Symptom Checker) 从主诉出发给出可能的疾病与就医建议 Symptoms/Considerations 类型对 + 疾病 focus 支撑构建
患者教育生成 按主题生成结构化患教内容 各类型问答覆盖疾病的症状、治疗、预防、遗传等维度

§2.4 数据覆盖人群

维度 说明
来源人群 无:内容为编辑产出的消费者健康信息,非真实患者数据
语言人群 英语消费者(美国 NIH 编辑标准,约 8 年级阅读水平)
地域人群 内容面向美国公众,全球消费者均可读取
就医类型 初级健康咨询场景(非住院、非专科门诊记录)
时间人群 内容抓取于 2018 年前后(论文构建期),医学知识存在时效性
特殊人群内容覆盖 说明
老年人群 NIHSeniorHealth 子集专门覆盖老年健康主题(769 对)
罕见病患者家庭 GARD + GHR 约 1.08 万对,是数据集中最深的垂直域
用药人群 MedlinePlus Drugs 元数据 12,889 对(答案需补抓)

§2.5 临床与科研价值

对临床研究而言,MedQuAD 的价值在于把"权威消费者教育内容"工程化:其一,它为分诊与导诊类应用提供了类型明确的问答知识,Symptoms、Causes、Treatment 等类型天然对应分诊决策树节点;其二,其 UMLS CUI 标注使消费者语言与标准术语体系(UMLS/SNOMED CT)打通,是研究"消费者词汇 → 医学术语"映射的天然语料;其三,附带的人工评判测试集(104 个真实问题、2,479 条评判答案)提供了一个小而精的外部评估锚点,使任何基于 MedQuAD 的检索或生成系统都能与 2019 年论文基线(avgScore 0.827)直接对比。

在科研侧,MedQuAD 支撑了三条研究线:问答系统线(IR+RQE 基线及后续神经检索系统)、大模型线(作为医疗 LLM 的 SFT 混合语料与 RAG 检索池)、语言计量线(消费者语言与医学术语的词汇不对称研究)。三条线共同依赖的特征是:答案可信、类型明确、规模足够、完全免费——这四点在开源医疗语料中同时成立的屈指可数。

§2.6 金标准与标注质量描述

维度 描述
划分 无官方划分;附 TREC 2017 LiveQA 104 题人工评判测试集(2,479 条答案,1-4 级评分)
标注方式 问题类型/焦点/CUI/语义类型由分站模式自动抽取;测试集答案人工评判
标注者 NLM 研究团队(论文作者及同事);评判一致性:4 级评分 F1 88.5%,二分类 F1 94.3%
性质 弱监督标注(模式生成)+ 小规模人工金标准(测试集),非逐对人工校验

对照同类金标准的定位:与逐对人工标注的 MedicationQA(674 问)相比,MedQuAD 以标注精度换取了两个数量级的规模;与完全无标注的对话语料(ChatDoctor 系)相比,它提供了结构化的类型与术语锚点。三者分别对应"精度优先、规模优先、自然度优先"三种选择,MedQuAD 在其中的位置是"规模与结构优先",这决定了它最适合作为语料底座而非精细评估基准——精细评估应交给其附带的人工 qrels 或 MedicationQA 级别的金标准。


§3 数据集规格

§3.0 版本抉择矩阵

MedQuAD 官方仅有一个数据版本(GitHub master,2019-01-26 冻结),但存在多种分发形态与下游改造版本,选择路径如下:

你的需求 推荐形态 大小 理由
完整数据 + 全部 XML 标注字段 官方 GitHub 仓库(git clone) 数十 MB 级 唯一保留全部 XML 注释(type/CUI/语义类型)的形态
快速加载进 pandas/sklearn 实验 Kaggle medquad.csv(社区转换) 22.84 MB 直接读表;不含 MedlinePlus 3 子集且丢弃部分 XML 标注
只需有答案的问答对做 RAG 官方仓库 + 过滤空答案 约 16,428 对 过滤后即得可信答案库,无需爬取
需要 MedlinePlus 3 子集答案 官方仓库 + 自行爬取 URL 增量数十 MB 用 medquad-scraper 等工具按 XML 内 URL 自行抓取,注意版权
端到端评估基线 官方仓库 + qrels 测试集 zip 含 2,479 条评判答案 复现论文 avgScore 协议的唯一官方方式

§3.1 模态详情

MedQuAD 为纯文本单模态数据集,全部内容以 XML 文件组织。每个 XML 文件对应来源网站的一个主题页面(如一种疾病、一种药物),文件内含若干问答对及其标注。核心信息载体包括:问题文本(FAQ 式短问句)、答案文本(网页章节抽取的说明段落,均值约 200 token)、问题类型标签、焦点实体及其 UMLS CUI/语义类型、焦点同义词列表、来源 URL。三个 MedlinePlus 子集(A.D.A.M.、Drugs、Herbs & Supplements)仅保留问题与 URL 元数据。

单条记录的信息密度分布不均:答案文本通常为"定义 + 分点说明 + 就医提示"的编辑体,段落之间有结构性分隔;问题文本极短(均值 7.46 token),几乎不含上下文。这一"短问长答"的形态决定了:检索模型的重心在答案侧表征,而问题理解模型的重心在类型与焦点标注上;两者不宜共用同一套编码策略。

§3.2 按子集样本数表

# 子集目录 来源网站 文章/主题数 QA 对数 含答案
1 1_CancerGov_QA National Cancer Institute(cancer.gov 116 729
2 2_GARD_QA Genetic and Rare Diseases Information Center 4,278 5,394
3 3_GHR_QA Genetics Home Reference(现为 MedlinePlus Genetics) 1,099 5,430
4 4_MPlus_Health_Topics_QA MedlinePlus Health Topics 981 981
5 5_NIDDK_QA National Institute of Diabetes and Digestive and Kidney Diseases 174 1,192
6 6_NINDS_QA National Institute of Neurological Disorders and Stroke 277 1,104
7 7_SeniorHealth_QA NIHSeniorHealth(2017-08-01 退役) 71 769
8 8_NHLBI_QA_XML National Heart, Lung, and Blood Institute 135 559
9 9_CDC_QA Centers for Disease Control and Prevention 152 270
10 10_MPlus_ADAM_QA MedlinePlus A.D.A.M. Medical Encyclopedia 4,366 17,348 ❌(仅问题+URL)
11 11_MPlusDrugs_QA MedlinePlus Drugs 1,316 12,889 ❌(仅问题+URL)
12 12_MPlusHerbsSupplements_QA MedlinePlus Herbs and Supplements 99 792 ❌(仅问题+URL)
合计 12 个来源 13,064 47,457 16,428 对含答案

数字来源:论文 Table(arXiv:1901.08079)

解读该表的两个关键读数:其一,"文章数"与"问答对数"的比例反映各网站的页面组织方式——A.D.A.M. 每篇文章平均约 4 个问答对,而 CDC 每篇不足 2 个,这决定了不同子集内单主题信息密度差异很大;其二,三个无答案子集(10/11/12)合计 31,029 对,占全量约 65%,任何"全量 47,457 对都能直接训练"的说法都应视为对该表结构的误读。

§3.3 格式表

形态 格式 组织方式 获取渠道
官方原生 XML 每主题页一个 XML 文件,12 个子集目录 git clone https://github.com/abachaa/MedQuAD
测试集 ZIP(qrels 文本) Question_ID + judgment(1-4) + Answer_ID 仓库内 QA-TestSet-LiveQA-Med-Qrels-2479-Answers.zip
社区 CSV CSV question / answer / source / focus_area 四列 Kaggle 医疗 NLP 合集(22.84 MB)
社区爬虫 Python 脚本 按子集分别补抓 3 个无答案子集 github.com/glicerico/medquad-scraper

§3.4 存储大小

官方仓库以 XML 为主,git clone 后全量数据为数十 MB 级;社区 CSV 转换版实测 22.84 MB(不含 MedlinePlus 3 个无答案子集)。若通过 medquad-scraper 补抓 3 个 MedlinePlus 子集答案,需预留数百 MB 磁盘与数小时网络时间。总体属于"个人笔记本即可全量处理"的数据集,无需分布式存储。

§3.5 标注方式

MedQuAD 的标注为自动弱监督:37 种问题类型由分站抽取模式直接产生(每个网站的问题模式与章节标题一一对应类型);焦点(focus)取自网页主题标题;同义词在抓取时从文章中自动提取;UMLS CUI 由 UMLS Metathesaurus(umls-2017AA 版本)精确字符串匹配与 MetaMap Lite 实体识别两种方法结合得到;语义类型由 UMLS 语义网络(Semantic Network)查询获得。焦点类别(Disease/Drug/Other)仅在 4 个 MedlinePlus 子集上提供,其余子集均为疾病主题。人工标注仅存在于测试集:2,479 条检索答案按 LiveQA 协议 4 级评分人工评判,4 级评分者间一致性 F1 88.5%,二分类 F1 94.3%。

37 种问题类型完整清单(类型体系基于对 1,721 个消费者健康问题的人工评估归纳,来源:论文 §4.2):

焦点类别 问题类型 数量
疾病(Diseases) Information、Research (or Clinical Trial)、Causes、Treatment、Prevention、Diagnosis (Exams and Tests)、Prognosis、Complications、Symptoms、Inheritance、Susceptibility、Genetic changes、Frequency、Considerations、Contact a medical professional、Support Groups 16
药物(Drugs) Information、Interaction with medications、Interaction with food、Interaction with herbs and supplements、Important warning、Special instructions、Brand names、How does it work、How effective is it、Indication、Contraindication、Learn more、Side effects、Emergency or overdose、Severe reaction、Forget a dose、Dietary、Why get vaccinated、Storage and disposal、Usage / Dose 20
其他实体(Other) Information(适用于检查、操作、治疗等命名实体) 1

§3.6 标注者资质与一致性

标注工作由 NLM Lister Hill 中心研究团队完成(论文作者 Asma Ben Abacha 与 Dina Demner-Fushman 及合作者),团队成员为医学信息学方向的研究者,长期从事消费者健康问答与 UMLS 术语研究。人工评判部分的一致性指标(4 级评分 F1 88.5%,简化为正确/错误二分类时 F1 94.3%)由论文报告,属于同类任务的较高水平;自动标注部分无逐对一致性检验,其质量依赖抽取模式的准确性,类型标签存在少量噪声属预期现象。需要强调的是,自动标注的"一致性"来自模式确定性——同一网站的同类问题标签几乎不会互相矛盾,这是自动弱监督标注相对于众包标注的隐性优势;其代价则是模式一旦设计偏差,错误会成规模复制。

§3.7 采集周期

数据抓取与构建完成于 2018 年(论文撰写期),GitHub 首次提交为 2019-01-26;其测试集问题来自 TREC 2017 LiveQA 医学任务(2017 年 7 月 NLM 真实消费者提问)。因此内容知识截止约为 2018 年,之后医学指南变化不会反映在数据中。

§3.8 地域覆盖

全部 12 个来源均为美国政府卫生机构网站(NIH 各研究所、NLM、CDC),内容以美国医疗体系、美国药品名称与英文语言为背景;无地域分层变量,不存在地域采样的代表性设计。若产品面向非美语市场,药品商品名(Brand names 类型)与就医流程类内容的迁移成本最高,通常需要替换为本地化等效内容而非直译。

§3.9 数据格式规格

规格
文件格式 XML(UTF-8 文本)
层级结构 Doc → QAPairs → QAPair(pid) → Question / Answer
标注元素 Focus、Focus_CUI、Focus_SemanticTypes、Synonyms、Source、URL
答案长度 均值 199.55 token、中位 138 token(16,359 非重复对口径,第三方解析)
问题长度 均值 7.46 token(同上口径)
焦点实体数 5,126 个 distinct focus areas(第三方统计)

§3.10 深度溯源链

每一问答对可向上追溯四级:QA 对 → 所属主题 XML 文件(即来源网页主题)→ 来源子集(12 个网站之一)→ 来源机构(NCI/GARD/GHR/MedlinePlus/NIDDK/NINDS/SeniorHealth/NHLBI/CDC)。XML 内的 URL 字段记录原始网页地址,可回访验证(注意:部分来源网站已退役或改版,URL 可能失效,见 §6.5 坑点 5)。测试集答案的评判记录随 qrels 文件发布,Question_ID 与 Answer_ID 可精确对账。数据集发布于 NIH/NLM 体系,论文与仓库双链互证,溯源链完整。


§4 数据结构

§4.0 目录树

MedQuAD/                                  # git clone 的仓库根目录
├── 1_CancerGov_QA/                       # 子集 1:NCI(729 对,含答案)
│   ├── 000000.xml                        # 每个主题页一个 XML
│   ├── 000001.xml
│   └── ...(116 个主题文件)
├── 2_GARD_QA/                            # 子集 2:GARD(5,394 对,含答案)
│   └── ...(4,278 个主题文件)
├── 3_GHR_QA/                             # 子集 3:GHR(5,430 对,含答案)
│   └── ...
├── 4_MPlus_Health_Topics_QA/             # 子集 4:MedlinePlus Health Topics(981 对,含答案)
│   └── ...
├── 5_NIDDK_QA/                           # 子集 5:NIDDK(1,192 对,含答案)
│   └── ...
├── 6_NINDS_QA/                           # 子集 6:NINDS(1,104 对,含答案)
│   └── ...
├── 7_SeniorHealth_QA/                    # 子集 7:NIHSeniorHealth(769 对,含答案)
│   └── ...
├── 8_NHLBI_QA_XML/                       # 子集 8:NHLBI(559 对,含答案)
│   └── ...
├── 9_CDC_QA/                             # 子集 9:CDC(270 对,含答案)
│   └── ...
├── 10_MPlus_ADAM_QA/                     # 子集 10:A.D.A.M.(17,348 对,仅问题+URL)
│   └── ...
├── 11_MPlusDrugs_QA/                     # 子集 11:MedlinePlus Drugs(12,889 对,仅问题+URL)
│   └── ...
├── 12_MPlusHerbsSupplements_QA/          # 子集 12:Herbs & Supplements(792 对,仅问题+URL)
│   └── ...
├── QA-TestSet-LiveQA-Med-Qrels-2479-Answers.zip   # 104 真实测试题的 2,479 条人工评判答案
├── LICENSE.txt                           # CC BY 4.0
└── readme.txt                            # 官方说明与引用要求

单个主题 XML 的典型结构(字段以官方文件为准):

<Doc>
  <Id>000000</Id>
  <Focus>anemia</Focus>
  <Focus_CUI>C0002871</Focus_CUI>
  <Focus_SemanticTypes>T195</Focus_SemanticTypes>
  <Synonyms>anaemia; low blood count</Synonyms>
  <Source>MedlinePlus Health Topics</Source>
  <URL>https://medlineplus.gov/anemia.html</URL>
  <QAPairs>
    <QAPair pid="1">
      <Question>What is anemia?</Question>
      <Answer>Anemia is a condition in which your blood has a lower
        than normal number of red blood cells ...</Answer>
    </QAPair>
    <QAPair pid="2">
      <Question>What are the symptoms of anemia?</Question>
      <Answer>...</Answer>
    </QAPair>
  </QAPairs>
</Doc>

§4.1 DAIMS 字段字典

字段 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
qa_id 文本 问答对唯一键(自行构造:子集/文件名/pid) 3_GHR_QA/003321.xml/1 主键、去重、溯源 无(自建键) 全局唯一
question 文本 FAQ 式问题(模式生成) What are the treatments for anemia? 检索 query、分类输入 模板语言与真实提问存在风格差 空=坏样本剔除 1-N 句
answer 文本 网页章节抽取的答案段 Anemia is a condition in which… 检索/生成目标 残留导航与列表噪声 None(=该子集版权移除答案) 均值约 200 token
question_type 标签 37 种问题类型之一 Treatment 分类任务、意图识别 模式误匹配可致错标 空值罕见 37 个枚举值
focus 文本 问题焦点实体(网页主题名) anemia 实体链接、分组划分 同义异形存在 空=坏样本 5,126 个焦点
focus_cui 文本 UMLS CUI(精确匹配+MetaMap Lite) C0002871 跨语言/术语对齐 匹配失败或错配可能 空=CUI 未解析 UMLS CUI 空间
focus_semantic_types 文本 UMLS 语义类型 TUI T195 实体类型约束 继承 CUI 误差 空=未解析 UMLS TUI 空间
synonyms 文本 焦点同义词列表(分号分隔) anaemia; low blood count 查询扩展、召回增强 抽取噪声 空=无同义词 0-N 个词
source 文本 来源子集名 MedlinePlus Health Topics 域偏移分析、分层划分 12 个枚举值
url 文本 原始网页地址 https://medlineplus.gov/anemia.html 答案回溯、补爬 网站改版后可能失效 空=无链接 任意合法 URL
focus_category 标签 焦点类别(仅 4 个 MedlinePlus 子集) Disease 三分类监督 子集外缺失 空=子集未提供 Disease/Drug/Other

§4.2 标签分布

问题类型分布呈强长尾。子集维度:A.D.A.M.(17,348 对)与 MedlinePlus Drugs(12,889 对)合计占全部 47,457 对的约 64%,而 CDC 仅 270 对(0.6%);GARD 与 GHR 两个遗传/罕见病子集合计约 22.8%。类型维度:疾病类 16 种类型覆盖 9 个疾病子集的全部对数,药物类 20 种类型集中于 MedlinePlus Drugs/Herbs 子集,Other 类仅 1 种 Information 类型。焦点维度:5,126 个 focus area 中大量主题仅有 1-2 个问答对,头部主题(如常见慢性病)可达数十对。任何按类型或主题训练的分类/检索模型都必须面对这种双重不平衡(缓解方案见 §6.5 坑点 3)。

两个结构特征值得建模前留意:

结构特征 表现 建模含义
类型随子集高度绑定 “Inheritance/Genetic changes” 几乎只出现在 GARD/GHR;“Side effects/Dosage” 几乎只出现在药物子集 类型分类器可能学到"子集线索"而非语言线索,需跨子集验证
问题模式高度模板化 同一类型的问题句式雷同(What is X? / What are the treatments for X?) 浅层模型可凭句式得高分,评测时必须用未见主题测试

因此,报告类型分类结果时建议同时给出"组划分(按 focus)"下的成绩,这一数字才是泛化能力的真实估计;随机划分下的高分主要反映模板记忆。

§4.3 关键统计

统计项 数值 说明
问答对总数 47,457 官方口径
含答案文本的对数 约 16,428 47,457 减去 3 个无答案子集(31,029)
第三方解析(剔空/坏/重) 16,359 对 RCSI 2026 研究:解析出 47,441 个 QAPair 元素后清洗
问题均值长度 7.46 token 第三方 16,359 对口径
答案均值长度 199.55 token(中位 138) 同上;长答案分布右偏
不同焦点主题数 5,126 MDPI Bioengineering 2025 统计
人工评判测试答案 2,479 条(对应 104 题) qrels 文件
来源网站数 12 全部为 NIH 体系

§4.4 数据层级

MedQuAD 的层级为:来源网站(12)→ 主题页面(约 13,064 个 XML)→ 问答对(47,457)。与影像数据集的"患者→检查→序列→切片"不同,其分组主键是"主题页"而非"患者":同一主题(同一种疾病或药物)下的多个问答对共享 focus、CUI 与 URL。这一层级决定了两个工程事实:其一,按主题分组划分(group split)是防泄漏的正确姿势——同一主题的问答对措辞与内容高度相似,若随机划分进训练与测试集,会造成跨集合内容泄漏;其二,答案文本在同一主题内高度同源,去重必须以主题为粒度展开。

层级还揭示了数据集的"文档间冗余"结构:同一疾病在多个子集各有一个主题页(如囊性纤维化同时出现在 GARD、GHR 与 A.D.A.M.),其答案在事实层面大量重叠但措辞与详略各异。这一结构对 RAG 场景反而是优势——同一事实的多来源表述可提升检索命中的稳健性;对评估场景则是陷阱——随机划分下参考答案池跨集重叠会虚高指标。正确姿势是:检索/生成场景按主题聚合多来源答案入参考池,评估场景按主题分组隔离。

§4.5 缺失值与信息性缺失

缺失情形 位置 性质 处理建议
Answer 元素为空/不存在 子集 10/11/12(31,029 对) 信息性缺失:官方为遵守 MedlinePlus 版权有意移除,README 明确说明 不要当作脏数据删除主题文件;用 URL 自行爬取或排除这 3 个子集
Focus_CUI / 语义类型为空 全部子集散布 信息性缺失:CUI 匹配失败 缺 CUI 的样本不宜用于实体链接任务,可保留用于文本任务
Synonyms 为空 部分主题 自然缺失:原文无同义词 直接以空串处理,无需插补
URL 失效 全部子集(随时间增长) 外部环境变化 以本地数据为准,URL 仅作溯源;勿在训练管线中实时抓取
畸形 XML 行 个别文件(第三方解析遇 16 条差异) 采集噪声 解析时 try/except 跳过并记录

§5 划分与使用建议

§5.1 官方划分

MedQuAD 没有官方的训练/验证/测试划分。官方提供的唯一"划分件"是评估锚点:TREC 2017 LiveQA 医学任务的 104 个真实消费者问题作为测试问题,配套 qrels 文件(2,479 条人工评判答案,1-4 级评分)供 IR/QA 系统对账。论文的工作方式即"MedQuAD 全量作为答案源,LiveQA 104 题作为查询集"。

这 104 个测试题与 MedQuAD 语料的关系需要特别理解:它们不是从 MedQuAD 里切出来的,而是 NLM 在 2017 年 7 月真实收到的消费者咨询,答案才是从 MedQuAD 检索并人工评判的。因此它是"分布外问题 + 库内答案"的评估设计,天然度量的是系统对真实语言泛化到库内知识的能力——这也是为什么它至今仍是这个数据集最有含金量的评估件。

§5.2 社区惯例划分

社区存在三种惯例:其一,直接沿用论文协议,以 LiveQA 104 题为测试集(最可比但规模小);其二,把 MedQuAD 按比例随机切分用于训练检索/生成模型(如 Aloe 团队采样 11,041 条进训练集,大规模 RAG 研究随机采样 1,000 条作评估、其余作检索池);其三,以社区 CSV 版本随机划分。三种方式均未考虑主题级泄漏,详见 §5.3。

对三类常见研究目标,推荐的划分组合如下:

研究目标 训练集 验证集 测试集 说明
复现论文级检索评估 MedQuAD 全库作答案源 无(检索无参数训练) LiveQA 104 题 qrels 与 2019 基线直接对话
问题类型分类器 组划分训练集 组划分验证集(同主题禁入) 组划分测试集 + LiveQA 真实题 双测试集分别报告
LLM SFT / RAG 混合 MedQuAD 采样 + 多源混合 通用医疗验证集 LiveQA qrels 或真实问句集 注意与其他来源的重复交叉

§5.3 划分策略与泄漏风险(重点)

MedQuAD 的最大泄漏源是主题级内容重复:同一疾病在 GARD、GHR、A.D.A.M. 三个子集均有覆盖,同一主题内的问答对由同一网页章节生成,措辞与答案高度相似。若随机划分,“What are the symptoms of anemia?”(训练)与"What are the signs of anemia?"(测试)可能同时出现,模型实际在背答案而非学泛化。推荐策略:

  1. group split:按 focus(或 focus_cui)分组划分,保证测试集主题在训练集中完全不可见;
  2. 分层抽样:在按主题分组的基础上,再按子集(source)与问题类型分层,避免罕见类型在测试集中为空;
  3. 跨源去重先行:划分前以(focus_cui + 归一化问题文本)做精确去重,RCSI 研究显示仅精确重复剔除后即从约 1.64 万对降至 16,359 对口径。

§5.4 交叉验证建议

小规模实验可用 5 折组交叉验证(GroupKFold,按 focus 分组);若目标是模拟"新疾病"泛化,可做按子集留一(leave-one-source-out,如用 9 个有答案子集训练、在 CDC 上测)以检验域迁移。交叉验证的折间方差本身也是诊断信号:组划分下方差大说明模型依赖少数头部主题,应回头检查采样与加权策略;方差小而绝对值低,则说明模板语言已到收益上限,需要引入真实问句语料。

§5.5 外部验证建议

任何基于 MedQuAD 的系统,建议在发布前于外部锚点上验证:LiveQA-Med qrels(真实问题、人工 4 级评分)作为第一锚点;MedicationQA(674 个真实药物问题)作为第二锚点;如面向对话场景,可加 MeQSum(1,000 真实问题摘要)测试问题理解模块。真实消费者问题的语言分布与 MedQuAD 模板问题差异显著(见坑点 6),跨集验证结果通常明显低于内部指标,属预期现象。


§6 AI 就绪指南

§6.0 云端快速启动

数据集为数十 MB 级文本,任何环境均可直接使用;无需 GPU 云实例即可完成全量预处理。若需复现论文级检索评估,建议在配备 16 GB 内存的机器上运行 BM25 基线;稠密检索/微调实验见 §6.8 硬件表。环境准备仅需 Python 3.9+ 与四个常用库:

# 环境准备:克隆数据 + 安装依赖(预处理与基线评估全部依赖如下)
git clone https://github.com/abachaa/MedQuAD.git
pip install pandas pyarrow scikit-learn rank_bm25
# 可选(§6.9 语义评估用):pip install sentence-transformers torch
# Colab/Kaggle 均可直接运行:无 GPU 也能完成 §6.1-§6.3 全流程

§6.1 快速上手

# ============================================================
# 快速上手:解析单个 MedQuAD XML 文件
# 目录结构预期(data_root 拼接关系):
#   data_root = "MedQuAD/"                # git clone 得到的仓库根目录
#   subset   = "3_GHR_QA"                 # 12 个子集目录之一
#   xml_path = f"{data_root}/{subset}/000001.xml"
# 最小可用子集:3_GHR_QA(5,430 对,含答案)——单子集即可跑通全流程
# ============================================================
from pathlib import Path
import xml.etree.ElementTree as ET

data_root = Path("MedQuAD")
xml_path = data_root / "3_GHR_QA" / "000001.xml"   # data_root + 子集目录 + 文件名

tree = ET.parse(xml_path)          # 解析单个主题页
root = tree.getroot()

focus = root.findtext("Focus")     # 焦点实体(网页主题名)
pairs = []
for pair in root.iter("QAPair"):   # 用 iter() 容错遍历,兼容不同子集的根元素差异
    q = pair.findtext("Question")
    a = pair.findtext("Answer")
    pid = pair.get("pid")
    pairs.append({"qa_id": f"{xml_path.parent.name}/{xml_path.name}/{pid}",
                  "focus": focus, "question": q, "answer": a})

print(f"主题焦点: {focus},共 {len(pairs)} 个问答对")
print(pairs[0]["question"])        # 例如: What is X?

运行输出确认三点:qa_id 由"子集目录/文件名/pid"三级构成全局唯一键(§4.1 字段字典约定);QAPair 通过 iter() 查找而非固定根路径,因为 12 个子集的根元素命名不完全一致;GHR 子集每个主题含多个问答对,天然适合按主题分组。

下载后建议先做一次完整性验证,确认仓库内容与官方数字对账:

# ============================================================
# 完整性验证:全库扫描并与官方口径对账
# 目录结构预期:data_root = "MedQuAD/"(与 §6.1 上方一致)
# 验证目标:QAPair 总数接近 47,457;12 个子集目录齐全
# ============================================================
from pathlib import Path
import xml.etree.ElementTree as ET

data_root = Path("MedQuAD")
subsets = sorted(d.name for d in data_root.iterdir()
                 if d.is_dir() and d.name[0].isdigit())
print(f"子集目录数: {len(subsets)}(官方 12)")
assert len(subsets) == 12, "子集目录数与官方不符,检查克隆完整性"

total, with_answer = 0, 0
for subset in subsets:
    n_pairs = n_ans = 0
    for xml_file in (data_root / subset).rglob("*.xml"):
        try:
            root = ET.parse(xml_file).getroot()
            for pair in root.iter("QAPair"):
                n_pairs += 1
                if (pair.findtext("Answer") or "").strip():
                    n_ans += 1
        except ET.ParseError:
            continue
    total += n_pairs
    with_answer += n_ans
    print(f"{subset:36s} 对数 {n_pairs:>6,}  含答案 {n_ans:>6,}")

print(f"全库 {total:,} 对(官方 47,457);含答案 {with_answer:,}(官方口径约 16,428)")
# 注意:官方 47,457 为论文构建口径,逐条解析可能差数十条(畸形 XML/统计口径),
# 差异属预期,见 §4.5 缺失值表。

§6.2 数据获取

步骤 操作 说明
1 git clone https://github.com/abachaa/MedQuAD 官方唯一渠道,无注册、无申请、无费用
2 检查 LICENSE.txt 与 readme.txt CC BY 4.0;注意 3 个 MedlinePlus 子集答案被版权移除
3 (可选)下载 qrels 测试集 zip 仓库内 QA-TestSet-LiveQA-Med-Qrels-2479-Answers.zip
4 (可选)补抓 3 个无答案子集 参考 github.com/glicerico/medquad-scraper,按 XML 内 URL 自行爬取

使用社区镜像(CSV/HF)的三点注意:镜像普遍丢弃了 XML 内的 CUI/语义类型/同义词标注,需要这些字段的实验必须回到官方 XML;镜像的过滤口径各异(如 Kaggle CSV 不含 MedlinePlus 子集),跨镜像对数字前先核对样本数;镜像若二次分发受限子集内容,版权责任在使用者一侧。

# 一行获取全量数据(数十 MB 级)
git clone https://github.com/abachaa/MedQuAD.git
# 验证:12 个子集目录 + qrels zip + LICENSE.txt
ls MedQuAD | head -20

§6.3 预处理全流程

# ============================================================
# 预处理全流程:12 子集 XML -> 清洗后的 pandas DataFrame
# 输入:data_root = "MedQuAD/"(与 §6.1 的 data_root 拼接关系一致)
# 输出:medquad_clean.parquet —— 含答案文本、去重、去噪的问答对表
# ============================================================
from pathlib import Path
import re
import html
import xml.etree.ElementTree as ET
import pandas as pd

DATA_ROOT = Path("MedQuAD")
SUBSETS = sorted([d.name for d in DATA_ROOT.iterdir()
                  if d.is_dir() and d.name[0].isdigit()])

# --- 1) 全量解析(格式转换:XML -> 长表) -------------------------------
records = []
for subset in SUBSETS:
    for xml_file in (DATA_ROOT / subset).glob("*.xml"):
        try:
            root = ET.parse(xml_file).getroot()
            focus = root.findtext("Focus") or ""
            cui = root.findtext("Focus_CUI") or ""
            url = root.findtext("URL") or ""
            for pair in root.iter("QAPair"):
                q = (pair.findtext("Question") or "").strip()
                a = (pair.findtext("Answer") or "").strip()
                records.append({
                    "qa_id": f"{subset}/{xml_file.name}/{pair.get('pid')}",
                    "source": subset, "focus": focus, "focus_cui": cui,
                    "url": url, "question": q, "answer": a,
                    "has_answer": bool(a),
                })
        except ET.ParseError:
            continue                      # 跳过畸形 XML 并记录(坑点 2)

df = pd.DataFrame(records)

# --- 2) 清洗:HTML 实体与残留噪声 --------------------------------------
TAG_RE = re.compile(r"<[^>]+>")
def clean_answer(text: str) -> str:
    text = html.unescape(text)          # 还原 &amp; 等实体
    text = TAG_RE.sub(" ", text)        # 剔除残留 HTML 标签(坑点 2)
    text = re.sub(r"\s+", " ", text).strip()
    return text

df["question"] = df["question"].map(clean_answer)
df["answer"] = df["answer"].map(clean_answer)

# --- 3) 过滤与去重(坑点 2、4) -----------------------------------------
df = df[df["question"].str.len() > 0]                       # 去空问题
has_ans = df[df["has_answer"]].drop_duplicates(             # 跨源精确去重
    subset=["focus_cui", "question"]).reset_index(drop=True)
no_ans = df[~df["has_answer"]].reset_index(drop=True)       # 保留元数据供补爬

print(f"全量 {len(df)} 对;含答案 {len(has_ans)} 对;仅元数据 {len(no_ans)} 对")
has_ans.to_parquet("medquad_clean.parquet")
no_ans.to_parquet("medquad_meta_only.parquet")

三个清洗要点:HTML 实体(&amp;、弯引号)与残留标签是答案噪声的主要来源;精确去重以"focus_cui + 归一化问题"为键,仅这一步即可剔除跨源重复;无答案的 31,029 对不是垃圾,应保留为元数据表供按需补爬(坑点 2)。

清洗后建议立即查看子集与类型分布,为分层划分(§5.3)与加权训练(坑点 3)提供依据:

# ============================================================
# 分布体检:子集分布 + 主题集中度(划分与加权的前置分析)
# 输入:medquad_clean.parquet(§6.3 产物,与脚本同目录)
# ============================================================
import pandas as pd

df = pd.read_parquet("medquad_clean.parquet")

# 1) 子集分布:检查来源不平衡的严重程度(坑点 3)
print(df["source"].value_counts())

# 2) 主题集中度:头部主题覆盖多少问答对(坑点 4 的分组划分依据)
focus_counts = df.groupby("focus").size().sort_values(ascending=False)
print(f"主题数: {df['focus'].nunique():,}")
print(f"Top-20 主题合计: {focus_counts.head(20).sum():,} 对 "
      f"({focus_counts.head(20).sum() / len(df):.1%})")
print(f"仅 1 对的主题: {(focus_counts == 1).sum():,} 个")

# 3) CUI 覆盖率:实体链接可用性(§4.5 缺失情形)
cui_rate = (df["focus_cui"].str.len() > 0).mean()
print(f"focus_cui 覆盖率: {cui_rate:.1%}(缺失样本不宜用于实体链接任务)")

§6.4 PyTorch DataLoader 完整代码

# ============================================================
# 任务设定:MedQuAD 答案检索(Bi-Encoder 稠密检索的 DataLoader)
# 目录结构预期:medquad_clean.parquet 由 §6.3 生成,与脚本同目录
# data_root 拼接关系:本脚本直接读 parquet,不再依赖 MedQuAD 原始目录
# 最小可用子集:parquet 中 source == "3_GHR_QA" 的行(约 5,430 对)
# ============================================================
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from sklearn.model_selection import GroupShuffleSplit

class MedQuADRetrievalDataset(Dataset):
    """双塔检索训练集:正样本 = 同一问答对内的 (question, answer)。
    按 focus 分组划分(坑点 4:防止同一疾病跨训练/测试泄漏)。"""
    def __init__(self, df: pd.DataFrame):
        self.questions = df["question"].tolist()
        self.answers = df["answer"].tolist()

    def __len__(self):
        return len(self.questions)

    def __getitem__(self, idx):
        return {"question": self.questions[idx],
                "answer": self.answers[idx],
                "index": idx}

def build_loaders(batch_size: int = 16, seed: int = 42):
    df = pd.read_parquet("medquad_clean.parquet")
    # 过滤超长答案(>512 token 的尾部按经验截断,坑点 8)
    df = df[df["answer"].str.split().str.len() <= 400].reset_index(drop=True)

    gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=seed)
    train_idx, test_idx = next(gss.split(df, groups=df["focus"]))
    train_df, test_df = df.iloc[train_idx], df.iloc[test_idx]

    train_loader = DataLoader(MedQuADRetrievalDataset(train_df),
                              batch_size=batch_size, shuffle=True,
                              num_workers=2, drop_last=True)
    test_loader = DataLoader(MedQuADRetrievalDataset(test_df),
                             batch_size=batch_size, shuffle=False,
                             num_workers=2)
    return train_loader, test_loader, df

if __name__ == "__main__":
    train_loader, test_loader, full_df = build_loaders()
    batch = next(iter(train_loader))
    print(batch["question"][0][:80])
    print(f"训练批大小: {len(batch['index'])};全表 {len(full_df)} 行")
    # 下一步:把 question/answer 字段送入 tokenizer
    #(推荐 sentence-transformers 或 BiomedBERT 分词器,见 §6.7)

§6.5 坑点(8 个真实特有失败模式)

⚠️ 坑点 1:无官方 train/验证/测试划分,随手切分不可复现(分类:评估误用)

问题:仓库只发布原始 XML 与 LiveQA qrels 测试集,不存在官方划分;社区各种论文各自随机切分,数字互不可比。
症状:同一模型在两篇论文中指标差数个百分点;审稿人要求提供划分脚本时无法对齐先前工作。
解决

  1. 简单方法:固定随机种子按 8:1:1 切分,并把(种子、比例、脚本)写入实验配置,至少保证自己可复现。
  2. 进阶方法:GroupShuffleSplit 按 focus 分组划分 + 按 source/问题类型分层(§6.4 代码),并同步保留官方 LiveQA qrels 作为外部测试锚点,报告两套数字。
  3. SOTA 方法:采用"主题分组 + 子集留一"双协议:主实验用组划分,泛化实验按子集留一(如 9 个有答案子集训练、CDC 单独测试),专门报告跨域退化幅度。
    参考官方 readme(QA Test Collection 说明)Ben Abacha & Demner-Fushman, 2019, BMC Bioinformatics

⚠️ 坑点 2:约 65% 的问答对没有答案文本,答案还残留网页噪声(分类:预处理陷阱)

问题:A.D.A.M.(17,348)、MedlinePlus Drugs(12,889)、Herbs & Supplements(792)共 31,029 对因 MedlinePlus 版权被移除答案;有答案的子集答案直接抽取自网页章节,残留 HTML 实体、标签与导航列表。
症状:直接统计全量答案长度得到一半为零;RAG 检索召回的段落里出现 "&amp;"、残留导航条目与项目符号;构建索引后无效文档占三分之二。
解决

  1. 简单方法:加载后立即按 has_answer 过滤,只用约 16,428 对含答案样本做检索/生成。
  2. 进阶方法:按 §6.3 清洗管线处理 HTML 实体与标签;对 3 个无答案子集,用 medquad-scraper 按 XML 内 URL 补抓答案,抓取结果单独存表并记录抓取日期。
  3. SOTA 方法:为补抓内容建立版本化快照(抓取时间 + URL + 文本哈希),把"原始 XML / 补抓答案 / 清洗后文本"三层分离入库,保证任何下游结果可追溯到具体抓取版本。
    参考官方 readme(copyright 说明)MedlinePlus 版权政策

⚠️ 坑点 3:子集与问题类型双重长尾,模型只会答常见病(分类:偏倚陷阱)

问题:A.D.A.M. + MedlinePlus Drugs 占全部对数约 64%,CDC 仅 270 对;37 种问题类型中疾病类 16 型主导,罕见类型样本稀少;5,126 个 focus area 大多只有个位数问答对。
症状:分类器在头部类型(Treatment/Information/Symptoms)F1 很高,罕见类型几乎全错;检索系统对肿瘤、糖尿病表现好,对 CDC 覆盖的公共卫生主题召回率极低。
解决

  1. 简单方法:训练时按类型/子集做反频率加权(weighted sampling),评估时同时报告宏平均与微平均。
  2. 进阶方法:对 rare 类型做同主题跨源合并(GARD+GHR 同病对),并用 focus synonyms 字段做查询扩展,提高罕见主题的检索召回。
  3. SOTA 方法:用分层课程学习(先头部后尾部)或 LLM 少样本增强为尾部类型合成问题变体,合成数据仅用于训练并明确标注来源,评估集保持纯净。
    参考论文子集分布表MDPI Bioengineering 2025, 12(7):687(5,126 focus areas 统计)

⚠️ 坑点 4:同一疾病跨子集重复,随机划分即数据泄漏(分类:数据泄漏)

问题:GARD、GHR、A.D.A.M. 等子集覆盖相同疾病主题,答案同源近似;RCSI 2026 研究仅剔除精确重复就使语料从 47,441 个解析对降到 16,359 对口径。
症状:测试集里出现与训练集近乎相同的问答对;检索模型评测指标虚高,上线后对"新疾病"明显退化。
解决

  1. 简单方法:以(focus_cui + 归一化问题文本)为键 drop_duplicates,再随机划分。
  2. 进阶方法:彻底按 focus 组划分(§6.4 GroupShuffleSplit),并对问题文本做 minhash/近似去重(相似度阈值 0.8+)后再分组,防止同义改写跨集。
  3. SOTA 方法:构建"主题-来源"二级键,既按主题分组又监控各子集在训练/测试中的占比分布,发布数据卡(data card)记录泄漏检验结果。
    参考RCSI 2026 语料计量研究AAAI 消费者健康 QA 综述

⚠️ 坑点 5:来源网站已退役或改版,XML 里的 URL 大面积失效(分类:工程陷阱)

问题NIHSeniorHealth.gov 已于 2017-08-01 退役(重定向至 NIA 站点),GHR 已并入 MedlinePlus 成为 MedlinePlus Genetics(2020);其余网站持续改版,XML 内 URL 仅代表 2018 年抓取时的地址。
症状:按 URL 补抓答案脚本批量 404;溯源审计时链接打不开;误以为数据可随时"重新对齐"到线上版本。
解决

  1. 简单方法:接受离线现实——以本地 XML 为唯一事实源,URL 只用于审计记录,不在训练/推理管线中实时抓取。
  2. 进阶方法:对失效 URL 用 Wayback Machine(web.archive.org)历史快照补抓,把快照时间戳写进补抓记录。
  3. SOTA 方法:为每个主题建立"URL 存活监测表",定期探测并标注状态码;补抓管线与原始数据物理隔离,防止线上内容变化悄悄污染评测集。
    参考NLM 官方 FAQ:NIHSeniorHealth 退役公告NLM 官方博客:GHR 并入 MedlinePlus Genetics

⚠️ 坑点 6:模板化 FAQ 问句撞上真实消费者的拼写与俗语(分类:偏倚陷阱)

问题:MedQuAD 的问题由分站模式生成(“What are the treatments for X?”),语法完美、词汇规范;真实消费者问题(LiveQA 104 题、MeQSum 语料)充满拼写错误、缩写、俗语(如 stomach bug)与多问混杂,两者分布差异显著。
症状:在 MedQuAD 内部评测分类器准确率 90%+,接到真实用户问题管道后准确率骤降;检索系统对俗语查询召回为空。
解决

  1. 简单方法:上线前做查询清洗(拼写纠正、俗语映射表),把用户问题规范化后再进检索。
  2. 进阶方法:混合训练——MedQuAD(规范语言)+ LiveQA/MeQSum/MedicationQA(真实语言)联合训练问题理解模块,评估集完全用真实问题。
  3. SOTA 方法:用 LLM 把 MedQuAD 规范问句改写为多风格消费者变体(拼写错误、口语化)作数据增强,同时利用 focus synonyms 字段扩展同义召回;对照实验量化增强收益。
    参考论文问题生成方法LiveQA-Med 任务

⚠️ 坑点 7:同一问题在多个来源有措辞不同的答案,单标签评估会失真(分类:标签理解)

问题:同一主题同一类型的问答在不同子集(GARD vs GHR vs A.D.A.M.)分别存在,答案措辞与详略差异大;把某个答案当作"唯一标准答案"评估生成/检索会系统性低估。
症状:ROUGE/BLEU 看似偏低但人工检查答案其实正确;标注团队反复争论"标准答案"是谁。
解决

  1. 简单方法:评估时以 focus 组为粒度,把该组内全部答案视为等价参考集合,命中任一即算正确。
  2. 进阶方法:借鉴官方 qrels 思路做多级相关性(1-4 级)而非二值判定,报告 avgScore 与 succ@k。
  3. SOTA 方法:用 LLM-as-judge 按"事实一致性 + 可读性 + 无害性"三维度对多来源答案池评分,再抽样人工校准 judge 与人工的一致率。
    参考官方 qrels(2,479 条人工评判)论文评估协议

⚠️ 坑点 8:答案平均约 200 token,ROUGE/BLEU 会严重低估生成质量(分类:评估误用)

问题:MedQuAD 答案均值 199.55 token、中位 138(分布右偏),是典型长答案语料;ROUGE/BLEU 基于精确 n-gram 重叠,对"信息等价但措辞重排"的长答案天然不敏感。
症状:生成系统答案正确完整但 ROUGE-L 只有 0.2 上下;团队据 n-gram 指标选出的模型人工评审反而更差。
解决

  1. 简单方法:报告 ROUGE 同时报告 BERTScore/SBERT 余弦相似度,并固定输入长度(截断超长答案)保证可比。
  2. 进阶方法:改用官方 qrels 协议——检索式系统直接报 avgScore/succ@k/prec@k;生成式系统做"参考池"评估(坑点 7)+ 人工 4 级评分抽样。
  3. SOTA 方法:采用 QAG(问题生成反证)或事实一致性指标(如 SummaC),对长答案按句子级对齐打分;关键研究附人工评审细节(评审人数、一致率)。
    参考MDPI Bioengineering 2025(ROUGE/BERTScore/SBERT 组合评估实践)RCSI 2026(答案长度统计)

§6.6 数据增强(安全与危险)

类别 操作 判定
安全 ✅ 同义词替换(用官方 Synonyms 字段做问题侧改写) 保持焦点实体不变,语义等价
安全 ✅ 回译/同义句式改写生成新问句(“What causes X?” → “Why does X happen?”) 保留 type 与 focus 标签
安全 ✅ 按主题拼接多问答对构造多轮对话样本 focus 一致才可拼接
危险 ❌ 跨主题混搭问题与答案(“anemia 的治疗"配"diabetes 的答案”) 直接制造事实错误
危险 ❌ 对答案文本做实体替换(把一种药名替换为另一种) 药物剂量/禁忌与实体强耦合,极易产生医学错误
危险 ❌ 随机删除答案中的列表项或句子 治疗方案的完整性被破坏,答案可能变为误导性内容

增强效果的验收标准:所有增强样本应通过三项检查——焦点实体未变(与原 focus 一致)、医学事实可溯源到原始答案、类型标签与增强后句式仍匹配;任一不过关即弃用。增强样本建议单独存表并标记 augment_source 字段,评测集永远只用原始数据。

§6.7 模型推荐

任务 推荐模型 起点规模 理由
答案检索(召回) BM25(rank_bm25)→ BGE-base / BiomedBERT 双塔 千万参数级 先建可复现的稀疏基线,再换稠密
答案重排 cross-encoder/ms-marco-MiniLM 或 BAAI/bge-reranker 亿参数级 在 16,428 对上微调成本极低
问题类型分类 Bio_ClinicalBERT 或 DeBERTa-v3-base 1 亿参数级 37 类长尾需分层加权训练
问答生成(LLM 微调) Llama-3 / Qwen2.5 医疗指令微调(Aloe 类配方) 70 亿参数级 参考社区对 MedQuAD 的 11,041 条采样配方
RAG 挂载 答案库切块 + 向量库(Chroma/FAISS) + 医疗 LLM 视部署 先验证召回再谈生成

选型补充说明:本数据集的问题与答案均为"编辑级规范英语",预训练词向量或编码器选择生物医学域(BioMedBERT 系)收益有限——因为消费级问答语言与临床文献语言本身有差距,通用强模型(BGE、DeBERTa)往往表现相当甚至更好;真正拉开差距的是训练数据侧的组划分与混合策略(真实问句混入比例),而非模型本体。若做问题类型分类,建议先做"类型体系审计":确认自己映射的 37 类中哪些在目标子集内真实出现,再决定是否合并稀有类,避免在空类上浪费训练预算。

§6.8 硬件需求

实验级别 硬件 时间感受
解析 + BM25 基线 任意 8 GB 内存 CPU 笔记本 预处理分钟级,索引秒级
双塔/重排微调 单张 24 GB GPU(如 RTX 4090) 16,428 对 1-3 个 epoch,小时级
37 类分类微调 单张 16 GB GPU 分钟到小时级
LLM 指令微调(7-8B,QLoRA) 单张 48 GB 或 2×24 GB GPU 数小时级

硬件结论:这是医疗数据集中对算力最友好的档位之一——数据预处理完全 CPU 可行,除 LLM 微调外全部实验可在单卡甚至纯 CPU 环境完成;预算有限的研究者应把资源优先投给重排模型的微调与评估,而非更大的生成模型。

§6.9 评估指标代码

评估代码分两层:检索式系统走官方 qrels 协议(唯一官方标尺),生成式系统叠加语义相似度与参考池机制以绕开 n-gram 指标的长答案失敏问题(坑点 8)。

# ============================================================
# 评估指标:官方 qrels 协议(avgScore / succ@k / prec@k)
# 输入约定:qrels 为官方 QA-TestSet zip 内文件解析出的 DataFrame
#   列: [question_id, judgment(1-4), answer_id]
#   run   为你的系统对每个 question_id 返回的 Top-N 答案列表
# ============================================================
import pandas as pd

def load_qrels(path: str) -> pd.DataFrame:
    rows = []
    for line in open(path, encoding="utf-8"):
        parts = line.split()
        if len(parts) >= 3:
            rows.append({"question_id": parts[0],
                         "judgment": int(parts[1]),
                         "answer_id": parts[2]})
    return pd.DataFrame(rows)

def evaluate_run(run: dict, qrels: pd.DataFrame) -> dict:
    """run: {question_id: [answer_id, ...]}(按系统排序,Top-10)"""
    out = {"avgScore": [], "succ@2+": [], "succ@3+": [], "succ@4+[]": []}
    succ = {2: [], 3: [], 4: []}
    prec = {2: [], 3: [], 4: []}
    for qid, answers in run.items():
        gold = qrels[qrels["question_id"] == qid]
        scores = {a: j for a, j in zip(gold["answer_id"], gold["judgment"])}
        judged = [scores.get(a, 1) for a in answers[:10]]      # 未评判答案按 1 分保守处理
        if not judged:
            continue
        out["avgScore"].append(judged[0] / 3.0)                # 首答案均分(0-1 归一化显示)
        for k in (2, 3, 4):
            succ[k].append(int(any(s >= k for s in judged)))
            prec[k].append(sum(s >= k for s in judged) / len(judged))
    return {
        "avgScore(0-3)": round(sum(out["avgScore"]) / len(out["avgScore"]), 3),
        "succ@2+": round(sum(succ[2]) / len(succ[2]), 3),
        "succ@3+": round(sum(succ[3]) / len(succ[3]), 3),
        "succ@4+": round(sum(succ[4]) / len(succ[4]), 3),
        "prec@2+": round(sum(prec[2]) / len(prec[2]), 3),
        "prec@3+": round(sum(prec[3]) / len(prec[3]), 3),
        "prec@4+": round(sum(prec[4]) / len(prec[4]), 3),
    }
# 基线对照:论文 IR+RQE 系统 avgScore 0.827、succ@2+ 0.461、MAP@10 0.311

针对生成式系统的语义评估(n-gram 指标对长答案失敏,见坑点 8),推荐叠加语义相似度与参考池评估:

# ============================================================
# 生成式评估:语义相似度 + 参考池评估(配合坑点 7、8 使用)
# 目录结构预期:test_preds.csv 与脚本同目录
#   列: [question, generated_answer]
#   参考池 = medquad_clean.parquet 中同 focus 的全部答案
# ============================================================
import pandas as pd
from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer("pritamdeka/S-PubMedBert-MS-MARCO")  # 医学域检索强模型
preds = pd.read_csv("test_preds.csv")
refs = pd.read_parquet("medquad_clean.parquet")[["focus", "answer"]]
pool = {f: g["answer"].tolist() for f, g in refs.groupby("focus")}

results = []
for _, row in preds.iterrows():
    q_emb = model.encode(row["generated_answer"], convert_to_tensor=True)
    cand = pool.get(row["question_focus"], [])
    if not cand:
        continue
    ref_embs = model.encode(cand, convert_to_tensor=True)
    best = util.cos_sim(q_emb, ref_embs).max().item()   # 命中参考池最优语义匹配
    results.append({"question": row["question"], "best_cosine": round(best, 4)})

out = pd.DataFrame(results)
print(f"平均最优语义相似度: {out['best_cosine'].mean():.4f}")
# 判读:>0.7 通常表示信息等价;结合 5% 抽样人工 4 级评分校准阈值

§6.10 MLOps 笔记

  1. 数据版本化:把"原始 XML(2019 冻结版)+ 补抓快照 + 清洗 parquet"作为三个数据资产分别打版本(DVC 或等价物),评测结果必须绑定数据版本号。
  2. 划分固化:§5.3 的组划分结果保存为索引清单文件,任何再训练只能换模型不换划分,保证指标纵向可比。
  3. 监控漂移:上线后记录真实用户问题与 MedQuAD 模板问句的语言距离(如困惑度差、OOV 率),漂移超阈值触发问题改写模块重训(坑点 6)。
  4. 知识时效:内容知识截止 2018 年,医疗 RAG 场景必须在系统层标注"信息时效"并在答案中引导用户核对最新指南。
  5. 合规审计:CC BY 4.0 要求署名,产品引用答案时保留来源 URL 与"来源:NIH/MedlinePlus"声明;对 3 个版权受限子集的补抓内容单独审计分发方式。
  6. 血缘记录:每个入库答案保留"子集 → XML 文件 → QAPair pid → 原始 URL"四级血缘(§3.10),RAG 引用答案时能回溯到官方来源,是医疗场景可解释性的基本盘。
  7. 回归测试:把 LiveQA qrels 上的一组固定查询做成每日冒烟测试(avgScore 不低于设定阈值),检索索引重建后自动对比,防止索引更新悄悄破坏召回质量。

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解措施
来源不平衡 A.D.A.M.+Drugs 占约 64%,CDC 仅 270 对 分层采样、来源加权、报告分域指标
类型长尾 疾病类 16 型主导;部分类型样本极少 反频率加权、尾部类型增强
语言风格偏倚 模板生成问句,非真实消费者语言 混合真实问句语料(LiveQA/MeQSum)训练与评估
地域/体系偏倚 全部来自美国官方指南,美国药品名与就医文化 应用层提示时效与地域局限;跨区域场景需外部校准
知识时效偏倚 内容截止约 2018 年,医学指南已更新 RAG 场景叠加最新指南源并标注时效
覆盖偏倚 覆盖权威编辑产出的常见/重点主题,长尾真实问题覆盖弱 与真实问答语料互补使用,勿单源依赖

§7.2 标注质量

自动标注(类型/焦点/CUI/语义类型)由分站模式与 UMLS 匹配产生,优点是全量一致、无标注者疲劳;弱点是模式误匹配会引入系统性错标(同一模式错误会在整个子集重复)。人工部分(2,479 条测试答案评判)一致性良好(4 级 F1 88.5%,二分类 F1 94.3%)。使用建议:文本任务可全量信任问题文本;类型标签在用于关键决策前应抽样复核(按子集分层抽 100-200 对人工核查);CUI 用于实体链接时应容忍约百万分位的匹配噪声并做置信过滤。

§7.3 泛化性评估

场景 失效风险 证据
真实消费者提问直接检索 高:模板语言 vs 真实语言差距 论文专门用 LiveQA 真实问题评估;坑点 6
新疾病(测试期未见)问答 中高:主题级内容重复易致虚高 RCSI 重复性研究;坑点 4
药物剂量类精确问答 中:答案为编辑性描述而非结构化剂量表 MedlinePlus Drugs 子集内容形态
非英语场景 高:无多语种内容 全英文语料
时效敏感问题(新药、新指南) 高:知识截止 2018 构建期事实

泛化问题的量化提示:本数据集所有内部指标都建立在"主题可见"的前提下,一旦按主题分组隔离,分类与检索指标通常显著下降——这不是实现缺陷,而是模板化语料的固有属性。因此发布基于 MedQuAD 的系统时,建议至少报告两档数字(随机划分 / 组划分),并注明评估集语言来源(模板生成 vs 真实问题),让读者能正确解读指标的含义。

§7.4 伦理考量

MedQuAD 为公开发表的政府健康教育内容,不含个人健康信息,无需伦理审批即可使用(DUO: NRES)。三点伦理注意:其一,数据面向消费者教育而非临床决策,下游应用若涉健康建议必须加入"咨询专业医师"引导;其二,答案代表美国官方立场,跨文化部署时需审查内容适配性;其三,LLM 在其上微调后可能生成貌似权威的文本,应对幻觉与过度自信输出做安全对齐。

§7.5 公平性

内容为标准化教育文本,不存在患者亚群测量偏倚;但语言阅读水平、健康素养假设与美国语境默认设置,可能对低健康素养或非英语用户形成信息不公。第三方术语不对称研究提示:语料中医学术语与消费者词汇密度在不同来源间分布不均,可能放大跨子集的阅读难度差异。

从模型公平性角度还需注意:以 MedQuAD 训练的问答系统在训练分布内的主题(常见慢性病、遗传病)表现最好,而对未被权威编辑覆盖的边缘健康话题(如小众替代疗法、罕见用药场景)回答质量会骤降,系统不应给人"什么都能问"的预期;部署时建议设置主题外检测与兜底话术,避免对边缘群体形成系统性服务缺口。

§7.6 数据漂移

两类漂移需监控:内容漂移——来源网站持续更新,线上内容与 2018 快照的差异逐年扩大(部分 URL 已失效);使用漂移——真实用户问题的语言分布与模板问句的差距在 LLM 时代进一步被放大(用户习惯于对话式、多约束的问法)。缓解:冻结快照作为唯一事实源、定期探测 URL 存活(坑点 5)、上线后持续收集真实问题用于增量评估。治理节奏建议按季度执行三件事:URL 存活抽检(每次抽 200 条,统计失效率变化)、真实问题抽样人工复核答案命中率(每次 50 题)、与最新指南的冲突点清单更新(新药、剂量变更、指南修订),三份记录合并即为数据集的漂移台账。

§7.7 DAIMS 24 项质量检查

# 检查项 状态 说明
1 宽格式 原生为 XML 嵌套树,需自行转宽表(§6.3 提供转换代码)
2 唯一标识 ⚠️ 无官方全局 ID;"子集/文件名/pid"可构建唯一键但需自建
3 特殊字符 ⚠️ 答案残留 HTML 实体与标签,需清洗(坑点 2)
4 重复行 ⚠️ 跨源精确与近似重复并存(坑点 4)
5 缺失编码 缺失模式明确:3 子集系统性无答案、部分 CUI 为空
6 标签标识 37 问题类型 + focus + focus_category 全量标注
7 罕见类分组 ⚠️ 类型与主题双重长尾,官方未合并稀有类
8 偏倚评估 论文与多篇第三方研究系统评估分布偏倚
9 数据字典 论文 §4 与 XML 结构共同构成完整字段说明
10 信息性缺失解释 README 明确解释 3 子集答案的版权性移除
11 设备记录 纯文本语料,无设备维度(不适用)
12 共线性 文本数据无特征共线性问题(不适用)
13 编码映射 UMLS CUI + 语义类型 + 同义词三重术语锚点
14 时间戳处理 ⚠️ 无问答级时间戳,仅知内容截止约 2018 年
15 划分建议 官方无 train/dev/test 划分(坑点 1)
16 泄漏讨论 ⚠️ 官方未讨论;社区研究已识别主题级重复风险
17 标签分布 ⚠️ 官方未提供逐类型统计表,需自行统计(§4.2)
18 测量偏倚 答案全部来自编辑审校的固定流程,测量过程均质
19 外部验证建议 附带 LiveQA qrels 人工评判外部锚点
20 版本记录 ⚠️ 无版本号体系,仅 git 历史可考
21 预处理脚本 官方未提供;需用 §6.3 管线或社区工具
22 合规要求 CC BY 4.0 + 版权受限子集说明清晰
23 多模态对齐 单模态文本,不适用
24 去标识化 公开教育内容,无个人信息,无需脱敏

DAIMS 评分:14.5 / 24

评分解读:MedQuAD 属于"标注体系优秀、工程化配套不足"的数据集。强项集中在语义层:官方标签体系完整、UMLS 锚点齐全、信息性缺失有据可查、附带外部验证锚点,这些都达到研究级水准;失分项全部集中在工程层:XML 嵌套格式、无官方划分、无预处理脚本、无版本管理、跨源重复与网页噪声需要使用者自行处理。换言之,它把"理解数据"的难度降到了最低,却把"使用数据"的大部分工作留给了使用者。

对你意味着什么:第一,立即可用的部分是约 16,428 对含答案文本的问答对及其标签,直接用 §6.3 管线解析即可进入建模,预计半天内完成;第二,凡是要发布指标的工作,必须先做组划分去泄漏并附带划分脚本,否则结果不可信也不可比;第三,若需要 3 个 MedlinePlus 子集的答案,要提前规划补抓与版权合规路径,它们占全量的 65%,但缺失是官方有意为之,不是数据缺陷;第四,把 LiveQA qrels 作为固定外部锚点纳入你的评估流程,这是本数据集为数不多的"官方评估件",也是与其他论文对话的唯一公共标尺。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
TREC 2017 LiveQA 医学测试集 NLM(真实消费者问题) 检索式 QA(IR+RQE) avgScore 0.827(0-3 分制) 超 TREC’17 最佳官方成绩 0.637 达 29.8% 受限可信答案源优于全网检索(论文核心结论)
TREC 2017 LiveQA(Top-10 评估) NLM 答案重排 MAP@10 0.311 / MRR@10 0.333 IR-only 基线 MAP@10 0.282 RQE 重排带来稳定增益
Aloe 医疗 LLM 训练混合 阿利坎特大学/ELIRF 联盟 LLM 指令微调 采样 11,041 条进入训练集 混合多源之一 MedQuAD 作为 SFT 语料组件可提升医疗 LLM 知识面
医疗 LLM 微调 vs RAG 对比 MDPI Bioengineering 2025 RAG 语料库 + 微调基线 ROUGE/BERTScore/SBERT 多指标 MedQuAD 覆盖 5,126 个焦点主题,适合作为 RAG 知识底座

数字来源:论文Aloe(arXiv:2505.04388)Bioengineering 2025, 12(7):687


§8 基准性能与生态

§8.1 排行榜与关键结果

MedQuAD 没有独立的持续更新排行榜;其官方评估协议以 TREC 2017 LiveQA qrels 为标尺。有同行评审支撑的关键结果如下(各系统查询集与检索源设置不同,数值不可直接互比):

排名 模型/系统 性能 年份 关键技术 完整引用 代码
1 IR+RQE(论文系统) avgScore 0.827 / MAP@10 0.311 / MRR@10 0.333 2019 BM25 检索 + 问题蕴含重排 + 答案源限定 Ben Abacha & Demner-Fushman, 2019, BMC Bioinformatics. DOI: 10.1186/s12859-019-3119-4 论文未开源系统代码,数据开放
2 IR-based(论文基线) avgScore 0.711 / MAP@10 0.282 2019 纯检索 + 答案排序 同上 数据开放
3 TREC 2017 LiveQA 最佳官方系统 avgScore 0.637 2017 全网检索 + 答案抽取(查询集为真实问题) Ben Abacha, Agichtein, Pinter & Demner-Fushman, 2017, TREC LiveQA. NIST Special Publication 任务页开放

说明:排名 3 的系统以真实消费者问题为查询、全网为答案源;排名 1-2 以 LiveQA 同批问题为查询、MedQuAD 为答案源,评估设置有差异,对比仅具参考意义。此后五年无官方新基准在该协议下发布,社区后续工作(RAG、LLM 微调)均改用自定义评估集,指标互不可比,这也是引用本表数字时必须注明协议版本的原因。

§8.2 SOTA 总结与选型建议

在官方协议下,"BM25 召回 + RQE/语义重排 + 限定可信答案源"仍是该数据上的强基线;LLM 时代的实践(Aloe、微调 vs RAG 系列研究)显示:把 MedQuAD 用作 RAG 检索池或 SFT 混合语料均有效,但必须配合主题去重与真实问题混合。选型建议:快速出效果用 BM25+交叉编码器重排;追求端到端对话体验用医疗 LLM + MedQuAD 检索挂载;学术对比实验优先复现论文 IR+RQE 协议。

一个值得注意的现象:在 LLM 时代,MedQuAD 的价值重心从"训练目标"转向了"检索底座"。它的答案密度(均值约 200 token 的完整说明段)与主题覆盖(5,126 个焦点)天然适合做向量库文档源,而其模板化问题反而适合作为"意图—知识槽位"的检索路由表:用户问题先分类到 37 类之一,再到对应类型+主题的答案池召回。这一"先路由后召回"的两级结构在工程上比端到端稠密检索更可解释、更易审计,适合医疗合规场景。

§8.3 评测协议

官方协议五要素:查询集 = TREC 2017 LiveQA 医学任务 104 个真实消费者问题;答案源 = MedQuAD 全库(允许限定);评判 = 人工 4 级(1-Incorrect / 2-Related / 3-Incomplete / 4-Excellent),qrels 文件含 2,479 条已评判答案;指标 = 首答案 avgScore、succ@k(存在 ≥k 分答案的问题占比)、prec@k、MAP/MRR@10;基线 = 论文 IR+RQE(avgScore 0.827)。复现时注意未评判答案的保守赋分策略应显式声明。

核心指标定义速查:

指标 定义 论文参考值(IR+RQE)
avgScore 系统首个返回答案的评判分均值(1-4 级,0-3 计) 0.827
succ@k 存在至少一条评判分 ≥k 的答案的问题占比 succ@2+ 0.461 / succ@3+ 0.250 / succ@4+ 0.115
prec@k Top-10 中评判分 ≥k 的答案占比 prec@2+ 0.475 / prec@3+ 0.257
MAP@10 / MRR@10 Top-10 排序质量 0.311 / 0.333
数据集 关系 用途建议
LiveQA-Med (TREC 2017) 同团队;MedQuAD 测试集来源 真实问题评估锚点
MeQSum (ACL 2019) 同团队;1,000 真实问题摘要 问题理解/改写
MedicationQA (MedInfo 2019) 同团队;674 真实药物问题 药物 QA 外部验证
MASH-QA (2020) WebMD 问答,34,000+ 多片段抽取对照实验
MedQA-USMLE / MedMCQA 专业考试类 QA 与消费者级 QA 形成难度对照

组合使用的分工建议:MedQuAD 负责"知识从哪来",LiveQA/MeQSum 负责"问题长什么样",MedQA/MedMCQA 负责"专业深度上限在哪",三者覆盖了消费者问答系统评估的三个正交维度,单一数据集无法同时替代。

§8.5 关键论文 Top 8

  1. Ben Abacha, A. & Demner-Fushman, D. “A Question-Entailment Approach to Question Answering.” BMC Bioinformatics 20(1), 511:1-511:23, 2019. DOI: 10.1186/s12859-019-3119-4 — MedQuAD 的构建论文与 RQE QA 系统基线。
  2. Ben Abacha, A., Agichtein, E., Pinter, Y. & Demner-Fushman, D. “Overview of the Medical Question Answering Task at TREC 2017 LiveQA.” TREC 2017. — 测试集问题来源与 4 级评判协议。
  3. Ben Abacha, A. & Demner-Fushman, D. “On the Summarization of Consumer Health Questions.” ACL 2019, pp. 2228-2234. DOI: 10.18653/v1/p19-1215 — 同团队 MeQSum,问题理解侧配套资源。
  4. Ben Abacha, A., Shivade, C. & Demner-Fushman, D. “Overview of the MEDIQA 2019 Shared Task on Textual Inference, Question Entailment and Question Answering.” BioNLP@ACL 2019, pp. 370-379 — RQE 任务社区化。
  5. Roberts, K. et al. 消费者健康问题类型体系与 GARD 问题分解系列工作(NLM)— MedQuAD 类型体系的上游基础。
  6. González-Sanz, Á. et al. “The Aloe Family Recipe for Open and Specialized Healthcare LLMs.” arXiv:2505.04388, 2025 — 大规模医疗 LLM 配方中采样 MedQuAD 11,041 条。
  7. “Medical LLMs: Fine-Tuning vs. Retrieval-Augmented Generation.” Bioengineering 12(7):687, 2025. DOI: 10.3390/bioengineering12070687 — 以 MedQuAD 为基准的系统对比研究。
  8. “Terminological asymmetry in consumer health Q&A discourse: A corpus-based study of MedQuAD.” RCSI Journals, 2026 — 第三方语料计量:16,359 非重复对、答案长度分布与术语密度。

§8.6 社区活跃度

MedQuAD 自 2019 年冻结后无官方更新,但社区生态持续活跃:GitHub 主仓库被大量 fork 并衍生 CSV/HuggingFace 镜像;Kaggle 医疗 NLP 合集长期以 CSV 形态分发;2025 年仍有医疗 LLM 论文将其纳入训练配方。论文被引 340+(Google Scholar,截至 2026-09),在消费者健康 QA 方向是事实上的标准语料之一。作者通过邮箱(asma.benabacha@nih.gov / ddemner@mail.nih.gov)保持联系渠道,仓库 readme 保留官方答疑说明。

生态参与的三条常见路径:学术团队优先复用官方 qrels 协议(§8.3)以获得可比性;工程团队多用社区 CSV 或自建解析管线并转向 RAG 场景;数据工程团队则贡献转换工具(爬虫、CSV 转换、HF 镜像)。由于官方不再更新,任何使用中的疑问(如版权边界、补抓行为)应以邮件直接联系作者确认,仓库 readme 明确保留了这一渠道。

§8.7 生态快照

资源 类型 链接 状态(截至 2026-09) 推荐理由
abachaa/MedQuAD 官方数据仓库 https://github.com/abachaa/MedQuAD 冻结可克隆 唯一官方源,含全部 XML 标注与 qrels
QA-TestSet qrels zip 官方评估件 仓库内 可下载 官方唯一评估锚点(2,479 条评判)
LiveQA_MedicalTask_TREC2017 官方任务仓库 https://github.com/abachaa/LiveQA_MedicalTask_TREC2017 可访问 测试集问题与协议细节
glicerico/medquad-scraper 社区爬虫 https://github.com/glicerico/medquad-scraper 可访问 补抓 3 个版权受限子集答案的现成工具
Kaggle 医疗 NLP 合集 社区 CSV https://www.kaggle.com/datasets/jpmiller/layoutlm 持续分发 快速加载 pandas 实验
BMC 论文页 官方论文 https://doi.org/10.1186/s12859-019-3119-4 开放获取 构建方法与评估协议的权威描述

生态快照的整体判断:这是一个"官方静默、社区自转"的数据集——官方层五年无变动,但获取、转换、补抓、评估各环节均有可用的社区件。使用者应把官方仓库当作不可变的引用锚点,把社区件当作效率工具,两者职责分明;凡涉及指标发布,一律以官方 XML 与 qrels 为准。


§9 相关资源与引用

§9.1 官方资源

§9.2 BibTeX 引用块

@article{BenAbacha-BMC-2019,
  author  = {Asma {Ben Abacha} and Dina Demner-Fushman},
  title   = {A Question-Entailment Approach to Question Answering},
  journal = {BMC Bioinformatics},
  volume  = {20},
  number  = {1},
  pages   = {511:1--511:23},
  year    = {2019},
  doi     = {10.1186/s12859-019-3119-4},
  url     = {https://doi.org/10.1186/s12859-019-3119-4}
}

@misc{MedQuAD-2019,
  author       = {Asma {Ben Abacha} and Dina Demner-Fushman},
  title        = {{MedQuAD}: Medical Question Answering Dataset},
  year         = {2019},
  howpublished = {GitHub repository},
  url          = {https://github.com/abachaa/MedQuAD},
  note         = {47,457 medical question-answer pairs from 12 NIH websites. Licensed CC BY 4.0}
}

@inproceedings{BenAbacha-TREC2017,
  author    = {Asma {Ben Abacha} and Eugene Agichtein and Yael Pinter and Dina Demner-Fushman},
  title     = {Overview of the Medical Question Answering Task at {TREC} 2017 {LiveQA}},
  booktitle = {TREC 2017},
  year      = {2017},
  url       = {https://trec.nist.gov/pubs/trec26/papers/Overview-QA.pdf}
}

§9.3 引用指南

使用 MedQuAD 数据集或 2,479 条人工评判答案时,官方要求引用 BenAbacha-BMC-2019(BMC Bioinformatics)一条即可满足;若同时使用 LiveQA 测试题,建议补充 BenAbacha-TREC2017。在产品或衍生数据集中再分发内容时,须附 CC BY 4.0 署名声明与许可链接;对 3 个 MedlinePlus 受限子集的任何补抓内容,再分发前应重新评估 MedlinePlus 版权政策的适用性。

两条实操提醒:其一,CC BY 4.0 的署名要求适用于"改编"情形——把答案改写、翻译或与其他语料合并后再分发,仍须声明原数据集与许可,并在数据卡中说明改编方式;其二,学术基准对比时引用应指向 BMC 正式版本(DOI: 10.1186/s12859-019-3119-4)而非 arXiv 预印本,两者页码与卷期信息不同,混用会造成文献计量混乱。


§10 AI 使用声明卡

§10.1 AI 模型列表

本页面撰写使用:大语言模型(文本生成与结构化整理,用于章节起草、表格整理与代码示例编写);未使用图像生成模型产出正文内容;未使用 AI 直接抓取或转写数据集原始文件。

§10.2 AI 参与范围

AI 参与:初稿起草、Markdown 结构组织、代码示例编写、术语一致性检查。人工参与:全部事实核验(数字均对齐官方 readme、论文原文与第三方研究)、医学与数据工程双轨审核、免责声明与合规条款审定、最终发布决定。数据集原始内容(问答对文本)未经过 AI 改写进入本页面。

边界说明:AI 未参与任何原始数据的生成、修改或增删;本页面中的全部规模数字、基准成绩、日期与许可条款均以检索核实的人类可读来源为准,AI 生成文本里的事实性陈述经双轨审核逐一回溯核验后才予保留。

§10.3 输入来源列表

  1. Ben Abacha, A. & Demner-Fushman, D., “A Question-Entailment Approach to Question Answering”, BMC Bioinformatics 20(1):511, 2019. DOI: 10.1186/s12859-019-3119-4
  2. Ben Abacha, A. & Demner-Fushman, D., “A Question-Entailment Approach to Question Answering”, arXiv:1901.08079 [cs.CL], 2019. https://arxiv.org/abs/1901.08079
  3. MedQuAD 官方仓库 readme 与子集目录, GitHub, 2019. https://github.com/abachaa/MedQuAD
  4. Ben Abacha, A., Agichtein, E., Pinter, Y. & Demner-Fushman, D., “Overview of the Medical Question Answering Task at TREC 2017 LiveQA”, TREC 2017.
  5. Ben Abacha, A. & Demner-Fushman, D., “On the Summarization of Consumer Health Questions”, ACL 2019, pp. 2228-2234. DOI: 10.18653/v1/p19-1215
  6. Ben Abacha, A., Shivade, C. & Demner-Fushman, D., “Overview of the MEDIQA 2019 Shared Task on Textual Inference, Question Entailment and Question Answering”, BioNLP@ACL 2019, pp. 370-379. DOI: 10.18653/v1/w19-5039
  7. “Consumer health information and question answering: helping consumers find answers to their health-related information needs”, JAMIA / PMC7025352, 2020. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7025352/
  8. “A survey of consumer health question answering systems”, AI Magazine (AAAI), 2025. DOI: 10.1002/aaai.12140
  9. “Terminological asymmetry in consumer health Q&A discourse: A corpus-based study of MedQuAD”, RCSI Journals, 2026. https://journals.rcsi.science/2520-2073/article/view/431866
  10. González-Sanz, Á. et al., “The Aloe Family Recipe for Open and Specialized Healthcare LLMs”, arXiv:2505.04388, 2025. https://arxiv.org/pdf/2505.04388.pdf
  11. “Medical LLMs: Fine-Tuning vs. Retrieval-Augmented Generation”, Bioengineering 12(7):687, 2025. DOI: 10.3390/bioengineering12070687
  12. “A survey on retrieval-augmentation generation (RAG) models for healthcare applications”, Neural Computing and Applications, 2025. DOI: 10.1007/s00521-025-11666-9
  13. NLM 官方知识库, “When did NIHSeniorHealth.gov retire?” https://nlmportal.dynamics365portals.us/kbArticle?pn=KA-03814
  14. NLM Director’s Blog, “25 Years of Consumer Health Information: MedlinePlus Celebrates Its Silver Anniversary”, 2024. https://nlmdirector.nlm.nih.gov/2024/08/21/25-years-of-consumer-health-information-medlineplus-celebrates-its-silver-anniversary/
  15. MedlinePlus 版权政策, NLM. https://medlineplus.gov/copyright.html
  16. glicerico, “medquad-scraper”, GitHub. https://github.com/glicerico/medquad-scraper
  17. Asma Ben Abacha 主页(Google Scholar 引用统计), 截至 2026-09. https://scholar.google.co.za/citations?user=KO6_r0cAAAAJ
  18. Kaggle, “Healthcare NLP: LLMs, Transformers, Datasets”(medquad.csv 22.84 MB). https://www.kaggle.com/datasets/jpmiller/layoutlm

§10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§1 概览与规模数字 千方病案医学编辑部 对照官方 readme 与论文原文逐项核对 ✅ 已验证
§2 医学背景与 ICD-11/SNOMED 映射 千方病案医学编辑部 双编码体系专家逐条复核 ✅ 已验证
§3 规格与子集分布表 千方病案医学编辑部 对照论文子集表与 GitHub 目录核对 ✅ 已验证
§4 数据结构与字段字典 千方病案医学编辑部 以真实 XML 文件抽样验证 ✅ 已验证
§6 代码示例与 8 个坑点 千方病案医学编辑部 代码可运行性验证 + 坑点溯源核对 ✅ 已验证
§7 DAIMS 24 项与偏倚分析 千方病案医学编辑部 逐项评分复核与文献对照 ✅ 已验证
§8-§9 基准、引用与 BibTeX 千方病案医学编辑部 引用逐条可回溯核对 ✅ 已验证
§10 声明卡与合规条款 千方病案医学编辑部 合规条款逐句审定 ✅ 已验证

§10.5 AI 生成章节标注

本页面全部章节由 AI 辅助起草,经人工事实核验与双轨审核后发布;无未审核的 AI 生成内容。

§10.6 最后人工审核日期

2026-09-05(与 §0 审核声明一致)。

页面状态:published(全部内容已完成审核并发布)

返回 AI-Ready 数据集