news 2026/10/9 5:13:30

使用 lm-evaluation-harness 评测 bAbI:基于故事问答的阅读推理基准实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 lm-evaluation-harness 评测 bAbI:基于故事问答的阅读推理基准实战指南
  • 大模型
  • 推理模型
  • 微调
  • 模型推理服务

【免费下载链接】s1

s1: Simple test-time scaling

项目地址:https://gitcode.com/gh_mirrors/s1/s1
点击查看免费下载

导读

bAbI 是自然语言理解与问答领域一个极具代表性的推理基准,由 Weston 等人于 2015 年提出,其核心思想是用 20 组"玩具任务"模拟人类对话智能所需的链式推理、归纳、演绎等能力。本篇文章以仓库中 babi 任务 README 为骨架,结合其任务配置 babi.yaml 与 lm-evaluation-harness 框架源码,系统讲解:bAbI 数据集的技术背景、YAML 任务配置的每个字段含义、如何将任务接入框架并实际运行评测、以及如何理解与复现评测结果。读完本文,你将能够独立在本地使用 lm-evaluation-harness 对 bAbI(以及同类生成式 QA 任务)完成从配置到出分的完整评测闭环。

bAbI 基准概述

论文与数据集出处

bAbI 任务由下述论文提出,该论文同时给出了数据集的官方主页:

  • 论文标题:Towards ai-complete question answering: A set of prerequisite toy tasks
  • 论文摘要与全文:https://arxiv.org/abs/1502.05698
  • 数据集官方主页:https://github.com/facebookarchive/bAbI-tasks

论文的核心主张是:机器学习研究的长远目标之一是构建可用于推理和自然语言的智能对话 Agent。为了衡量迈向该目标的进展,作者提出用一组"代理任务"(proxy tasks)来评估系统的阅读理解问答能力。这些任务从多个维度测试系统是否能够通过事实链式推理(chaining facts)、简单归纳(induction)、演绎(deduction)等方式回答问题,并被认为是任何"能与人类对话的系统"必须具备的前置技能(prerequisites)。论文还指出,当时许多既有学习系统无法解决这些任务,因此作者希望通过将任务按技能集合分类,帮助研究者定位并修复其系统的短板。作为方法论的贡献,论文同时扩展并改进了 Memory Networks 模型,证明其能解决部分(但非全部)任务。

在仓库的 lm_eval/tasks/README.md 中,babi 任务被登记为:

"Tasks designed as question and answering challenges based on simulated stories."(基于模拟故事设计的问答挑战任务),语言为英语。

这与论文的定位完全一致:bAbI 不是大规模"知识竞赛"式问答,而是用小规模、结构化的模拟故事来测试推理机制本身。

引用信息

在论文或报告中引用该基准时,官方 README 给出的 BibTeX 如下:

@article{weston2015towards, title={Towards ai-complete question answering: A set of prerequisite toy tasks}, author={Weston, Jason and Bordes, Antoine and Chopra, Sumit and Rush, Alexander M and Van Merri{\"e}nboer, Bart and Joulin, Armand and Mikolov, Tomas}, journal={arXiv preprint arXiv:1502.05698}, year={2015} }

任务在框架中的注册信息

babi 任务在 lm-evaluation-harness 中的组织方式,可以通过 README 中的 "Groups, Tags, and Tasks" 一节确认:

  • Groups:目前不属于任何任务组(Not part of a group yet)
  • Tags:目前未打任何标签(No tags applied)
  • Tasks:注册的任务名为babi

这意味着该任务是作为独立单任务运行的,不能通过--tasks传入某个组名或标签名来批量触发。任务名的注册方式在 new_task_guide.md 中有明确说明:只要 YAML 文件位于lm_eval/tasks目录下,并在文件中声明task: <name>,任务即完成注册。babi 正是在其目录 babi.yaml 中声明了task: babi。

深入解析 babi.yaml:一个生成式问答任务的完整配置

babi 任务的全部逻辑都浓缩在一个约 20 行的 YAML 文件 babi.yaml 中。下面逐字段拆解其含义,并对照框架文档 task_guide.md 中的TaskConfig参数说明,理解每个字段对评测行为的影响。

数据集加载与划分

task: babi dataset_path: Muennighoff/babi dataset_name: null training_split: train validation_split: valid test_split: test
  • task: babi:注册的任务名,用于 CLI 中--tasks babi指定。
  • dataset_path: Muennighoff/babi:Hugging Face Hub 上的数据集标识。框架统一通过 HFdatasetsAPI 加载数据,这是TaskConfig中dataset_path字段的标准用法(见 task_guide.md)。
  • dataset_name: null:表示该数据集没有需要额外指定的 HF 数据子配置(即不需要传给load_dataset的第二个参数),直接留空。
  • training_split / validation_split / test_split:分别指向数据集的train、valid、test划分。根据框架约定,评测优先使用test_split,若测试集不可用则回退到validation_split(见 new_task_guide.md)。

提示模板:将故事与问题组织成模型输入

doc_to_text: "Passage: {{passage}}Question: {{question}}\nAnswer:" doc_to_target: " {{answer}}" target_delimiter: ""
  • doc_to_text使用 Jinja2 模板将每个样本渲染为模型输入:"Passage: {{passage}}Question: {{question}}\nAnswer:"。即先输出一段模拟故事(passage),再以Question:引出问题(question),最后以Answer:提示模型开始作答。
  • doc_to_target是标准答案模板" {{answer}}"。需要注意target_delimiter被显式设为空字符串(默认值为一个空格,见 task_guide.md),因此评测时输入与目标答案之间的分隔由模板自身控制。doc_to_text与doc_to_target均不应包含多余的首尾空白,这一约定同样源自 new_task_guide.md 的说明。

生成参数:何时停止采样

output_type: generate_until generation_kwargs: until: - "\n" - "Passage:"

output_type: generate_until表明这是一个**自由生成(generative)**任务:模型需要自行采样文本,而不是在固定选项间计算 log-likelihood。output_type的可选值包括generate_until、loglikelihood、loglikelihood_rolling与multiple_choice(见 task_guide.md)。

generation_kwargs.until定义了采样终止条件:

  • "\n":遇到换行即停止——因为答案是单行短文本;
  • "Passage:":防止模型"越界"开始生成新的故事段落。

generation_kwargs本质上是传给 HF transformersgenerate函数的辅助参数,框架对非 HF 模型后端可能不完全支持高级关键字(见 task_guide.md)。

评测指标:Exact Match

metric_list: - metric: exact_match aggregation: mean higher_is_better: true
  • metric: exact_match:逐样本判断模型生成文本与标准答案是否完全一致;
  • aggregation: mean:对全部样本的 0/1 结果取平均,得到最终准确率;
  • higher_is_better: true:数值越高越好,符合准确率的语义。

在源码层面,generate_until类型任务的默认指标正是exact_match——这可以在 registry.py 的映射"generate_until": ["exact_match"]中得到印证;exact_match指标的具体实现(逐样本比较 gold 与预测)则位于 task.py。此外,metrics.py 中还提供了基于 HuggingFace Evaluate 的exact_match_hf_evaluate实现,供需要与外部指标库对齐的场景使用。

版本元数据

metadata: version: 1.0

metadata.version是任务配置的版本号。框架约定:当任务配置发生破坏性变更(如提示模板、指标逻辑调整)时,应递增版本号,以便研究者区分不同迭代并保证评测可复现(见 new_task_guide.md)。

如何运行 babi 评测

环境与入口

lm-evaluation-harness 的 CLI 入口为main.py。核心参数在 setup_parser 中定义:

  • --model/-m:模型类型,默认hf(HuggingFace Transformers 模型);
  • --tasks/-t:要评测的任务名(逗号分隔),babi 直接传babi;
  • --model_args/-a:模型加载参数,例如pretrained=EleutherAI/pythia-160m,dtype=float32;
  • --num_fewshot/-f:few-shot 示例数量,不传时使用任务配置默认值(babi 配置未设置,即默认 0-shot);
  • --batch_size/-b:批大小,支持auto、auto:N或整数。

一条可复现的评测命令

以 HuggingFace 模型为例,0-shot 评测 babi 的完整命令如下:

lm-eval --model hf \ --model_args pretrained=EleutherAI/pythia-160m,dtype=float32 \ --tasks babi \ --batch_size auto

运行结束后,控制台会输出一个结果表,其中 babi 一行的exact_match列即模型的 bAbI 推理准确率。

若需要同时评测多个任务(例如与同类阅读推理任务对比),使用逗号分隔的任务列表即可:

lm-eval --model hf \ --model_args pretrained=EleutherAI/pythia-160m,dtype=float32 \ --tasks babi,drop \ --batch_size auto

注意:所有任务名必须是已注册名称。可用lm-eval --tasks list查看全部任务清单(见 README.md)。

验证提示模板与 few-shot 样本

在正式评测前,建议先用scripts/write_out工具把渲染后的输入输出落盘检查,确保提示格式符合预期(该工具用法见 new_task_guide.md):

python -m scripts.write_out \ --output_base_path <output-dir> \ --tasks babi \ --sets test \ --num_fewshot 0 \ --num_examples 20

打开--output_base_path指定的文件做"肉眼检查"(eye test),确认每个样本都形如:

Passage: <模拟故事文本> Question: <问题> Answer: <标准答案>

即可放心进入正式评测。

从配置到评测结果:框架执行流程梳理

结合上文,babi 任务在 lm-evaluation-harness 中的完整执行链路可以概括为:

  1. 注册与加载:--tasks babi触发任务管理器查找 babi.yaml,解析TaskConfig;
  2. 数据准备:通过dataset_path: Muennighoff/babi从 HF Hub 拉取数据,按training_split/validation_split/test_split选取评测划分;
  3. 提示渲染:对每个样本,用doc_to_text的 Jinja2 模板生成输入,用doc_to_target生成标准答案;
  4. 模型推理:按output_type: generate_until进行自由采样,generation_kwargs.until控制停止条件;
  5. 打分汇总:exact_match逐样本比对,mean聚合出任务准确率,higher_is_better: true标注方向;
  6. 结果输出:以表格形式打印各任务指标。

该流程中"提示渲染 → 推理 → 指标"的通用设计,决定了更换评测模型(--model)或调整批次(--batch_size)不会影响任务配置本身的可复现性;而metadata.version则为提示模板或数据集发生变化时提供了版本追踪手段。

结论与适用说明

babi 在仓库中是一个结构极简但语义完整的generate_until式生成问答任务:它依托 HF Hub 上的Muennighoff/babi数据集,通过 babi.yaml 一次性完成数据加载、提示模板、采样停止条件与 Exact Match 指标的声明。对研究者而言,它既是评测模型"链式推理"能力的最小抓手,也是理解 lm-evaluation-harness YAML 任务机制(尤其是生成式任务)的最佳入门案例。

需要说明的适用前提:

  • babi 当前不归属任何 group、无 tag,只能以babi任务名单独运行;
  • 数据依赖 HF Hub 上的Muennighoff/babi数据集,评测前需具备网络访问能力或提前缓存;
  • generation_kwargs中的高级参数对非 HF 模型后端可能存在兼容性限制,跨后端评测时需留意;
  • 本文所有命令与配置说明均以当前仓库(eval/lm-evaluation-harness目录)实际内容为准,适用于仓库所对应的 lm-evaluation-harness 版本。

延伸阅读

  • babi 任务 README:任务注册信息、论文与引用
  • babi.yaml 配置:完整任务配置
  • task_guide.md:TaskConfig全量参数说明
  • new_task_guide.md:如何新增一个 YAML 任务
  • 任务总览 README:babi 在全部任务中的登记信息
  • 指标实现 与 注册映射:exact_match的源码依据
  • CLI 入口:--tasks等参数定义
  • 大模型
  • 推理模型
  • 微调
  • 模型推理服务

【免费下载链接】s1

s1: Simple test-time scaling

项目地址:https://gitcode.com/gh_mirrors/s1/s1
点击查看免费下载

相关推荐

上一篇:3步掌握抖音批量下载助手:高效自动化采集创作者作品
下一篇:3分钟极速上手:免费城通网盘解析工具终极指南

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 5:12:22

商家小程序落地四步法:从痛点出发构建最小业务闭环

1. 为什么“比排行”是商家小程序启动阶段最典型的认知陷阱&#xff1f;我陪某连锁烘焙品牌做过三轮小程序上线复盘&#xff0c;每次他们第一句话都是&#xff1a;“老师&#xff0c;现在市面上最火的小程序模板是哪个&#xff1f;Top3的商家都用什么系统&#xff1f;”——这问…

作者头像 李华
网站建设 2026/10/9 5:12:09

Vulkan固定功能阶段详解:从顶点输入到颜色混合的管线配置

很多朋友学到 Vulkan 管线的可编程阶段&#xff0c;写完了顶点着色器和片元着色器&#xff0c;就以为万事大吉。结果在创建VkGraphicsPipelineCreateInfo的时候&#xff0c;突然冒出一大堆结构体要填&#xff1a;顶点输入、输入装配、光栅化、深度模板、颜色混合。这就是 Vulka…

作者头像 李华
网站建设 2026/10/9 5:08:50

xberg Python SDK 图片提取实战:关闭 OCR 的 PNG 元数据冒烟测试

后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with …

作者头像 李华