使用 lm-evaluation-harness 评测医学临床笔记生成任务:MedText 任务配置与实现解析
2026/9/15 15:55:27 网站建设 项目流程

使用 lm-evaluation-harness 评测医学临床笔记生成任务:MedText 任务配置与实现解析

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

MedText 是基于合成临床笔记构建的医学诊断问答数据集,lm-evaluation-harness 为其提供了两套现成的评测任务:medtext(开放式生成 + 文本相似度指标)与medtext_perplexity(滚动对数似然困惑度)。本文以 lm_eval/tasks/medtext/README.md 为主线,结合任务 YAML 配置与 Python 工具函数,逐项讲解任务加载、文档映射、指标计算与运行方式,帮助你直接复用这套医学领域评测基准。

数据集与任务背景

MedText 是一个医学诊断数据集,收录了超过 1000 条教科书级质量的病人主诉(patient presentations)及其诊断与治疗方案。数据集中完整覆盖了人们就医时最常见的 100 种疾病和 30 种外伤,且每种疾病包含从轻度、复杂到重症的多个数据点。它源自论文Towards Automatic Generation of Shareable Synthetic Clinical Notes Using Neural Language Models(Oren Melamud 与 Chaitanya Shivade,2019,arXiv:1905.07002),该工作旨在利用神经语言模型自动生成可共享的合成临床笔记。

在 lm-evaluation-harness 中,该任务包位于 lm_eval/tasks/medtext/,共包含 5 个文件:

文件作用
README.md任务说明、论文信息与引用格式
medtext.yaml开放式生成评测任务定义
medtext_perplexity.yaml基于困惑度的评测任务定义
utils.py生成任务的文档映射与结果处理逻辑
utils_perplexity.py困惑度任务的结果处理逻辑

README 中定义了两个评测任务,均面向英文开放式问答(Open-ended QA):

  • medtext:开放式英文问答,使用生成式指标评估;
  • medtext_perplexity:同一任务,但改用困惑度(perplexity)评估。

medtext 任务:开放式生成评测

medtext.yaml 是medtext任务的核心定义,完整内容如下:

task: medtext dataset_path: BI55/MedText description: > Instructions: The following text is from a collection of medical records. What follows is the patients record. Answer how a doctor would, what is the likely diagnosis, and what is the treatment?. Answer how a doctor would, what is the likely diagnosis, and what is the treatment? output_type: generate_until training_split: train validation_split: train test_split: train doc_to_text: !function utils.doc_to_text doc_to_target: !function utils.doc_to_target process_results: !function utils.process_results 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

各配置项含义如下:

  • dataset_path: BI55/MedText:指明 Hugging Face Hub 上的数据集仓库 ID,评测时框架会按此路径加载数据集;
  • output_type: generate_until:声明该任务属于自回归文本生成类型,模型需要持续生成 token,直到命中终止条件;
  • training_split / validation_split / test_split: train:数据集的 train 划分同时被用作训练、验证与测试集合,即所有数据点都会参与评测;
  • doc_to_text: !function utils.doc_to_text!function语法指示框架调用同目录下utils.py中导出的doc_to_text函数,将数据样本映射为模型输入的提示文本;
  • doc_to_target: !function utils.doc_to_target:将样本映射为参考答案(ground truth);
  • process_results: !function utils.process_results:评测阶段对模型输出与参考答案计算各类指标;
  • generation_kwargs.until: ["\n\n"]:模型生成的终止符为两个连续换行,一旦生成该序列即停止,保证输出停留在单条临床记录的回答范围内;
  • metric_list:依次声明了 bleu、rouge1、rouge2、rougeL、bleurt、bert_score 六项生成质量指标,全部使用nanmean聚合、数值越高越好;
  • metadata.version: 1.0:任务配置版本号,便于结果复现与版本追踪。

文档映射与结果处理函数

utils.py 实现了三个关键函数。首先是提示与参考答案的映射:

def doc_to_text(doc) -> str: return doc["Prompt"] def doc_to_target(doc) -> str: return doc["Completion"]
  • doc_to_text直接取数据样本中的Prompt字段作为模型输入,配合 YAML 中的description前缀构成完整提示;
  • doc_to_targetCompletion字段作为参考答案,用于后续指标比对。

process_results将模型生成结果与参考答案组装后交给doc_eval计算六项指标:

def process_results(doc, results): pred, refs = [results[0]], [doc_to_target(doc)] if len(refs[0]) < 1 or len(pred[0]) < 1: return { "bleu": np.NAN, "rouge1": np.NAN, "rouge2": np.NAN, "rougeL": np.NAN, "bleurt": np.NAN, "bert_score": np.NAN, } results = doc_eval(pred, refs) return { "bleu": results["bleu"], "rouge1": results["rouge1"], "rouge2": results["rouge2"], "rougeL": results["rougeL"], "bleurt": results["bleurt"], "bert_score": results["bert_score"], }

值得注意的细节:当参考答案或模型输出为空字符串时,函数直接返回全 NaN,避免对无效样本计算指标;同时doc_eval中还有一处工程性保护——当 BLEU 恰好为 0.0 时,会加上1e-5的微小偏移,以免破坏后续 stderr(标准误差)的计算。

指标计算与依赖安装

utils.py 顶部使用 Hugging Face 的evaluate库加载四个评测器:

bleu = evaluate.load("bleu") rouge = evaluate.load("rouge") bertscore = evaluate.load("bertscore") bleurt = evaluate.load("bleurt", "bleurt-base-512", module_type="metric")

其中 BLEURT 使用bleurt-base-512检查点,BERTScore 使用默认英文(lang="en")配置。如果缺少相关依赖,模块会抛出明确的安装提示,所需包包括:

pip install evaluate bert-score rouge_score>=0.1.2 nltk absl-py

(BLEURT 指标本身来自 google-research 的 bleurt 仓库,evaluate库会负责加载。)

每个指标在计算时都包裹了try/except,若单个指标计算失败(例如 BERTScore 需要下载模型权重失败),该指标会回退为np.NAN而不会中断整个评测流程,doc_eval最终返回包含bleurouge1rouge2rougeLbleurtbert_score六个键的字典,与 YAML 中的metric_list一一对应。

medtext_perplexity 任务:滚动对数似然评测

medtext_perplexity.yaml 通过include继承基础任务配置,仅改写评测方式:

include: medtext.yaml task: medtext_perplexity output_type: loglikelihood_rolling doc_to_text: "" process_results: !function utils_perplexity.process_results metric_list: - 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

核心差异有三点:

  1. output_type: loglikelihood_rolling:将评测从生成式改为滚动对数似然(rolling log-likelihood),即对参考文本分段计算对数概率并加总,无需模型实际生成文本;
  2. doc_to_text: "":输入提示被清空,模型直接对Completion参考文本进行似然评估;
  3. metric_list替换为word_perplexitybyte_perplexitybits_per_byte三项,均为越低越好(higher_is_better: false)。

结果处理与聚合原理

utils_perplexity.py 中,process_results根据参考文本的规模对对数似然进行归一化:

def process_results(doc, results): (loglikelihood,) = results _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), }
  • 词数_words通过按空白符切分参考文本得到;
  • 字节数_bytes通过对参考文本做 UTF-8 编码后取长度得到;
  • 返回的元组(loglikelihood, 归一化基数)是加权聚合的标准接口形式。

对应地,lm_eval/api/metrics.py 中注册了三个指标及其聚合方式(同文件第 302-329 行):

  • word_perplexitybyte_perplexity使用weighted_perplexity聚合:exp(-weighted_mean(items))(第 51-53 行),即对对数似然按词数/字节数加权平均后取负指数;
  • bits_per_byte使用同名bits_per_byte聚合:-weighted_mean(items) / math.log(2)(第 56-58 行),将对数似然折算为每字节的比特数。

由此,困惑度任务可以在不调用解码器的情况下,快速衡量模型对医学临床文本的建模能力,与medtext的生成式指标形成互补:前者反映"生成得像不像",后者反映"概率上认不认"。

运行方式

两个任务均已注册进任务管理器,可直接通过 lm-evaluation-harness 的统一 CLI 运行,例如使用 Hugging Face 模型:

lm_eval --model hf \ --model_args pretrained=EleutherAI/pythia-70m \ --tasks medtext \ --num_fewshot 0

如需同时评估困惑度版本:

lm_eval --model hf \ --model_args pretrained=EleutherAI/pythia-70m \ --tasks medtext_perplexity \ --num_fewshot 0

注意运行medtext前需先安装evaluate及配套指标依赖(见上文),否则 utils.py 会抛出ModuleNotFoundErrormedtext_perplexity由于只依赖框架内置的对数似然与加权聚合逻辑,通常无需额外指标依赖。评测结果会以nanmean聚合输出各指标均值,可直接用于跨模型的医学领域能力对比。

引用格式

在论文或技术报告中引用 MedText 任务时,可使用 README 提供的 BibTeX 条目(省略 url 字段,arXiv 编号见eprint):

@misc{melamud2019automaticgenerationshareablesynthetic, title={Towards Automatic Generation of Shareable Synthetic Clinical Notes Using Neural Language Models}, author={Oren Melamud and Chaitanya Shivade}, year={2019}, eprint={1905.07002}, archivePrefix={arXiv}, primaryClass={cs.CL}, }

小结

MedText 任务包是 lm-evaluation-harness 中一个典型的"同一数据集、双评测范式"案例:medtext通过generate_until结合 BLEU/ROUGE/BLEURT/BERTScore 评估生成质量,medtext_perplexity通过loglikelihood_rolling结合加权困惑度与每字节比特数评估概率建模能力。从 medtext.yaml 的!function函数引用、utils.py 的防御式指标计算,到 metrics.py 的加权聚合实现,整个链路清晰展示了如何为一个医疗领域数据集快速搭建可复现、可对比的评测基准,可作为新增同类型医学文本评测任务的参考模板。

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

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

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

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

立即咨询