阿斯克勒庇俄斯 合成病历指令集 — 十五万条指令,没有一份真病历

15.8 万份合成出院小结 / 八类临床 NLP 任务 / CC BY-NC-SA 4.0 开放下载

来源 https://huggingface.co/datasets/starmpcc/Asclepius-Synthetic-Clinical-Notes发布时间: 2026-10-26最后更新: 2026-10-26 阅读 7
阿斯克勒庇俄斯 合成病历指令集 — 十五万条指令,没有一份真病历

信息速览

数据集名称阿斯克勒庇俄斯 合成病历指令集 — 十五万条指令,没有一份真病历
数据类型文本语料,文献引用
规模不适用(源头是 PMC-Patients 中的已发表病例报告,一例一文,官方未公布去重后的患者数)
接入方式https://huggingface.co/datasets/starmpcc/Asclepius-Synthetic-Clinical-Notes
AI 就绪度

Asclepius 是一份 2023 年公开的医学指令微调数据集,作者来自 KAIST,合作方包括延世大学医学院与首尔国立大学。它做的事情听起来很简单:把 PubMed Central 里已经发表、已经匿名化的病例报告,交给 GPT-3.5-turbo 改写成出院小结的样子,再为每份改写后的病历配上一批问题和答案,最后把整包东西以 CC BY-NC-SA 4.0 放到 Hugging Face 上,任何人都能下载。

它之所以值得单独拆开讲,不是因为规模大,而是因为它把「合成病历能不能代替真实病历」这个问题做成了一次公开实验。医学语料长期被锁在数据使用协议后面,MIMIC 系列要完成培训、签署协议、等待审批;而 Asclepius 的每一个字都来自公开发表的文献,所以可以自由分发。作者用同一套流程又做了一个基于 MIMIC-III 的孪生版本 Asclepius-R,只在 PhysioNet 凭证访问,然后把两个版本放在同一批真实病历上对答,结论是没有显著差距。

这页要交代的是这条合规链条的每一环,以及链上最容易被忽略的两个接头:改写模型会给数据带进什么错误,以及「源头已经匿名」这句话到底替谁担保了合规。它适合做方法原型、任务适配与教学示例,不适合当作真实病历的替代品,也不适合直接商用。一屏速览见下表。

维度 内容
官方名称 Asclepius: Synthetic Clinical Notes & Instruction Dataset
中文习惯叫法 阿斯克勒庇俄斯合成病历指令集
构建方 KAIST 团队,通讯作者 Edward Choi;临床合作方延世大学医学院与首尔国立大学
首次公开 2023-09-01(Hugging Face 仓库创建);论文 2023-09 预印,2024-06 被 ACL 2024 Findings 收录
源头数据 PMC-Patients 病例报告集(源自 PubMed Central 公开全文)
生成模型 GPT-3.5-turbo,卡片明写版本 0314
规模(论文口径) 15.8 万份合成出院小结,十五万八千余条指令-答案对
规模(卡片口径) 157k 份合成出院小结
任务类型 八类:命名实体识别、关系抽取、时序信息抽取、共指消解、问答、缩写展开、摘要、改写
文件形态 单个 synthetic.csv,约 400 MB
字段 patient_id、patient、question、answer、task 五列
许可 CC BY-NC-SA 4.0,无需申请
凭证要求 无,公开仓库,gated 为 false
配套模型 Asclepius-7B/13B、Llama2 版、Llama3-8B、Mistral-7B-v0.3
真人病历孪生版 Asclepius-R,基于 MIMIC-III 的 57k 份出院小结,PhysioNet 凭证访问
一句话定位 用「公开病例报告 + 商业模型改写」绕开病历分发限制的合成语料

§1 它要解决的具体麻烦

1.1 一句话结论:它卖的不是病历,是一条能公开走完的合规路径

先把结论摆出来:Asclepius 的价值不在数据本身有多真,而在于它证明了一条路径走得通——从完全公开的文献出发,经过一次改写,可以造出格式与语气都接近真实出院小结的语料,并且这个过程从头到尾不需要签任何协议。

这条路径的关键判断是「病例报告与出院小结足够像」。论文对这一点的论证很直白:两者都包含入院情况、实验室结果、明确诊断与治疗方案;差别在于病例报告为发表而写,语言规范、连续叙述、经过编辑润色;出院小结为快速查阅而写,充斥缩写、非规范术语、偶有语法错误,并用病史、体格检查、评估、计划这类小标题切分成半结构化段落。改写的任务就是把这个差别抹平。

抹平的办法是提示词工程加临床医生复核。作者在提示词里明确要求模型模仿真实出院小结的特征,同时加了一条约束:原文没有提到的临床实体,不得在合成病历里生成。调提示词的过程中,每版提示词都让临床医生抽看 50 个样本,检查输出像不像真实病历、有没有和原病例报告冲突的地方。这条约束是整份数据集可信度的第一根支柱,也是后文要反复回到的地方。

1.2 三条常见的错误期待

第一次接触这份数据集的人,最容易带着三个期待进来,三个都会落空。

期待一:这是脱敏后的真实病历。 不是。合成病历的语言风格是真实病历的,病例内容是病例报告的,两者都不是任何一位真实住院患者的住院过程。一份真实出院小结里有大量「无意义但真实」的细节:第 3 天体温 38.2 度、第 5 天引流 45 毫升、出院带药写了四种但只吃了一种。这些在病例报告里通常不会写,因此也不在合成病历里。

期待二:既然源头公开,那用它做任何事都没问题。 许可只回答了一半。CC BY-NC-SA 4.0 排除了商业用途,这层是清楚的;但内容由 GPT-3.5 生成这件事,牵出另一层约束,论文自己在局限性一节里点明了:OpenAI 的使用条款禁止拿其输出去训练与自身构成商业竞争的模型。两层约束叠加,能不能商用不是一个「看许可」就能答完的问题。

期待三:既然作者说能替代真实病历,那就放心替代。 论文的原话比这个谨慎得多。作者写的是「目的不是宣称合成病历可以完全取代真实病历,而是说明用合成病历训练出的模型可以是真实数据训练模型的一个可行替代」。这两句话在中文语境里很容易被压缩成一句「合成病历可以替代真实病历」,压缩掉的正是全部限定语。

1.3 它能给到的与给不到的

你的需求 它给的 够不够
一份格式像出院小结的英文语料,用来做段落切分、章节识别 15.8 万份带小标题的半结构化文本 够,这是它最扎实的用途
八类临床 NLP 任务的指令-答案对,用来做 SFT 冷启动 每份病历一条,任务标签明确 够冷启动,不够做精细评测
可自由分发的语料,用来写论文、发模型、做比赛 demo 无凭证要求,单文件下载 够,这是它相对 MIMIC 系的核心优势
真实世界的用药剂量、检验参考区间、诊疗路径 病例报告里碰巧写到的那些 不够,而且不要按真实世界的分布去用它
病程记录、护理记录、影像报告、会诊记录 完全没有,只有出院小结 不够,零覆盖
多轮追问、上下文修正、长文档问答 全部是单轮问答 不够,结构上就不支持
中文临床语料 没有,全英文 不够
商业产品训练数据 许可排除,且上游模型条款另有约束 不够,且需要法务判断
儿科、产科、精神科等特定科室的均衡覆盖 取决于 PMC 收录了什么病例报告 不可控,官方未公布科室分布

这张表里最需要强调的一格是「真实世界的用药剂量」。合成病历由改写模型生成,剂量、单位、参考区间这类数字是模型从病例报告里抄的,抄的时候可能改写、可能补全、可能在原文模糊处自己编一个看起来合理的值。用这类语料训练抽取模型,模型学到的是「模型写的数字长什么样」,而不是「临床记录里的数字长什么样」。

1.4 你的处境与它能帮到的事

这里的处境按真实工作场景来列,不按数据集特性来列。左侧写你正在面对什么,不是它有什么。

你的处境 它能帮你什么 下一步该做什么
手里没有任何临床语料,导师要求先跑通一个临床 LLM 的 SFT 流程 直接下载 400 MB 单文件,能在一张消费级显卡上跑通 LoRA 微调 先用它打通流程,然后申请 MIMIC 或本院数据做真正的领域适配
医院数据出不了内网,但需要对外演示一个能读病历的模型 它训练出的模型权重本身公开,可以在内网部署,演示环节不需要触碰真实数据 演示必须明确标注语料来源,避免让观众以为模型读过真实病历
在写一篇关于合成数据合规性的论文,需要可复现的完整流水线 提示词、预处理、训练脚本全部开源,每一步都能重跑 复现时注意 GPT-3.5 版本已不可回溯,只能对齐流水线不能对齐输出
做临床 NLP 任务的评测基准,需要病人级切分 有 patient_id,可以按病例报告做去重与切分 切分必须在 patient_id 层面做,不能按行切,否则同一份病历会横跨训练集与测试集
想把英文临床语料翻成中文再训一个中文模型 无,全英文且不可商用 换思路:找中文公开病例报告或中文电子病历开源语料
想知道合成病历到底比真实病历差多少 论文提供了同规模对照的消融实验与临床医生评分 把论文第 4 节与附录 F 对照读,注意样本量与显著性
正在评估「要不要花两周去申请 MIMIC」 它给出了一条不申请也能开工的备选 如果研究结论要落到真实临床场景,两条路都走:先用它起步,再申请 MIMIC 做验证
需要一份能拿去给伦理委员会说明的数据来源文档 源头链路清晰:PMC 病例报告 → 改写 → 指令 注意链条中间有一步是不可完全审计的模型生成,说明文档里要如实写

最后一行值得多说一句。伦理审查关注的通常不是「数据有没有隐私」,而是「研究者有没有能力说清数据是怎么来的」。Asclepius 的链条前段很干净、后段很干净,中间那一步是黑箱:你知道用了哪个模型、哪个版本、什么提示词,但你无法逐条证明任何一个输出与原病例报告严格一致。这一点在填表时没法回避,只能如实描述。

1.5 一句话判断

如果你的目标是把临床 LLM 的流水线跑通、把方法写成论文、把模型发出去让别人复现,这份数据集是当下最省事的选择之一;如果你的目标是让模型在真实病历上产生可以直接采信的临床建议,它连及格线都还没到——这一点作者本人写在局限性里。

1.6 不适合谁:四条边界

第一条,不能接受非商业许可的团队。 许可是 CC BY-NC-SA 4.0,四个字母里 NC 就是不许商用。这条边界最硬,没有讨论空间。即便有人说「内部研究算不算商用」,也应由法务判断,不应由工程师在 README 里自我裁定。

第二条,需要真实世界分布的研究者。 做药物流行病学、真实世界证据、临床路径分析的团队,需要的是真实处方与真实病程。合成病历的分布由病例报告的选择偏倚与改写模型的生成偏好共同决定,与任何一家医院的实际分布都不对应。

第三条,做其他文体任务的团队。 只有出院小结。病程记录、护理记录、手术记录、影像报告、病理报告、会诊记录一概没有。做医疗对话的团队也要注意,这里是单轮问答,不是对话。

第四条,需要中文或需要多语种的团队。 全英文。跨语言迁移可以做,但那是另一个课题,不要指望这份数据自带中文能力。

§2 数据构成与规格

2.1 规模、来源与两个口径

先把三个数字摆清楚:15.8 万、十五万八千余、157k。

  • 15.8 万:论文正文的圆整表述,指合成出院小结的份数,也指合成病历这一层的规模。
  • 十五万八千余:论文正文给出的指令-答案对精确条数,是数据集的行数口径。
  • 157k:Hugging Face 数据卡「先为 157k 份合成出院小结生成指令-答案对」一句里的数。

按论文的说法,一份合成病历配一组指令-答案对,两个数应该相等;卡片写 157k,与论文精确值相差约 1.5k。这个差额官方没有解释。可能的解释至少有三种:卡片写作时用的是较早的中间版本、写作时做了口语化圆整、或者部分病历在合并时被丢弃。这三种都没有官方依据,因此本文只记录「存在两个口径」,不下结论。

源头是 PMC-Patients。这是一个从 PubMed Central 开放获取全文中抽取病例报告的集合,每一条对应一篇已发表文献中的一个病例。这些病例本身已经匿名化,是公开发表的学术内容,因此不存在二次脱敏的问题。这也解释了作者为什么敢说「使用合成笔记,与真实笔记不同,不仅让我们能借用先进的在线大模型产出一整套高质量临床指令,还允许把这些资源与在其上训练的模型开源」。

生成环节的模型是 GPT-3.5-turbo。卡片明写版本 0314,即 2023 年 3 月 14 日那一版。论文正文统一称 GPT-3.5,只在小节标题的说明里点明 turbo。这个细节重要,因为 0314 是一个已经下线的快照:想完全重现当年的输出,技术上做不到。

2.2 字段与记录的完整字典

整个数据集只有一张表,五个字段。

字段名 类型 含义 取值形态 使用注意
patient_id 字符串 来自 PMC-Patients 的病例报告编号 数据集内部的唯一标识,一例一个 一行不唯一:同一份病历对应多条问答时会重复出现
patient 长文本 合成出院小结全文 数百到数千词,含小标题的半结构化英文 这是改写产物,不是原文,也不是真实病历
question 字符串 由 GPT-3.5 生成的指令 自然语言提问或任务指令 与 task 字段对应,但表述由模型即兴生成,不保证术语统一
answer 长文本 由 GPT-3.5 依据该病历生成的答案 自然语言,长短不一 答案的事实依据是 patient 字段,patient 错则答案错
task 字符串 任务类别 八类之一 用于筛选子集与分层采样

另有三个不在表里、但使用时必须知道的事实:

事实 说明 影响
主键不是 patient_id 同一份病历配多条问答 去重与切分须用 patient_id 与 question 的联合键
没有原始病例报告链接 卡片只保留 patient_id 无法从数据集直接回溯原文,需要回到 PMC-Patients 按编号查
没有质量控制标记 没有人工打分、没有模型置信度 不能按质量分层,只能整体使用或整体丢弃

第三行是这份数据集最容易被低估的缺陷。做指令微调的人习惯拿到数据先按质量过滤,通常是「用更强的模型打一遍分,扔掉低分的」。Asclepius 没有给任何可过滤的信号,五个字段全是有内容的,没有一个是质量标注。想过滤只能自己重跑一遍评分,那等于自己再造一半的数据工程。

2.3 一条记录的完整解剖

下面这条示意记录按字段结构拼出来,内容取自论文对合成病历的描述与卡片字段说明,不复制任何真实行。

patient_id: PMC0000000
task: Abbreviation Expansion
question: What does the abbreviation in the sentence
          "He was started on IV vancomycin" refer to?
answer: The abbreviation "IV" stands for intravenous,
        indicating that vancomycin was administered
        through a vein rather than by mouth.

patient:
  Chief Complaint
    74-year-old male presenting with fever and
    productive cough for three days.

  History of Present Illness
    The patient reports onset of chills and
    pyrexia three days prior to admission.
    No recent travel. No sick contacts reported.

  Physical Examination
    Temperature 38.6 C, heart rate 104, blood
    pressure 118/72, oxygen saturation 94% on
    room air. Coarse crackles at right base.

  Laboratory Findings
    WBC 14.2, CRP elevated. Chest radiograph
    shows right lower lobe consolidation.

  Assessment and Plan
    Community-acquired pneumonia. Started on IV
    vancomycin and ceftriaxone. Repeat imaging
    in 48 hours. Discharge planning pending
    clinical improvement.

三段结构一目了然:patient 是被追问的文本,question 是被问的问题,answer 是被答的答案。三者的关系不是「一段话配一个问题」,而是「一份病历配一个问题,答案必须落回这份病历」。

这里有一个容易忽略的细节:question 与 answer 是同一次生成的两步,不是两步独立生成后对齐的。论文明确写了这一点,并给出了理由:很多研究为了让流程更省事,会一次性生成问题与答案,但作者的经验是分两步生成,问题与答案都会更详细。这条经验对想复刻流水线的人有直接价值。

再看 patient 字段本身。小标题是 Chief Complaint、History of Present Illness、Physical Examination、Laboratory Findings、Assessment and Plan,这是美式出院小结的常见骨架。原文的病例报告不长这样:它是一段一段连续叙述,标题通常是 Case Presentation、Discussion、Conclusion 这类期刊体例。改写做的事情就是重排结构、换成病历体例、把「the patient was a 74-year-old man who presented with」改成「74-year-old male presenting with」。

2.4 八类任务与它们的结构差异

八类任务不是平级的,它们的输入输出关系差别很大。

任务 输入依赖 输出形态 在真实临床 NLP 里的对应任务 合成语料上的风险
命名实体识别 病历中的实体片段 实体与其类别的列表 概念抽取、术语标准化 标注边界与真实标注指南不一致,模型按语感切
关系抽取 两个实体及其上下文 关系类型 药物-不良反应、疾病-症状关联 关系定义由模型即兴给出,类目不稳定
时序信息抽取 含时间表达的事件 事件与时间的配对 病程时间线重建 病例报告的时间信息本就稀疏,合成后更稀
共指消解 代词与名词短语链 指代链 病历内实体追踪 改写会重排句子,原文共指关系可能被破坏
问答 整个病历 自然语言答案 病历问答、临床信息检索 答案质量受病历质量与提问质量双重限制
缩写展开 缩写及其上下文 展开后的全称 术语规范化 缩写表来自模型先验,可能与本文献领域不符
摘要 整份病历 摘要段落 出院小结自动生成、压缩 摘要会继承并放大病历里的错误
改写 整份病历或段落 改写后的文本 文本简化、患者版说明 二次改写会进一步累积失真

这张表里最值得警惕的是「缩写展开」与「命名实体识别」两行。这两类任务看上去最简单,实际上最依赖外部知识:IV 展开成 intravenous 靠的是常识,但如果病历里出现一个罕见的科室内部缩写,模型展开时会调用自己的先验,而先验未必与这份病历所属的专科一致。同样,命名实体识别的边界判定(「右肺下叶实变」是一个实体还是两个)在真实标注项目里要花几个月对齐指南,合成数据里则由模型一次性决定,没有指南。

论文对八类任务的选择有明确出处:先参考一份关于英国临床 NLP 任务的综述,再与专业人员讨论后收敛。这个来历说明任务清单不是拍脑袋的,但也说明它服务的是「覆盖面」,不是「深度」。

2.5 与同类资源的字段差异

把 Asclepius 放到几张常见的临床语料旁边看,字段差异比数据量差异更能说明问题。

资源 一行是什么 核心字段 文体 获取门槛 与本数据集的字段差异
Asclepius 一份合成病历上的一条问答 patient / question / answer / task 出院小结(合成) 无 唯一带「问题」与「答案」两列的开源临床语料之一
Asclepius-R 一份真实出院小结上的一条问答 行号 / question / answer / task 出院小结(真实) PhysioNet 凭证 字段几乎同构,但 patient 不在表内,需凭行号回 MIMIC 取
PMC-Patients 一篇文献中的一个病例 病例全文与文献元数据 病例报告(期刊体例) 无 是 Asclepius 的上一层,无问答列,无病历体例
MIMIC-III 出院小结 一次住院的一份小结 文本主体在 NOTEEVENTS 表 出院小结(真实) 凭证 + 培训 + 协议 带完整结构化映射与时间戳,Asclepius 两者皆无
通用指令集(如 Alpaca 系) 一条通用指令与应答 instruction / input / output 通用 无 结构可对齐,但 input 是通用文本而非病历
医疗对话集 一段医患多轮对话 多轮 utterance 与角色 对话 视来源 多轮,Asclepius 是单轮

第一行和倒数第二行的对比值得单独说。通用指令集的三段式是 instruction / input / output,Asclepius 的三段式是 question / patient / answer,形状完全一致,只是 input 那一格填的是病历。这意味着任何为标准 SFT 流程写的加载代码都能直接用,不需要改数据管道。这是它工程上的一大优点,也是它被误用的一个入口:形状一致会让使用者下意识地把它当成普通指令集,忽略 input 那一格的特殊性。

§3 它是什么:一条改写链上的三层身份

3.1 三层身份,任何一层搞混都会读错

Asclepius 这个名字在论文、仓库、模型列表里指的是三个不同的东西,而且这三个东西互相依赖。

层 指什么 在哪 规模 许可
语料层 合成出院小结与指令-答案对 Hugging Face 数据集 15.8 万份 / 十五万八千余条 CC BY-NC-SA 4.0
模型层 在其上做领域预训练与指令微调得到的一组模型 Hugging Face 模型库 从 7B 到 13B,多个底座 随底座模型,多为开放权重但带使用条款
方法层 一套「公开病例报告 → 合成病历 → 指令 → 训练」的流水线 GitHub 仓库 十余个脚本 代码仓库为 MIT

语料层是本文的主角。模型层与方法层的存在是为了说明一件事:这份语料不是孤立的数据交付,它是一条完整流水线的中间产物,任何一环换掉,下游结论都会变。

3.2 为什么源头必须是病例报告,而不是别的公开文本

公开可用的医学文本不少:教科书、指南、百科、论坛问答、公开摘要。作者选了病例报告,理由写在方法一节里,可以拆成三条。

第一,内容结构对得上。 病例报告本身就是为了记录单个患者的诊疗过程而写的,入院情况、检查结果、诊断、治疗方案四件套齐全,与出院小结的骨架一一对应。

第二,已经匿名。 发表时经过期刊的伦理与隐私审查,姓名、日期、机构等标识已被处理,因此不存在「改写后是否残留身份信息」这一层监管负担。这一条是整个方案成立的支点。

第三,公开可得且体量大。 通过 PMC-Patients 可以批量拿到,不需要逐篇去爬。

反过来说,这三条也划定了它拿不到的东西。教科书没有单个患者的完整病程,指南没有具体病例,论坛问答没有结构化的检查结果,公开摘要缺正文细节。这解释了为什么数据集只有一个文体:能同时满足三条的公开文本,基本只有病例报告。

3.3 「合成」在这里有两层意思

中文里「合成」一个词,在英文语境里对应两件不同的事,混起来会导致严重误读。

层 合成的是什么 靠什么合成 是否含真实患者
文体合成 把期刊体例改写成病历体例 提示词约束 + 模型改写 否,源头已匿名
内容合成 生成原文没有的临床事实 模型幻觉 是虚构,不是真实患者

作者的努力几乎全部投在第一层,第二层是尽力避免但无法根除的副作用。提示词里那条「原文未出现的临床实体不得生成」,针对的就是第二层;临床医生每版提示词抽看 50 个样本,也是针对第二层。但抽样复核只能证明「抽到的这些没问题」,不能证明「全部没问题」。

这就是理解整份数据集的关键分界线:文体是合成的,因此可信;内容是转录的,因此可信度取决于转录这一步;而转录是模型做的,模型会出错且错误不可逐条追溯。

3.4 与真实病历的三处结构性差距

即使改写做得再好,合成病历与真实出院小结之间仍有结构性差距,这三处差距不是质量问题,是方法本身的边界。

差距 真实出院小结 合成病历 后果
过程性信息 逐日记录、每次调整剂量的理由、会诊往返 只有结果,过程被压缩成一句 任何依赖时间线的任务都失真
冗余与噪声 大量与主诉无关的记录、模板化套话、错别字 被模型清洗掉,语言更干净 模型学到的是「干净病历」,部署时会被噪声打乱
机构特异性 本院缩写、本院检验项目名、本院模板 不存在,模型按通用写法生成 跨机构适配时要重新处理术语

第一处差距最要命。真实的出院小结之所以对临床 NLP 有价值,很大程度上在于它记录了「医生在不确定中怎么决策」:第一天用了 A 药,第二天因为肾功能变化换成 B 药,第三天的培养结果显示耐药所以再加 C 药。病例报告通常只写结局:患者经万古霉素治疗后好转出院。改写成病历体例,也只是把这句话挪到 Assessment and Plan 段落里,中间的决策过程并没有被补出来。

§4 质量与特色:「像不像」与「对不对」是两件事

4.1 作者用什么证明它像

论文对「像不像」给了一个相当聪明的量化办法:困惑度。

思路是这样的:先拿 57k 份真实出院小结微调一个语言模型,让它专门熟悉临床文本的用词与句式;然后拿这个模型去给几组文本打分,看它觉得哪组文本更眼熟。

文本组 来源 困惑度 读法
真实出院小结(同院) MIMIC-III,训练时未见过 2.186 最眼熟,因为同院同体例
真实出院小结(同院新一代) MIMIC-IV 2.809 略陌生,体例有演变
真实出院小结(另一机构) i2b2 5.178 明显更陌生,跨机构差异真实存在
原始病例报告 PMC-Patients 71.719 极其陌生,期刊体例与病历体例差距巨大
合成病历 由上述病例报告改写 4.816 落入真实医院数据的区间内

这张表的解读要克制。作者想说明的是:原始病例报告在语言模型眼里「完全不像病历」(71.719),改写之后掉到了真实医院数据的范围里(4.816,介于同院与跨院之间)。这个结果确实支持「文体改写成功」。

但困惑度衡量的只是「这段文字读起来像不像病历」,不衡量「这段文字说的事情对不对」。一份把肺炎写成心梗的病历,只要用的是标准病历语言,困惑度一样会很低。所以这张表证明的是文体层,不是内容层。把这两层分开,是读这份数据集最基本的分寸。

4.2 作者用什么证明它有用

第二组证据走的是下游评测。作者在两个模型的同一批真实病历上答题,再看评分。

对比 用什么评 结论 需要注意的限定
合成版对真实版(同为 13B) 四位临床医生对 100 道真实医生提问打分 3.03 对 3.15,配对检验未拒绝「两者等价」 样本 100 道,检验不拒绝不等于证明等价
同一批题由 GPT-4 打分 GPT-4 按四点评分 同样未拒绝等价 GPT-4 与医生的相关性只有中等
医生之间的一致性 Krippendorff α 0.53,属中等一致 中等一致意味着单次评分噪声不小
GPT-4 与医生的一致性 皮尔逊、肯德尔、斯皮尔曼 0.41 / 0.36 / 0.39 中等相关,够佐证不够替代

四行放在一起看,结论应该这样表述:在这份 100 题的样本上,没有观察到合成版与真实版之间的显著性能差距。这句话与「合成版与真实版性能相同」不是一回事,而流传的版本往往是后者。

「检验不拒绝原假设」这个逻辑在统计上很微妙:样本小、噪声大,本来就不容易测出差异。作者自己在正文里承认了这一点(解释受样本量 100 所限),这是诚实的写法。

4.3 论文自己承认的幻觉账

附录里有一张幻觉归因表,把两位模型在 DiSCQ 数据集上拿到 1 分(不可接受)的回答逐条归类。这是全篇对「对不对」最直接的一次交代。

幻觉类别 含义 合成版条数 真实版条数
提及不存在的实体 引用了文档里没有的实体 4 4
回答含糊 答案不清或多解 2 3
临床解读错误 依据给定数据给出错误或不恰当的解读 4 3
错误断言不存在 文档里明明有,硬说没有 2 0
合计 100 题中被判不可接受的条数 12 10

这张表的价值在于它同时打击了两个方向的自满。

一方面,合成版 12 条、真实版 10 条,数量接近,其中 9 条是两者共有的同一批错误。作者据此论证:幻觉模式相近,进一步支持了「合成数据可用」的主张。

另一方面,真实版也是 10 条。也就是说,即便完全用真实病历训练,模型在 100 道真实医生提问上仍有一成回答不可接受。这说明幻觉的主因不是数据合成,而是任务本身难、模型本身弱。这条信息比「合成没问题」更值得记住。

表格里还有一个方向性差异值得单独看:「错误断言不存在」这一类,合成版 2 条,真实版 0 条。作者没有对这个差异做统计检验,因此不能下结论,但这一格与全文主轴直接相关——合成病历里信息密度低(病例报告本来就写得少),模型更容易在「这段文字里有没有提到 X」这类判断上把「没写」当成「没有」。这是一个合理的机制猜测,不是官方结论。

4.4 案例:一位 74 岁男性的三次身份变化

说明:以下案例是按论文与卡片描述的字段结构重组的示意案例,用于说明数据在链条每一环发生了什么,不代表任何一条真实数据行。

把一份数据从源头推到下游,最清楚的方式是盯住同一位患者。设想 PMC-Patients 收录了这样一篇病例报告:一位 74 岁男性,因发热、咳嗽三天入院,体温 38.6 度,右肺下叶实变,诊断社区获得性肺炎,用万古霉素联合头孢曲松治疗,好转出院。

第一次身份变化:从期刊体例变成病历体例。 原文是连续叙述,标题是病例介绍、讨论、结论。改写之后,同一批事实被重新装配进主诉、现病史、体格检查、实验室检查、评估与计划五个小标题里。这一步只动结构,不动事实。困惑度从 71 的量级掉到 4 的量级,说的就是这一步。

第二次身份变化:从病历变成问答。 同一份合成病历被问了八个方向的问题:这里的缩写是什么意思、体温与白细胞之间是什么关系、入院到出院之间发生了哪些事件、文中的「he」指谁、这份病历的摘要怎么写、这段话换个说法怎么写。每个问题配一个答案,每个答案都必须落回这份病历。

第三次身份变化:从问答变成训练信号。 八条问答被切成八条训练样本,反复喂给模型。此时模型已经看不到「这是同一份病历的八个侧面」,它看到的是八个独立样本。如果这八条里有两条互相矛盾(比如一条说用了万古霉素,另一条说万古霉素因过敏停用),模型会把两条都当成正确的学进去。

第三次身份变化是把 §4.4 的案例推向部署时最该检查的一环:同一 patient_id 下的问答是否自洽。这一检查在官方流程里没有,论文也没有讨论。做微调的人如果只用单条样本,不会遇到这个问题;但如果做多任务联合训练或做指令跟随的一致性评估,就会遇到。

4.5 质量信号的缺口

把上面四小节的信息汇总,可以得到一张质量信号的覆盖表。

质量维度 官方给了什么信号 够不够做筛选
文体像不像病历 困惑度对比表 够,但只是整体指标,不能逐条用
内容对不对 临床医生抽看 50 个样本、幻觉归因表 不够,抽样复核不能转成逐条标签
任务标注准不准 五个人工核定种子 + 提示词调优 不够,种子只有五个,覆盖不了全部
同一病历的问答是否自洽 无 完全没有
科室与病种是否均衡 无 完全没有
是否存在残留身份信息 依赖源头匿名 结构性成立,但没有逐条报告

最后一行需要说清楚为什么「结构性成立」。源头是已发表病例报告,期刊在发表前已做匿名化处理,因此理论上不存在真实患者身份。这不是「我们检测过没有」,而是「上游已经处理过,我们没有引入新患者」。这个论证方式本身是站得住的,但它与「逐条验证」是两种不同强度的保证,引用时不要把后者说成前者。

§5 怎么拿到:从下载到追问的完整链路

5.1 下载与解包

数据只有一个文件。设计上故意做得极简,因为这份数据集的卖点之一就是「任何人不需要审批就能拿到」。

#-- 方式一:用 huggingface 官方命令行工具(推荐,支持断点续传)
pip install -U "huggingface_hub[cli]"
huggingface-cli download starmpcc/Asclepius-Synthetic-Clinical-Notes \
    synthetic.csv \
    --repo-type dataset \
    --local-dir ./asclepius

#-- 方式二:直接取原始文件
curl -L -o synthetic.csv \
  https://huggingface.co/datasets/starmpcc/Asclepius-Synthetic-Clinical-Notes/resolve/main/synthetic.csv

#-- 校验体量:文件应在 400 MB 量级
ls -lh synthetic.csv

文件只有一个,解包这一步不存在。工程上需要注意的只有两点:一是 CSV 里有嵌了换行的长文本,用普通按行切分的工具会读错;二是内存,400 MB 的文件读进 pandas 大约占 1 GB 以上,机器紧张时用分块读。

5.2 用 datasets 库直接加载

比起自己解析 CSV,用 datasets 库最省事。

from datasets import load_dataset

#-- streaming=True 时不会把整表读进内存,适合先摸清结构
ds = load_dataset(
    "csv",
    data_files="synthetic.csv",
    split="train",
    streaming=True,
)

#-- 取前三条看看长什么样
for i, row in enumerate(ds.take(3)):
    print("=" * 60)
    print("patient_id:", row["patient_id"])
    print("task      :", row["task"])
    print("question  :", row["question"][:200])
    print("answer    :", row["answer"][:200])
    print("note head :", row["patient"][:300].replace("\n", " | "))

第一次跑这段代码,最容易产生的错觉是「一行为一份病历」。看到 patient_id 连续重复三次就会明白:行是问答对,patient_id 是病历号。

5.3 按任务筛子集

八类任务混在一张表里,做实验时几乎总要按任务拆开。

import pandas as pd

df = pd.read_csv("synthetic.csv")

#-- 先看八类任务各自的样本量
counts = df["task"].value_counts()
print(counts)

#-- 挑一个任务做子集
sub = df[df["task"] == "Summarization"].reset_index(drop=True)
print("子集行数:", len(sub))
print("唯一病历数:", sub["patient_id"].nunique())

跑完之后会得到一个此前不知道的事实:稀缺任务的病历数与行数差距很大。如果某个任务只有很少几条,做任务级评测时样本量会薄到不足以给出稳定结论。这类判断必须自己算,官方没有公布任务分布。

5.4 病人级切分:这一步做错,全部实验作废

这是整页最重要的一段代码。如果不按 patient_id 切分,同一份病历的八条问答会分散在训练集与测试集里,测试分数会被系统性抬高。

import pandas as pd
from sklearn.model_selection import GroupShuffleSplit

df = pd.read_csv("synthetic.csv")

#-- 按病历分组切分:同一 patient_id 的全部行必须落在同一侧
gss = GroupShuffleSplit(n_splits=1, test_size=0.1, random_state=42)
train_idx, test_idx = next(gss.split(df, groups=df["patient_id"]))

train = df.iloc[train_idx].reset_index(drop=True)
test = df.iloc[test_idx].reset_index(drop=True)

#-- 反向校验:两侧的病历号不允许有任何交集
overlap = set(train["patient_id"]) & set(test["patient_id"])
print("训练集行数:", len(train), "病历数:", train["patient_id"].nunique())
print("测试集行数:", len(test), "病历数:", test["patient_id"].nunique())
print("交集应为空:", overlap)
assert not overlap, "切分泄漏:同一份病历同时出现在两侧"

这段代码里那个 assert 不是形式主义。它在流程里唯一的作用是拦住一类最常见的错误:有人先用 train_test_split 切了,再用 groupby 想补救,结果补救顺序写反了。

5.5 接到标准 SFT 流程上

数据形状与通用指令集一致,可以直接映射过去。

from datasets import Dataset

def to_sft(example):
    #-- 把三段结构拼成一段带角色标记的文本
    prompt = (
        "You are a clinical language model. Read the discharge summary "
        "and answer the clinician's question concisely.\n\n"
        "[Discharge Summary Begin]\n"
        f"{example['patient']}\n"
        "[Discharge Summary End]\n\n"
        "[Question Begin]\n"
        f"{example['question']}\n"
        "[Question End]\n"
    )
    return {"text": prompt + example["answer"]}

raw = Dataset.from_pandas(train[["patient", "question", "answer"]])
sft = raw.map(to_sft)
print(sft[0]["text"][:800])

提示词的结构照抄了官方仓库的推理模板,这样训练与推理用同一套分隔符,避免训练时学了一种格式、推理时换了另一种。

5.6 一次真实的追问:同一份病历问三遍

拿到数据之后,最值得先做的一件事是验证同一 patient_id 下的一致性。

import pandas as pd

df = pd.read_csv("synthetic.csv")

#-- 找出问答条数最多的几份病历
top = df["patient_id"].value_counts().head(3)
print(top)

#-- 挑一份,把它下面所有问答按顺序打出来
pid = top.index[0]
rows = df[df["patient_id"] == pid]
for _, r in rows.iterrows():
    print("-" * 60)
    print("task    :", r["task"])
    print("question:", r["question"])
    print("answer  :", r["answer"][:400])

这一步的实际产出往往不是「发现问题」而是「发现问题比预想的多」。同一份病历下,一条问答说患者有糖尿病史,另一条在摘要里没提;一条把某个缩写展开成 A,另一条展开成 B。这不证明数据不可用,但足以说明:逐条看是必须的,只看整体指标是不够的。

§6 与库内数据集的互链关系

6.1 关系图谱

Asclepius 在库里的位置很特殊:它同时是 MIMIC 系语料的下游替代品、是 PMC 系语料的下游产物、是临床指令微调这一族的先行者。

库内数据集 关系类型 关系说明
MIMIC-III 临床数据库 对照物 / 上游之一的镜像 作者的 Asclepius-R 以 MIMIC-III 出院小结为源;凭证访问、协议约束,与本文的开放路线正好互补
MIMIC-IV 潜在上游 论文评估集用到 MIMIC-IV 出院小结,但数据集本身不含
PMC-Patients 直接上游 Asclepius 的全部 patient 字段由 PMC-Patients 改写而来
PMC 开放获取全文 更上游 PMC-Patients 的源头,决定病例报告的覆盖面
去标识化医学文本类数据集 平行路线 走「采集真实文本 + 去标识」路线,与「改写公开病例」路线是两种合规思路
MIMIC 系合成笔记类数据集 平行路线 走「真实病历 + 大模型改写」路线,可分发但需 MIMIC 权限
EHR 笔记问答类数据集 下游同类 用真实病历造问答,与 Asclepius 任务形态接近但数据来源相反
临床问答与医学考试基准 下游评测 可用来评估 Asclepius 训练出的模型,两者互补
中文医疗指令集 平行路线 中文语境下走开源对话语料重组的路线,与本文同构不同源

这张表里最值得展开的是第二行与第一行的组合。作者的 Asclepius-R 是一个常被忽略的对照设计:同一批任务模板、同一套提示词、同一套流水线,只把源从公开病例报告换成 MIMIC 出院小结,得到 57k 条指令-答案对。这个设计把「数据来源」这一个变量单独隔离出来,让比较变得干净。代价是 R 版受 MIMIC 协议约束,只能凭证访问,反而失去了 Asclepius 最大的优势。

6.2 检索路径

按目的选路径,比按名字搜更省时间。

你的问题 该查哪 理由
合成病历到底能到什么程度 Asclepius 论文第 4 节 + 附录 有医生评分、有幻觉归因,是最直接的第一手材料
想拿公开语料做临床 LLM 起步 PMC-Patients 加上本文 上游给原文,本文给改写与问答,两级都能用
想拿真实病历做同样的事 MIMIC-III 与 Asclepius-R 任务模板相同,可做严格对照
想评估一个临床模型在真实病历上的表现 临床问答基准 Asclepius 数据本身是训练集,不是评测集
关心合成数据的合规边界 本文 §7 与论文局限性一节 论文自己写了服务条款问题,比二手解读可靠
想复现整条流水线 GitHub 仓库 提示词与脚本全在,GPT-3.5 版本不可回溯是唯一硬伤

最后一行值得强调:复现这个词在这里要打折。能复现的是流水线结构与每一步的输入输出关系,不能复现的是当年的模型输出。0314 这个版本号写进卡片,既是一种诚实,也是一种提醒。

§7 质量评估与局限性

7.0 阅读本节前的一个前置校正

读这份数据集的评估结论之前,需要先校正一个默认假设。

大多数人读数据集论文时的默认假设是:证据越强,结论越普适。看到「GPT-4 打分」与「四位临床医生」两重验证,会下意识地把结论外推成「合成病历与真实病历等价」。这个推论在 Asclepius 上会形成一次明显的误判。

误判的根源在于样本与任务的范围。所有的医生评分都发生在 100 道来自同一数据集(DiSCQ)的真实医生提问上,模型只评了两个(13B 的合成版与真实版),任务是单轮问答,文体是出院小结。在这四重限定之外的任何一句话,都不是论文说过的。把它读成「合成病历在所有临床任务上都等价于真实病历」,是把一个受控实验的结论扩大了一百倍。

校正之后的读法是:这份数据集的证据强度,足以支持「在这种文体、这种任务、这个规模下,合成路线值得一试」,不足以支持「合成路线已经可以替代真实数据」。本节后面的所有评分都建立在这个校正之上。

7.1 五维评分

按千方医数集的五维框架打分,满分 10。

维度 评分 评分理由
可得性 9.5 单一文件、无申请、无凭证、无 gated;这份数据集最无可争议的优点
工程友好度 8.5 五列结构,与标准指令集形状一致,加载代码几乎不用改;扣分在长文本 CSV 解析与内存占用
文体真实度 7.5 困惑度落入真实医院数据区间,小标题骨架规范;扣分在过程信息被压缩、噪声被清洗
内容可信度 5.5 有提示词约束与医生抽看,但无逐条质量标签,幻觉率与真实版接近且不可过滤
合规清晰度 6 许可条款清楚(非商业),源头匿名链路清楚;扣分在 GPT-3.5 输出条款这层外部约束需要自行判断
DAIMS 综合 7.4 以上五维加权,权重按可得性 0.2、工程 0.15、文体 0.25、内容 0.3、合规 0.1

DAIMS(Data and AI Management/Maturity Score)是千方医数集自用的就绪度记分框架,五维分别回答「拿不拿得到」「接不接得上」「像不像真的」「内容可不可信」「能不能合规用」五个问题。这份数据集的分数形状很典型:两头高、中间塌。可得性与工程性接近满分,内容可信度与合规清晰度都停在及格线附近。

这个形状本身就是结论:它是一份为「流通」而设计的数据,不是为「采信」而设计的数据。

7.2 三条最该被记住的缺陷

缺陷一:错误不可追溯。 流水线是三级串联:病例报告 → 合成病历 → 指令答案。任何一级出错,下游都无法定位是哪一级出的。真实病历至少能追到原始采集记录,合成数据追到模型输出就断了。这对做错误分析的人是实质障碍:你能发现模型答错了,但说不清是数据错还是模型错。

缺陷二:样本选择偏倚无法量化。 PMC-Patients 收录的是「值得发表的病例」,这本身就筛掉了一大批东西:常见病的常规病程不会成文、阴性结果不会成文、平淡的住院过程不会成文。偏倚的方向可以猜(偏向罕见、典型、有教学价值),幅度不可知,官方没有给出病种分布,也没给出与真实住院人群的对照。

缺陷三:任务深度受限于单轮。 八类任务看上去覆盖广,但全部是单轮。真实临床工作里的信息需求很少是一次问答能解决的:医生会追问、会纠正、会说「不是这个患者,是上一个」。论文把这一条写进了局限性,并说明计划在后续工作中扩展到交互式对话。

7.3 已知的、可枚举的偏差

上一小节讲的是结构性缺陷,这一小节列出可以逐条点名的偏差。

偏差 表现 来源层级
文体偏差 只有出院小结,无病程、护理、手术、影像、病理 官方页面明示
语种偏差 全英文 官方页面明示
病例类型偏差 偏向可发表的典型与罕见病例 论文方法一节自述
时点偏差 生成于 2023 年,模型版本 0314,此后未更新语料 官方页面可核
科室偏差 未公布科室分布,实际取决于 PMC 收录 未核实
地域偏差 病例报告来自各国,写作风格与诊疗惯例混杂 未核实
人口学偏差 未公布年龄与性别构成 未核实
术语偏差 缩写与术语按模型先验展开,未做领域对齐 推论,未核实

后四行都标了未核实,这不是偷懒。这一类的数字要么需要下载全量逐条统计(研究纪律不允许),要么官方根本没有公布(无法核实)。把它们如实标出来,比编一个看起来合理的分布更有用。

7.4 外部验证矩阵

一份数据集的可信度,很大程度上取决于它被谁、用什么方式验证过。

验证方 验证方式 覆盖范围 结论 独立性
论文作者,GPT-4 评测 按四点评分标准自动打分 多数据集、多任务、与多个基线对比 合成版接近或优于开源基线,13B 接近 GPT-3.5 低:作者自评,评分模型与生成模型同源
论文作者,四位临床医生 人工阅读并评分 100 道真实医生提问,两个模型 3.03 对 3.15,未拒绝等价 中:人工评分,但样本量与设计由作者决定
论文作者,一致性分析 计算医生间与模型间一致性 同上 α 为 0.53,GPT-4 与医生中等相关 中:用于给自动评分背书
论文作者,幻觉归因 逐条归类 1 分回答 100 题中的不可接受回答 合成 12 条、真实 10 条,9 条重合 中:人工归类
同行评审 ACL 2024 Findings 收录 全文 方法被同行接受 较高:独立第三方
第三方复现 未收集到公开发表的独立复现 无 无 无

最后一行的空缺必须说出来。一份 2023 年的数据集,被引用多次、被多个模型训练使用,但公开可查的、严格的独立复现(同一协议、同一评测集、独立团队)本文没有收集到。这不是说没有,而是说本文的研究范围之内没有见到。

7.5 它为何能持续:一个「零门槛」位置的生存逻辑

一份 2023 年生成、此后基本没更新、许可还是非商业的数据集,为什么到今天仍在被下载、被引用、被当作起点?

支撑条件 具体内容 稳固程度
入口为零 无申请、无凭证、无 gated,一个文件就能开工 很稳,除非许可变更
上游稳定 PMC-Patients 持续更新,源头不会枯竭 稳,但数据集本身不跟随更新
位置独占 开放可分发的临床指令语料极少,它占了先 中,后来者正在进入
与模型绑定 配套模型在模型库长期可下载,形成「数据+权重」组合 稳
方法可教 流水线清晰、提示词公开,适合教学与复现练习 稳
社区惯性 大量后续工作以它为基线,引用自我强化 中,会被更新的合成语料分流

六条里最关键的其实是第一行与第三行。它之所以还在被用,不是因为它是最好的一份,而是因为它是当时唯一一份「不用签任何东西就能拿到」的临床指令语料。这个位置带来的先发优势,很难被数据质量的优势覆盖,因为后来者要么体量更大但要申请,要么同样开放但出现得更晚。

第二行的「不跟随更新」值得多说一句。上游 PMC-Patients 还在增长,但 Asclepius 冻结在 2023 年的快照上。这意味着用它的模型,实际上是在 2023 年的病例分布上做适配。对方法验证没影响,对效果评估有影响。

§8 生态位与历史

8.1 时间线:一份数据集的两年

时间 事件 意义
2023-09-01 Hugging Face 仓库创建 数据集公开存在的最早时点
2023-09 arXiv 预印本上线 方法与评测正式公开
2023-09-25 基于 Llama2 的版本发布 底座从 Llama1 迁移到 Llama2,可用性与许可都更友好
2024-01 Asclepius-R 与 MIMIC 版指令集上到 PhysioNet 真实病历孪生版落地,对照设计完整
2024-03 预训练阶段的模型权重上传 让「领域预训练 + 指令微调」两步都能单独复现
2024-06 论文被 ACL 2024 Findings 收录 同行评审通过,数据集获得学术背书
2024-06-14 仓库最后修改;Llama3 与 Mistral 版本发布 底座跟着开源社区前进,数据集本身冻结

这条时间线有一个值得注意的形状:数据集在 2023 年 9 月就冻结了,但配套模型一直更新到 2024 年 6 月。也就是说,同一份语料被反复用在新底座上,语料没变、模型在变。这解释了为什么用户列表很长而数据卡无人改动。

8.2 三代合成病历路线的分野

把「合成病历」当一件事看,会发现它其实有三条互不相同的路线,Asclepius 站在中间那条。

路线 源 手段 代表 可分发 主要风险
早期统计生成 真实病历 循环神经网络、早期生成模型 论文相关工作一节引用的若干早期工作 否,受源头协议约束 语言僵硬,临床一致性差
公开病例改写 公开病例报告 通用大模型改写 本文 是 内容受改写模型质量约束
真实病历改写 真实病历 开源或商用大模型改写 MIMIC 系合成笔记类工作 否或凭证访问 改写是否彻底去除身份信息需单独论证

这条分野最重要的一句是:第三条路线看起来最像真实病历,却最不自由。因为它从真实病历出发,无论改写得多彻底,产物在协议层面都被视为衍生数据。第一条路线同理,而且语言质量最差。第二条路线是唯一能公开分发的,代价是要接受「源头是病例报告」带来的偏倚。

理解这个三分法,就能理解为什么本文开头说 Asclepius 走的是「第三类」——它不是从真实临床文本改写,也不是从教科书生成,而是从已公开的病例报告改写。这三者的合规负担依次递减,内容保真度也依次递减。

8.3 它在指令微调谱系里的位置

放回指令微调的大谱系里,Asclepius 的贡献可以用三条并列。

维度 此前的通行做法 Asclepius 的做法 影响
语料来源 真实病历,受协议约束 公开病例报告改写 打开「可公开分发」这扇门
任务组织 每任务一个模型 一个模型覆盖八类任务 降低多任务部署成本
领域适配 直接在通用底座上做指令微调 先用在同语料上做领域预训练,再做指令微调 两步走的收益在论文里有消融对照

第三条是最容易被忽略、实际上最可迁移的一条。作者的观察是:通用领域训练的模型对临床文本的用词与句式不适配,此前有人靠真实病历预训练解决,而在本方案里用合成病历预训练同样能起作用。这条经验对所有做垂直领域微调的人都有用,不只是医学。

8.4 它没有解决的问题

一份数据集的历史位置,很大程度由它没解决的问题定义。

未解决的问题 论文是否提及 后续是否有人接手 现状
幻觉的根因与抑制 提及,承认调查不充分 部分,各模型自己加强对齐 未解
病例报告的选择偏倚 未深入讨论 未见公开量化 未解
多轮交互 提及,列为未来工作 有其他团队做对话版 部分被替代
其他文体 提及,列为未来工作 影像报告、病程记录各有独立工作 分散推进
中文与其他语种 未讨论 中文方向有平行工作 另行解决
上游模型输出的授权问题 提及,指出条款限制 未见统一解法 未解,且随条款变化而变

最后一行是这整条路线最脆弱的一环。论文里的建议是「用开源模型替换 GPT 的角色」就能规避,这句话在 2024 年看起来很合理,在 2026 年依然是合理建议,但换掉生成模型就等于换掉整份数据,历史版本的分发许可问题依然挂在原处。

§9 使用指引

9.1 三种角色的路径

同一份数据,三类人该做的事完全不同。

角色 第一周该做什么 不该做什么 验收标准
学生 / 入门研究者 下载、加载、跑通一次 LoRA 微调、在自带的小测试集上看输出 不要在这个阶段下任何关于合成数据优劣的结论 能完整复现一次训练并生成可读输出
方法研究者 读论文第 4 节与附录,读完 §4.4 的案例,自己设计一组病人级切分实验 不要直接把论文的等价结论搬到自己的任务上 有一组自己数据上的对照结果
医院信息科 / 合规负责人 把许可条款、上游模型条款、源头匿名链路整理成一页纸,交给法务 不要只看许可缩写就签字 一页纸能回答「能不能用、用在哪、边界在哪」

第二行那个「自己设计一组病人级切分实验」值得展开。最有价值的复现不是重跑作者的实验,而是在自己的任务上做同构对照:拿一份本院或公开的真实病历,用同样的提示词造一份合成版,比较两者训练出的模型。这一步做完,才真正知道这条路在你的场景里值不值。

9.2 一条最短的可用流程

从零到能用的最短路径,五步。

#-- 第一步:建环境
python3 -m venv asclepius_env
source asclepius_env/bin/activate
pip install datasets transformers peft accelerate pandas scikit-learn

#-- 第二步:下载数据
huggingface-cli download starmpcc/Asclepius-Synthetic-Clinical-Notes \
    synthetic.csv --repo-type dataset --local-dir ./data

#-- 第三步:检查字段与任务分布
python3 -c "
import pandas as pd
df = pd.read_csv('data/synthetic.csv')
print(df.shape)
print(df['task'].value_counts())
print('唯一病历数:', df['patient_id'].nunique())
"

#-- 第四步:病人级切分(见 §5.4 的脚本),产出 train.csv 与 test.csv
python3 split_by_patient.py --input data/synthetic.csv --outdir ./split

#-- 第五步:在开放底座上做 LoRA 微调
python3 -m peft.scripts.lora_finetune \
    --model_name_or_path Qwen/Qwen2.5-1.5B-Instruct \
    --train_file ./split/train.csv \
    --output_dir ./ckpt \
    --num_train_epochs 3 \
    --per_device_train_batch_size 1 \
    --learning_rate 2e-4

第五步的底座特意选了一个小参数的开源模型而不是论文里的 LLaMA,理由是入门阶段不该被权重申请与显存卡住。等流程跑通、确认数据形状无误,再换大模型。

9.3 引用方式

引用这份数据集时,需要同时给出三层信息。

层 内容 用途
论文 公开发表的临床大语言模型,基于合成临床病历构建 方法出处,说明数据怎么来的
数据集 Hugging Face 上的合成临床病历与指令数据集 数据出处,说明用的是哪一份
版本 2024-06-14 的仓库快照 可复现性,说明是哪一版

第三行最容易被忽略。这份数据集虽然冻结,但仓库元数据改过一次,模型列表也增补过。引用时不写快照日期,使用者无法确认你用的是哪一版。

§10 AI 使用声明

事项 说明
本文性质 由人工智能辅助撰写、经人工编排的百科条目,不是官方文档
事实来源 Hugging Face 数据卡与仓库元数据、论文正文与附录、PhysioNet 孪生版页面
数字口径 一律采用官方公布值,多口径并存处并列列出
未核实项 科室分布、人口学构成、残留身份信息检测结果,官方未公布
案例性质 §4.4 及后文回指的案例为示例性重组,不代表任何一条真实数据行
评估结论 五维评分与 DAIMS 记分是本库框架下的判断,非官方数据
时效 核验时点为 2026-10-26,此后许可与仓库状态可能变化
免责 不构成法律意见;商用前的合规判断应由法务独立完成

常见误读(避坑清单)

常见说法 实际 证据
这是脱敏后的真实病历 是公开病例报告的改写产物,无真实患者,也无真实病程 卡片写明源为 PMC-Patients 病例报告,用 GPT-3.5 改写
源头公开,所以可以随便用 许可为非商业,且上游模型条款对训练竞品另有约束 卡片许可字段与论文局限性一节的表述
论文证明了合成病历能替代真实病历 论文证明的是「在这批任务上未观察到显著差距」 作者明写「目的不是宣称可以完全取代」
困惑度低就说明内容对 困惑度只衡量文体像不像,不衡量事实对不对 论文用困惑度对比的是文体相似度
150 万条数据随便拿来训 15.8 万份病历、15.8 万条问答,不是 150 万 论文正文精确值为十五万八千余
训练数据是 15.8 万条,一行就是一份病历 一行是一条问答,同一病历会出现多次 字段设计为 patient_id 加 question 加 answer
直接随机切分就行 必须按 patient_id 分组切分,否则同病历跨集泄漏 同一病历对应多条问答,按行切必然重叠
只有合成版会幻觉 真实版同样有 10 条不可接受回答 附录幻觉归因表
可以拿去训中文模型 全英文,无中文 卡片语言字段仅英文
想复现当年结果,照着脚本跑就行 生成模型是 0314 快照,已无法回溯 卡片明写版本号

FAQ

Q1:Asclepius 到底是什么?
一份合成临床病历与指令-答案对数据集,2023 年公开,源头是 PMC-Patients 的病例报告,用 GPT-3.5-turbo 改写并生成问答。配套还有一组在其上训练的临床大模型。

Q2:谁做的?
KAIST 团队,通讯作者 Edward Choi,临床合作方为延世大学医学院与首尔国立大学。论文被 ACL 2024 Findings 收录。

Q3:有多少数据?
论文口径 15.8 万份合成出院小结、十五万八千余条指令-答案对;数据卡写 157k 份。两个口径都来自官方,差额未说明。

Q4:源头数据是什么?
PMC-Patients,从 PubMed Central 开放获取全文中抽取的病例报告集合,本身已匿名,因此后续无二次脱敏负担。

Q5:为什么只有出院小结?
因为病例报告的叙事结构(入院、检查、诊断、治疗)与出院小结最接近。病程记录、护理记录、影像报告都不在覆盖范围,论文在局限性里承认这是取舍。

Q6:和 MIMIC-III 什么关系?
两个独立资产。Asclepius 走公开病例报告路线、可自由下载;Asclepius-R 走 MIMIC-III 出院小结路线、57k 份,只能在 PhysioNet 凭证访问。

Q7:能不能商用?
数据集是 CC BY-NC-SA 4.0,排除商业用途;内容由 GPT-3.5 生成,其条款对训练竞品另有约束。两层叠加,商用需法务单独判断。

Q8:用了它训练出的模型会不会有幻觉?
会。论文的幻觉归因显示,100 道真实医生提问中有 12 条不可接受回答,真实版是 10 条,9 条重合。幻觉与数据来源关系不大,与任务难度关系更大。

Q9:怎么切训练集与测试集?
必须按 patient_id 分组切分。同一份病历对应多条问答,按行随机切分会让同一病历横跨两侧,测试分数被系统性抬高。

Q10:官方给了质量标签吗?
没有。五列全是有内容的业务字段,没有人工打分、没有置信度。想按质量过滤只能自己重跑评分。

Q11:想复刻整条流水线可行吗?
结构与脚本完全可复现,输出不可复现:生成模型是 GPT-3.5-turbo 的 0314 快照,已下线,无法重跑。

Q12:那份 2024 年的 Llama3 与 Mistral 版本和数据集是什么关系?
同一份语料、换底座重训。语料从 2023 年 9 月冻结,模型更新到 2024 年 6 月,说明这条流水线的价值主要在语料本身。

术语表

术语 英文 含义
合成病历 synthetic clinical note 由模型生成或改写、模仿真实病历格式的文本,不含真实患者
病例报告 case report 期刊发表的单个病例记述,含诊疗过程与讨论,本身已匿名
出院小结 discharge summary 住院结束时由医生撰写的总结性病历,含诊疗经过与出院医嘱
指令微调 instruction tuning 用「指令-答案」对训练模型跟随指令的能力
领域预训练 domain adaptive pretraining 在下游微调前,先用领域语料做自监督预训练
提示词调优 prompt tuning 反复修改提示词以控制模型输出风格与约束
困惑度 perplexity 语言模型对一段文本的「陌生程度」,越低越像训练分布
幻觉 hallucination 模型生成原文不存在或与原文矛盾的内容
共指消解 coreference resolution 判断文中不同表述是否指向同一实体
时序信息抽取 temporal information extraction 抽取事件及其时间表达
缩写展开 abbreviation expansion 把缩写还原为全称
关系抽取 relation extraction 抽取实体之间的语义关系
命名实体识别 named entity recognition 识别文本中的实体片段并归类
文档级切分 group splitting 按文档或患者分组切分数据集,防止同一实体跨集泄漏
凭证访问 credentialed access 需完成培训并签署协议才能下载的访问方式
非商业许可 non-commercial license 排除商业用途的开放许可,如 CC BY-NC-SA 的 NC 条款
相同方式共享 share-alike 衍生作品须以相同许可发布,如 SA 条款
单轮问答 single-turn QA 一次提问对应一次回答,无上下文延续
患者级 patient-level 以患者为单位组织或切分数据,而非以行为单位
选择偏倚 selection bias 样本进入数据集的过程非随机,导致分布偏离目标人群
提示词约束 prompt constraint 在提示词中明确禁止某类输出,如禁止生成原文没有的实体
消融实验 ablation study 逐步移除或替换某个组件,观察性能变化以判断其贡献
评分者间一致性 inter-rater agreement 多位评分者对同一对象打分的一致程度
四点评分 four-point scale 不可接受、差、可接受、优秀四档的人工评分标准
开放权重 open weights 模型参数可下载,但使用受条款约束
孪生版本 twin variant 同一流程换数据源得到的对照版本,如 Asclepius-R

附录 A:核心数字核对表

项 值 来源 来源层级
合成病历份数(论文) 15.8 万 论文正文 论文摘要与正文
指令-答案对(论文) 158,114 论文方法一节 论文正文
合成病历份数(卡片) 157k 数据卡 官方数据卡
源头病例集 PMC-Patients 数据卡与论文 双源一致
生成模型 GPT-3.5-turbo,版本 0314 数据卡 官方数据卡
任务类别数 八类 论文与数据卡 双源一致
文件数 一个 CSV 仓库文件树 官方仓库元数据
文件体积 约 400 MB 仓库文件树 官方仓库元数据
字段数 五个 数据卡 官方数据卡
许可 CC BY-NC-SA 4.0 数据卡标签 官方数据卡
是否 gated 否 仓库元数据接口 官方仓库元数据
孪生版规模 57k 份出院小结 PhysioNet 页面 官方页面
孪生版访问方式 凭证 + 协议 PhysioNet 页面 官方页面
医生评分(合成版) 3.03 论文第 4 节 论文正文
医生评分(真实版) 3.15 论文第 4 节 论文正文
评分者一致性 α 为 0.53 论文第 4 节 论文正文
幻觉不可接受条数(合成版) 12 论文附录 论文附录
幻觉不可接受条数(真实版) 10 论文附录 论文附录
困惑度(原始病例报告) 71.719 论文方法一节 论文正文
困惑度(合成病历) 4.816 论文方法一节 论文正文
期刊 ACL 2024 Findings 官方仓库公告 官方页面

附录 B:数字的来源分层

层级 定义 本文中的例子 处理方式
第一层:官方页面 数据卡、仓库元数据、PhysioNet 页面直接写出的 许可、字段、文件体积、gated 状态、生成模型版本、孪生版访问方式 直接采用
第二层:论文摘要与正文 论文写出的规模、评测、幻觉归因 15.8 万份、指令精确条数、医生评分、困惑度、幻觉条数 直接采用并注明口径
第三层:未核实 官方未公布、本文未做统计的 科室分布、人口学构成、残留身份信息检测、第三方复现 明确标注「未核实」,不作推算

三层的划分不是为了给数字排序,而是为了让引用者知道每个数字能用多硬。第一层最硬,改一次就要重新核;第二层跟着论文版本走,预印与正式版可能有差异;第三层只能当方向性描述,不能进任何量化的论证。

附录 C:完整参考文献

编号 文献 用途
C1 公开发表的临床大语言模型,基于合成临床病历构建,2023 年预印,2024 年被 ACL Findings 收录 方法与评测的权威出处
C2 Asclepius 合成临床病历与指令数据集,Hugging Face 数据卡与仓库元数据 规模、字段、许可、版本的权威出处
C3 Asclepius-R,基于 MIMIC-III 出院小结的版本,PhysioNet,2024 年 孪生版规模、访问方式、训练配置
C4 Asclepius 代码与提示词仓库 流水线每一步的实现细节
C5 PMC-Patients 病例报告数据集 上游数据的规模与字段
C6 MIMIC-III 临床数据库官方说明 孪生版的源头与协议
C7 关于英国临床 NLP 任务现状的综述 八类任务清单的出处
C8 自指令式指令生成方法 引导式生成方法学来源

附录 D:患者级切分与泄漏自查脚本

import argparse
import pandas as pd
from sklearn.model_selection import GroupShuffleSplit


def split(input_path, outdir, test_size=0.1, seed=42):
    df = pd.read_csv(input_path)

    #-- 校验五个必需字段都在
    need = {"patient_id", "patient", "question", "answer", "task"}
    missing = need - set(df.columns)
    if missing:
        raise ValueError(f"缺字段: {sorted(missing)}")

    gss = GroupShuffleSplit(n_splits=1, test_size=test_size, random_state=seed)
    train_idx, test_idx = next(gss.split(df, groups=df["patient_id"]))
    train = df.iloc[train_idx].reset_index(drop=True)
    test = df.iloc[test_idx].reset_index(drop=True)

    #-- 泄漏自查:两侧病历号不得有交集
    overlap = set(train["patient_id"]) & set(test["patient_id"])
    assert not overlap, f"泄漏: {len(overlap)} 个病历跨集"

    train.to_csv(f"{outdir}/train.csv", index=False)
    test.to_csv(f"{outdir}/test.csv", index=False)
    print(f"训练 {len(train)} 行 / {train['patient_id'].nunique()} 病历")
    print(f"测试 {len(test)} 行 / {test['patient_id'].nunique()} 病历")


if __name__ == "__main__":
    ap = argparse.ArgumentParser()
    ap.add_argument("--input", required=True)
    ap.add_argument("--outdir", required=True)
    ap.add_argument("--test_size", type=float, default=0.1)
    args = ap.parse_args()
    split(args.input, args.outdir, args.test_size)

这个脚本取代了 §9.2 第五步里引用的 split_by_patient.py,两者功能相同,可以直接存盘运行。

附录 E:如果只记五件事

序 一句话
一 它没有真实病历,源头是已发表的病例报告,改写成病历体例
二 它的价值在合规路径,不在数据规模:不用签任何协议就能开工
三 「像」与「对」是两件事,困惑度只证明前者
四 幻觉不是合成数据独有的问题,真实版在同样的题上也有约一成不可接受
五 切分必须按 patient_id 分组,按行切会让实验结论整体失效

编辑说明

核验时点:2026-10-26。数据卡、仓库元数据与文件树、PhysioNet 孪生版页面、论文正文与附录均在此时点回读。论文 arXiv:2402.01749 经核对为城市基础模型综述,与本数据集无关,故不采用。

核验方式:规模、字段、许可、生成模型版本以数据卡与仓库元数据接口为准;评测结论、困惑度、幻觉归因、局限性表述以论文正文与附录为准;孪生版规模 57k 与凭证访问方式以 PhysioNet 页面为准。多口径并存项(15.8 万与 157k)在正文并列保留,不合并、不裁决。

未覆盖内容:科室分布、人口学构成、残留身份信息的检测结果、第三方独立复现,本文研究范围内未获取,一律标注未核实;不做任何基于抽样或推算的填补。

体例说明:本篇按 v5 骨架撰写,§1 至 §10 连续,术语集中在正文术语表,数字核对与来源分层分列附录 A 与附录 B。§4.4 的案例为按字段结构重组的示意,用于说明链条各环节的变化,不代表任何一条真实数据行。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • mednli — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • aci-bench — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • er-reason — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • mimic-ext-synnotes — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • tcmeval-sdt — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • medsynth — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • tcm-sd — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • mietic — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录
  • lunguage — 共享标签:医疗NLP / 医学问答与基准 / 临床文本
  • ehr-reasoncon — 共享标签:医疗NLP / 医学问答与基准 / 临床文本 / 电子健康记录

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

返回 AI-Ready 数据集