合成数据工厂:可公开、可复现、不可冒充真实
一个开源 Demo 很容易给人错觉:病例都能跑通,页面也有结果,于是好像已经接近临床可用。问题常常不在代码,而在演示数据太干净–既没有缺失,也没有冲突,更不会触碰真实数据的访问边界。
开源医疗项目面临一个根本矛盾:没有数据就不能运行,带真实数据又可能违反隐私、合同和伦理。合成数据是工程教学的解法,但不是临床效果的捷径。
来龙去脉与痛点
Section titled “来龙去脉与痛点”医疗模拟器早于生成式 AI。Synthea 用规则和统计生成从出生到死亡的合成患者,可导出 FHIR R4、Bulk FHIR、CSV 等格式,目标是“真实感但非真实”的记录。S08 它适合接口、工作流和回归测试,却不会自然复现目标医院的缺失机制、编码习惯、治疗选择偏差和人群差异。
另一端,MIMIC-IV、MIMIC-CXR 等真实去标识数据仍属于受控访问资源,使用者需接受培训和协议约束,官方明确衍生数据和模型也要谨慎处理。S09S10 所以本书只提供 adapter 和 manifest,不重新分发受限内容。
三层数据工厂
Section titled “三层数据工厂”数据工厂的核心是 Fixture 层:极小、人工可读,覆盖单元测试和边界情况。在此之上,Synthetic cohort 层用固定 seed 批量生成患者、协议与冲突/缺失模式,用于性能和回归。最上层是 Governed real-data adapter,只定义 schema、映射、去标识检查和本地执行流程,数据永不进入开源仓库。
每个数据版本产生 DatasetManifest,包含生成器版本、seed、来源、许可、患者数、模态、切分策略、质量检查、哈希和禁止用途。切分按患者、时间和站点隔离,避免同一患者片段泄漏到训练和测试。
| 数据源 | 适合 | 不适合 |
|---|---|---|
| Synthea | FHIR 流程、接口、合成队列 S08 | 直接估计真实临床性能 |
| MIMIC-IV | 受治理的 ICU/医院研究 S09 | 随仓库分发、发往未授权在线 API S10 |
| TCIA | 具体 collection 的癌症影像研究 S11 | 假设所有 collection 许可相同 |
| 手写 fixture | 精准覆盖失败场景 | 代表人群统计分布 |
python3 labs/run_lab.py --lab 05实验用固定 seed 生成 8 个合成患者,包含 EGFR 阳性、关键检测缺失和证据冲突。程序打印数据集哈希,同 seed 重跑必须一致,换 seed 必须变化。它验证可复现性,不产生临床指标。
按这个顺序检查:先记录基线哈希,再不改规则地重跑,最后只换 seed。前两次不一致说明实验不可重放,第三次仍一致说明生成器可能没有真正使用 seed,这三种情况都比“看起来像病历”更早暴露工程问题。
合成一个“难得恰到好处”的病例
Section titled “合成一个“难得恰到好处”的病例”最没价值的 fixture 是所有字段齐全、单位一致、结论显然。MedAgent Forge 的 syn-nsclc-003 应同时具备业务现实:一份病理报告确认 NSCLC;较早基因报告写 EGFR 阴性,较新报告发现 exon 19 deletion;一次实验室结果用 10^9/L,另一次使用不同单位;协议抓取版本已更新;某条记录状态是 entered-in-error。金标不是简单的“符合”,而是哪些 criterion 确定、哪些 conflict、哪个来源应被忽略以及人工需要核对什么。
生成器先采样患者级潜变量,如年龄、疾病亚型和分子状态;再根据状态生成不同模态事件;最后施加观测过程:有些检测没做、有些延迟上报、有些记录重复或修订。这样能区分“患者真实状态”和“系统可见证据”。Agent 只能依据可见证据判断,不能偷看生成器潜变量,潜变量只供 hidden verifier 设计场景。
每条合成记录标注 synthetic=true 与生成器版本,避免流入真实队列。生成器 seed、规则文件和依赖哈希共同决定数据版本–仅记录 seed 不够,因为规则修改后同 seed 仍会产生不同数据。
质量不是“看起来像病历”
Section titled “质量不是“看起来像病历””合成数据质量至少分四层:结构质量检查 FHIR/DICOM/schema 是否有效,逻辑质量检查采样早于报告、死亡后无新就诊等不变量,统计质量比较年龄、事件频率和缺失模式(但只在有合法参考数据时进行),任务质量确认 12 类失败场景都有覆盖。最后一层最适合本开源教程,因为它不需要宣称人群真实。
反过来,语言流畅度并非首要指标。一份看似专业的生成病历可能包含不可能时间线、互相矛盾的治疗或过度典型的描述。模型生成文本只能作为候选,经规则验证和人工抽样,关键金标由显式场景定义产生。
DatasetManifest 为每个 source 记录 owner、URL/合同、access class、permitted purpose、redistributable、derivative policy、retention 和审核日期。构建任务接收目标 release_profile:public profile 只允许可再分发 fixture 与合成数据,local-research profile 可以加载受控 adapter,但输出和缓存仍留在本地。CI 对 public artifact 执行 deny rule,不能靠开发者记忆。
MIMIC 的受控访问尤其适合说明“代码开源”和“数据开源”是两回事。S09S10 仓库可以开源转换脚本、schema、单元测试和下载说明,但不能把 credentialed 数据、其不允许公开的衍生物或含敏感样本的日志推上 GitHub。TCIA 也要按具体 collection 核对许可和引用,不能用一个总入口替所有数据集授权。S11
从合成到真实的迁移门
Section titled “从合成到真实的迁移门”只有工程回归全部稳定,才考虑在受治理环境接真实 adapter。第一步不是训练,而是数据 profiling:字段覆盖、编码体系、单位、时间戳、重复、缺失和跨系统 patient linkage。随后让专家审查小批 Evidence 和 criterion gold,再做 silent/offline evaluation,不写回、不影响流程。若分布差异导致性能下降,应修数据和合同,而不是把真实数据直接塞进提示词。
公开演示永远保留合成模式,并在 UI 显著标记。真实模式应通过独立配置、密钥和网络边界启用,测试确保两个 profile 不会共享 cache 或索引。
数据卡记录生成目的、总体构造、字段与模态、seed/版本、预期用途、禁止用途、已知不真实之处、质量测试和联系方式。特别写出哪些现实没有模拟:机构编码差异、真实缺失、罕见亚组、设备和治疗偏差。若别人只看数据卡就会误以为它能证明临床性能,说明边界写得不够清楚。
扩展练习是为同一潜在患者生成三个观测版本:完整、缺 EGFR、报告冲突。三个 fixture 只改变观测过程,hidden truth 不变。检查系统是否分别给 met/unknown/conflict,而不是凭合成器潜变量作弊。
最后把生成器版本改动写进 changelog,并证明旧 fixture hash 不会被悄悄覆盖。
- “去标识”不自动等于可公开,合同和再识别风险仍需评估。
- LLM 生成病历会复制偏见或产生不合理组合,需要规则/专家审核。
- 合成队列过于整洁会夸大系统效果,必须主动注入缺失、延迟、重复、单位错误和冲突。
- 本项目的合成 NSCLC 病例只能用于工程演示。
完整的来源类型、用途与边界见教材来源注册表。
资料与延伸阅读
Section titled “资料与延伸阅读”- Synthea:了解合成患者与 FHIR/CSV 导出的边界;它不代表目标医院的人群分布。
- MIMIC-IV 和 PhysioNet 受控健康数据许可:先确认访问、衍生物和第三方服务限制,再考虑本地 adapter。
- The Cancer Imaging Archive:影像 collection 的许可与引用需要逐项核对,不能把目录入口当作统一授权。