信息速览
一份出院小结平均一千二百个词,写满了这次住院为什么来、做了什么、带什么药回家、复查找谁。临床医生要在里面找一条信息——比如「出院时到底带了哪几种药」——靠的是眼熟和检索框;而一个模型要做到同样的事,必须先有人把「问什么」和「答什么」一条条写出来给它看。临床文本上的问答语料一直卡在这一步:人工出题太贵,出少了只够当测试集,喂不饱一次微调;出多了又付不起医生的时间。于是公开领域长期存在一个尴尬的分层——要么是几百条精雕细琢、只能用来打分的题,要么是模板批量生成、问法僵硬的题,中间那一档「量足够大、问法足够自然、还带一点人工核验」的空着。
EHR-DS-QA 的做法是把出题这件事整个交给模型:拿 MIMIC-IV-Note v2.2 的两万一千余份出院小结,让两个开源的 130 亿参数指令微调模型逐份阅读并生成问答对,一共产出十五万余条。它瞄准的正是中间那一档——规模足以支撑一次真正的指令微调,问法来自生成模型而非固定模板,并附一个医生核验过的子集让人能对质量有个落点。配套的生成代码也一并开源,意味着这套流水线可以搬到任何一份临床或非临床文本上重跑。
它的代价同样明确,而且必须开篇就摆出来:十五万余条里只有 506 条经医生核验,占 0.323%,核验结果单独成文件,其余十五万条没有任何逐条人工判定;生成时的输入上限卡在 6000 个 token,更长的小结直接被排除;原始语料来自 MIMIC-IV-Note,因此要走 PhysioNet 的凭证申请、签署数据使用协议并完成 CITI 培训。它不是一份人工精标语料,是一份用规模换覆盖的合成语料,质量证据集中在那 506 条上。这一版 EHR-DS-QA 出院小结问答集覆盖的,正是上面说的中间那一档。一屏速览见下表。
一屏速览
| 维度 | 内容 |
|---|---|
| 全名 | EHR-DS-QA: A Synthetic QA Dataset Derived from Medical Discharge Summaries for Enhanced Medical Information Retrieval Systems |
| 发布方 | PhysioNet(数据由独立研究者 Konstantin Kotschenreuther 构建,无机构隶属) |
| 首次发布 | 2024 年 1 月 11 日,版本 1.0.0 |
| 最近改动 | 无后续版本;官方页面显示当前版本与全部版本累计浏览 255 次 |
| 来源语料 | MIMIC-IV v2.2 与 MIMIC-IV-Note v2.2 的出院小结 |
| 出院小结数 | 21,466 份(标准上下文 18,203 份,扩展上下文 3,263 份) |
| 涉及患者数 | 14,967 名 |
| 问答对总量 | 156,599 条(标准上下文 133,562 条,扩展上下文 23,037 条) |
| 小结长度 | 平均 1,250 词,中位数 1,209 词,范围 3–5,908 词(NLTK 词数) |
| 核验规模 | 506 条经医生核验,占总量 0.323%;其中 478 条判定正确 |
| 生成模型 | OpenOrca-Platypus2-13B(<3000 token)与 OpenAssistant llama2-13b-orca-8k-3319(3000–6000 token),均为 4 bit 量化 |
| 上下文上限 | 输入上限 6000 token,超过者不纳入;硬件为 24 GB 显存 |
| 文件格式 | UTF-8 编码 JSON 与 CSV(RFC 4180),共四个文件 |
| 划分方式 | 官方未提供训练/测试划分;核验子集单独成两个文件 |
| 许可与访问 | PhysioNet 凭证访问;Credentialed Health Data License 1.5.0 + DUA 1.5.0 + CITI 培训 |
| 典型用途 | 检索增强临床问答系统的训练、验证与测试;医学小模型的指令微调 |
§1 它要解决的具体麻烦
1.1 临床问答语料卡在「出题」这一步
把电子病历变成可问答的知识,技术链条上有三个环节:检索到正确的文档片段、读懂片段里的临床表述、把读懂的东西组织成一句能交付的答案。近十年的大模型把后两环大幅简化了,真正卡住的往往是第一环之后的监督信号——你拿什么教模型「医生会怎么问」。
人工出题是最直接的路,也是最贵的。医生看一份一千二百词的小结,提出三五个有价值的问题并写出标准答案,一份就要十几分钟,还要处理「答案到底涵盖到第几项药」这类口径争议。这条路做出来的东西精度高,但规模通常停在几百条,够打分不够训练。模板生成是另一条路,把「出院诊断是什么」「带了什么药」这类句式套到结构化字段上,规模可以很大,但问法僵化,而且问题本身就泄露了答案的位置,模型学会的是模式匹配而不是阅读。
第三条路是让一个足够强的模型来出题。这条路的可行性有一处公开证据:InstructGPT 对 GPT-3 的指令微调里,用包含「问题—答案—相关上下文段落」三元组的数据做训练,使得模型在问答与摘要任务上给出上下文中不存在信息的比例(幻觉率)下降了 48.7%。EHR-DS-QA 走的正是第三条路,而且刻意选择了一档「能在本地跑起来」的模型——作者明确把目标定在约十亿参数、可以在日常电脑上运行的专用小模型上,这份语料就是为这类小模型的微调准备的粮草。
1.2 三条常见的错误期待
第一条,期待它是「人工标注的高质量问答」。它不是。十五万余条问答对里,逐条经医生核验的只有 506 条,官方给出的核验正确率是 94.466%。剩下那十五万条的质量,只能靠这 506 条外推,而外推的可靠性取决于核验抽样是不是随机的——官方页面没有说明抽样方式,这一点要写在使用笔记里(§7.3)。
第二条,期待它自带训练/测试划分。它没有。四个文件里没有任何划分字段,也没有划分脚本。所有划分都要自己做,而且必须按 subject_id 分组做,不能按 note_id 随机切——同一患者的多次住院小结之间共享大量背景信息(§5.4)。
第三条,期待它覆盖「长小结」。它做不到。生成时输入上限是 6000 个 token,超过这个长度的小结在选样阶段就被排除了。这不是数据里长文本少,而是长文本被主动丢掉,因此它不能用来研究长上下文场景下的问答行为。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 医学小模型的检索增强问答微调 | 十五万余条「上下文—问题—答案」三元组 | 够,这是它设计时就瞄准的用途 |
| 评估一个问答系统的总体准确率 | 无标准答案的自动评测口径 | 不够,需自建评测集或只用核验子集 |
| 用人工判定的样本做质量参照 | 506 条带 correct 布尔值 |
够做参照,不够做训练集 |
| 研究长上下文(万 token 级)问答 | 上限 6000 token | 不够,长小结被排除在外 |
| 研究医生真实提问行为 | 问题由模型生成而非医生提出 | 不够,应看医生出题的语料 |
| 从病历结构化表里做 SQL 问答 | 它只有自由文本 | 不够,需表格式问答语料 |
| 跨机构泛化验证 | 单一来源(BIDMC) | 不够,只能做单中心结论 |
| 复现一套「任意文本生成问答对」的流水线 | 配套代码已开源在 GitHub | 够,代码与提示词模板都在仓库里 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你有一个 1B–7B 的医学小模型,想在病历问答上做指令微调 | 提供规模足够的三元组,格式可直接拼成指令样本 | 先按 subject_id 分组划分,再用核验子集做质量门槛检查 |
| 你在做检索增强问答,缺一个「给定段落回答」的监督信号 | 每条问答对都能追溯到一份具体小结与具体患者 | 把 note 当检索语料、question 当查询,评测检索与生成两段 |
| 你想量化「合成数据训出来的模型有多不准」 | 506 条人工判定给出了错误的主要形态:列表漏项 | 用官方给出的错误形态设计你的错误分类体系 |
| 你要在自己的临床文本上复现这套流水线 | 官方给出了模型、量化参数、预处理与后处理规则 | 照 §2.4 与 §2.5 的表逐项对齐,注意 6000 token 上限 |
| 你想研究幻觉 | 官方明说模型极少产生含上下文外信息的幻觉,更多是漏答 | 它更适合研究「漏答」而不是「编造」,别选错对象 |
| 你要做面向患者的问题回答 | 不合适,问题由模型按医生层级生成 | 转看面向患者的出院摘要问答语料 |
1.5 一句话判断
它不适合当「质量的标尺」,而适合当「规模的燃料」:十五万条合成问答对解决的是「没东西可训」的问题,而它自己对质量的回答只押在那 506 条核验样本上。
1.6 不适合谁:四条边界
不适合拿来做模型能力的最终评分。 十五万余条里没有逐条标准答案,拿模型输出与合成答案比相似度,量的是「像不像那个生成器」,不是「对不对」。真要打分,用那 506 条,或自建评测集。
不适合拿来做长文本研究。 6000 token 的天花板是硬件造成的硬截断,长小结根本没进语料。任何关于长上下文退化的结论都不能用它来下。
不适合拿来做医生提问行为的建模。 问题由两个 130 亿参数模型按提示词模板生成,反映的是模型对「医生会问什么」的模仿,不是医生真实的检索需求。官方也把它定位在「医生层级的问题」,而非「医生提出的问题」。
不适合拿来做跨机构结论。 全部语料来自贝斯以色列女执事医疗中心一家机构,写作规范、科室构成、住院病种结构都是这一家的。用它得到的结论只能写成单中心结果。
§2 数据构成与规格
2.1 四个文件与它们的关系
官方在数据描述一节给出了完整的交付清单:一份 JSON、一份 CSV,内容互为镜像;再加一份核验子集的 JSON 与 CSV。四份文件的命名规则很简单——带 _verified 后缀的两份只含经医生核验的记录。
| 文件名 | 格式 | 内容 | 使用注意 |
|---|---|---|---|
mimic_note_iv_qa.json |
UTF-8 JSON | 全量记录,顶层为字典列表 | 推荐入口,嵌套结构完整 |
mimic_note_iv_qa.csv |
UTF-8 CSV(RFC 4180) | 与上一份镜像 | qa_pairs 列为 JSON 字符串,需二次解析 |
mimic_note_iv_qa_verified.json |
UTF-8 JSON | 仅含经医生核验的记录,带 human_verified 与 correct |
评测与质量参照用 |
mimic_note_iv_qa_verified.csv |
UTF-8 CSV(RFC 4180) | 与上一份镜像 | 同上,仍需二次解析 qa_pairs |
要留意的是 JSON 转 CSV 这一步的性质。官方明确说 JSON 是按 RFC 4180 转成 CSV 的,而 qa_pairs 这个键的值是一个字典列表,落到 CSV 里只能变成一整串 JSON 文本。所以走 CSV 路线的人必须再做一次 json.loads,否则 qa_pairs 拿到的是字符串而不是列表——这是最常踩的第一个坑。
官方没有提供打包压缩包,也没有提供任何划分文件、模型权重或提示词模板文件。提示词模板与生成代码在配套的 GitHub 仓库里,不在 PhysioNet 的文件目录内。
2.2 字段字典
每条记录是一份出院小结及其派生问答对。顶层字段如下,其中 correct 与 human_verified 只出现在核验记录里。
| 字段 | 类型 | 含义 | 使用注意 |
|---|---|---|---|
original_id |
整数 | 项目内部的唯一编号 | 只在项目内部唯一,跨项目无意义 |
note |
字符串 | 出院小结正文 | 已去除开头的人称标识段 |
qa_pairs |
字典列表 | 由该小结生成的问答对 | CSV 里是 JSON 字符串,须解析 |
qa_pairs[].question |
字符串 | 模型生成的、聚焦该病例的问题 | 长度与复杂度取决于生成模型 |
qa_pairs[].answer |
字符串 | 模型生成的答案 | 后处理要求必须以英文句点结尾 |
qa_pairs[].correct |
布尔 | 医生判定的正误 | 仅核验记录有;未核验记录无此键 |
extended_context |
布尔 | 小结 token 数是否超过 3000 | 决定交给 4096 还是 8192 上下文模型 |
note_id |
字符串 | MIMIC-IV-Note 的小结编号 | 可直接与源库关联 |
subject_id |
字符串 | MIMIC-IV 的患者编号 | 划分数据集时的分组键 |
hadm_id |
字符串 | MIMIC-IV 的住院编号 | 一次住院可对应多份小结 |
human_verified |
布尔 | 该小结下所有问答对是否均已核验 | 仅核验文件里有 |
三个来自 MIMIC 的标识符把这份合成语料和源库锁死了,这是它一个容易被忽略的价值:subject_id 让人能把问答对与结构化表(诊断、用药、检验)连起来做交叉分析,hadm_id 让人能按一次住院聚合,note_id 让人能回到原始小结核对。合成数据集通常把这条链路切断,本数据集保留了它。
2.3 一条记录的完整解剖
单条记录的形状是一份小结挂一串问答对。读取的标准写法如下:
import json
import pandas as pd
#-- JSON 是推荐入口:顶层是列表,每个元素是一份出院小结及其问答对
with open('mimic_note_iv_qa.json', encoding='utf-8') as f:
data = json.load(f)
rec = data[0]
#-- 顶层键:编号、正文、问答对、上下文标记、三个来源标识符
print(sorted(rec.keys()))
#-- qa_pairs 是字典列表;correct 只在核验文件里存在
for qa in rec['qa_pairs'][:3]:
print(qa.get('question'))
print(qa.get('answer'))
print(qa.get('correct')) #-- 全量文件里这里会是 None
走 CSV 路线时多一步解析:
#-- CSV 里的 qa_pairs 是一整串 JSON 文本,必须再解析一次
df = pd.read_csv('mimic_note_iv_qa.csv')
df['qa_pairs'] = df['qa_pairs'].map(json.loads)
#-- 展开成扁平的三元组表:一行一条问答对
flat = df.explode('qa_pairs').reset_index(drop=True)
flat['question'] = flat['qa_pairs'].map(lambda d: d.get('question'))
flat['answer'] = flat['qa_pairs'].map(lambda d: d.get('answer'))
print(flat.columns.tolist(), flat.shape)
扁平化之后,一行就是一条「上下文—问题—答案」三元组,可以直接拼成指令微调样本。注意 note 这一列会在展开后被复制很多次,做内存预算时按问答对条数而不是小结份数估。
2.4 两条生成流水线与它们的量化配置
这是本数据集在规格上最独特的地方:不是用一个模型跑到底,而是按小结长度分给两个不同的 130 亿参数模型。分界线是 3000 个 token。
| 项 | 标准上下文流水线 | 扩展上下文流水线 |
|---|---|---|
| 适用小结 | token 数小于 3000 | token 数在 3000 到 6000 之间 |
| 模型 | Open-Orca/OpenOrca-Platypus2-13B | OpenAssistant/llama2-13b-orca-8k-3319 |
| 模型来源 | OpenOrcaxOpenChat-Preview2-13B 与 Platypus2-13B 合并 | Llama 2 13B 的 RoPE 缩放指令微调版 |
| 原生上下文 | 4096 token | 8192 token |
| 推理库 | ExLlama | Hugging Face Transformers |
| 量化 | 4 bit,Act Order 开,group size 64 | 4 bit,Act Order 关,group size 128 |
| 位置编码 | 原生 | NTK Rope Scaling,alpha 取 4 |
| 产出问答对 | 133,562 条 | 23,037 条 |
| 覆盖小结 | 18,203 份 | 3,263 份 |
两条线的存在意味着一个必须写进方法节的变量:extended_context 为真时,生成它的模型不同、量化配置不同、位置编码策略也不同。把它当同一个生成器的输出混在一起分析,等于把一个混杂因素藏起来。合理做法是把它当分层变量,或者在主要结论上只用标准上下文那一档。
选样顺序同样值得记一笔。官方说明:小于 3000 token 的小结同时按 ID 升序与降序两条顺序各处理一遍,而 3000 token 以上的小结只按升序处理了一遍。前者的双遍处理意味着同一份小结可能对应不止一条记录,按 note_id 做去重或计数时要先确认官方交付里是否存在重复,不能默认一一对应。
上游微调的超参数官方也一并列出,列在这里是因为它们决定了生成器的行为边界:
| 上游模型 | 训练方式 | 硬件 | 学习率 | 批大小 | 预热步数 | 轮数 | 权重衰减 | 最大长度 |
|---|---|---|---|---|---|---|---|---|
| OpenOrcaxOpenChat-Preview2-13B | 全参数微调 | 8×A100-80GB | 未公开 | 未公开 | 未公开 | 未公开 | 未公开 | 未公开 |
| garage-bAInd/Platypus2-13B | LoRA 适配 | 1×A100-80GB | 4e-4 | 16 | 100 | 1 | 0 | 4096 |
| OpenAssistant/llama2-13b-orca-8k-3319 | 指令微调 | 8×A100-SXM4-80GB | 1e-5 | 2 | 100 | 1 | 0 | 8192 |
两个生成模型在项目里都是开箱即用,没有再做过额外微调。这一点对复现很关键:你拿到的输出是「公开模型权重 + 官方提示词模板 + 4 bit 量化 + 固定解码设置」的结果,任何一项对不上,复现出来的分布就会偏。
2.5 预处理与后处理:五道过滤
合成数据的质量,很大一部分不取决于生成而取决于过滤。官方把这几步写得很细,整理成表:
| 阶段 | 规则 | 目的 | 副作用 |
|---|---|---|---|
| 预处理 | 删去小结开头主要由个人标识段构成的第一段 | 去掉无信息量的开头 | 若开头含有效内容会一并丢失 |
| 预处理 | 若含过敏信息段,则删去其之前的所有内容 | 过敏段常是第一个可用段落 | 过敏段之前的段落被切掉 |
| 后处理 | Mr. / Mrs. 加下划线替换为 the patient;Dr. 加下划线替换为 the doctor |
消除残留的去标识痕迹 | 指代变模糊 |
| 后处理 | 仍含去标识引用的问答对整条删除 | 兜底清理 | 部分问答对被丢弃 |
| 后处理 | 检出 <s> 与 ### 等特殊标记并替换;答案不以句点结尾的问答对删除 |
剔除截断与未完成输出 | 非英语结尾的有效答案可能被误删 |
第一、二条合起来解释了为什么 note 字段里看不到小结最开头的抬头部分——那是主动切掉的,不是源库缺失。第五条尤其值得留意:答案必须以英文句点结尾,否则整条丢弃。这条规则对英文语料是合理的启发式,但它同时意味着任何以数字、括号或换行收尾的有效答案都会被一并丢掉,而丢弃了多少、官方没有给出数字。
还有一层过滤是格式解析。官方明说模型并未总是遵守输出格式,因此需要解析代码;绝大多数情况解析成功,少数情况下整条问答对以未解析的原始字符串形式存了下来,项目为此又跑了一轮二次解析。这意味着核验子集之外的记录里,可能残留极少量结构异常的答案。
2.6 与同类资源的字段差异
| 对比项 | EHR-DS-QA | EHRNoteQA | DiSCQ | DrugEHRQA |
|---|---|---|---|---|
| 来源 | MIMIC-IV-Note v2.2 | MIMIC-IV-Note v2.2 | MIMIC-III v1.4 | MIMIC-III v1.4 结构化表 |
| 文本形态 | 出院小结全文 | 出院小结全文 | 出院小结片段 | 结构化表加自由文本 |
| 答案形态 | 自由文本 | 五选一选项加答案键 | 触发片段与检索 | 查询结果 |
| 问题来源 | 大模型生成 | 人工编写 | 医学专家编写 | 自然语言查询 |
| 规模量级 | 十五万余条问答对 | 评测基准量级 | 两千余条问题 | 问答对若干 |
| 人工核验 | 506 条,占 0.323% | 逐题带审阅标识 | 全部由专家产出 | 未公开 |
| 主要用途 | 训练与验证 | 大模型评测 | 提问行为研究与问题生成 | 用药相关查询 |
| 访问 | 凭证访问 | 视源项目而定 | 公开 | 视源项目而定 |
这张表要说清的只有一件事:在「规模」这一列上它一骑绝尘,在「人工参与程度」这一列上它垫底。这两件事是同一个设计的两面,选它的时候必须同时接受。
§3 它是谁的数据
3.1 贡献者与机构
| 项 | 内容 |
|---|---|
| 作者 | Konstantin Kotschenreuther |
| 机构隶属 | Independent(独立研究者,无机构) |
| 发布平台 | PhysioNet(RRID:SCR_007345) |
| 资助 | 官方声明无任何外部资助、无外部计算资源 |
| 利益冲突 | 作者声明无 |
| 配套代码 | GitHub 仓库 kkotsche1/EHR-DS-QA-Code-for-QA-Generation-over-EHR-Discharge-Summaries |
「独立研究者、无外部资助、无外部算力」这三点合起来解释了数据集的几乎全部设计取舍。24 GB 显存是把 6000 token 设为上限的直接原因;用 4 bit 量化的 130 亿参数模型而不是更大的模型,是算力的函数;作者把目标明确写成「约十亿参数、能在日常电脑上跑的专用小模型」,是因为他假设的使用场景是医院与普通诊所的本地机器,而不是数据中心。这不是缺陷清单,而是一组自洽的工程决策——读这份数据的时候,先理解它是在什么约束下做出来的,很多看起来别扭的地方就讲得通了。
3.2 时间线
| 时间 | 事件 | 意义 |
|---|---|---|
| 2023-09-18 | 配套代码仓库的最后一次更新(官方引用日期) | 流水线先于数据定稿 |
| 2023-09 | 参考文献的集中访问日期 | 工作主要在 2023 年完成 |
| 2024-01-11 | 版本 1.0.0 在 PhysioNet 上线 | 首次公开,此后无新版本 |
| 上线至今 | 官方页面记录当前版本与全部版本累计浏览 255 次 | 关注度低,属小众资源 |
它没有版本迭代,也没有修订说明。对使用者来说这有两层含义:一是拿到的数据就是 2024 年 1 月那一版,不存在「新版修了旧版的错」;二是官方页面列出的已知限制(列表漏项、长小结更易出错、偶发漏答)至今仍然有效,没有人承诺修。
3.3 采集场景:MIMIC-IV-Note 的出院小结
源语料是 MIMIC-IV-Note v2.2,来自贝斯以色列女执事医疗中心的去标识自由文本临床记录。官方给的长度画像(NLTK 词数)是:平均 1,250 词,中位数 1,209 词,范围 3 到 5,908 词。注意到下界是 3 词——存在几乎空的小结,这类极端短文本生成的问答对内容可想而知,做数据清洗时值得单独看一眼。
从这份语料里,项目最终纳入 21,466 份小结,覆盖 14,967 名患者。小结份数多于患者数,说明存在同一患者多次住院的情况,这正是划分时要用 subject_id 分组的原因。
上一个版本的 MIMIC 体系里,MIMIC-IV 覆盖超过四万名患者的记录;本数据集并未全量使用,而是按长度与顺序规则选样。这一点决定了它的代表性边界:它是 MIMIC-IV-Note 出院小结的一个按长度截断、按 ID 顺序抽取的子集,不是随机样本。
3.4 数据来源的四个层次
理解这份数据要分清四层,每一层的可得性与性质都不同:
| 层次 | 内容 | 可得性 | 对使用者的含义 |
|---|---|---|---|
| 原始电子病历 | BIDMC 的真实住院记录 | 不可得 | 无法回溯核验原始信息 |
| MIMIC-IV-Note v2.2 | 去标识后的自由文本临床记录 | 凭证可得 | 可通过 note_id 回到原文 |
| 出院小结正文 | 本数据集的 note 字段 |
随数据集可得 | 已切掉开头段,与源库不完全一致 |
| 问答对与核验标记 | qa_pairs 与 correct |
随数据集可得 | 模型生成加医生抽样判定 |
第三层与源库的差异要特别记一笔:因为预处理切掉了开头段与过敏段之前的内容,本数据集里的 note 不等于 MIMIC-IV-Note 里的原始小结全文。任何拿 note_id 去源库取原文比对的做法,都会发现开头少了一截——这是预期行为,不是数据损坏。
§4 它最独特的东西
4.1 从「只够测试」到「够训」这一步
官方在背景一节里点名了两个先行工作,并给出了对它们的评价,这两句评价正好框定了本数据集的位置。一个是 DrugEHRQA,围绕 MIMIC-III 的电子病历做自然语言查询与检索;另一个是 MIMIC-III 临床笔记的标注问答对,官方认为它「意在模型测试而非模型训练,因而问答对数量少得多,并且聚焦于定位答案在上下文中的确切位置——而随着先进 Transformer 模型的出现,这个细节已不那么关键」。
这两句话合起来,就是本数据集要跨的那道坎:把问答对的量从「够打分」推到「够训练」,同时把标注重点从「答案在哪一行」换到「答案说了什么」。十五万余条这个量级是为此服务的——按常见的指令微调样本量估算,这个量足够让一个十亿参数级别的模型在「读给定段落回答问题」这件事上形成稳定的行为。
代价是人工参与被压缩到极限。它跨过了规模这道坎,但没能同时跨过质量证据这道坎——那 506 条核验样本,是它唯一能拿出来证明「这些合成答案大体可信」的东西。
4.2 官方给出的统计口径
官方在摘要统计一节给出了完整数字,全部照录如下,这些是全文数字的第一出处:
| 项 | 数值 |
|---|---|
| 生成的问答对总数 | 156,599 |
| 标准上下文(<3000 token)问答对 | 133,562 |
| 扩展上下文问答对 | 23,037 |
| 处理的出院小结数 | 21,466 |
| 标准上下文小结数 | 18,203 |
| 扩展上下文小结数 | 3,263 |
| 涉及的患者数 | 14,967 |
| 出院小结平均词数 | 1,250 |
| 出院小结词数中位数 | 1,209 |
| 出院小结词数范围 | 3–5,908 |
| 经医生核验的问答对 | 506 |
| 核验占比 | 0.323% |
| 判定正确的核验问答对 | 478 |
| 判定错误的核验问答对 | 28 |
| 核验正确率 | 94.466% |
| 核验的标准上下文问答对 | 441(正确 418,94.78%) |
| 核验的扩展上下文问答对 | 65(正确 60,92.30%) |
两组分项数字各自与总数吻合:133,562 加 23,037 正好是 156,599,18,203 加 3,263 正好是 21,466。这个内部一致性说明统计口径是清晰的,可以放心引用。
需要提醒的是这几个数字的性质:它们描述的是核验子集的构成,不是全量十五万条的质量分布。441 与 65 的分组只告诉我们核验样本里长短上下文各占多少,不能据此推断全量的正确率。
4.3 案例:核验判定是怎么做出来的
官方对核验规则的描述很具体,值得逐条拆开,因为它决定了那 94.466% 到底意味着什么:
| 情形 | 判定 | 说明 |
|---|---|---|
| 问题被上下文完整且正确地回答 | 正确 | 唯一算对的情形 |
| 问题在上下文中无法回答,模型明确回答「无法从给定上下文回答」 | 正确 | 承认答不出也算对 |
| 部分正确:正确内容与幻觉混杂 | 错误 | 幻觉零容忍 |
| 部分正确:答案未覆盖与该问题相关的全部信息 | 错误 | 漏项零容忍 |
| 列表型问题(如出院带药)漏掉其中一项 | 错误 | 即使其余全对也判错 |
最后两条是理解这个 94.466% 的钥匙。核验采用的是一个非常严的口径:任何漏项都算错。所以 5.534% 的错误率里,绝大部分不是「说错了」,而是「没说全」。官方自己也印证了这一点:绝大多数错误表现为列表理解时的遗漏,尤其在列举药物或诊断这类问题上。
这对使用者的意义很直接:如果你关心的是「模型会不会编造」,这份核验结果告诉你的信息有限,因为幻觉在核验口径里只是错误的一小部分;如果你关心的是「模型会不会漏」,那这份核验结果恰好是一个严苛的标尺。
4.4 三处容易读错的地方
第一处:94.466% 不是全量准确率。 它是 506 条核验样本里的正确率。十五万条未经核验的问答对没有对应的判定,其真实正确率未知。把这 94.466% 写进论文当作数据集的整体准确率,是对统计口径的误读。
第二处:核验的抽样方式未公开。 官方没有说明这 506 条是按什么规则从十五万余条里抽出来的。若抽样与 note_id、extended_context 或生成顺序相关,那么这 506 条的经验就不能无偏地外推到全量。这是它质量论证上最大的一处空白,使用者应在局限一节写明。
第三处:核验与未核验混在一个文件里会出问题。 核验子集单独成文件,且核验记录多出 human_verified 与 correct 两个键。若把两个文件拼在一起再统一处理,correct 字段的缺失会被读成「未核验」还是「判定为错」,取决于你的代码怎么写——必须在读取时就显式区分两个来源。
4.5 边界条件:什么情况下它不再适用
| 条件 | 是否适用 | 判断依据 |
|---|---|---|
| 训练一个医学小模型做段落问答 | 适用,且是设计目标 | 十五万余条三元组 |
| 作为模型能力的最终评分基准 | 不适用 | 无逐条标准答案 |
| 研究长上下文问答的退化 | 不适用 | 输入上限 6000 token |
| 研究幻觉的产生机制 | 部分适用 | 官方称幻觉罕见,错误以漏项为主 |
| 建模医生真实提问行为 | 不适用 | 问题由生成模型产出 |
| 跨机构泛化结论 | 不适用 | 单一来源机构 |
| 面向患者的通俗问答 | 不适用 | 问题定位在医生层级 |
| 复现一套文本到问答对的流水线 | 适用 | 模型、量化、模板、后处理规则均已公开 |
这张表最有用的两行是第一行与第四行。第一行是它的主场;第四行提醒一个选错对象的风险——冲着「研究幻觉」来的人会失望,因为生成器更多是答不全而不是乱编。
§5 怎么拿到
5.1 目录结构与下载面
| 路径 | 内容 | 备注 |
|---|---|---|
/files/ehr-ds-qa/1.0.0/mimic_note_iv_qa.json |
全量记录 | UTF-8 编码,推荐入口 |
/files/ehr-ds-qa/1.0.0/mimic_note_iv_qa.csv |
全量记录镜像 | RFC 4180 |
/files/ehr-ds-qa/1.0.0/mimic_note_iv_qa_verified.json |
核验子集 | 多出两个键 |
/files/ehr-ds-qa/1.0.0/mimic_note_iv_qa_verified.csv |
核验子集镜像 | RFC 4180 |
官方的文件目录是扁平的,根目录下就是这四个文件,没有子目录、没有划分文件、没有模型权重。文件清单来自官方页面的数据描述一节。
需要说明的是,本次核验时文件目录页返回了访问受限提示(页面显示因区域法律或政策限制不可用),因此四个文件的实际体积、全库打包体积未能直接测量。文件清单与字段结构以官方页面的数据描述为准,体积数字一律不写。
5.2 申请与下载
访问链路比一般公开数据集长一截,按官方页面的顺序是三步:完成 CITI「Data or Specimens Only Research」培训、签署 PhysioNet 凭证健康数据使用协议 1.5.0、以凭证用户身份登录下载。
#-- 1. 凭证登录后整库下载;-np 防止爬到上级目录
wget -r -N -c -np --user <username> --ask-password \
https://physionet.org/files/ehr-ds-qa/1.0.0/
#-- 2. 确认四个文件都在
ls -1 mimic_note_iv_qa.json mimic_note_iv_qa.csv \
mimic_note_iv_qa_verified.json mimic_note_iv_qa_verified.csv
也可以用 PhysioNet 官方的命令行工具:
#-- physionet-cli 走的是同一套凭证,适合脚本化
pip install physionet
physionet download ehr-ds-qa 1.0.0 --output-dir ./ehr-ds-qa
拿不到凭证的情况下没有任何替代路径——官方页面的访问策略写得很清楚:只有签署了数据使用协议的凭证用户才能访问文件。想先看看数据长什么样的人,可以先读官方页面的字段说明与配套的 GitHub 仓库。
5.3 用 pandas 直接读
import json
import pandas as pd
#-- 一次性读入全量 JSON;文件较大,内存吃紧时改用 ijson 流式解析
with open('mimic_note_iv_qa.json', encoding='utf-8') as f:
data = json.load(f)
#-- 元数据与正文分开建表,避免把长文本复制多份
meta = pd.DataFrame([{k: v for k, v in r.items() if k != 'qa_pairs'}
for r in data])
print(meta.columns.tolist(), meta.shape)
#-- 核验子集的记录多出 human_verified 与 correct 两个键
with open('mimic_note_iv_qa_verified.json', encoding='utf-8') as f:
ver = json.load(f)
print(sorted(ver[0].keys()))
meta 这张表的行数等于出院小结条数,每一行带着 subject_id、hadm_id、note_id 与 extended_context,足够支撑分组划分与分层分析,而不必去动体积大得多的 note 正文。
5.4 转成微调样本
import json
from collections import defaultdict
with open('mimic_note_iv_qa.json', encoding='utf-8') as f:
data = json.load(f)
#-- 关键:按 subject_id 分组划分,同一患者的小结不得跨集
groups = defaultdict(list)
for r in data:
groups[r['subject_id']].append(r)
sids = sorted(groups) #-- 排序保证划分可复现
cut = int(len(sids) * 0.9) #-- 示例口径:九成患者进训练
train_sids, test_sids = set(sids[:cut]), set(sids[cut:])
def to_samples(records):
out = []
for r in records:
for qa in r['qa_pairs']:
out.append({'context': r['note'], 'question': qa['question'],
'answer': qa['answer'], 'note_id': r['note_id'],
'subject_id': r['subject_id'],
'extended': r['extended_context']})
return out
train = to_samples([r for s in train_sids for r in groups[s]])
test = to_samples([r for s in test_sids for r in groups[s]])
print(len(train), len(test))
这段代码里有三处必须在论文里写清楚:一是划分口径按患者而不是按小结,二是九成的比例只是示例、换比例要显式改,三是 extended_context 被保留为分层变量而不是被丢掉。第三点尤其重要——丢了它,你就分不清结论来自标准上下文那一档还是两档混在一起。
5.5 核验子集的用法
506 条核验样本的正确姿势是当标尺,不是当训练集。三种常见用法:
| 用法 | 做法 | 能得到什么 |
|---|---|---|
| 质量参照 | 统计 correct 为真与为假的问答对,按官方给出的错误形态归类 |
合成答案的主要失效模式 |
| 评测集 | 用这 506 条测你自己模型的答案 | 一个带人工判定的小评测集 |
| 训练过滤 | 只用 correct 为真的问答对微调 |
一个干净的极小训练集 |
第三种用法要谨慎:478 条正确样本太少,单独训不出任何东西,只能作为其他训练数据之上的一层精筛补充。把它当主训练集会立刻过拟合。
5.6 五个最容易出错的地方
| 位置 | 错误写法 | 后果 | 正确做法 |
|---|---|---|---|
| CSV 读取 | 直接把 qa_pairs 当列表用 |
拿到字符串,遍历出单个字符 | 先 json.loads |
| 数据集划分 | 按 note_id 随机切 |
同一患者跨集,结果虚高 | 按 subject_id 分组 |
| 质量表述 | 把 94.466% 说成全量准确率 | 夸大质量证据 | 写明它是 506 条核验样本的正确率 |
| 长短上下文 | 忽略 extended_context 直接混用 |
混入模型差异这一混杂因素 | 作为分层变量或只用标准档 |
| 原文比对 | 用 note_id 取源库全文比对 |
发现开头少一截,误判为损坏 | 记住预处理切掉了开头段与过敏段之前的内容 |
§6 与库内条目的关系
6.1 关系图谱
把临床问答类的库内资源按「文本形态 × 人工参与程度」摆开,本数据集的位置就很清楚:
| 资源 | 文本形态 | 问题来源 | 规模量级 | 与本数据集的关系 |
|---|---|---|---|---|
| EHR-DS-QA(本数据集) | 出院小结全文 | 大模型生成 | 十五万余条 | 待测 |
| EHRNoteQA | 出院小结全文 | 人工编写,五选一 | 评测基准量级 | 同源语料,一训一测,互补最强 |
| DiSCQ | 出院小结片段 | 医学专家编写 | 两千余条 | 医生真实提问的对照 |
| MeDiSumQA | 出院摘要 | 面向患者改写 | 数百对 | 面向患者视角的对照 |
| DrugEHRQA | 结构化表加自由文本 | 自然语言查询 | 用药相关 | 结构化路线的对照 |
| ArchEHR-QA | 患者叙述加笔记节选 | 真实患者提问经医生改写 | 共享任务量级 | 带句级证据引用的对照 |
| EHRXQA | 结构化表加影像 | 模板生成 | 四万余道 | 结构化与多模态路线的对照 |
| EHRSQL | 结构化表 | 自然语言转 SQL | 大规模 | 数据库问答路线的对照 |
这条关系线的意义在于:同样叫「电子病历问答」,走的路子完全不同。本数据集是唯一一个把「自由文本 + 大规模合成 + 面向微调」三件事凑在一起的,其余要么人工出题、要么走结构化表、要么面向评测。
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 同源语料的人工出题版本 | EHRNoteQA、出院小结 评测 |
EHRNoteQA(rid 1256) |
| 医生真实提问行为 | DiSCQ、trigger、提问生成 |
DiSCQ(rid 1527) |
| 面向患者的出院问题 | MeDiSumQA、患者 出院摘要 |
MeDiSumQA(rid 1315) |
| 结构化表的自然语言查询 | DrugEHRQA、EHRSQL、Text-to-SQL |
DrugEHRQA(rid 1300)、EHRSQL(rid 713) |
| 带句级证据引用的问答 | ArchEHR-QA、证据 引用 |
ArchEHR-QA(rid 1000) |
| 源语料本身 | MIMIC-IV-Note、MIMIC-IV |
MIMIC-IV-Note(rid 47)、MIMIC-IV(rid 4) |
| 出院小结的其他标注形态 | Brief Hospital Course、章节切分 |
简要住院病程标注集(rid 1249) |
6.3 与其他库内条目的分工判据
| 任务 | 主粮仓该用什么 | 本数据集的位置 | 原因 |
|---|---|---|---|
| 段落问答的指令微调 | 本数据集 | 主力 | 十五万余条三元组,规模唯一够 |
| 大模型能力打分 | EHRNoteQA | 不适用 | 需要人工出题的标准答案 |
| 提问行为研究 | DiSCQ | 不适用 | 需要医生真实提问 |
| 结构化查询 | EHRSQL、EHRXQA | 不适用 | 需要表结构 |
| 面向患者问答 | MeDiSumQA、ArchEHR-QA | 不适用 | 问题定位在医生层级 |
| 质量证据参照 | 本数据集的核验子集 | 辅助 | 506 条人工判定 |
| 流水线复现 | 本数据集的配套代码 | 主力 | 唯一公开了完整生成配置的 |
这张表第一行的「唯一」是它存在的理由,其余各行都在划边界。被高估的用法是把它当评测基准——它没有逐条标准答案,担不起这个角色。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先纠正一个常见误判:把「合成」当成「劣质」。评价这份数据不能套用人工标注的尺子,因为它解决的根本不是同一个问题。人工标注解决的是「这条对不对」,本数据集解决的是「有没有足够多的东西可训」。用前一把尺子量它,结论必然是「不合格」;而这个结论对想做微调的人毫无帮助。
这个校正会改变下面五维评分的读法。标注质量这一项它拿不到高分,但在「规模与可得的流水线」上它有独占的位置。把两件事混在一起看,就会得出「不值得用」的错误结论。
7.1 五维评分
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 5 | 十五万余条问答对、两万余份小结,量级足以支撑微调 |
| 标注质量 | 2 | 逐条人工判定仅 506 条(0.323%),其余无判定 |
| 任务适配 | 5 | 三元组格式可直接用于检索增强问答的微调 |
| 文档完整 | 5 | 模型、量化、预处理、后处理、统计口径全部公开 |
| 可获取性 | 2 | 凭证访问,须签协议并完成培训 |
五项合计 19 分(满分 25)。这个分数结构是典型的「强在规模与文档、弱在质量证据与获取门槛」:想快速上手的人会被凭证流程拦一道,想拿它当金标准的人会失望,而想用它训小模型的人正好。
7.2 已知限制与它们的影响
| 官方列出的限制 | 具体表现 | 对使用者的影响 |
|---|---|---|
| 列表理解遗漏 | 列举药物或诊断时漏掉其中一项 | 合成答案作为监督信号时,会教模型答不全 |
| 长小结更易出错 | 扩展上下文核验正确率 92.30%,低于标准档 94.78% | 长文本场景的错误率更高 |
| 偶发漏答 | 上下文里有答案,模型却回答「未提供」 | 训练出的模型可能过度保守 |
| 幻觉 | 含上下文外信息的回答,官方称罕见 | 研究幻觉的人会样本不足 |
| 上下文上限 | 6000 token,更长小结被排除 | 不能用于长上下文研究 |
| 生成器偏差 | 生成模型本身的倾向会影响问法与答法 | 多样性不足,问法同质 |
| 去标识造成的偏斜 | 普遍以 the patient 指代患者 | 与真实临床对话的指代方式不同 |
前两条是官方明确点出的主要失效模式,值得单独强调:用这份数据微调出来的模型,在「列举类」问题上大概率会继承漏项的毛病。如果下游任务恰好是「出院带药有哪些」,那这个缺陷会直接落在任务上,而不是停留在统计数字里。
7.3 可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 长度截断 | 超过 6000 token 的小结被排除 | 长住院、复杂病例系统性缺失 |
| 选样顺序 | 短小结双遍处理、长小结单遍 | 同一 note_id 可能对应多条记录 |
| 单中心 | 全部来自 BIDMC | 写作规范与病种结构单一 |
| 核验抽样未公开 | 506 条的抽取规则未说明 | 核验结果向全量外推的可靠性未知 |
| 生成器单一谱系 | 两个模型同属 Llama 2 13B 系微调 | 错误模式高度相关,不像多模型集成 |
| 后处理截断 | 答案不以句点结尾即丢弃 | 非句点结尾的有效答案被系统性剔除 |
| 段落切除 | 开头段与过敏段之前的内容被删 | 位于小结开头的信息不可用 |
第四行是这一节最该被记住的一行。其余偏差都是可以绕开或校正的,唯独核验抽样方式未公开这件事无法从数据侧补救——它决定了这份数据集的质量论证能走多远。
7.4 外部验证矩阵
| 验证角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 微调数据源 | 用它训练小模型做段落问答 | 规模足够,格式直接可用 | 继承漏项与保守倾向 |
| 质量参照 | 引用 506 条核验结果说明合成质量 | 核验口径严格 | 不能外推为全量准确率 |
| 流水线复现 | 照 GitHub 代码在自有文本上重跑 | 配置全部公开 | 硬件不同则量化与上下文上限需重设 |
| 检索评测的查询源 | 用 question 当查询、note 当语料 |
查询自然度高于模板生成 | 查询分布反映的是模型偏好 |
外部使用里最稳的姿势是第一种与第三种。第二种常有被夸大的风险——把 94.466% 说成数据集的整体正确率,是对核验口径的误读(§4.4)。
7.5 它为何还值得用
它没有版本迭代、关注度低、质量证据薄弱,却仍然是这个位置上少见的选择,原因是它把三件通常不同时成立的事凑在了一起:量足够大、格式足够直接、生成配置足够透明。前两点让它能用,第三点让人能判断能不能信。绝大多数合成数据集只做到了第一点。
§8 生态位与历史
8.1 历史沿革
它出现在 2024 年初,正值开源大模型可直接本地部署的窗口期:130 亿参数的模型经 4 bit 量化后能塞进 24 GB 显存,个人研究者第一次可以在自己的机器上跑通「读全文、出题、答题」的完整流水线。本数据集是这个窗口期的典型产物——不是机构立项的成果,而是一个人用一张消费级或工作站级显卡做出来的东西。
它在 PhysioNet 上的托管方式也很典型:数据放在平台上,代码放在 GitHub 上,两者通过官方页面的链接互指。这种模式让它不依赖项目经费就能长期存在,代价是没有维护承诺——官方列出的已知限制至今没有修订计划。
8.2 与先行工作的关系
官方在背景一节点名了两个先行工作,并明确说明了与它们的差异。对 DrugEHRQA,官方把它归为「围绕 MIMIC-III 电子病历做自然语言查询检索」的一支;对 MIMIC-III 临床笔记的标注问答对,官方的评价是它意在测试而非训练、数量少得多、且聚焦答案位置定位。
这个定位关系值得记牢,因为它解释了本数据集的两个设计选择:为什么规模要堆到十五万条(为了够训),为什么不标答案位置(因为先进模型不再需要)。这两条都是为了跨过先行工作留下的那道坎。
有意思的是,先行工作里人工出题的那一支并没有被替代,而是分化成了另一个生态位:DiSCQ 这类由医学专家出题的语料,回答的是「医生到底会问什么」,与本数据集的「怎么让模型学会答题」是互补而非竞争关系。
8.3 生态位:燃料而不是标尺
| 角色 | 主粮仓 | 标尺 |
|---|---|---|
| 典型用法 | 指令微调、预训练式喂料 | 能力打分、排行榜 |
| 需要的前提 | 规模大、格式统一 | 人工判定、口径严格 |
| 代表资源 | 本数据集、大规模合成语料 | EHRNoteQA、DiSCQ |
| 失败模式 | 质量缺陷被继承到模型里 | 样本太少导致结论不稳 |
本数据集坐在左边这一列。把燃料当标尺用,会遇到「没有标准答案」这个硬伤;把标尺当燃料用,会遇到「量不够训」这个硬伤。两者不能互换,选之前先想清楚你要的是哪一种。
8.4 谁在用它,用来做什么
从它的设计目标与数据形态反推,使用者集中在三类:做医学小模型微调的工程组(把它当燃料)、做检索增强问答的研究组(把它当上下文—问题—答案三元组的来源)、想在自有临床文本上复现生成流水线的团队(把它当参考实现)。第三类常常被忽略,但配套代码与提示词模板的完整公开,让它的复现价值可能高于数据本身。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 小模型微调工程师 | 走完凭证流程,读 JSON,跑通 §5.3 | 按 subject_id 分组划分,训一版基线 |
划分口径与 extended_context 都要写进方法节 |
| 检索增强问答研究者 | 把 note 当语料、question 当查询搭检索 |
分标准档与扩展档分别报告 | 两档生成器不同,别混报 |
| 流水线复现者 | 读 GitHub 仓库的提示词模板与解析代码 | 在自有文本上跑通并对比后处理规则 | 24 GB 显存与 6000 token 上限是原版的约束 |
9.2 一条最短的可用流程
#-- 1. 凭证登录后下载(须先完成 CITI 培训并签署 DUA)
wget -r -N -c -np --user <username> --ask-password \
https://physionet.org/files/ehr-ds-qa/1.0.0/
import json
from collections import defaultdict
#-- 2. 读入并按患者编号分组(划分的唯一正确口径)
with open('mimic_note_iv_qa.json', encoding='utf-8') as f:
data = json.load(f)
groups = defaultdict(list)
for r in data:
groups[r['subject_id']].append(r)
#-- 3. 挑一段看形状:问题、答案、长短上下文标记
r = data[0]
print(r['note_id'], r['subject_id'], r['hadm_id'], r['extended_context'])
print(r['qa_pairs'][0]['question'])
print(r['qa_pairs'][0]['answer'])
#-- 4. 核验子集单独读,correct 键只在那里出现
with open('mimic_note_iv_qa_verified.json', encoding='utf-8') as f:
ver = json.load(f)
flags = [qa.get('correct') for r in ver for qa in r['qa_pairs']]
print(len(flags), sum(flags))
最后一段的输出对应官方给出的 506 与 478,可以作为完整性自检:两个数对上了,说明文件读全了、核验子集没有缺行。
9.3 引用方式
| 引用对象 | 内容 |
|---|---|
| 数据集 | Kotschenreuther, K. (2024). EHR-DS-QA: A Synthetic QA Dataset Derived from Medical Discharge Summaries for Enhanced Medical Information Retrieval Systems (version 1.0.0). PhysioNet. RRID:SCR_007345. https://doi.org/10.13026/25fx-f706 |
| 平台 | Pollard, T. 等 (2026). PhysioNet as a global platform for biomedical research. Nature Health. https://doi.org/10.1038/s44360-026-00096-z |
| 上游语料 | MIMIC-IV v2.2(https://doi.org/10.13026/6mm1-ek67)与 MIMIC-IV-Note v2.2(https://doi.org/10.13026/1n74-ne17) |
| 生成代码 | GitHub 仓库 kkotsche1/EHR-DS-QA-Code-for-QA-Generation-over-EHR-Discharge-Summaries |
论文里建议同时写明:使用的版本号(1.0.0)、是否使用了核验子集、划分是否按 subject_id 分组、以及结论是否只在标准上下文那一档上成立。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,编辑把关结构与事实 |
| 数字来源 | 规模、结构、边界三类数字全部来自 PhysioNet 官方页面 v1.0.0 的摘要与摘要统计一节 |
| 文件核验 | 四个数据文件的文件名与字段结构来自官方页面的数据描述一节;文件目录页因区域访问限制未能直接列举 |
| 不一致说明 | 官方页面未说明核验样本的抽样方式,文中已作为局限列出而非推测 |
| 论文信息 | 官方页面自述即为原始出处;未另见同行评审论文,仅参考其列出的参考文献 |
| 未核验内容 | 四个文件的实际体积、核验样本的抽取规则、后处理丢弃的问答对条数、同一小结重复出现的具体记录数 |
| 图像 | 无配图;封面为生成式提示词,不含真实病历内容 |
| 免责 | 本文不构成临床建议;数据使用须遵守 PhysioNet 凭证健康数据使用协议 1.5.0,且不得尝试重新标识患者 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 「这十五万条问答对都经过医生核验」 | 仅 506 条经核验,占 0.323% | 官方摘要统计一节 |
| 「数据集整体准确率是 94.466%」 | 这是 506 条核验样本的正确率,不是全量 | 官方把核验记录单列成 _verified 文件 |
| 「它自带训练集与测试集」 | 无任何划分字段,四个文件里都没有 | 官方文件清单与字段字典 |
| 「它能处理任意长度的病历」 | 输入上限 6000 token,更长小结被排除 | 官方已知限制一节 |
| 「拿 note_id 回源库比对,发现少了开头是数据损坏」 | 预处理主动切掉开头段与过敏段之前的内容 | 官方数据预处理一节 |
| 「CSV 里的 qa_pairs 可以直接当列表用」 | 它是 JSON 字符串,必须再解析一次 | 官方数据描述一节的提示 |
| 「按 note_id 随机划分数据集就行」 | 同一患者有多次住院,须按 subject_id 分组 | 字段名 subject_id 与患者数少于小结数 |
| 「核验错误主要是胡编乱造」 | 主要是列表漏项;幻觉被官方称为罕见 | 官方已知限制一节 |
| 「它是开放数据,可以直接下载」 | 凭证访问,须签 DUA 并完成 CITI 培训 | 官方页面的访问与许可信息 |
| 「两个长度档是同一个模型生成的」 | 分属两个不同的 130 亿参数微调模型,量化配置也不同 | 官方模型实现一节 |
FAQ
Q1:EHR-DS-QA 到底是什么,和 MIMIC-IV-Note 是什么关系?
它是一份派生数据集:把 MIMIC-IV-Note v2.2 里的出院小结交给两个开源的 130 亿参数 Llama 2 指令微调模型,让模型读完一份小结后自己出题、自己作答,最终留下 156,599 条问答对,覆盖 21,466 份小结、14,967 名患者。它与源库的关系通过三个标识符锁死:note_id 指向具体小结,subject_id 指向患者,hadm_id 指向住院。因此它虽然来自 MIMIC-IV-Note,却是一份独立的合成语料,需要单独申请。
Q2:十五万条问答对的质量怎么保证?能保证到什么程度?
保证来自两个环节,都不覆盖全量。一是生成后的后处理,包括清理残留的去标识引用、替换特殊标记、删除答案不以句点结尾的问答对;二是医生抽样核验,共 506 条,其中 478 条判定正确。所以可引用的质量证据只覆盖那 506 条,占全量的 0.323%。其余记录没有任何逐条人工判定,官方也没有公开这 506 条的抽样规则。
Q3:为什么分两个模型?我在分析时要注意什么?
因为硬件。生成用的显卡是 24 GB 显存,130 亿参数模型必须做 4 bit 量化,原生上下文 4096 token 的模型处理不了更长的小结。于是项目按 3000 token 划线:短小结交给 OpenOrca-Platypus2-13B,长小结交给经 RoPE 缩放扩展到 8192 的 OpenAssistant llama2-13b-orca-8k-3319,后者还额外用了 alpha 为 4 的 NTK Rope Scaling。分析时必须把 extended_context 当分层变量,两档分开报告,否则等于把「生成器不同」这个混杂因素藏进了结论里。
Q4:能拿它来评测我的模型吗?
不太合适。评测需要逐条标准答案,而它只有 506 条带人工判定,其余十五万条的答案本身就是生成模型的输出,拿它当标准答案是「用生成器衡量生成器」。真要评测,要么只用那 506 条(但样本太小,结论不稳),要么自建评测集,要么转向人工出题的语料。它擅长的角色是训练燃料,不是评分标尺。
Q5:6000 token 的上限意味着什么?
意味着长住院、复杂病例被系统性地排除在外。这不是数据里长文本少,而是选样阶段主动丢掉的——超过 6000 token 的小结根本没进流水线。因此任何关于长上下文场景的结论都不能用它来下,而且要注意被排除的那一批恰恰可能是临床上最复杂的病例,这会放大单中心数据的选择偏倚。
Q6:核验判定为什么这么严?94.466% 该怎么理解?
核验采用了一个很严的口径:只有被上下文完整且正确回答才算对;如果问题本身在上下文里答不出,模型明确回答「无法回答」也算对;但只要出现幻觉、或者答案没覆盖相关信息,就算错。列表型问题漏掉一项,即使其余全对也判错。所以 5.534% 的错误里绝大部分是「没说全」而不是「说错了」。理解这一点,才能决定这份核验结果能不能回答你关心的问题。
Q7:我想在自己的病历文本上重跑这套流水线,可行吗?
可行,而且这可能是它最被低估的价值。官方把生成用的两个模型、量化参数(含 Act Order 与 group size)、推理库、NTK Rope Scaling 的 alpha 值、预处理与后处理规则,连同提示词模板与解析代码都公开了,模板与代码在配套的 GitHub 仓库里。复现时要注意:原版的 6000 token 上限是 24 GB 显存的函数,你的硬件不同,上限与量化配置都要重设,重设之后产出就与原版不可直接比较。
Q8:它的许可允许商业使用吗?
它按 PhysioNet 凭证健康数据许可 1.5.0 开放,访问前须签署数据使用协议 1.5.0、完成 CITI「Data or Specimens Only Research」培训,并以凭证用户身份登录。这是一份针对健康数据的受限许可,条款与开放数据许可不同,商业使用前应逐条核对协议文本,尤其注意不得尝试重新标识患者这一条。本文不构成法律意见。
术语表
| 术语 | 解释 |
|---|---|
| 出院小结 | 患者出院时由医生撰写的住院经过与后续安排摘要 |
| 检索增强问答 | 先检索到相关文本片段,再让模型基于该片段作答的范式 |
| 合成数据 | 由模型而非人工生成的训练数据 |
| 指令微调 | 用「指令—回答」样本对预训练模型做二次训练 |
| 幻觉 | 模型给出上下文中不存在的信息 |
| 漏答 | 上下文中有答案,模型却回答未提及 |
| 列表理解 | 模型从文本中完整列举多个项目的能力 |
| 量化 | 降低权重数值精度以减小显存占用的技术 |
| 4 bit 量化 | 每个权重用四位存储 |
| Act Order | 量化时按激活顺序重排权重以减小误差的选项 |
| group size | 量化分组的粒度,越小精度越高 |
| 上下文长度 | 模型单次能处理的 token 上限 |
| RoPE 缩放 | 通过变换旋转位置编码来扩展上下文窗口的方法 |
| NTK Rope Scaling | 一种 RoPE 缩放实现,本数据集取 alpha 为 4 |
| ExLlama | 面向量化权重的 Llama 推理库 |
| LoRA | 低秩适配,一种只训练少量参数的微调方法 |
| token | 模型处理文本的基本单位,不等于词 |
| NLTK | 一个自然语言工具包,官方用它统计词数 |
| RFC 4180 | CSV 格式的通用规范 |
| 去标识 | 移除或替换可识别个人身份的信息 |
| DUA | 数据使用协议,访问受限数据前须签署的法律文件 |
| CITI 培训 | 涉及人体数据研究的合规培训课程 |
| subject_id | MIMIC-IV 中的患者编号 |
| hadm_id | MIMIC-IV 中的单次住院编号 |
| note_id | MIMIC-IV-Note 中的临床记录编号 |
附录 A:核心数字核对表
| 项 | 值 | 出处 |
|---|---|---|
| 出院小结数 | 21,466 | 官方摘要与摘要统计 |
| 问答对总数 | 156,599 | 官方摘要与摘要统计 |
| 标准上下文问答对 | 133,562 | 官方摘要统计 |
| 扩展上下文问答对 | 23,037 | 官方摘要统计 |
| 标准上下文小结数 | 18,203 | 官方摘要统计 |
| 扩展上下文小结数 | 3,263 | 官方摘要统计 |
| 患者数 | 14,967 | 官方摘要统计 |
| 小结平均词数 | 1,250 | 官方摘要统计 |
| 小结词数中位数 | 1,209 | 官方摘要统计 |
| 小结词数范围 | 3–5,908 | 官方摘要统计 |
| 核验问答对 | 506 | 官方摘要统计 |
| 核验占比 | 0.323% | 官方摘要统计 |
| 核验正确 / 错误 | 478 / 28 | 官方摘要统计 |
| 核验正确率 | 94.466% | 官方摘要统计 |
| 标准档核验正确率 | 418 / 441,94.78% | 官方摘要统计 |
| 扩展档核验正确率 | 60 / 65,92.30% | 官方摘要统计 |
| 上下文上限 | 6000 token | 官方摘要与已知限制 |
| 长短上下文分界 | 3000 token | 官方数据集生成一节 |
| 显存约束 | 24 GB | 官方已知限制 |
| 数据文件数 | 4 | 官方数据描述 |
| 顶层字段数 | 7(核验记录为 8,多 human_verified) |
官方字段说明 |
| 版本与发布日 | 1.0.0,2024-01-11 | 官方页面 |
| DOI | 10.13026/25fx-f706 | 官方页面 |
| 许可 | PhysioNet 凭证健康数据许可 1.5.0 | 官方页面 |
附录 B:数字的来源分层
第一层:官方页面。 全部规模数字(小结数、问答对数、患者数、核验数)、结构数字(文件数、字段名、模型与量化配置、上下文分界)、边界数字(6000 token 上限、24 GB 显存、许可与访问要求、版本与 DOI)都取自 PhysioNet 官方页面的摘要、方法、数据描述与摘要统计各节。
第二层:官方列出的参考文献。 关于先行工作的定位、幻觉率下降 48.7% 这一证据,来自官方页面引用的文献,本文只转述官方的转述,未逐篇核对原文。
第三层:未核实。 四个文件的实际体积与全库下载量(文件目录因区域访问限制未能直接列举)、核验样本的抽样规则、后处理阶段丢弃的问答对条数、同一小结因双遍处理而重复出现的具体记录数、以及各顶层字段的实际取值范围。正文凡涉及这些地方都只做定性表述,读者若需精确数字须自行统计。
附录 C:完整参考文献
| 编号 | 文献 | 链接 | 用途 |
|---|---|---|---|
| 1 | EHR-DS-QA v1.0.0(本数据集) | https://physionet.org/content/ehr-ds-qa/1.0.0/ | 全部规模、结构、边界数字 |
| 2 | 配套生成代码仓库 | https://github.com/kkotsche1/EHR-DS-QA-Code-for-QA-Generation-over-EHR-Discharge-Summaries | 提示词模板与流水线配置 |
| 3 | MIMIC-IV v2.2 | https://doi.org/10.13026/6mm1-ek67 | 上游语料 |
| 4 | MIMIC-IV-Note v2.2 | https://doi.org/10.13026/1n74-ne17 | 上游语料 |
| 5 | PhysioNet 平台综述(2026,Nature Health) | https://doi.org/10.1038/s44360-026-00096-z | 托管模式与引用规范 |
| 6 | DrugEHRQA(官方点名的先行工作) | https://doi.org/10.13026/a849-cd06 | §8.2 的定位关系 |
| 7 | MIMIC-III 临床笔记标注问答对(官方点名的先行工作) | https://doi.org/10.13026/j0y6-bw05 | §8.2 的定位关系 |
| 8 | Llama 2 模型论文 | https://arxiv.org/abs/2307.09288 | 生成器基座模型 |
| 9 | 位置插值扩展上下文窗口 | https://arxiv.org/abs/2306.15595 | NTK Rope Scaling 背景 |
| 10 | OpenOrca-Platypus2-13B 模型卡 | https://huggingface.co/Open-Orca/OpenOrca-Platypus2-13B | 标准上下文生成器 |
| 11 | OpenAssistant llama2-13b-orca-8k-3319 模型卡 | https://huggingface.co/OpenAssistant/llama2-13b-orca-8k-3319 | 扩展上下文生成器 |
附录 D:任务代码
任务一:按患者分组划分并导出微调样本
import json
import random
from collections import defaultdict
with open('mimic_note_iv_qa.json', encoding='utf-8') as f:
data = json.load(f)
#-- 按患者编号分组,保证同一患者不跨集
groups = defaultdict(list)
for r in data:
groups[r['subject_id']].append(r)
sids = sorted(groups)
random.Random(2024).shuffle(sids) #-- 固定种子,划分可复现
cut = int(len(sids) * 0.9)
train_sids, dev_sids = set(sids[:cut]), set(sids[cut:])
def dump(records, path, only_standard=False):
n = 0
with open(path, 'w', encoding='utf-8') as f:
for r in records:
#-- 只保留标准上下文档,可避免混入生成器差异
if only_standard and r['extended_context']:
continue
for qa in r['qa_pairs']:
f.write(json.dumps({'note_id': r['note_id'],
'subject_id': r['subject_id'],
'context': r['note'],
'question': qa['question'],
'answer': qa['answer']},
ensure_ascii=False) + '\n')
n += 1
return n
a = dump([r for s in train_sids for r in groups[s]], 'train.jsonl', True)
b = dump([r for s in dev_sids for r in groups[s]], 'dev.jsonl', True)
print(a, b)
任务二:核验子集的质量自检
import json
with open('mimic_note_iv_qa_verified.json', encoding='utf-8') as f:
ver = json.load(f)
#-- 逐条取出判定标记,按长短上下文分层统计
rows = []
for r in ver:
for qa in r['qa_pairs']:
rows.append((r['extended_context'], qa.get('correct')))
print('核验记录数', len(ver))
print('核验问答对数', len(rows))
for ext in (False, True):
sub = [c for e, c in rows if e == ext]
print('extended_context =', ext, '总数', len(sub), '正确', sum(sub))
第二段代码的输出应与官方摘要统计里的 506、478、441、418、65、60 对上。对不上就说明文件没读全,或者核验子集与全量文件被混在了一起。
附录 E:如果只记五件事
| 序号 | 记住什么 | 为什么 |
|---|---|---|
| 1 | 21,466 份小结、156,599 条问答对、14,967 名患者 | 这三个数字定义了它的规模与覆盖范围 |
| 2 | 只有 506 条经医生核验,占 0.323% | 质量证据的边界,别把 94.466% 说成全量准确率 |
| 3 | 两个生成器按 3000 token 分流,量化与位置编码都不同 | 必须分层分析,否则结论里藏着混杂因素 |
| 4 | 输入上限 6000 token,长小结被排除 | 不能用于长上下文研究,且排除了复杂病例 |
| 5 | 按 subject_id 分组划分,不按 note_id 随机切 |
同一患者多次住院会造成泄漏 |
编辑说明
本文的核验时间为 2026 年 10 月 28 日。核对方式为直接访问 PhysioNet 项目页 v1.0.0,逐节读取摘要、背景、方法、数据描述、使用说明、发布说明、伦理与参考文献,并据此记录全部规模、结构与边界数字;四个数据文件的文件名与字段结构取自官方页面的数据描述一节。文件目录页在本次核验时返回了区域访问限制提示,因此文件体积、全库下载量未能直接测量,文中一律不给体积数字。论文侧未另见同行评审版本的原始论文,官方页面自述即为第一出处,其列举的参考文献本文只转述官方的转述。未覆盖的内容包括:核验样本的抽取规则、后处理阶段丢弃的问答对条数、同一 note_id 因双遍处理而重复出现的具体记录数,以及各字段的实际取值范围。这些需要拿到数据后自行统计,本文按要求只写规模、结构、边界三类数字。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- ehr-notes-qa-llms — 共享标签:电子病历 / 临床自然语言处理 / 问答数据集
- discq — 共享标签:电子病历 / 临床自然语言处理 / 问答数据集
- medisumqa — 共享标签:电子病历 / 问答数据集 / 去标识文本
- drugehrqa — 共享标签:电子病历 / 问答数据集
- archehr-qa-bionlp-task-2025 — 共享标签:电子病历 / 临床自然语言处理 / 问答数据集
- ehrxqa — 共享标签:电子病历 / 问答数据集
- ehrsql — 共享标签:电子病历 / 问答数据集
- mimic-iv-note — 共享标签:电子病历 / 自由文本 / 去标识文本
- mimic-iv-clinical-database — 共享标签:电子病历 / 去标识文本
- labelled-notes-hospital-course — 共享标签:电子病历 / 自由文本
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

