
使用 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-harnessMEDIQA-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 封装模式与仓库中medqa、pubmedqa等其他医学评测任务并存共同构成医学 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_until与loglikelihood_rolling均为框架内置的合法输出类型前者让模型自回归生成直到遇到终止符后者对文本做滚动式对数似然累加。这种同一个数据集、两种评测协议的设计允许研究者在同一批数据上分别考察模型的生成质量和概率建模能力。数据集与字段映射两个任务都使用 Hugging Face 上的 BigBIO 医学数据集bigbio/mediqa_qa并显式声明了四个划分splitdataset_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并打印错误不影响其余指标产出BLEU通过evaluate库的bleu指标计算源码特别处理了 BLEU 恰为 0.0 的情形——为其加上1e-5微小偏移因为BLEU 为 0 会破坏 stderr标准误差的计算见 utils.py 注释ROUGE-1 / ROUGE-2 / ROUGE-L通过evaluate库的rouge指标一次性计算三种变体BLEURT加载evaluate.load(bleurt, bleurt-base-512, module_typemetric)取逐样本 scores 的均值需要从google-research/bleurt源码安装BERTScorebertscore.compute(..., langen)取各样本 F1 的均值语言固定为英语。这些指标在 lm_eval/api/metrics.py 中与框架内置的bleu聚合函数基于 sacrebleu 的corpus_bleu存在对应关系但本任务选择在process_results阶段逐样本完成指标计算再由metric_list中的nanmean聚合属于逐样本指标 容错聚合的典型医疗生成任务模式。依赖安装由于涉及evaluate、bert-score、rouge_score、nltk、absl-py以及从源码安装的bleurtutils.py 在导入失败时会抛出明确的安装指引。对应安装命令为pip install evaluate bert-score rouge_score0.1.2 nltk absl-py pip install githttps://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_perplexity、bits_per_byte聚合函数会读取(总和, 数量)对通过math.exp(-loglikelihood / count)换算为最终指标因此word_perplexity 指数化的每词负对数似然byte_perplexity与bits_per_byte以字节为单位衡量模型压缩效率perplexity则直接透传原始对数似然值在 utils_perplexity.py 中还通过print打印了即时困惑度便于调试。运行方式在安装好 lm-evaluation-harness 及其依赖后可通过命令行直接运行这两个任务。以 Hugging Face 模型为例# 生成式 QA 评测需先安装 evaluate/bleurt/bertscore 等依赖 lm_eval --model hf \ --model_args pretrainedQwen/Qwen2.5-7B-Instruct,trust_remote_codeTrue \ --tasks mediqa_qa2019 \ --batch_size 8 # 困惑度评测无需额外指标库 lm_eval --model hf \ --model_args pretrainedQwen/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.yamlMedQA-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 会议信息、DOI10.18653/v1/W19-5039及页码370–379等规范元数据可直接粘贴使用。小结mediqa_qa2019与mediqa_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),仅供参考