使用 lm-evaluation-harness 评测 MEDIQA-QA 2019 医学开放问答:任务配置与源码级解析
2026/9/15 18:22:29 网站建设 项目流程

使用 lm-evaluation-harness 评测 MEDIQA-QA 2019 医学开放问答:任务配置与源码级解析

【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness

MEDIQA-QA 2019 是 ACL-BioNLP 医学共享任务中的开放问答(Open-ended QA)子任务,本仓库在lm_eval/tasks/mediqa_qa2019/目录下将其封装为两个可直接运行的评测任务:mediqa_qa2019(生成式回答 + 文本相似度指标)与mediqa_qa2019_perplexity(基于 log-likelihood 的困惑度评估)。阅读本文后,你将掌握这两个任务的完整配置结构、数据集字段映射、六类评测指标的计算逻辑与依赖安装方式,并能直接复用命令行完成对任意 Hugging Face 模型的医学问答能力评估。

任务背景:MEDIQA 2019 共享任务与论文来源

MEDIQA 2019 是第 18 届 BioNLP Workshop 上组织的共享任务,围绕医学领域的文本推断(Natural Language Inference, NLI)、问题蕴含识别(Recognizing Question Entailment, RQE)与问答(Question Answering, QA)三个子任务展开。本仓库封装的mediqa_qa2019对应其中的开放问答(Open-ended QA)子任务,即模型需要以医生的口吻,对患者提出的医学问题给出信息丰富、有帮助的自然语言回答,而非从有限候选项中做选择。

该任务对应的权威论文为:

Ben Abacha, Asma; Shivade, Chaitanya; Demner-Fushman, Dina. "Overview of the MEDIQA 2019 Shared Task on Textual Inference, Question Entailment and Question Answering", Proceedings of the 18th BioNLP Workshop and Shared Task, Florence, Italy, 2019, pp. 370–379.

论文元信息(标题、作者、DOI、页码等)完整记录在任务的 README.md 中,数据集主页为 MEDIQA 2019 官方网站(sites.google.com/view/mediqa2019)。从源码结构看,该任务目录包含两个 YAML 配置、两个 Python 工具模块,形成了"配置声明 + 函数钩子"的标准 task 封装模式,与仓库中medqapubmedqa等其他医学评测任务并存,共同构成医学 NLP 能力矩阵。

任务变体总览

该目录下注册了两个任务,二者的核心差异在于评测协议(生成 vs 困惑度),但共享同一份数据集与字段提取逻辑:

任务名输出类型(output_type)评测指标适用场景
mediqa_qa2019generate_untilBLEU、ROUGE-1/2/L、BLEURT、BERTScore衡量生成回答与参考答案的语义/词面相似度
mediqa_qa2019_perplexityloglikelihood_rollingperplexity、word_perplexity、byte_perplexity、bits_per_byte衡量模型对参考答案的建模能力(越低越好)

在 lm-evaluation-harness 的任务体系里,output_type决定了模型被调用时的推理方式。查看 lm_eval/api/task.py 可知,generate_untilloglikelihood_rolling均为框架内置的合法输出类型:前者让模型自回归生成直到遇到终止符,后者对文本做滚动式对数似然累加。这种"同一个数据集、两种评测协议"的设计,允许研究者在同一批数据上分别考察模型的生成质量和概率建模能力。

数据集与字段映射

两个任务都使用 Hugging Face 上的 BigBIO 医学数据集bigbio/mediqa_qa,并显式声明了四个划分(split):

dataset_path: bigbio/mediqa_qa training_split: train_live_qa_med validation_split: validation test_split: test

值得注意的训练集划分名train_live_qa_med是 MEDIQA 数据集中专用于"实时医学问答(live QA med)"的划分。数据集的样本结构从工具函数中可以精确还原(见 utils.py):

  • 输入(doc_to_text):取doc["QUESTION"]["QuestionText"],即患者提出的问题原文;
  • 参考答案(doc_to_target):取doc["QUESTION"]["AnswerList"][0]["Answer"]["AnswerText"],即专家组给出的第一条标准答案文本。

这段映射同时被两个任务复用,只是mediqa_qa2019_perplexity通过 utils_perplexity.py 中完全相同的逻辑获取目标文本,并将其同时用于困惑度计算与去污染查询(decontamination query)。

生成式 QA 任务:mediqa_qa2019

配置逐项解析

mediqa_qa2019.yaml 的完整配置如下:

task: mediqa_qa2019 dataset_path: bigbio/mediqa_qa description: > Instructions: The following text is a question asked by a patient. Answer how a doctor would, while trying to be as informative and helpful as possible. output_type: generate_until training_split: train_live_qa_med validation_split: validation test_split: test doc_to_text: !function utils.doc_to_text doc_to_target: !function utils.doc_to_target process_results: !function utils.process_results_gen generation_kwargs: until: - "\n\n" metric_list: - metric: bleu aggregation: nanmean higher_is_better: true - metric: rouge1 aggregation: nanmean higher_is_better: true - metric: rouge2 aggregation: nanmean higher_is_better: true - metric: rougeL aggregation: nanmean higher_is_better: true - metric: bleurt aggregation: nanmean higher_is_better: true - metric: bert_score aggregation: nanmean higher_is_better: true metadata: version: 1.0

关键配置含义:

  • description:注入到提示词前的系统指令,要求模型"像医生一样尽可能提供信息丰富且有用的回答",这是医学场景下 prompt 工程的核心组成部分;
  • output_type:generate_until:框架将调用模型的文本生成接口,逐 token 自回归解码;
  • generation_kwargs.until:["\n\n"]:指定生成终止条件——模型输出遇到连续两个换行符即停止,防止生成超出单个回答的冗余内容;
  • metric_list:声明六类指标,aggregation: nanmean表示跨样本取忽略 NaN 的均值(因为某些样本可能因生成失败或引用为空而产生 NaN,见下文源码),higher_is_better: true表明所有指标都是越大越好;
  • metadata.version: 1.0:任务版本号,用于结果追踪与缓存一致性。

生成结果处理与六类指标源码实现

评测时,每个样本的模型输出与参考答案会交给 utils.py 中的process_results_gen处理。该函数首先做有效性过滤:若参考答案或模型预测任一为空字符串(len < 1),则直接返回全 NaN 结果,避免下游指标计算报错。

随后调用doc_eval(见 utils.py)并行计算六类指标,且每一类指标都包裹了 try/except 容错——某个指标库加载失败或计算异常时,仅该指标返回np.NAN并打印错误,不影响其余指标产出:

  1. BLEU:通过evaluate库的bleu指标计算;源码特别处理了 BLEU 恰为 0.0 的情形——为其加上1e-5微小偏移,因为"BLEU 为 0 会破坏 stderr(标准误差)的计算"(见 utils.py 注释);
  2. ROUGE-1 / ROUGE-2 / ROUGE-L:通过evaluate库的rouge指标一次性计算三种变体;
  3. BLEURT:加载evaluate.load("bleurt", "bleurt-base-512", module_type="metric"),取逐样本 scores 的均值,需要从google-research/bleurt源码安装;
  4. BERTScorebertscore.compute(..., lang="en"),取各样本 F1 的均值,语言固定为英语。

这些指标在 lm_eval/api/metrics.py 中与框架内置的bleu聚合函数(基于 sacrebleu 的corpus_bleu)存在对应关系,但本任务选择在process_results阶段逐样本完成指标计算,再由metric_list中的nanmean聚合,属于"逐样本指标 + 容错聚合"的典型医疗生成任务模式。

依赖安装

由于涉及evaluatebert-scorerouge_scorenltkabsl-py以及从源码安装的bleurt,utils.py 在导入失败时会抛出明确的安装指引。对应安装命令为:

pip install evaluate bert-score "rouge_score>=0.1.2" nltk absl-py pip install git+https://github.com/google-research/bleurt.git

注意 BLEURT 依赖 TensorFlow 或 JAX 环境,实际运行前需确保相关后端可用;若只想快速验证 BLEU/ROUGE 流程,可仅安装前一行依赖(缺库时对应指标会返回 NaN 而非中断评测)。

困惑度变体:mediqa_qa2019_perplexity

配置解析

mediqa_qa2019_perplexity.yaml 采用了完全不同的评测协议:

task: mediqa_qa2019_perplexity dataset_path: bigbio/mediqa_qa description: > Instructions: The following text is a question asked by a patient. Answer how a doctor would, while trying to be as informative and helpful as possible. output_type: loglikelihood_rolling training_split: train_live_qa_med validation_split: validation test_split: test doc_to_text: "" doc_to_target: !function utils_perplexity.doc_to_target process_results: !function utils_perplexity.process_results should_decontaminate: true doc_to_decontamination_query: !function utils_perplexity.doc_to_target metric_list: - metric: perplexity higher_is_better: false - metric: word_perplexity higher_is_better: false - metric: byte_perplexity higher_is_better: false - metric: bits_per_byte higher_is_better: false metadata: version: 1.0

与生成式变体的关键差异:

  • output_type:loglikelihood_rolling:不再生成文本,而是对给定文本做滚动窗口的对数似然累加,衡量模型"复现"参考答案的能力;
  • doc_to_text:"":空输入前缀,即直接对目标答案计算困惑度,不拼接问题(更准确地说,问题文本不作为条件上下文);
  • 四个指标全部higher_is_better: false:困惑度越低表示模型对医学答案文本的建模越准确;
  • should_decontaminate: true:启用数据去污染机制,doc_to_decontamination_query复用目标答案作为查询串,用于检测评测数据是否混入模型训练集(与 docs/decontamination.md 描述的去污染流程衔接)。

指标计算源码

utils_perplexity.py 的process_results从模型返回的(loglikelihood,)出发:

_words = len(re.split(r"\s+", doc_to_target(doc))) _bytes = len(doc_to_target(doc).encode("utf-8")) return { "word_perplexity": (loglikelihood, _words), "byte_perplexity": (loglikelihood, _bytes), "bits_per_byte": (loglikelihood, _bytes), "perplexity": (loglikelihood), }
  • re.split(r"\s+", ...)按空白切分得到词数,encode("utf-8")得到字节数;
  • 返回的元组形式(loglikelihood, count)是 lm-evaluation-harness 中 perplexity 类指标的约定格式——框架在 lm_eval/api/metrics.py 中注册的word_perplexitybits_per_byte聚合函数会读取(总和, 数量)对,通过math.exp(-loglikelihood / count)换算为最终指标;
  • 因此word_perplexity= 指数化的每词负对数似然,byte_perplexitybits_per_byte以字节为单位衡量模型压缩效率,perplexity则直接透传原始对数似然值(在 utils_perplexity.py 中还通过print打印了即时困惑度便于调试)。

运行方式

在安装好 lm-evaluation-harness 及其依赖后,可通过命令行直接运行这两个任务。以 Hugging Face 模型为例:

# 生成式 QA 评测(需先安装 evaluate/bleurt/bertscore 等依赖) lm_eval --model hf \ --model_args pretrained=Qwen/Qwen2.5-7B-Instruct,trust_remote_code=True \ --tasks mediqa_qa2019 \ --batch_size 8 # 困惑度评测(无需额外指标库) lm_eval --model hf \ --model_args pretrained=Qwen/Qwen2.5-7B \ --tasks mediqa_qa2019_perplexity \ --batch_size 8

如需同时对比两个变体,可写为--tasks mediqa_qa2019,mediqa_qa2019_perplexity。任务名由 YAML 顶部的task字段注册,可通过lm_eval --tasks list系列子命令(见 lm_eval/_cli/ls.py)确认任务是否被正确索引;任务配置中通过!function引用的utils.doc_to_text等函数,则由任务目录下的同名 Python 模块动态加载。若采用 Python API,可参考 docs/python-api.md 中simple_evaluate的调用方式传入任务名。

与同目录医学任务的定位差异

在 lm_eval/tasks/ 下,医学领域任务形成了互补矩阵:

  • medqa/medqa.yaml(MedQA-USMLE)与 pubmedqa/pubmedqa.yaml 采用multiple_choice输出类型,评估选择题准确率(acc/acc_norm),考察的是医学知识选择能力;
  • mediqa_qa2019系列采用开放生成与困惑度协议,考察的是开放式医学回答的生成质量与语言建模能力

这种差异意味着:MedQA 适合衡量知识广度,而 MEDIQA-QA 2019 更适合衡量模型在医疗咨询场景下的实际表达质量——这也是在引用与对比实验结果时需要区分的评测维度。

引用规范

在论文或技术报告中引用 MEDIQA-QA 2019 评测时,应使用 README.md 中提供的 BibTeX 条目(ben-abacha-etal-2019-overview),完整记录了论文标题、三位作者、BioNLP 2019 会议信息、DOI(10.18653/v1/W19-5039)及页码(370–379)等规范元数据,可直接粘贴使用。

小结

mediqa_qa2019mediqa_qa2019_perplexity展示了 lm-evaluation-harness 中"一套数据、双评测协议"的任务封装范式:前者通过generate_until+ 六类文本相似度指标评估开放式回答质量,后者通过loglikelihood_rolling+ 四类困惑度指标评估概率建模能力。结合 utils.py 的容错设计与 utils_perplexity.py 的元组式指标约定,读者既可以开箱即用地复现 MEDIQA 2019 评测,也可以以此为模板,将任意"问题-参考答案"格式的医学数据集改造成同样的双协议评测任务。

【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询