lm-evaluation-harness 中的 OpenBookQA 任务:配置解析、评估原理与多语言变体实践 📅 发布时间:2026/9/15 14:25:41 👁 浏览次数: lm-evaluation-harness 中的 OpenBookQA 任务配置解析、评估原理与多语言变体实践【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harnessOpenBookQAOpen Book Question Answering是艾伦人工智能研究所AI2于 2018 年发布的常识问答基准专门考察模型在开卷考试场景下综合外部知识进行推理的能力。本文以 lm_eval/tasks/openbookqa/README.md 为核心骨架结合其同名 YAML 配置 openbookqa.yaml 与框架源码系统讲解该任务的数据集构成、逐字段配置含义、multiple_choice评测机制、acc/acc_norm指标原理、去污染设置以及如何用lm-evaluation-harness实际运行评估并延伸介绍仓库内已有的多语言 OpenBookQA 变体。读完本文你将掌握一条从数据集到 YAML 配置再到评测命令的完整落地链路并能举一反三地理解同类多项选择任务的实现方式。一、OpenBookQA 数据集为什么它是开卷考试1.1 论文与数据集定位OpenBookQA 对应的论文标题为Can a Suit of Armor Conduct Electricity? A New Dataset for Open Book Question AnsweringMihaylov 等EMNLP 2018arXiv 编号 1809.02789数据集主页为 AI2 的 Open Book QA 页面。按仓库 README 的描述该数据集模拟人类开卷考试的场景来评估对某一学科的理解能力核心特征包括共5,957 道小学科学水平的多项选择题划分为4,957 训练 / 500 开发 / 500 测试三个子集配套一本由1,326 条核心科学事实构成的小书the book题目用于检验对这些事实的理解及其在新颖情境下的应用训练集额外提供题目 → 该题所考察的核心科学事实的映射回答题目所需的常识远超书中内容属于开放知识设计上刻意保证基于检索的算法和基于词共现的算法都无法正确作答。这些属性使 OpenBookQA 成为检验语言模型知识运用 常识推理能力的经典任务也是本项目 lm_eval/tasks/README.md 中对其需要外部知识与推理的开卷问答任务定位的直接依据。1.2 引用信息在论文或技术报告中引用该数据集时可直接使用 README 中给出的 BibTeX 条目inproceedings{OpenBookQA2018, title{Can a Suit of Armor Conduct Electricity? A New Dataset for Open Book Question Answering}, author{Todor Mihaylov and Peter Clark and Tushar Khot and Ashish Sabharwal}, booktitle{EMNLP}, year{2018} }二、任务注册与仓库中的组织方式2.1 任务命名与注册README 明确指出当前实现的任务名为openbookqaGroups and Tasks一节且该任务尚未被归入任何 groupNot part of a group yet。这意味着你可以直接用任务名openbookqa独立运行评测。任务注册依赖 YAML 配置顶部的task字段。按照 docs/new_task_guide.md 的说明位于lm_eval/tasks目录内的 YAML 文件只需声明task名即可被TaskManager自动发现如需加载自定义路径可通过--include_path或--tasks /path/to/yaml/file指定。仓库中该任务存放于 lm_eval/tasks/openbookqa/由README.md与openbookqa.yaml两个文件组成——这正是项目推荐的每个数据集一个子目录的组织惯例。2.2 版本元数据配置底部携带metadata.version: 1.0。按 docs/task_guide.md 与 docs/new_task_guide.md 的约定metadata用于记录任意附加信息其中version键用于标记任务配置的版本号任何破坏性修改都应递增版本以便结果对比。三、openbookqa.yaml 逐字段深度解析任务的完整配置如下lm_eval/tasks/openbookqa/openbookqa.yamltask: openbookqa dataset_path: allenai/openbookqa dataset_name: main output_type: multiple_choice training_split: train validation_split: validation test_split: test doc_to_text: question_stem doc_to_target: {{choices.label.index(answerKey.lstrip())}} doc_to_choice: {{choices.text}} should_decontaminate: true doc_to_decontamination_query: question_stem metric_list: - metric: acc aggregation: mean higher_is_better: true - metric: acc_norm aggregation: mean higher_is_better: true metadata: version: 1.0下面按功能分组逐字段解读字段语义可对照 docs/task_guide.md 中的TaskConfig参数说明。3.1 数据源与切分Dataset Configurationdataset_path: allenai/openbookqa指定 Hugging Face Hub 上的数据集名称。框架的所有数据下载与管理都通过 HFdatasetsAPI 完成。dataset_name: mainHF 术语中的数据实例data instance或子配置名对应datasets.load_dataset的第二个参数。OpenBookQA 使用默认的main配置。training_split: train/validation_split: validation/test_split: test分别声明训练、验证、测试切分的名称。按框架约定评测优先使用test_split不可用时回退到validation_splitfew-shot 示例默认按 train → validation → test 的顺序选取也可用fewshot_split或fewshot_config显式覆盖。3.2 提示模板Prompting三项doc_to_*字段共同定义了把一条数据渲染成模型输入 目标输出的规则doc_to_text: question_stem直接引用数据集中的question_stem字段作为输入文本。数据集字段天然满足需求时可直接写字段名而不必使用 Jinja2 模板docs/new_task_guide.md 中称之为 basic prompt 用法。doc_to_choice: {{choices.text}}Jinja2 模板将数据集中的choices.text一个长度为 4 的选项文本列表渲染为候选答案列表。doc_to_target: {{choices.label.index(answerKey.lstrip())}}核心逻辑所在——数据集每条记录包含choices.label形如[A,B,C,D]和正确答案标识answerKey如A。该模板先将answerKey用lstrip()去除可能的首部空白再通过choices.label.index(...)求得正确答案在标签列表中的下标。这正是 docs/task_guide.md 中强调的约定对于multiple_choice任务doc_to_target应返回正确选项在doc_to_choice列表中的索引而非文本本身。提示格式的渲染约定值得注意框架会在doc_to_text输出与doc_to_target输出之间插入默认的target_delimiter一个空格因此实际交给模型比对的完整串为doc_to_text(doc) doc_to_choice[doc_to_target(doc)]详见 docs/new_task_guide.md 的 multiple choice 格式一节。这也解释了为什么在多项选择任务中四个选项会各生成一条候选串与输入拼接再逐条计算似然。3.3 输出类型multiple_choice 的评测机制output_type: multiple_choice表明该任务属于判别式多项选择类型模型不是自由生成文本而是在固定候选集合中通过比较各选项的 loglikelihood 选出最可能的答案。与之并列的框架支持类型还包括generate_until自由生成、loglikelihood、loglikelihood_rolling。在multiple_choice模式下对每个文档框架将doc_to_text与每个选项经target_delimiter拼接组合成多条输入候选续写对分别请求模型的 loglikelihood最后取似然最高的选项作为预测。这种机制不要求模型输出任何文字只依赖其词元级概率分布是多项选择评测的标准做法。3.4 指标配置acc 与 acc_norm配置声明了两项指标均使用mean聚合、higher_is_better: true指标含义聚合方向acc原始准确率预测选项是否等于正确答案mean越大越好acc_norm长度归一化准确率length-normalized accuracymean越大越好两者在源码层面的注册可参见 lm_eval/api/metrics.pyacc与acc_norm均注册为output_type[loglikelihood, multiple_choice]、aggregationmean的透传指标函数真正的打分发生在评估器内部——acc_norm在比较各选项时会对 loglikelihood 除以选项词元长度以削弱长选项天然累积更高负对数似然带来的偏差这是多项选择评测中的常用修正。对 OpenBookQA 这类选项长度可能不等的任务同时报告acc与acc_norm有助于更全面地观察模型表现。3.5 去污染设置Decontaminationshould_decontaminate: true doc_to_decontamination_query: question_stemshould_decontaminate: true开启测试集与训练语料的重叠检测doc_to_decontamination_query: question_stem指定以题面文本作为去污染匹配查询。按 docs/task_guide.md 的说明若该项开启但未指定查询字段则默认沿用doc_to_text的渲染结果本任务显式指定了question_stem。该机制可在评测报告中标记可能与预训练语料重叠的样本从而对分数给出更审慎的解读相关工具位于 lm_eval/decontamination/。四、运行 OpenBookQA 评测4.1 基础评测命令以 Hugging Face 模型为例使用任务名openbookqa运行评测lm_eval --model hf \ --model_args pretrainedEleutherAI/pythia-70m \ --tasks openbookqa \ --batch_size auto或使用 Python 模块形式python -m lm_eval \ --model hf \ --model_args pretrainedEleutherAI/pythia-70m \ --tasks openbookqa \ --batch_size auto--model hf选择 Hugging Face transformers 后端--model_args传入模型名等参数如pretrained...、dtypefloat32、devicecpu--tasks openbookqa指定要评测的任务可同时传多个任务名逗号分隔--batch_size auto让框架自动探测安全批大小。评测结束后会打印结果表其中包含openbookqa行的acc、acc_norm及其标准差stderr。由于该任务未挂载到任何 group结果表中不会有额外的分组聚合行。4.2 指定 few-shot 与切分OpenBookQA 的 few-shot 示例默认从train切分选取。显式指定 5-shot 并限制在测试集上lm_eval --model hf \ --model_args pretrainedEleutherAI/pythia-70m \ --tasks openbookqa \ --num_fewshot 5 \ --batch_size autonum_fewshot的默认值为 0见 docs/task_guide.md 的 Runtime configuration 一节。如需快速验证提示渲染是否符合预期可使用 scripts/write_out.py 导出实际拼接的 promptpython -m scripts.write_out \ --output_base_path /tmp/openbookqa_preview \ --tasks openbookqa \ --sets test \ --num_fewshot 2 \ --num_examples 5该脚本会按--num_fewshot渲染若干条示例便于人工目测eye testprompt 格式是否正确流程说明见 docs/new_task_guide.md 的 Checking validity 一节。4.3 回归测试佐证仓库的回归测试数据中包含 tests/testdata/openbookqa-v0-res.json说明openbookqa任务有对应的评测结果快照用于回归校验可作为任务配置行为正确的旁证。五、仓库中的 OpenBookQA 多语言与变体家族OpenBookQA 的英文主任务之外本仓库还将其扩展到了多种语言与评测框架均以同名 YAML 变体形式存在可作为复制任务模板的参考孟加拉语bangla_openbookqa.yaml 使用hishab/openbookqa-bn数据集其提示模板与主任务不同——显式用 Jinja2 循环把选项渲染成A. .../B. ...列表并追加Answer:doc_to_choice直接固定为[A, B, C, D]doc_to_target使用answerKey。可见同一基准在不同语言实现下提示格式可以灵活设计但输出类型与指标保持一致加泰罗尼亚语catalan_bench/openbookqa_ca.yaml归属于 catalan_bench.yaml 这一更大评测组西班牙语spanish_bench/openbookqa_es.yaml加利西亚语galician_bench/openbookqa_gl.yaml阿拉伯语方言aradice/openbookqa/ 下含openbookqa_eng.yaml、openbookqa_egy.yaml、openbookqa_msa.yaml、openbookqa_lev.yaml等方言变体挪威语noreval/noropenbookqa/ 下按nob书面挪威语与nno新挪威语分别提供p0~p4多个提示模板变体。这一主任务 多语言/多模板变体的组织方式正是 docs/new_task_guide.md 所鼓励的任务演化路径新增变体时在 README 中注明每个变体新增/评估的内容并声明其匹配的已发表评测设置。六、贡献新任务时的 Checklist 实践README 末尾附带了贡献任务的标准自查清单这也适用于任何基于 OpenBookQA 增加变体的场景该任务是否属于文献中已有的基准是否引用了原始论文原论文是否提供参考实现是否已对照参考实现核验并记录运行方式若同一数据集已有其他任务主变体Main variant是否被清晰标注是否在 README 中用一句话说明每个新变体的差异与评估点是否注明该变体匹配了哪些已发表的评测设置建议将填写完毕的 checklist 保留在lm_eval/tasks/task_dir/README.md中并在 lm_eval/tasks/README.md 的任务索引表里登记新任务方便其他使用者发现与检索。七、小结本文围绕 lm_eval/tasks/openbookqa/README.md 展开完整覆盖了 OpenBookQA 的数据集背景、任务注册方式、openbookqa.yaml 的全部字段语义、multiple_choice评测机制、acc/acc_norm指标的源码注册依据lm_eval/api/metrics.py、去污染设置以及从 CLI 到 few-shot 预览的完整运行流程并梳理了仓库内丰富的多语言变体。对于任何希望在新数据集上复现开卷问答类评估的读者本任务是一份结构清晰、可直接套用的最小完整范例。【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考