十五万条合成问答 — EHR-DS-QA 出院小结问答集

21,466 份出院小结 / 156,599 条问答对 / 506 条医生核验

来源 https://physionet.org/content/ehr-ds-qa/1.0.0/发布时间: 2026-10-28最后更新: 2026-10-28 阅读 9
十五万条合成问答 — EHR-DS-QA 出院小结问答集

信息速览

数据集名称十五万条合成问答 — EHR-DS-QA 出院小结问答集
数据类型自由文本,问答对,合成数据,指令微调,去标识文本
规模14,967名患者/21,466份出院小结
接入方式https://physionet.org/content/ehr-ds-qa/1.0.0/
AI 就绪度

一份出院小结平均一千二百个词,写满了这次住院为什么来、做了什么、带什么药回家、复查找谁。临床医生要在里面找一条信息——比如「出院时到底带了哪几种药」——靠的是眼熟和检索框;而一个模型要做到同样的事,必须先有人把「问什么」和「答什么」一条条写出来给它看。临床文本上的问答语料一直卡在这一步:人工出题太贵,出少了只够当测试集,喂不饱一次微调;出多了又付不起医生的时间。于是公开领域长期存在一个尴尬的分层——要么是几百条精雕细琢、只能用来打分的题,要么是模板批量生成、问法僵硬的题,中间那一档「量足够大、问法足够自然、还带一点人工核验」的空着。

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 — 共享标签:电子病历 / 自由文本

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集