拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于 lm-evaluation-harness 的 OLAPH 生物医学长文问答事实性评估:任务配置与指标实现深度解析

基于 lm-evaluation-harness 的 OLAPH 生物医学长文问答事实性评估任务配置与指标实现深度解析【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness本指南以 lm-evaluation-harness 仓库中的 OLAPH 任务为对象完整剖析olaph开放式问答生成评估与olaph_perplexity困惑度评估两个任务的 YAML 配置、数据集处理逻辑、六类文本生成指标与三类困惑度指标的实现细节。读完本文你将掌握如何在 lm-evaluation-harness 中运行生物医学长文问答评估、理解 generate_until 与 loglikelihood_rolling 两种输出类型的差异并能基于源码级证据自定义同类长文生成评估任务。一、OLAPH 任务在 lm-evaluation-harness 中的定位OLAPHOptimalLong-formAnswering withPreferenceHierarchies出自论文OLAPH: Improving Factuality in Biomedical Long-form Question AnsweringJeong et al., 2024其核心目标是提升语言模型在生物医学领域的开放式长文问答Long-form QA事实性。lm-evaluation-harness 将该评测基准落地为两个可直接通过 CLI 调用的任务定义于 lm_eval/tasks/olaph/ 目录任务名输出类型评估方式olaphgenerate_until开放式文本生成与参考答案计算 BLEU/ROUGE/BERTScore/BLEURTolaph_perplexityloglikelihood_rolling滚动对数似然计算 word/byte 困惑度与 bits-per-byte两个任务均使用dmis-lab/MedLFQA数据集Hugging Face 上的生物医学长文问答数据集测试集划分统一为test并通过#include机制共享基础配置。目录内共包含 5 个文件README.md、olaph.yaml、olaph_perplexity.yaml、utils.py 与 utils_perplexity.py后两者提供!function引用的数据处理与结果计算函数。二、任务一olaph—— 开放式问答生成评估2.1 完整 YAML 配置逐项拆解olaph.yaml 定义了olaph任务的全部元信息全文如下task: olaph dataset_path: dmis-lab/MedLFQA description: Instructions: You are a helpful healthcare assistant. Answer the following question as concisely as possible without omitting relevant information. output_type: generate_until training_split: test validation_split: test test_split: test process_docs: !function utils.process_docs 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: bert_score aggregation: nanmean higher_is_better: true - metric: bleurt aggregation: nanmean higher_is_better: true metadata: version: 1.2各字段的作用与实现依据如下task: olaph任务唯一标识也是 CLI 调用时的任务名。dataset_path: dmis-lab/MedLFQAHugging Face 数据集标识。lm-evaluation-harness 通过 lm_eval/api/task.py 中的数据集加载层读取该数据集。description注入到每一条 prompt 前的系统指令要求模型扮演有帮助的医疗健康助手并在不遗漏相关信息的前提下尽量简洁作答。该指令会经doc_to_text拼接进上下文。output_type: generate_until声明本任务为自由文本生成。生成在遇到until中的终止符\n\n时停止保证模型在输出一个段落即一条长文答案后即被截断。training_split / validation_split / test_split三者均指向test划分。由于 MedLFQA 面向评测设计训练与验证划分被显式指定为 test避免缺省回退逻辑带来的歧义。process_docs指向utils.process_docs对原始数据集做采样与预处理见 2.3 节。doc_to_text/doc_to_target分别定义模型的输入问题与参考答案自由形式答案。process_results指向utils.process_results逐条计算 6 类生成质量指标见 2.2 节。metric_list声明 6 个指标全部使用nanmean聚合忽略 NaN 求均值实现见 lm_eval/api/metrics.py全部higher_is_better: true。metadata.version: 1.2任务版本号用于 lm-evaluation-harness 的版本追踪与缓存键计算。2.2 六类生成质量指标从单条答案到聚合分数olaph任务同时启用 6 个长文生成指标覆盖 n-gram 重合度、召回式重叠与语义/学习式相似度三个层次指标含义库来源方向bleu基于 n-gram 精确匹配的翻译质量经典指标evaluate.load(bleu)越高越好rouge1 / rouge2 / rougeL基于召回的重叠指标unigram/bigram/最长公共子序列evaluate.load(rouge)越高越好bert_score基于 BERT 嵌入的语义相似度取 F1evaluate.load(bertscore)越高越好bleurt基于学习排序的参考答案-生成文本相关性打分evaluate.load(bleurt, bleurt-base-512)越高越好这些指标的计算在 utils.py 的doc_eval函数中逐项完成每个指标均包在try/except中——当单个指标计算失败如输入长度不足、库版本异常时返回np.NAN而不是中断整个评估流程def doc_eval(pred, refs): try: bleu_results bleu.compute(predictionspred, referencesrefs) except Exception as e: print(fBleu error: {e}) bleu_results {bleu: np.NAN} # rouge / bleurt / bertscore 同理各自兜底为 NAN ...一个值得注意的工程细节当 BLEU 恰好为 0.0 时模型输出与参考答案完全无 n-gram 重叠代码会主动加上1e-5的极小偏移见 utils.py 附近避免 0 值破坏后续标准误stderr的计算。process_results进一步设置了过滤规则见 utils.py当参考答案或生成答案的长度小于 10 个字符时6 个指标全部直接置为 NaN不参与聚合。这一设计过滤了过短、信息量不足的样本对保证聚合分数反映真实长文生成质量。2.3 数据集采样默认只评估 10% 的样本utils.py 中的process_docs是一个值得注意的采样逻辑def process_docs(dataset: datasets.Dataset): def _helper(doc): return doc num_entries len(dataset) one_percent_index int(0.1 * num_entries) # Select the first 1% of instances filtered_dataset dataset.select(range(one_percent_index)) return filtered_dataset.map(_helper)代码注释写的是 first 1%但实际系数为0.1即默认只取数据集前 10% 的样本用于评估。这一取舍兼顾了长文生成评估的计算成本生成式指标尤其昂贵与评测效率代价是评估结果基于 MedLFQA 的头部子集而非全量。如果你的实验需要全量评估可以仿照该函数在自定义分支中修改采样比例或去掉采样。doc_to_text与doc_to_target则直接抽取数据集的原始字段def doc_to_text(doc) - str: return doc[Question] def doc_to_target(doc) - str: return doc[Free_form_answer]即输入为 MedLFQA 的Question字段参考答案为其Free_form_answer字段。三、任务二olaph_perplexity—— 困惑度评估变体3.1 配置差异从生成到滚动对数似然olaph_perplexity.yaml 通过#include: olaph.yaml继承基础配置再覆盖关键字段完整配置如下task: olaph_perplexity #include: olaph.yaml dataset_path: dmis-lab/MedLFQA description: Instructions: You are a helpful healthcare assistant. Answer the following question as concisely as possible without omitting relevant information. training_split: test validation_split: test test_split: test output_type: loglikelihood_rolling doc_to_text: process_docs: !function utils.process_docs doc_to_target: !function utils.doc_to_target process_results: !function utils_perplexity.process_results generation_kwargs: until: - \n\n 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与olaph相比关键差异有三点output_type从generate_until改为loglikelihood_rolling不再要求模型生成文本而是对doc_to_target即参考答案全文计算滚动对数似然。doc_to_text被置为空字符串表明输入 prompt 不参与困惑度计算任务纯粹衡量模型对参考答案本身的拟合度。process_results替换为utils_perplexity.process_results为每个样本产出(loglikelihood, 词数/字节数)元组供聚合阶段做加权困惑度计算。metric_list替换为 3 个困惑度指标均为higher_is_better: false越低越好且不再显式声明aggregation——因为word_perplexity、byte_perplexity在 lm_eval/api/metrics.py 中已通过register_metric绑定默认聚合器weighted_perplexitybits_per_byte绑定bits_per_byte聚合器。3.2 按词/按字节的困惑度归一化实现utils_perplexity.py 实现极简但揭示了困惑度计算的归一化原理import re from lm_eval.tasks.olaph.utils import doc_to_target 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), }word_perplexity返回(loglikelihood, 词数)其中词数由正则re.split(r\s, ...)按空白切分统计。聚合阶段使用weighted_perplexity见 lm_eval/api/metrics.py即对对数似然按词数加权平均后取负指数math.exp(-weighted_mean(items))。这样不同长度答案的困惑度可以跨样本公平比较。byte_perplexity同样按字节数加权但这里字节数指doc_to_target的 UTF-8 编码字节数len(...encode(utf-8))。英文文本中词数与字节数高度相关但该指标对多字节字符如医学术语中的特殊符号更敏感。bits_per_byte同样以字节数归一化但聚合函数不同——bits_per_byte聚合器计算-weighted_mean(items) / math.log(2)见 lm_eval/api/metrics.py输出单位为每字节比特数是信息论意义上衡量模型压缩能力的标准指标。需要说明的是loglikelihood_rolling的滚动窗口长度由各模型后端自行管理如 Hugging Face 模型的max_length配置lm-evaluation-harness 在 lm_eval/api/task.py 与各模型实现中统一处理该输出类型。四、如何运行 OLAPH 评估4.1 前置依赖安装olaph任务依赖evaluate生态的指标库。运行前需按 utils.py 顶部导入逻辑安装pip install evaluate bert-score rouge_score0.1.2 nltk absl-py pip install githttps://github.com/google-research/bleurt.git其中bleurt依赖 Google Research 的 BLEURT 仓库bleurt-base-512检查点如缺失对应依赖任务加载时会抛出明确的ModuleNotFoundError提示。若评估机无法联网下载 BLEURT也可在自定义分支中裁剪metric_list或替换doc_eval中的对应计算块。4.2 CLI 运行命令lm-evaluation-harness 通过 lm_eval/_cli/ 子命令体系加载任务。以 Hugging Face 模型为例# 运行开放式问答生成评估6 类指标 lm_eval --model hf \ --model_args pretrainedQwen/Qwen2.5-7B-Instruct,trust_remote_codeTrue \ --tasks olaph \ --device cuda:0 \ --batch_size auto \ --output_path results/olaph # 运行困惑度评估word/byte perplexity 与 bits_per_byte lm_eval --model hf \ --model_args pretrainedQwen/Qwen2.5-7B-Instruct \ --tasks olaph_perplexity \ --device cuda:0 \ --batch_size auto \ --output_path results/olaph_perplexity若需同时评估两个变体可直接传--tasks olaph,olaph_perplexity。任务名由 lm_eval/tasks/manager.py 的load_task_or_group机制解析YAML 中!function引用的utils/utils_perplexity模块相对olaph/目录解析。4.3 输出解读olaph输出bleu、rouge1、rouge2、rougeL、bert_score、bleurt六个分数全部以nanmean聚合。由于默认只采样前 10% 的 MedLFQA 样本横向对比不同模型时应保持相同采样设置。olaph_perplexity输出word_perplexity、byte_perplexity、bits_per_byte三个越低越好的分数。困惑度直接反映模型对参考答案分布的拟合程度常被用作事实性/流畅性的补充信号与生成式指标形成互补。五、与仓库其他任务的关联与扩展建议loglikelihood_rolling输出类型在仓库中被多类任务复用例如 wikitext.yaml、c4/c4.yaml、pile_10k.yaml 以及医疗领域的 meddialog_raw_perplexity.yaml、medtext_perplexity.yaml 等。参考这些任务的配置可以快速理解loglikelihood_rolling在纯文本困惑度基准与问答如 OLAPH场景下的差异化配置方式。若要基于 OLAPH 扩展自己的生物医学长文问答评测推荐路径复制olaph.yaml与utils.py修改task名称与dataset_path按需调整process_docs中的采样比例OLAPH 默认 10%在metric_list中增删指标保持与doc_eval返回字典的键一致如需困惑度变体仿照olaph_perplexity.yaml通过#include复用配置并接入utils_perplexity.py的加权归一化逻辑。六、引用与版本信息OLAPH 论文的官方 BibTeX 引文保存于 README.mdmisc{jeong2024olaphimprovingfactualitybiomedical, title{OLAPH: Improving Factuality in Biomedical Long-form Question Answering}, author{Minbyul Jeong and Hyeon Hwang and Chanwoong Yoon and Taewhoo Lee and Jaewoo Kang}, year{2024}, eprint{2405.12701}, archivePrefix{arXiv}, primaryClass{cs.CL}, url{https://arxiv.org/abs/2405.12701}, }论文以 arXiv 编号 2405.12701 发布。任务配置版本方面olaph当前为1.2olaph_perplexity为1.0版本号参与缓存与结果追踪升级配置逻辑时应同步递增以免命中旧缓存。七、小结OLAPH 任务是 lm-evaluation-harness 中生成式长文问答 多元文本相似度指标与滚动对数似然 困惑度两种评估范式的典型样板。olaph通过 6 类指标BLEU/ROUGE/BERTScore/BLEURT衡量生成答案与参考答案的文本质量并内置 10% 采样与短文本过滤规则olaph_perplexity则以按词/按字节归一化的困惑度与 bits-per-byte 从信息论角度度量模型对答案分布的拟合程度。理解这两个任务的 YAML 结构、!function函数引用与聚合机制即可举一反三地构建同类生物医学或长文生成评测任务。【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门