信息速览
JAMA Clinical Challenge 是一份由真实病例改写的医学多选题集:每题给出一段病例描述、一个临床问题、四个选项,以及期刊作者撰写的讨论段作为参考答案与推理依据。它由约翰霍普金斯大学团队整理,2025 年发表在 NAACL 长论文里,来源是《美国医学会杂志》网络版同名专栏十年的存档。
它最反常的地方不是规模,也不是难度,而是获取方式:正文没有发布。作者在仓库里写得很直白,受版权限制不能公开这份数据,只给了文章网址清单和一个爬虫脚本。想复现研究的人必须自己有期刊全文权限,跑完脚本才能得到题目。
这条约束决定了整个数据集的性质——它是一份引用密集却难以直接复用的基准,衡量的是「模型面对真实疑难病例能做到什么」,同时把复现门槛明确写在了门口。一屏速览见下表。
| 项目 | 内容 |
|---|---|
| 名称 | JAMA Clinical Challenge |
| 整理方 | 约翰霍普金斯大学(Hanjie Chen、Zhouxiang Fang、Yash Singla、Mark Dredze) |
| 论文 | Benchmarking Large Language Models on Answering and Explaining Challenging Medical Questions |
| 发表 | NAACL 2025 长论文,pp. 3563–3599,DOI 10.18653/v1/2025.naacl-long.182 |
| 预印本 | arXiv:2402.18060(2024 年 2 月首次提交,2026 年 2 月为第 6 版) |
| 上游来源 | JAMA Network Clinical Challenge 专栏在线存档 |
| 时间跨度 | 2013 年 7 月至 2023 年 10 月 |
| 规模 | 一千五百二十四例病例,一题对一例 |
| 任务形式 | 四选一单选,附专家讨论段 |
| 问法类型 | 诊断(这是什么病)与处置(下一步做什么)两类 |
| 输入长度 | 平均 371、最长 779 个词元 |
| 解释长度 | 平均 632、最长 1,369 个词元 |
| 模态 | 纯文本,图像全部剔除 |
| 划分数 | 无训练/开发/测试划分,全量作测试 |
| 发放内容 | 网址清单 JSON + 爬虫脚本(仓库无 LICENSE 文件) |
| 许可 | 数据受期刊版权约束不公开;代码未声明许可 |
§1 速览:它到底是什么
1.1 一句话定义
它是把期刊专栏里真实发表过的疑难病例,改写成四选一单选题,并保留原作者讨论段作为免费推理参照的一套评测题。
拆开看这句话有四个要点。第一,病例是真实发表过的,不是编的模拟题;第二,每道题都对应一份四选一答卷,答案唯一;第三,每题背后都有一段医生写的讨论,说明为什么对、其余选项为什么错;第四,这份题集没有做成压缩包挂在网上,只给了找到原文的路线。
1.2 它和普通医学问答集差在哪里
市面上多数医学问答集的题目来自考试题库或教科书习题,形式规整、知识点清楚、单题答案短。JAMA Clinical Challenge 走的是另一条路:先有一篇发表于 2013 至 2023 年间的病例报告,作者把病例描述压成一段病史,把结论拆成四个选项,再附上原文讨论段。
这个差别的后果很具体。考试题问「某病的首选药是什么」,答案是一个药名;这里的题问「这位患者下一步该做什么」,答案要结合病史、体征、既往用药与检查结果一起判断。前者的难点在记忆,后者的难点在取舍——四个选项往往都是合理处置,只有一个是当下最该做的。
论文摘要里有一句判断可以当标尺:医学执照考试和一般临床问题无法捕捉真实病例的复杂度。这句话是本数据集存在的理由,也是它被反复引用的原因。
1.3 三十秒决策卡
下表左列写的是使用者可能面对的处境,右列是这份数据能否帮上忙、怎么帮。判断依据全部来自论文与仓库说明。
| 你的处境 | 它能帮你什么 |
|---|---|
| 想论证「大模型在真实病例上还不如考试题」 | 提供一组十年跨度的真实病例题,适合与执照考试类基准并列报告 |
| 手头有机构订阅,想搭一套内部评测集 | 网址清单直接可用,跑爬虫即可得到题目,成本主要在访问权限而不在工程 |
| 研究模型解释是否可信 | 每题有专家讨论段作参照,可做自动与人工双重评审,论文给了这套流程 |
| 想找开放许可的数据做训练 | 帮不上。正文不公开,代码未声明许可,都不满足可自由使用的要求 |
| 想复现论文的分数做横向对照 | 条件不足。没有固定快照,年份、抓取时间、权限范围都会改变样本集合 |
| 想研究「病例去图后难度如何变化」 | 论文明确说明图像被排除,且保留了是否含图的标记,可作为对照材料 |
最后一行的思路值得展开:正因为图像被拿掉,这批数据反而成了一面镜子,照出「纯文本模型在读病例时丢掉了多少信息」。皮肤科、眼科、病理类的病例原本靠一张图就能定诊断,去图之后必须靠文字描述还原,难度结构因此改变。
1.4 不适合谁
如果你的需求是「找一份能直接 pip install 或 wget 拿到的多选题集来训练模型」,它给不了你——能拿到的是网址和脚本,正文在家、钥匙在外。
如果你的需求是「要一个稳定的测试快照,好让不同团队报出可比的分数」,它也未必合适。论文没有提供固定划分,仓库没有打包数据,不同时间抓取的结果可能不同。
如果你的需求是「需要影像一起理解的多模态评测」,它同样不行。整理时明确剔除了图像,只保留一个「是否含图」的布尔标记,图像本身不在数据里。
如果你的需求是「需要覆盖全科、样本均衡的题库」,它的结构偏向期刊栏目本身的选题分布,某些专业题目多、某些极少,用它估计模型的整体医学水平会有偏。
1.5 核心价值的三个支撑点
判断一份数据集值不值得收录,通常看三件事:是否有人真的在用、是否提供了别人提供不了的东西、边界是否清楚。这份数据三项都成立,但成立的方式与普通开放数据集不同。
被引用。 论文把 JAMA Clinical Challenge 与 Medbullets 并列提出,作为「比既有基准更难」的证据,此后讨论真实病例推理、医学解释评测的工作普遍把它列为对照项。它进入的不是训练流水线,而是评测清单。
不可替代。 从有版权的顶级医学期刊专栏里取真实病例、改写成标准化选择题、并保留原作者讨论段,这件事需要三样东西同时具备:期刊授权、专业知识、工程能力。三者凑齐的成本很高,所以同类资源稀少。
边界清楚。 作者没有含糊其辞地说「稍后发布」,而是明确指出不发布、说明原因、给出替代路径、提醒使用者先确认许可。边界写在明处,比含糊的「申请后提供」更容易判断。
§2 数据构成与规格
2.1 规模:官方给的口径
规模只有一个官方数字:1,524。论文正文写「JAMA Clinical Challenge consists of 1524 clinical cases collected from the JAMA Network Clinical Challenge archive」,表 1 的条目数一栏同样是这个数,表 2 的对比表也按同一口径列出。
这里有一个需要说清的地方。表 1 的题注定义了一件事:那一列统计的是测试样本数。也就是说,这个数字不是「抓了多少篇文章」,而是「进入评测的题有多少道」。论文没有给出抓取到的原始文章数与最终题数之间的差异,也没有说明剔除了哪些文章。这一点在后续核查里会成为一个不确定项。
时间跨度同样是官方口径:2013 年 7 月到 2023 年 10 月,跨度覆盖十年零三个月,横跨 13 个医学领域。领域标签取自文章所属的期刊或专栏分类,不是对病例内容重新归类的结果。
2.2 一条记录长什么样
理解这份数据最快的办法是看一条记录。仓库里的网址清单是 JSON 数组,每个元素四个字段,与原文献一一对应。
{
"id": 0,
"link": "https://jamanetwork.com/journals/jama/fullarticle/2811509",
"answer_idx": "D",
"answer": "Provide supportive care"
}
{
"id": 2,
"link": "https://jamanetwork.com/journals/jamadermatology/fullarticle/2811083",
"answer_idx": "D",
"answer": "Mpox"
}
第一条的正确答案是「给予支持治疗」,属于处置类问法;第二条的正确答案是「猴痘」,属于诊断类问法。两条记录并排放,正说明同一个数据集里混着两种题型,评测时若不加区分,会把「记住病名」和「会做决策」两种能力搅在一起。
四个字段的分工是:id 为序号,link 指向文章全文页,answer_idx 是正确选项在 A 到 D 中的位置,answer 是正确选项的文本。后者是冗余校验——抓取时如果选项顺序错乱,用答案文本比对即可发现。
2.3 爬虫抓完之后的表
跑完 jama_scraper.py,输出是两张同源的清单:jama_raw.csv 和 jama_raw.json。前者给人看,后者给程序读。字段共 11 列,顺序固定。
| 字段 | 来源 | 含义 |
|---|---|---|
| link | 网址清单 | 文章全文地址,同时是主键 |
| question | 页面正文 | 病例描述段与多选题题干拼接后的完整题面 |
| opa / opb / opc / opd | 页面正文 | 四个选项,按页面顺序落位 |
| diagnosis | 页面正文 | 诊断名,取自「Diagnosis」或「What To Do Next」后紧跟的那一段 |
| answer_idx | 网址清单 | 正确选项序号,直接沿用清单值,不由爬虫推断 |
| answer | 网址清单 | 正确选项文本 |
| explanation | 页面正文 | 讨论段拼接后的专家解释 |
| field | 页面元数据 | 文章类型与上级分类拼接而成,可粗当专业标签 |
有一处设计值得单独说:答案不是从页面里猜的,而是直接从网址清单拷过来。爬虫源码里有一行注释专门交代了这一选择——为了让答案正确。这解释了为什么网址清单要保留 answer_idx 和 answer 两个字段:它们不是给使用者看的元信息,而是爬虫的输入参数。
2.4 题面的拼装规则
question 字段不是页面上某一段的原文,而是两段拼起来的:前面是病例描述,后面是多选题题干,中间用一个空格连接。
这个拼法带来一个后果:题面里同时存在「患者情况」与「要回答的问题」,模型必须自己切分。对指令微调过的模型通常不构成困难,但如果直接按句切分做检索,边界会切错,因为病例描述的末句往往也是陈述句,与题干之间没有分隔符。
爬虫在取病例描述段时做了一个过滤:段落里的空格数加一小于 8 的,直接跳过。这个阈值的作用是滤掉小标题、图注、作者署名之类短行,只保留成段的叙述文字。它是一道很粗糙的闸门,可能滤掉少数真正的短段,也可能放过个别长图注。
2.5 解释字段的性质
专家解释来自原文的讨论段,由期刊邀约的医生与其他医学专业人员撰写。它不是为机器学习优化的「标准答案说明」,而是写给临床同行看的病例讨论:先说诊断依据,再解释鉴别诊断为什么被排除,最后给出处置建议。
这个性质决定了两件事。第一,解释长度差异很大,论文给的均值是 632 个词元、最长 1,369 个词元,说明有的讨论只需一段话,有的要铺开讲鉴别。第二,解释与正确答案不一定逐句对应,模型生成的解释即使结论正确,也可能因为组织方式不同而在自动评审中吃亏,这也是论文要用人工评审做补充的原因。
2.6 与 Medbullets 的关系:一对同胎不同命
这两个数据集出自同一篇论文、同一个仓库、同一批作者,但发放方式完全相反。把它们放一起对照,最能说明「许可如何决定一个数据集的一生」。
| 维度 | JAMA Clinical Challenge | Medbullets |
|---|---|---|
| 题目性质 | 真实发表病例改写 | 模拟临床题 |
| 每题材量 | 固定四个选项 | 原版五个选项,另有四选项版本 |
| 选项版本记号 | 不设版本记号 | Medbullets-5 与 Medbullets-4 |
| 来源版权 | 期刊版权,须订阅 | 可公开发布 |
| 发放方式 | 只给网址清单与爬虫 | 提供下载 |
| 仓库形态 | 根目录放脚本与清单 | 独立目录,含数据文件 |
| 复现门槛 | 需自备全文权限 | 直接获取 |
这张表里最刺眼的是第三行和第四行:同一篇论文里,一个数据集写的是「可下载」,另一个写的是「因版权不能公开」。论文附录把话说得更透——很多大学与大型机构有 JAMA 内容授权,个人获取则可能很贵,现实是大部分高质量医学信息并非开放获取。
2.7 定位差异:它站在哪一排
医学问答基准大致可以排成一条从「考试」到「真实病例」的轴。JAMA Clinical Challenge 站在最靠真实病例的一端。
| 资源 | 题目来源 | 典型问法 | 是否附解释 | 获取方式 |
|---|---|---|---|---|
| MedQA | 医学执照考试题库 | 诊断、机制、用药 | 部分附解析 | 公开下载 |
| PubMedQA | 生物医学论文摘要 | 摘要能否回答某问题 | 无 | 公开下载 |
| MedMCQA | 印度医学入学考试 | 知识点记忆为主 | 附解析 | 公开下载 |
| Medbullets | 教学机构模拟题 | 典型病例处置 | 附专家解释 | 公开下载 |
| JAMA Clinical Challenge | 期刊真实病例专栏 | 疑难病例诊断与处置 | 附专家讨论 | 仅网址与爬虫 |
| NEJM 影像挑战类 | 期刊影像病例 | 图像判读 | 附讨论 | 依期刊条款 |
这张表要说明的判断规则很直接:要规模和开放许可,选考试题库那一排;要真实病例与可推理的解释,选期刊专栏这一排;后者几乎没有一份能直接下载,代价就是复现门槛。
2.8 为什么一千五百道题不算多,却够用
一千五百道题放在动辄十万量级的题库面前不算大。但对评测用途来说,规模并非首要变量,题目难度与区分度才是。
论文的论点是这批题比既有基准更难,判断依据是七个模型在多个提示设定下的表现。题目愈难,模型之间的差距愈容易拉开,需要的题量反而愈少。这也是很多高难度基准只有几百到几千题的原因:它们的用途是测上限,不是训模型。
反过来说,这个量级不适合做统计细分。若想比较某个专科里两种方法的优劣,切成若干组之后每组样本会少到难以得出稳定结论。用它做结论时,宜停在整体层面。
§3 来源层:这些病例从哪来、为什么值得信
3.1 上游是期刊的一个固定栏目
上游不是零散抓取的论文,而是一个有编辑把关的固定栏目:JAMA 网络 Clinical Challenge。该栏目每期选一篇病例,请作者写出病例经过、设置一个临床问题、给出四到五个候选答案、再附一段讨论。
这个结构天生适合改造成选择题。期刊已经把「问题」与「答案候选」摆好了,整理者要做的不是从零命题,而是把版式里的信息搬到结构化字段里。这也是为什么爬虫脚本不长——难点不在命题,而在解析页面。
3.2 栏目覆盖十个期刊
栏目分布在 JAMA 网络的多个子刊上。网址清单里的链接能直接看出所属刊物,把后缀拆开统计,得到十个刊物与各自的条目数。
| 刊物 | 题目数 |
|---|---|
| JAMA Ophthalmology | 378 |
| JAMA Dermatology | 255 |
| JAMA Otolaryngology–Head & Neck Surgery | 254 |
| JAMA | 241 |
| JAMA Surgery | 126 |
| JAMA Oncology | 85 |
| JAMA Cardiology | 76 |
| JAMA Pediatrics | 56 |
| JAMA Neurology | 48 |
| JAMA Psychiatry | 5 |
| 合计 | 与官方规模一致 |
这份清单本身就是一次核对的抓手:总数与论文口径完全一致,十个刊物加起来正好是官方数字。眼科、皮肤科、耳鼻喉三个子刊占了大头,这与栏目本身的选题偏好有关——这三科的病例最依赖「看一眼就明白」的视觉判断,也最适合做成图文并茂的挑战题。
3.3 为什么眼科与皮肤科占比高,而精神科只有个位数
这不是整理者挑的,是栏目本身长成这样。Clinical Challenge 的核心玩法是给一张图、问一个诊断,图像是题眼。皮肤与眼科的病变可以直接拍下来,耳鼻喉与外科有内镜和术中照片,肿瘤与影像有切片和扫描;精神科没有这样的「一眼定诊断」的视觉对象,病例挑战的形式天然不适用。
这个解释有一个直接后果:把图像全部剔除之后,占比最高的三个科室恰好是受影响最重的三个科室。原来的题眼没了,文字描述的负担就压到了病史段上。整理者保留了「是否含图」的标记,正是为了让使用者知道哪些题的原文依赖图像。
3.4 时间跨度为什么重要
2013 年 7 月到 2023 年 10 月,这十年零三个月里医学本身在变:诊断标准改过,药物退市过,新的病原体出现过,影像技术升级过。用这批题评测模型,实际上是在测模型对「一个时间切片内的临床共识」的掌握程度。
这件事有两面。一面是好处:题目带着时代印记,能测出模型是否把旧共识当成新知识。另一面是风险:若用训练数据截止较晚的模型来答,它可能通过「知道这件事后来怎么改了」而答对,而不是通过推理病例。评测时若不看训练数据的时间边界,分数会偏高。
3.5 视觉提示与本文的关系
这是理解整份数据的一把钥匙,值得单独拿出来说。
Clinical Challenge 的原始玩法是:给读者一张临床照片或影像,配一段简短病史,问「诊断是什么」或「下一步做什么」。图像承担了从病史到诊断之间最关键的一跳。整理者把这一步拿掉了,理由是让任务适配纯文本语言模型。
拿掉之后会发生什么,可以推演三条路径。
第一条,题还能做。病史里若有足够特异的描述(比如「沿神经节段分布的群集性水疱」),文字本身就足以指向诊断,图像只是佐证。这类题去图后难度上升有限。
第二条,题变得极难甚至无解。若病史故意写得很克制,把关键体征留给图像,那么纯文本模型只能靠猜。这类题在去图后的表现,测的其实不是医学知识,而是「在信息不足时的猜测策略」。
第三条,题的性质变了。原本是「识别图像」,去图后变成「从文字描述里抽取关键体征」,考的能力换了赛道。
整理者没有在论文里对这三千分法做量化,只说明剔除了图像。使用这批数据时心里要装着这件事:某些题的低分不代表模型不懂医,而是题目本身丢了题眼。
3.6 病例的筛选标准:难与不寻常
论文对来源病例的描述只有一句判断:这些病例是刻意按难度与不寻常表现挑出来的。这句话值得放大——它解释了为什么这个数据集的分数普遍低于考试题库。
「不寻常表现」在临床上有个专名叫非典型表现。典型病例好答,因为教科书照着写;非典型病例难答,因为要跳出第一印象去考虑罕见可能。期刊栏目选的就是后者,这是它的卖点,也是它作为评测集的价值所在。
3.7 为什么这个来源值得信
来源的可信度建立在三层机制上,每一层都可以独立核查。
第一层是编辑把关。期刊专栏的每篇病例都经过同行评审与编辑加工,病例描述、问答设置、讨论内容都有人负责。
第二层是署名责任。讨论段由具名医生撰写,观点可追溯。这一点与匿名标注的众包数据集不同,出错时能找到作者。
第三层是可查证。每道题都保留文章网址,任何人都能回到原文核对题面、选项、答案与解释是否被正确搬运。这是它相比封闭数据集的一大优势:虽然正文不发布,但每一处都能溯源。
三层合起来,构成一个不太常见的情况:数据本身不开放,但数据的每一处都可以被独立验证。这在实际使用中很有价值——团队可以只在自己的权限范围内核验若干条,确认搬运无误,再信任整批。
3.8 与「从论文里挖题」的路线有什么不同
另一条常见路线是从 PubMed 摘要或开放论文里自动生成问答对。那条路线的优点是规模大、可开放;缺点是题目质量参差,且往往只考「找句子」,不考「做判断」。
这条路线相反:规模小、不开放、但每道题都经过临床同行的判断,且带着一段真正的推理。两种路线的分工很清楚——前者用来训练与预训练评测,后者用来做高难度推理的终极检验。
§4 获取层:正文不发布意味着什么
4.1 先把那句话原样摆出来
仓库说明里对本数据集的全部交代只有一段,值得逐字引用。
We do not publicly release the JAMA Clinical Challenge data due to license constraints. Instead, we provide URLs to the articles and a scraper that you can use to obtain the data with the appropriate license. Please check your license to ensure you have access to JAMA articles (Full Text) before you run the script.
论文附录把同一件事说得更完整:因为版权限制不能公开发布该数据集,改为提供文章网址与爬虫;同时又补了一句现实观察——很多大学与大型机构有该期刊的内容授权,个人获取则可能费用不低,高端医学信息普遍不在开放获取之列。
这两段合起来,结论没有歧义:正文未公开发布,能公开的只有入口。 这不是「申请后发放」,也不是「登记后邮件发送」,就是不给。
4.2 这条约束的三层含义
很多人读到「不公开发布」会下意识理解成「应该快发布了」或「要找作者要一下」。这两种理解都错。把约束拆成三层,边界就清楚了。
| 层次 | 含义 | 具体后果 |
|---|---|---|
| 法律层 | 期刊对病例全文享有版权,转载与再分发需授权 | 作者无权把正文打包上传,哪怕论文是自己写的 |
| 现实层 | 全文访问依赖机构订阅或个人付费 | 能否重建取决于使用者所在的机构,而不是使用者的技术能力 |
| 工程层 | 只有网址与解析脚本可用 | 数据的内容随时点变化,不存在一份「官方快照」 |
第三层最容易被低估。没有快照意味着没有版本号,没有校验和,没有「清单上的每条记录一定抓得到」的保证。页面改版、文章撤稿、访问权限变更,都会让重建结果与论文时代不同。
4.3 能拿到什么,拿不到什么
分清楚这两栏,就能判断自己手上有什么。
| 能拿到 | 拿不到 |
|---|---|
| 全部文章的网址,逐条可溯 | 文章正文的官方压缩包 |
| 每条题的正确选项序号 | 固定不变的样本快照 |
| 每条题的正确选项文本 | 训练、开发、测试划分 |
| 抓取与解析脚本(Python) | 代码的使用许可声明 |
| 论文里全部规模与方法描述 | 标注协议、专家资质说明 |
| 各专业与问法的官方统计 | 逐题的质量评分或难度分级 |
最右列里「代码的使用许可声明」这一项容易漏。仓库根目录有 .gitignore、README、两个脚本和一个清单文件,没有 LICENSE 文件。严格按开源惯例,未声明许可的代码默认保留全部权利,使用者不能默认自己可以随意再分发。
4.4 爬虫做了什么,为什么只有这么长
jama_scraper.py 用 BeautifulSoup 解析页面,用 cloudscraper 应对反爬,用 pandas 组装表格,全文不到两百行。拆开看只有四个动作。
#-- 1. 从网页容器里取题干与四个选项
div = soup.find('div', class_='box-section online-quiz clip-last-child thm-bg')
question = div.find('h4', class_='box-section--title').text
answers = [p.text for p in div.find_all('p', class_='para')]
#-- 2. 从文章正文里取病例段与讨论段(超过 8 个词的段落才收)
if np.char.count(paragraph.get_text(), ' ') + 1 < 8:
continue
if case == 1:
casepara.append(paragraph.get_text())
if discussion == 1:
discussionpara.append(paragraph.get_text())
#-- 3. 组装一行记录:答案取自网址清单,不取自页面
dff.append([url, question, answers[0], answers[1], answers[2], answers[3],
diagnosis, row['answer_idx'], row['answer'], combinediscussionpara, articleType])
#-- 4. 落盘为两张同源清单
df.to_csv("jama_raw.csv", index=False)
json.dump(df.reset_index().to_dict(orient='records'), open('jama_raw.json', 'w'), indent=4)
四步里第三步最关键。答案不是从页面识别出来的,而是从网址清单直接取 answer_idx 与 answer。这个设计把「找正确答案」这件最容易出错的事移出了爬虫,交给人工核对过的清单。代价是清单一旦出错,整批答案都错,而且爬虫本身发现不了。
4.5 反爬与失败重试
脚本用 cloudscraper 而不是 requests,是为了过掉期刊站点的浏览器指纹校验。取页面后先找多选题容器,找不到就重试一次;再找不到就打印一行提示并跳过该条。
whethermcq, mcqquestion, answers = extractMCQ(soup)
if whethermcq is None:
print("No MCQ found; trying again")
soup = BeautifulSoup(scraper.get(url).text, 'html.parser')
whethermcq, mcqquestion, answers = extractMCQ(soup)
if whethermcq is None:
print("Please check your license to ensure you have access to JAMA website.")
continue
这段代码埋着整个流程最实际的坑。「找不到题目容器」有两种成因:一是页面结构变了,二是这次请求没有拿到全文(无权限时站点返回的是摘要页或登录页)。脚本无法区分两者,只能用同一句提示覆盖——所以看到这句提示,先别怀疑代码,先确认自己的访问权限。
4.6 补抓新文章的第二支脚本
仓库另附 fetch_jama_cases.py,由外部贡献者 awxlong 提供,作用是扫描专栏的更新内容、补出新文章的网址,输出 jama_links_updated.json。
这支脚本的存在说明一件事:作者自己也知道网址清单会过时。专栏在 2023 年 10 月之后仍在更新,而论文的统计截止在那个时点。想要与论文口径一致,应当只用原始清单;想要追求时效,就得自己处理新增部分,并接受样本集合与论文不再可比。
4.7 一条最小的重建流程
如果你所在机构有全文权限,重建一次的最小流程如下。前提是先确认 jama_links.json 与两个脚本在同一目录。
#-- 1. 建环境(Python 3.9 以上)
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
#-- 2. 检查清单条数与首尾记录
python -c "import json; d=json.load(open('jama_links.json')); print(len(d), d[0]['link'])"
#-- 3. 跑爬虫,输出 jama_raw.csv 与 jama_raw.json
python jama_scraper.py
第二步那行检查很有用。清单是 JSON 数组,元素含 id、link、answer_idx、answer 四个字段,用一行就能确认清单完整、首条记录可读。若这一步就报错,说明文件没下全或被代理改写,不必往下跑。
4.8 抓完之后必须自己做的三件核对
脚本不保证结果正确,只保证尝试过。跑完至少要核三件事。
第一,条数对不对。 输入清单有多少条,输出就该有多少条上下。若输出明显偏少,多半是权限不足导致大量页面只返回摘要,被 continue 跳过了。
第二,选项有没有错位。 抽查若干条,把 answer 字段与 opa 至 opd 中对应序号的那一个逐字比对。脚本按页面顺序落位,一旦某篇文章的选项排版特殊,顺序就会错。
第三,解释是否为空。 讨论段的拼接依赖页面里出现 Discussion 小标题。若某些文章的讨论标题写法不同,explanation 会是空串,而这类记录在整批里只占少数,不特意查很容易漏掉。
4.9 为什么不能只靠爬虫交付
有人会想:既然有脚本,我跑一遍再分发给团队就行。这个想法在许可上有问题。
分发抓取结果,等于分发期刊正文,而正文的再分发权在期刊手里,不在作者手里,也不在使用者手里。机构订阅通常允许内部研究使用,但不允许对外转发全文。因此即便你成功重建成一份完整数据集,它也只是一份「仅在本机构内可用」的副本,不能当作开源数据对外发布。
这条限制决定了这份数据的传播形态:论文里的数字被广泛引用,数据本身却很少被复制。引用的是结论,不是样本。
4.10 一条贯穿案例:同一科室、两种问法、一条错误路径
要说明「这道题的答案能不能信」,最好的办法是看两条同科室记录。它们都来自耳鼻喉子刊,题意却落在两种不同的问法上。
| 观察点 | 第一条 | 第二条 |
|---|---|---|
| 来源刊物 | 耳鼻喉子刊 | 同一子刊 |
| 问法 | 诊断 | 诊断 |
| 正确答案 | 气肿性甲状腺炎 | 另一个病名 |
| 正确选项位置 | C | 另有一处 |
| 页面上的正确答案 | 由绿框样式给出 | 由绿框样式给出 |
| 数据里的正确答案 | 清单中的 answer_idx | 清单中的 answer_idx |
| 若解析样式 | 依赖 CSS 类名,改版即失效 | 同左 |
| 若沿用清单 | 与人工核对一致 | 同左 |
两张表的最后一列值得停一下。页面上标出正确答案靠的是样式类名,解析器只要抓错一个类名,就会把错误选项当成正确答案,而且整批错得完全一致。清单路线把这一步挪走了:答案由人工核对过,脚本只负责搬运题面。
这条路径的代价也要说清。清单一旦有错,脚本无从发现,因为它从不与页面比对。所以重建流程里「抽样回原文核对」这一步是不能省的——省掉它,等于把清单的正确性完全外包给了一次三年前的核对。
这条案例在后面几节还会用到:§5.2 讲问法时用它说明同一科室为何出现两种题型,§5.4 讲答案位置时用它说明位置分布不集中在某一处,§7.3 讲答案依赖清单时用它说明错误会整批传导。
4.11 拿不到正文,还能做什么
有三条务实路径,各自对应不同目标。
路径一:只读论文,做方法借鉴。 论文给出了完整的数据构造流程、提示设计、自动解释评审与人工评审方案。这套流程可以搬到自家有权限的病例库上,得到一份内部基准。
路径二:抓少量样本,做性质验证。 若机构有权限,抓几百条足以验证「真实病例比考试题难」这件事是否在自己的模型上复现,不必追求全量。
路径三:只用清单做元研究。 网址清单公开在仓库里,可以统计刊物分布、时间分布、答案位置分布,用来研究栏目的命题习惯。这类研究不需要全文。
三条路径都不需要突破许可边界,也都用得上这份数据的核心信息。
§5 结构层:题目、选项与答案如何咬合
5.1 题目的三层结构
每道题由三层构成,从外到内分别是病例描述、临床问题、四个选项。三者不是并列的字段,而是递进的信息。
病例描述给事实:患者的年龄、主诉、病程、既往史、查体结果、化验与影像的文字结论。临床问题给方向:要诊断,还是要下一步处置。四个选项给候选池:读完之后只能从其中挑一个。
理解这个递进的用处在于定位错误来源。模型答错可能是没读到关键事实(第一层)、误读了问题方向(第二层)、或没在候选里找到最合适的(第三层)。三层的排查方式不同。
5.2 两种问法在数据里的痕迹
问法大概分两类:问诊断,问下一步怎么做。前者要求从症状体征反推病名,后者要求在多个合理处置里挑出最该做的。
回看前面那两条记录,正好一例各占一条。第一条答案是「给予支持治疗」,是处置;第二条答案是「猴痘」,是诊断。
再看 §4.10 的案例里那两条同科室记录,两者都是诊断类问法,却分布在两个不同的病名上。把它们与前面两条并排放,四道题恰好覆盖了诊断与处置两个方向,说明「同一科室」与「同一问法」并不绑定。
这两类题的难度来源不同。诊断题难在鉴别,几个病名都说得通,要看某个细节才能排除;处置题难在排序,几个处置都不算错,但有一个优先级最高。评测时若把两类混算,得到的平均分对「模型更擅长记忆还是更擅长决策」这个问题没有解释力。
5.3 四个选项为什么固定为四
训练有素的读者看到这里会问:为什么不是五个。答案在论文的做法里。
同一团队为了让对比公平,为 Medbullets 同时做了五选项版与四选项版,又把 MedQA 的五选项版裁成四选项版(随机删掉一个错误选项)。而 JAMA 部分从一开始就是四个,因为期刊原文的挑战题本身就是四选一。
固定四个还有一个隐性好处:随机猜的期望正确率是四分之一,各家数字放在一起时基线统一。若选项数在题与题之间浮动,猜对率的期望就不是常数,跨题比较会失真。
5.4 正确答案的位置与文本
网址清单里每条都给了正确选项的序号与文本。序号是字母,文本是答案原文。两者必须一致,任意一者错了,后面的评测都会错。
这个设计还带来一个副产品:可以用序号做位置分析。四条记录里答案分别落在四个不同位置,说明清单里的位置分布并不集中在某个字母。对于想研究「模型是否有位置偏好」的人来说,清单本身就是材料,且不需要全文权限。
§4.10 的案例提供了更细的观察:同一科室的两条记录分属两个不同的正确选项字母,说明位置是随文章排布而定,与学科、问法、难度都无关。任何按学科切分后得出的「位置偏好」结论,都是伪相关。
5.5 诊断字段与答案字段不是一回事
diagnosis 与 answer 容易混。前者是页面里「Diagnosis」或「What To Do Next」小标题后面那一段,后者是清单里记的正确选项文本。
处置类题目里,两者往往不同:diagnosis 是病名,answer 是处置动作。脚本里有一段专门处理这种情况——如果没有找到处置段,就把诊断段当作答案。
#-- 诊断段与答案段二选一:找不到处置段时退回诊断段
if founddiagnosis == True and fetchoptiontrue == False:
chooseoption = diagnosis
这段逻辑说明:diagnosis 这个字段语义并不纯粹,它有时是病名,有时是处置。做字段级分析时不能把它当同质变量。
5.6 解释字段的内部结构
讨论段不是一段均匀的文字,它通常按固定套路展开:先复述关键发现,再给诊断或处置,然后逐条说明为什么不选其他选项,最后补充一点背景知识。
自动评审时,这个结构会影响打分。用参考解释与生成解释做相似度比较,模型若按「先说结论」的顺序写,可能与原文的「先说发现」错位,相似度被低估,而内容其实正确。论文之所以要补人工评审,部分原因就在这里。
5.7 专业标签是怎么来的
field 字段由两个页面元素拼接:文章类型与上级分类。前者是页面上的分类标签,后者是更粗的学科归类。
这个设计意味着专业标签反映的是「文章发在哪里」,而不是「病例讲什么」。一篇讲甲状腺的病例若发在耳鼻喉子刊,标签就会指向耳鼻喉。按专业分组统计时,这是口径要说明的一点。
5.8 是否含图的标记
脚本会检查文章正文里有没有图像容器,有就标 Yes,没有就标 No。这个布尔值是目前唯一残留的视觉信息。
它的用途是分层。把含图的题与不含图的题分开看,可以观察「去图对难度的影响」在两组之间是否不同。不含图的题本来就不依赖图像,去图前后难度变化小;含图的题在原文里图像是题眼,去图后应当明显变难。
5.9 三份材料之间的对应关系
把期刊页、网址清单、抓取结果三者摆在一起,才能看清数据是怎么流动的。
| 材料 | 谁维护 | 主要内容 | 与题目的关系 |
|---|---|---|---|
| 期刊文章页 | 期刊编辑部 | 病例、图像、问答、讨论 | 唯一权威原文 |
| 网址清单 | 论文作者 | 网址、答案序号、答案文本 | 定位与答案标注 |
| 抓取结果 | 使用者自己跑 | 题面、四选项、解释、专业 | 可评测的数据表 |
| 论文统计表 | 论文作者 | 规模、长度、领域、基线分 | 口径参照 |
这条链上每一环都可能断。文章下线、清单过期、脚本失效、统计口径变化,四种断法分别对应四种不同的补救方式,排查时按链路顺序走最省力。
5.10 数据表里没有的东西
判读一份数据最快的办法之一是看它刻意没放什么。这张表里没有以下几样。
| 缺失项 | 为什么没有 | 影响 |
|---|---|---|
| 图像 | 为纯文本模型定制,主动剔除 | 视觉型病例难度结构改变 |
| 训练/开发/测试划分 | 全量当测试集用,少样本靠留一 | 无法与论文分数直接对齐 |
| 标注者信息 | 解释由期刊邀约作者撰写 | 无法评估标注一致性 |
| 难度分级 | 期刊不做分级 | 只能看整体分,不能看分层 |
| 版本号 | 数据不发布,无从编号 | 无法引用「某版本」的固定快照 |
| 许可声明(代码) | 仓库未附 | 再分发缺乏明确依据 |
这六项里,前两项是设计选择,后四项是发放方式的连带后果。理解这个区分,才不会把「没有」误当成「漏了」。
§6 与库内条目的关系
6.1 在医学问答谱系里的位置
若把站内资源按「题目从哪来」排开,位置关系很清楚。
| 站内资源 | 题目来源 | 与本文的关系 |
|---|---|---|
| MedQA | 医学执照考试 | 同为四选一,来源是考试而非真实病例,难度层级更浅 |
| MedMCQA | 医学入学考试 | 同为选择题,规模更大,开放获取 |
| PubMedQA | 生物医学摘要 | 任务不是四选一,是判断摘要能否回答问题 |
| Medbullets | 教学机构模拟题 | 同一仓库、同一论文,是本文的对照项 |
| MedXpertQA | 专家构造的难题 | 定位相近,都瞄准高难度,构造方式不同 |
| NEJM 影像挑战类 | 期刊影像病例 | 同样来自期刊、同样有获取门槛,本文是其文字版近邻 |
| 本文 | 期刊真实病例 | 真实病例加专家解释,只给入口不给正文 |
判断规则是:要开放许可与规模,往考试题库走;要真实病例与可推理的解释,往期刊专栏走,代价是拿到数据的门槛。
6.2 与 Medbullets 必须分开看
这两个名字经常一起出现,容易被当作同一份数据的两个版本。实际是两份数据。
分开看的理由是它们的性质不同:来源不同(期刊病例与教学机构模拟题)、版权状态不同(受约束与可发布)、获取方式不同(脚本与下载)、选项数不同(固定四个与五或四)。任何一项不同都足以让它们不能混算。
6.3 检索路径
想找同类资源,通常从三条路入手。第一条是从论文出发,看它引用了谁、被谁引用;第二条是从仓库出发,看同一个作者还发布了什么;第三条是从栏目出发,看期刊这个专栏还派生过哪些整理工作。三条路各能补上另外两条看不到的部分。
6.4 互链建议
站内互链应当围绕「同任务不同来源」与「同来源不同任务」两条线展开。前者把本文与考试类题库连起来,帮使用者理解难度梯度;后者把本文与期刊派生的其他挑战题连起来,帮使用者理解同一个来源能派生出多少种任务。
不建议与影像类资源建立强关联。本文不含图像,与影像数据集的关联只在「来源同为期刊病例」这一层,把它当作多模态资源会误导。
§7 质量评估与局限性
7.0 阅读本节前需要知道的一件事
评价这份数据之前,先要校正一个评价框架的错位:它不是「训练集」,也不是「开放基准」,而是「一份需要自带钥匙才能进的评测题库」。
用评价开放数据集的标准来评它,会得到一连串「缺这个、缺那个」的结论——没有压缩包、没有划分、没有许可文件、没有版本号。这些缺失是真的,但如果据此判它不合格,等于拿尺子量天平。
真正该问的是另外三个问题:它的构造方式是否站得住?它在被引用时是否被正确理解?它的边界是否被清楚地交代给了使用者?以下按这三个问题展开。
7.1 构造方式的可靠性
从期刊专栏取题、改写成四选一、保留原文讨论,这条路线有三个优点。题目来自真实发表并经同行评议的病例,专业质量有底线;选项由原作者设置,干扰项是真正可能的误诊或误处置;解释由具名医生撰写,推理链完整。
它也有一个结构性弱点:题目不是按评测目标设计的。期刊出题的动机是教学与挑战,不是测量模型能力,因此题目的区分度、难度梯度、选项干扰强度都不受控。有些题凭常识就能排除三项,有些题的四个选项都像是正确答案。用这样的题集算平均分,分数的含义略模糊。
7.2 DAIMS 评分
DAIMS 是数据就绪度的分层评分框架,从描述、结构、访问三层衡量一份数据能否被直接使用。下表按八个维度逐项给出判断,分值为五分制,判断依据来自仓库说明、论文与清单本身。
| 评分维度 | 得分 | 判断依据 |
|---|---|---|
| 描述层:身份与边界 | 4 | 名称、来源、时间跨度、规模、任务形式均有明确定义;边界(不发布、去图、无划分)写得很直白 |
| 描述层:文档完备度 | 2 | 只有一段仓库说明与论文正文,没有独立的数据卡、字段说明或标注手册;字段需读源码才能看懂 |
| 结构层:标识体系 | 3 | 网址可作主键,清单含序号可作辅助键;但无稳定数据集级标识,也无版本号 |
| 结构层:层级一致性 | 3 | 题面、选项、答案、解释四层关系清楚;diagnosis 字段语义不稳定,专业标签由刊物决定而非内容 |
| 结构层:模态配对 | 2 | 纯文本,图像被剔除,仅留是否含图的布尔标记;原文的多模态信息大量丢失 |
| 访问层:开放程度 | 1 | 正文不公开发布,只给网址与脚本;实际获取能力取决于使用者的期刊订阅 |
| 访问层:可复现性 | 2 | 有脚本可跑,但无快照、无版本、无校验和;页面变化与权限差异都会改变结果 |
| 访问层:许可清晰度 | 2 | 数据层的限制有明确说明(受期刊版权约束),代码层无 LICENSE 文件,实际授权范围不清 |
八项平均 2.4 分,落在「可理解、难复用」一档。描述层的边界意识较强,访问层是短板——这不是整理者做得不好,而是来源本身的版权状态决定了上限。
7.3 逐条局限
第一,没有固定快照。 修复方式在源头:只有作者打包发布一份带版本号的数据才可能解决,而这恰是版权不允许的。使用者的对策是自建哈希记录,把每次抓取的时间、条数、校验值存档。
第二,没有划分。 论文全量当测试集,少样本学习用留一交叉验证构造演示。这意味着任何在本文上微调的模型都会泄漏。使用者的对策是把本文只用于零样本或少样本评测,不用来训练。
第三,图像被剔除。 对眼科、皮肤科、耳鼻喉三个占比最高的科室影响最大。使用者的对策是利用是否含图标记分层报告,把含图题与不含图题的分数分开看。
第四,选项干扰强度不均。 部分题凭常识可排除多项。使用者的对策是同时报告随机基线与「只给选项不给病例」的分数,作为难度下限参照。
第五,没有标注一致性数据。 解释由单一位作者撰写,没有第二人复核的记录。使用者的对策是把它当作一份专业参考,而非金标准答案。
第六,答案依赖清单正确性。 爬虫直接沿用清单里的答案,清单错了整批都错。使用者的对策是抽样回到原文核对。§4.10 的案例已经把这个失效模式展开过:页面上有绿框,数据里有清单,两者都不经过解析器的判断,一旦清单出错,脚本没有任何机制能发现。
第七,代码授权不明。 仓库无 LICENSE 文件。使用者的对策是只在内部使用脚本,不对外再分发。
第八,时间切片带来的知识时效问题。 题目覆盖 2013 至 2023 年,其中若干结论已被更新。使用者的对策是记录每题所属年份,观察模型在早期与近期题目上的差异。
7.4 官方口径与清单的对照
有一处口径需要点明。论文正文、表 1 与表 2 对比表三者用的是同一个数字;仓库里的网址清单按数组长度与论文口径同数,且链接无重复。三处一致,这一点是可靠的。
不一致的地方在别处:论文没有说明「抓到的文章数」与「最终题目数」之间是否有差,也没有说明是否有文章因抓取失败被剔除。清单的长度与论文口径相同,可以视为间接证据表明没有明显剔除,但这只是推断,不是官方声明。
7.5 外部验证矩阵
一份数据是否可信,可以看外部材料能否相互印证。下表把四类信息源与它们能验证的部分对应起来。
| 信息源 | 能验证什么 | 不能验证什么 |
|---|---|---|
| 论文正文与表格 | 规模、长度、领域、基线分、构造流程 | 逐条记录的实际内容 |
| 仓库说明 | 获取方式、许可约束、脚本用法 | 数据质量细节 |
| 网址清单 | 题目数、刊物分布、答案位置 | 题面与解释的准确性 |
| 期刊原文 | 每一题的题面、选项、答案、讨论 | 无法批量核对全量 |
四类合起来,能核到清单层面与论文层面,核不到「全量题面是否被正确搬运」。这一层只能靠抽样。
7.6 一个必须说清的性质
这份数据的引用率与它的可获取性严重不匹配。论文里的结论被广泛引用,数据本身却极少被真正复制。
这带来一个隐性风险:讨论中引用「在某基准上模型只得了多少分」时,很少说明这个分数是在什么时间、用什么权限、抓了多少条、有没有跑通全部题的情况下得到的。不同团队报出的数字,未必建立在同一份样本上。
使用本文时,若要做跨团队比较,至少应报告四项元信息:抓取时间、成功条数、期刊权限来源、是否剔除含图题。缺任何一项,比较都只能算参考。
§8 版本与生态
8.1 为什么先讲「没有版本」这件事
大多数数据集介绍从版本号讲起:1.0 何时发、1.1 改了什么、当前推荐哪一版。这份数据没有这套东西,因为它不发数据,也就没有数据版本号。
能编号的只有三样:论文版本、代码提交、网址清单的更新。三者都不是数据版本,理解这个区别,才不会在引用时张冠李戴。
| 可编号对象 | 标识 | 变更记录 | 是否等同数据版本 |
|---|---|---|---|
| 论文预印本 | arXiv:2402.18060,2024 年 2 月首版,2026 年 2 月第 6 版 | 有明确版本史 | 否,论文版本变了数据没变 |
| 会议论文 | ACL Anthology 2025.naacl-long.182,含 v1 与 v2 两个 PDF | 有 | 否 |
| 仓库代码 | 提交哈希 | 有 | 否,代码更新不代表样本更新 |
| 网址清单 | 文件本身,无版本号 | 有更新记录无版本号 | 部分等同,清单即样本集合 |
| 抓取结果 | 无 | 无 | 每次抓取都是一份新副本 |
最后一行是本数据集最特别的地方:每个使用者的抓取结果,自己就是一份「版本」。 没有官方版本号,只有各自的副本。
8.2 仓库的更新轨迹
从仓库的文件记录能看出这条项目是怎么长出来的。清单与爬虫先出现,随后在 2024 年 8 月加入进度条与依赖更新,并由外部贡献者补上新文章抓取脚本,最后是 2025 年 7 月一次说明文字修订。
这条轨迹透露两点。一是维护并不频繁,属于「论文发完、说明补齐」的常态;二是补抓新文章这件事由社区推进,说明作者清楚网址清单会随子刊更新而过期。
8.3 论文版本与数据的关系
论文在 2024 年初次提交、2025 年定为 NAACL 长论文、2026 年初仍有修订。论文是可以改的,数据不能。
这带来一个细微但实际的问题:若论文后续修订了统计数字或实验设置,而数据本身仍是「跑脚本即时抓取」,那么论文里描述的那份样本与今天抓到的样本之间,时间距离只会越拉越大。引用时应当区分「论文所述的样本」与「今天能抓到的样本」。
8.4 它在评测生态里的生态位
在医学问答基准的谱系上,它占据的是一个很窄的生态位:真实病例、附专家解释、不开放。
这条位置的价值可以通过反证看出来。假如它突然开放下载,会发生什么?短期内引用量会上升,因为它终于能被跑;但中期会出现一个新问题——数据集被训练进去,分数不再能反映推理能力。它今天不被广泛下载,反而保住了一种「测试集」的纯洁性。
这个反证不是说封闭更好,而是说封闭与开放各自有代价。它的代价是复现门槛高,换来的是被污染的概率低。
8.5 谁在依赖它
依赖关系可以从引用位置看出来。它通常出现在三类论述里。
第一类是「既有基准不够难」的论证,用它作为真实病例的代表,与执照考试题形成对比。第二类是「解释评测」的研究,因为它每题都带专家讨论,是少数能同时测答案与推理的资源。第三类是医学教育研究,把期刊病例挑战本身当作教学方法,顺带引用这份结构化整理。
三类依赖都不是「必须用它」,而是「用它最方便」。这一点与其他基础设施型数据集不同——后者一旦消失,下游链条会断;它消失,下游只会换一个对照项。
8.6 为何能持续
这份数据没有下载量、没有托管平台、没有专项经费,按常见标准看很难「活下去」。但它有三处结构性的支撑。
第一,来源本身在持续生产。 期刊专栏从未停更,2023 年之后仍有新病例发表。只要栏目在,数据就能被不断补抓,不必依赖作者维护。
第二,维护成本极低。 要维护的不是一份会腐坏的压缩包,而是两个脚本与一份网址清单。页面结构变了改几行解析规则即可,不必重做数据。
第三,它是论文的附属品,而非独立项目。 论文被引用就会带来访问,访问就会带来新的使用者,哪怕这些人最终没能跑通。这种「弱依赖但持续访问」的状态,足以让仓库保持可见。
三处支撑各有脆弱点:栏目改版会让脚本失效,论文热度下降会让访问减少,清单不及时更新会让样本陈旧。但对一份本就不以「人人可用」为目标的资源来说,这些脆弱点可以接受。
8.7 与开放基准的长期差异
把时间拉长看,开放基准与这类受限基准会走出两条不同的曲线。
开放基准的曲线先升后降:发布时被大量使用,几年后因被训练数据污染而失去区分度,逐渐退为「历史基线」。受限基准的曲线比较平:始终有一小批人能跑,分数更新慢,但因为样本不进入训练,区分度下降得慢。
这两条曲线没有孰优孰劣。做工程选前者,做能力上限的判断选后者。理解这一点,就不会把「它没什么人下载」当成缺点。
§9 使用指引
9.1 三种角色的路径
不同人来查这份数据的起点不同。下表按角色列出最短路径与最容易踩的坑。
| 角色 | 最短路径 | 最容易踩的坑 |
|---|---|---|
| 做模型评测的研究者 | 先确认机构权限,再跑脚本,抽样核对,最后记录元信息 | 用不完整的样本跑出分数,却按全量口径报告 |
| 做可解释性研究的人 | 直接读论文的解释评审方法,再移植到自家数据 | 把期刊讨论段当成「标准解释模板」 |
| 做医学教育的人 | 取论文方法与栏目本身,不必跑数据 | 以为拿到了结构化题库 |
| 做数据工程的人 | 读脚本源码,理解解析规则后再改 | 以为答案来自页面解析 |
第三行值得点一下。教学场景其实不需要结构化数据,直接用期刊专栏的原始页面更合适,因为图像还在。这份整理的价值在于它把题目变成了可计算的格式,对教学反而做了减法。
9.2 一条最小可用的评测流程
假设已有权限并跑通了脚本,得到 jama_raw.json。评测时最容易出错的是把题面切错,下面这段处理题面拼装的代码可以直接用。
import json, re
rows = json.load(open('jama_raw.json'))
def build_prompt(r, n_shot=0):
#-- 题干与选项按固定格式编号,避免模型只回字母不回理由
opts = "\n".join(f"{k}. {r[f'op{k.lower()}']}" for k in "ABCD")
return (f"Read the clinical case and answer the multiple-choice question.\n\n"
f"{r['question']}\n\n{opts}\n\n"
f"Answer with the option letter, then explain your reasoning.")
def gold_letter(r):
#-- 清单给的是字母序号,直接用作金标准
return r['answer_idx'].strip().upper()
print(build_prompt(rows[0]))
print('gold:', gold_letter(rows[0]))
这段代码的关键在处理选项编号,而不是处理题面。因为 question 已经是「病例加题干」的拼接结果,无需再切分;真正会出错的是选项顺序——若按字典序重排,就与 answer_idx 脱钩了。
9.3 分层统计的写法
拿到结果后,至少按含图与否分一组。原因是这两组的难度来源不同,混在一起会互相掩盖。
import json
from collections import defaultdict
rows = json.load(open('jama_raw.json'))
stat = defaultdict(lambda: [0, 0]) # [答对, 总数]
for r in rows:
hit = int(pred.get(r['link'], '') == r['answer_idx'])
for key in ('all', r['field'].split('/')[0], 'has_image' if r.get('has_image') else 'text_only'):
stat[key][0] += hit
stat[key][1] += 1
for k, (c, n) in sorted(stat.items()):
print(f'{k:30s} acc={c/n:.3f} n={n}')
三层键分别是全体、刊物、含图与否。这样一张表能把「整体分低是因为模型差」与「整体分低是因为题难」区分开。
9.4 在 AI 流程中的位置
常见的医学 AI 流程分四段:预训练、指令微调、内部评测、对外发布。这份数据适合的位置只有第三段,且只适合作为高难度对照,不适合作为主评测集。
不适合当主评测集的理由有两条。一是样本量不足以做细分结论,二是没有固定快照,主评测需要可复现的数字,而它给不了。当对照项则合适:主评测用规模大、口径稳的开放集,对照用本文,说明「换到真实病例后分数掉多少」。
9.5 若要自建同类数据集
若你的机构有病例库权限,想照这套思路自建,值得复用的有三点。
第一,题目与解释同源。讨论段由原作者写,天然与题目配套,比事后补写解释省力且更可信。第二,答案与题面分离存放。把答案单独放一份清单,解析页面时只负责搬运,避免「解析器猜答案」这一类错误。第三,保留来源链接。没有链接的数据无法核查,也无法应对抽样质检。
值得改进的也有两点。一是补齐标注一致性与难度分级,这两项本文没有;二是给出固定快照与版本号,这一项受版权限制时可以用「哈希加时间戳」的方式部分替代。
9.6 可以提出的研究问题
这份数据能支撑的问题不多,但都比较硬。
它能否检验模型的鉴别诊断能力?把诊断类与处置类分开算,就能看出模型是不是只会背病名。解释的自动评审与人工评审差异有多大?论文给了两者对照,可以顺着做。去图对分数的影响有多大?用是否含图标记分层即可初步回答。旧年份的题是否比新年份的题更容易被答对?这能检验模型的知识时效。
四个问题都不需要额外数据,用本文加上模型就能做。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 数据性质 | 真实发表病例的二次结构化整理,非模拟生成;原病例与讨论由期刊编辑与具名作者产出 |
| 建议用途 | 高难度医学推理评测、解释质量研究、医学教育方法参照、真实病例与考试题难度对比 |
| 不建议用途 | 训练或微调模型(会污染评测)、作为临床决策依据、用于对患者输出诊断建议 |
| 伦理边界 | 病例已发表于公开期刊,但属已发表的患者诊疗信息;重建数据后不得用于尝试重识别患者 |
| 合规要求 | 须自行确认对期刊全文的访问授权;不得对外再分发抓取所得的正文;代码未声明许可,不默认可再分发 |
| 引用要求 | 引用论文 Chen et al., NAACL 2025(DOI 10.18653/v1/2025.naacl-long.182);同时标注上游期刊专栏 |
| 版本状态 | 无数据版本号;样本集合随抓取时点变化,报告结果时应记录抓取时间与成功条数 |
| 责任声明 | 使用该数据产生的模型、结论与产品后果由使用者承担;整理者已明确说明不发布数据与版权约束 |
常见误读
围绕这份数据流传着一些说法,多数来自把论文里并行的几个对象混为一谈。逐条对照可以澄清。
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「数据已经发布,仓库里就是」 | 仓库只有网址清单与爬虫,正文未发布 | 仓库说明首段原文 |
| 「只是慢,作者说申请后就给」 | 说明里没有申请渠道,明确写不发布 | 仓库说明与论文附录 A |
| 「op4 和 op5 是 JAMA 的两个版本」 | 这两个记号专指 Medbullets 与 MedQA 的选项数版本 | 论文表 2 与正文对选项数的说明 |
| 「每题五个选项,有一个是以上都不对」 | 每题固定四个选项 | 论文表 2 标注 4 answer choices |
| 「它有训练集和测试集」 | 无划分,全量作测试,少样本靠留一交叉验证 | 论文表 1 题注与实验设置 |
| 「它包含临床图像」 | 图像全部剔除,只保留是否含图的标记 | 论文方法段与脚本的图像检测函数 |
| 「网址清单是给别人看的元信息」 | 清单同时是爬虫的答案输入,答案由清单决定 | 爬虫源码的答案赋值一行 |
| 「跑通脚本就等于复现了论文」 | 抓取时点、权限范围、页面版本都会改变样本 | 脚本无快照机制,说明未给版本号 |
| 「仓库是开源项目,代码随便用」 | 无 LICENSE 文件,授权未声明 | 仓库根目录文件清单 |
| 「这个数就是抓到的文章总数」 | 论文把它定义为测试样本数,未说明抓取与剔除差额 | 论文表 1 题注 |
| 「它和 MedQA 一样是考试题」 | 来源是期刊真实病例,问法与难度层级不同 | 论文摘要对两类数据来源的区分 |
| 「这个数据集没人用,所以不重要」 | 被引用的是方法论结论,数据本身少被复制,两者不同 | 论文引用场景与仓库静态形态 |
第五条与第十条最容易被混淆,因为它们都涉及数字口径。前者的误读会导致在本数据上微调,直接破坏评测有效性;后者的误读会导致引用时把「题数」说成「文章数」。两种都会在实际写作中留下硬伤。
FAQ
Q1:这份数据到底存不存在?
存在,只是没有被作者打包公开。论文、仓库、网址清单都是真实存在的,清单里的链接逐条可访问(有权限时),每条的正确答案也记录在清单里。不存在的是「一份能直接下载的数据文件」。
Q2:我没有期刊订阅,还能用吗?
能读论文、能用网址清单做元研究、能读脚本理解流程,但不能重建题面。若只是想验证方法,可以照论文流程在自家有权限的病例上重做一遍。
Q3:为什么作者不干脆匿名化后发布?
因为障碍是版权而不是隐私。病例已在期刊公开发表,患者信息的问题相对可控;真正卡住的是期刊对全文的复制与再分发权,匿名化解决不了这一层。
Q4:一千五百来道题够做评测吗?
对整体层面的判断够,对细分结论不够。若按刊物切成十组,最小的一组只有个位数,无法给出稳定结论。做细分时应合并分组或只报告定性观察。
Q5:能不能用它微调模型?
技术上可以,方法论上不该。它被设计为测试集,没有训练划分;一旦被训练进去,后续在同一批题上的分数就不再反映推理能力。若确实需要同类训练数据,应当另找开放来源。
Q6:论文说的「更难」有多难?
论文的论据是七个模型在多个提示设定下的表现都低于在既有基准上的水平。这里不给具体分数,因为分数依赖于提示设计与模型版本,脱离设定单独引用容易误导;需要具体数值时应直接读论文表 3 与表 4。
Q7:解释字段能当标准答案用吗?
可以当专业参考,不宜当金标准。它由单一位期刊作者撰写,没有第二人复核记录,也不保证覆盖所有选项。做自动评审时,它是参照物而非唯一正解。
Q8:为什么答案不直接从网页里解析?
因为网页上的绿框高亮是样式,不是语义。解析样式容易在页面改版时失效,也容易在少数排版异常的文章上错位。改用人工核对过的清单,把错误风险集中到一处,可控性更高。
Q9:它和 NEJM 的影像挑战是什么关系?
同属「期刊病例挑战」这一族,但形态不同。本文是文字版四选一,NEJM 那一族更依赖图像判读。两者都受各自期刊的版权约束,都不能直接下载。
Q10:我要引用它,引用格式怎么写?
引用论文即可,作者为 Chen、Fang、Singla、Dredze,出处为 NAACL 2025 长论文,页码 3563 至 3599,DOI 为 10.18653/v1/2025.naacl-long.182。若同时用到上游病例,应另外注明期刊专栏与文章链接。
术语表
| 术语 | 含义 |
|---|---|
| Clinical Challenge | 期刊的病例挑战栏目,每期一篇病例加一道选择题 |
| 多选题问答 | 给定问题与若干候选答案,选出一个正确的任务形式 |
| 专家解释 | 由医生撰写的推理说明,交代诊断依据与鉴别思路 |
| 四选一 | 每题四个候选答案,只需选一个,随机猜对率为四分之一 |
| 正确答案序号 | 正确选项在候选列表中的位置,本文以字母表示 |
| case description | 病例描述,即患者病史、查体与检查结果的叙述段 |
| Discussion | 讨论段,期刊文章中解释诊断与处置的那一节 |
| 留一交叉验证 | 少样本评测时逐题轮换演示样本的做法,避免固定划分 |
| 零样本 | 不给任何示例,直接让模型作答 |
| 少样本 | 在提示里附若干示例后再让模型作答 |
| 词元 | 模型处理文本的最小单位,长度统计常用它 |
| 期刊订阅权限 | 机构或个人依合同取得的期刊全文访问资格 |
| 版权约束 | 阻止作者把期刊全文再分发的法律限制 |
| 快照 | 某一时点固定下来的数据副本,可用于复现 |
| 校验和 | 对文件内容计算的摘要值,用于判断副本是否一致 |
| 位置偏好 | 模型倾向选择某个选项字母的现象 |
| 干扰项 | 错误但看似合理的候选答案 |
| 鉴别诊断 | 在若干可能疾病之间排除、确定的过程 |
| 视觉提示 | 依赖图像才能完成判读的线索,本文被整体剔除 |
| 期刊专栏 | 期刊内按主题固定的栏目,本文来源的上级单位 |
| DAIMS | 数据就绪度的分层评分框架,衡量描述、结构与访问 |
附录 A 速查卡
| 键 | 值 |
|---|---|
| 名称 | JAMA Clinical Challenge |
| 整理方 | Johns Hopkins University(Chen、Fang、Singla、Dredze) |
| 论文 | NAACL 2025 长论文,pp. 3563–3599 |
| 预印本 | arXiv:2402.18060 |
| 仓库 | github.com/HanjieChen/ChallengeClinicalQA |
| 上游 | JAMA Network Clinical Challenge 专栏 |
| 时间跨度 | 2013-07 至 2023-10 |
| 规模 | 一千五百二十四例(官方口径) |
| 任务 | 四选一,附专家讨论 |
| 刊物数 | 10 |
| 输入长度 | 平均 371 / 最长 779 词元 |
| 解释长度 | 平均 632 词元,最长约为其两倍余 |
| 划分 | 无,全量作测试 |
| 发放 | 网址清单 + 爬虫脚本 |
| 许可 | 数据受期刊版权约束不公开;代码未声明 |
附录 B 文件清单
| 路径 | 类型 | 说明 |
|---|---|---|
| README.md | 文档 | 说明两个数据集、发布政策、运行方法与引用格式 |
| jama_links.json | 数据 | 网址与答案清单,数组形式,每条四字段 |
| jama_scraper.py | 代码 | 主爬虫,输出 CSV 与 JSON 两个文件 |
| fetch_jama_cases.py | 代码 | 补抓新文章网址,由外部贡献者提供 |
| requirements.txt | 依赖 | cloudscraper、beautifulsoup4、pandas、numpy、tqdm 等 |
| .gitignore | 配置 | 忽略本地生成文件 |
| medbullets/ | 目录 | 同论文的另一个数据集的目录,含其数据文件 |
| LICENSE | 缺失 | 仓库根目录无许可文件 |
附录 C 外部资源对照
| 资源 | 地址形态 | 用途 |
|---|---|---|
| 仓库主页 | github.com/HanjieChen/ChallengeClinicalQA | 获取清单与脚本、查看说明 |
| 论文预印本 | arxiv.org/abs/2402.18060 | 完整的构造方法、统计与实验 |
| 论文正式版 | aclanthology.org/2025.naacl-long.182 | 会议版引用与页码 |
| 期刊专栏 | jamanetwork.com/collections/44038/clinical-challenge | 上游病例集合,需订阅 |
| 期刊全文页 | jamanetwork.com/journals/… | 逐题原文,由清单链接指向 |
附录 D 字段字典
| 字段 | 类型 | 含义 |
|---|---|---|
| id | 整数 | 清单序号,从零开始,与链接一一对应 |
| link | 字符串 | 文章全文网址,可作主键 |
| answer_idx | 字符串 | 正确选项字母,A 至 D |
| answer | 字符串 | 正确选项的原文文本 |
| question | 字符串 | 病例描述与题干拼接后的题面 |
| opa | 字符串 | 第一个选项 |
| opb | 字符串 | 第二个选项 |
| opc | 字符串 | 第三个选项 |
| opd | 字符串 | 第四个选项 |
| diagnosis | 字符串 | 诊断段文本,处置类题中有时退化为处置 |
| explanation | 字符串 | 讨论段拼接后的专家解释 |
| field | 字符串 | 文章类型与上级分类拼接的专业标签 |
附录 E 引用与版本
论文引用关键字段如下。
@inproceedings{chen-etal-2025-benchmarking,
title = {Benchmarking Large Language Models on Answering and Explaining Challenging Medical Questions},
author = {Chen, Hanjie and Fang, Zhouxiang and Singla, Yash and Dredze, Mark},
booktitle = {Proceedings of the 2025 Conference of the Nations of the Americas Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 1: Long Papers)},
month = {April},
year = {2025},
address = {Albuquerque, New Mexico},
publisher = {Association for Computational Linguistics},
pages = {3563--3599},
doi = {10.18653/v1/2025.naacl-long.182}
}
引用版本时要区分三件事:论文版本(arXiv 有多个,会议版另有 v1 与 v2 两个 PDF)、代码版本(以提交哈希标识)、样本版本(无官方号,需自行记录抓取时点)。混写其中任意两项,都会让引用失去可追溯性。
编辑说明
核验时间:2026 年 10 月 29 日。
核验方式:以 arXiv 第 6 版全文为主要依据,逐节核对规模、时间跨度、选项数、长度统计、划分方式与许可表述;以 ACL Anthology 2025.naacl-long.182 核对题名、页码与 DOI;以仓库 README 原文核对发布政策与运行方法;以仓库根目录文件清单核对是否存在许可文件;以 jama_links.json 的实际内容核对条目数、字段构成与刊物分布;以 jama_scraper.py 源码核对字段来源、答案赋值方式与失败处理逻辑;以论文表 1 与表 2 交叉核对题目数量与选项数。
未覆盖内容:未申请期刊全文权限,因而未能运行爬虫得到题面,未能核对逐条题面与选项的搬运准确性;未验证期刊页面当前结构是否仍与脚本的选择器匹配;未逐一访问全部链接确认是否仍可访问。
口径冲突记录:一、论文表 1 把条目数定义为测试样本数,与「抓取文章数」并非同一概念,正文已在 §2.1 与 §7.4 区分;二、diagnosis 字段在源码中存在语义不稳定的退化路径,已在 §5.5 说明;三、论文层面的「十三医学领域」与网址清单按刊物拆出的十个刊物不是同一统计口径,前者按学科分类、后者按刊物归属,两者不应混用。
与常见二手描述不符之处:一、op4 与 op5 不是该数据集的选项数版本记号,而是同一论文里 Medbullets 与 MedQA 的版本标记,该数据集固定四选一;二、该数据集并不提供训练与测试划分,论文把全量当作测试样本;三、该数据集明确不含任何图像。三处均在正文给出依据。
权限声明补给:若后续要引用本词条中的任何规模数字,请同时引用论文,并以论文表 1 为准;本词条不替代论文作为统计口径的原始来源。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- i2b2-n2c2-nlp — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- cblue — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- blurb — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- bc2gm — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- rxqa — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- scifact — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- pubtabnet — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- blue-benchmark — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- healthsearchqa — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
- claimify — 共享标签:医学问答与基准 / 医疗NLP / 评测基准
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。
需要更高工程化程度或合规出域的商业版本?
当前展示的公开版本适用于学术研究与原型验证。千方医数集依托三甲医院直采网络,提供经专家标注、符合伦理合规的专病数据集交易服务。

