使用 lm-evaluation-harness 评估孟加拉语模型:Bangla MMLU / BoolQA / PIQA / OpenBookQA / CommonsenseQA 任务全解析
【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness
导读
本文聚焦 lm-evaluation-harness 仓库中的孟加拉语(Bangla/Bengali)评测任务实现,即以lm_eval/tasks/bangla/目录为核心的五个基准任务——Bangla MMLU、Bangla BoolQA、Bangla PIQA、Bangla OpenBookQA 与 Bangla CommonsenseQA。这些任务源自 TituLLMs 家族论文(arXiv:2502.11187),用于训练、验证和对比评估孟加拉语大语言模型。读完本文,你将掌握每个任务的 YAML 配置结构、提示模板构造、few-shot 采样机制、准确率指标原理,以及如何在本地用一条lm-eval run命令跑通全部 Bangla 基准。
一、背景:Bangla 基准与 TituLLMs
孟加拉语(Bangla/Bengali)是使用者超过两亿的语言,但高质量的开源评测基准长期稀缺。lm_eval/tasks/bangla/目录下的资源正是为填补这一空白而设计:它包含Bangla MMLU、Bangla OpenBookQA、Bangla BoolQA、Bangla PIQA、Bangla CommonsenseQA五类覆盖不同能力维度的数据集,用于训练、开发以及对孟加拉语语言模型进行对比评测。
按照 bangla/README.md 的说明,这些数据集在TituLLMs——一个面向孟加拉语的大语言模型家族——的训练与综合基准测试中被广泛使用,相关细节可参阅原研究论文TituLLMs: A Family of Bangla LLMs with Comprehensive Benchmarking(arXiv:2502.11187)。数据本身托管于 Hugging Face 的hishab组织下,包括:
hishab/titulm-bangla-mmlu(Bangla MMLU)hishab/boolq_bn(Bangla BoolQA)hishab/openbookqa-bn(Bangla OpenBookQA)hishab/piqa-bn(Bangla PIQA)hishab/commonsenseqa-bn(Bangla CommonsenseQA)
在 lm-evaluation-harness 的任务总索引 lm_eval/tasks/README.md 中,这五个数据集也以bangla_mmlu、bangla_commonsenseQA、bangla_boolQA、bangla_piQA、bangla_poenbookQA等名称登记在案,语言列标注为 Bengali/Bangla,说明它们被正式纳入该框架的内置任务集合。
注意:总索引表格中的个别名称存在拼写不一致(如
poenbookQA),实际可用的任务名以各 YAML 文件中的task:字段为准,详见下文。
二、任务实现:五个 YAML 配置逐项拆解
与仓库中绝大多数任务一样,Bangla 系列任务不写任何 Python 代码,而是以声明式 YAML 配置驱动。所有配置位于lm_eval/tasks/bangla/目录,由 lm_eval/tasks/manager.py 中的TaskManager在初始化时扫描索引:TaskManager默认将lm_eval/tasks/目录加入搜索路径,通过TaskIndex建立任务名到 YAML 路径的映射,并提供all_tasks属性供 CLI 列出全部可用任务。
2.1 bangla_mmlu.yaml —— 多主题多项选择题
文件:bangla_mmlu.yaml
task: bangla_mmlu dataset_path: hishab/titulm-bangla-mmlu dataset_name: all description: "The following are multiple choice questions (with answers) about range of topics in Bangla" test_split: test fewshot_split: dev fewshot_config: sampler: first_n output_type: multiple_choice doc_to_text: "{{question.strip()}} A. {{options[0]}} B. {{options[1]}} C. {{options[2]}} D. {{options[3]}} Answer:" doc_to_choice: ["A", "B", "C", "D"] doc_to_target: answer metric_list: - metric: acc aggregation: mean higher_is_better: true - metric: acc_norm aggregation: mean higher_is_better: true这是对 MMLU 范式的孟加拉语移植:数据集的all子集涵盖孟加拉语的多学科选择题。配置要点:
task:任务名bangla_mmlu,是 CLI 中引用该任务的唯一标识;dataset_path/dataset_name:Hugging Face 数据集路径及子集名,运行时会通过datasets库自动加载;test_split: test与fewshot_split: dev:评测与 few-shot 示例分别取自测试集和开发集;doc_to_text:将样本渲染为选项拼接的提问文本,options[0..3]对应 A/B/C/D 四个选项;doc_to_choice: ["A", "B", "C", "D"]:候选答案集合,模型需在四个字母中选出正确项;doc_to_target: answer:从样本字段answer取正确答案。
2.2 bangla_boolqa.yaml —— 篇章是非题
文件:bangla_boolqa.yaml
task: boolqa_bn dataset_path: hishab/boolq_bn description: "Bangla BoolQ: yes/no questions based on a passage." test_split: validation fewshot_split: train fewshot_config: sampler: first_n output_type: multiple_choice doc_to_text: |- Passage: {{passage.strip()}} Question: {{question.strip()}} Answer: doc_to_choice: ["yes", "no"] doc_to_target: answer metric_list: - metric: acc aggregation: mean higher_is_better: trueBoolQA 评测模型基于篇章回答是非问题的阅读理解能力。该任务将英文 BoolQ 数据集的孟加拉语译文hishab/boolq_bn包装为二分类多项选择题:
- 使用 YAML 块标量(
|-)构造多行提示:先给出Passage篇章,再给出Question问题,最后以Answer:收尾; doc_to_choice: ["yes", "no"]表明答案是 yes/no 二选一;- 测试/示例划分与其他任务不同:
test_split: validation、fewshot_split: train。
2.3 bangla_openbookqa.yaml —— 开放书本知识问答
文件:bangla_openbookqa.yaml
task: openbookqa_bn dataset_path: hishab/openbookqa-bn description: "Bangla OpenBookQA multiple-choice questions." test_split: test fewshot_split: train fewshot_config: sampler: first_n output_type: multiple_choice doc_to_text: |- {{question_stem.strip()}} {% for i in range(choices['label'] | length) -%} {{choices['label'][i]}}. {{choices['text'][i]}} {% endfor -%} Answer: doc_to_choice: ["A", "B", "C", "D"] doc_to_target: answerKey metric_list: - metric: acc aggregation: mean higher_is_better: true - metric: acc_norm aggregation: mean higher_is_better: trueOpenBookQA 考察模型能否利用"开放书本"式的常识知识回答科学类多选题。此配置展示了 lm-evaluation-harness 强大的Jinja2 模板能力:
doc_to_text中使用{% for %}循环遍历choices['label']与choices['text']两个并列列表,动态生成数量可变的选项列表(这里为 A/B/C/D 四项);doc_to_target: answerKey直接从样本的answerKey字段取答案;choices['label']与choices['text']的结构沿用了原始 OpenBookQA 数据集的嵌套字段格式。
2.4 bangla_piqa.yaml —— 物理常识推理
文件:bangla_piqa.yaml
task: piqa_bn dataset_path: hishab/piqa-bn description: "Bangla PIQA: physical commonsense reasoning questions." test_split: validation fewshot_split: train fewshot_config: sampler: first_n output_type: multiple_choice doc_to_text: |- {{goal.strip()}} A. {{sol1.strip()}} B. {{sol2.strip()}} Answer: doc_to_choice: ["A", "B"] doc_to_target: label metric_list: - metric: acc aggregation: mean higher_is_better: truePIQA 聚焦物理常识推理:给定一个目标(goal)和两个候选解决方案(sol1、sol2),模型需判断哪个方案更合理。配置采用最直接的模板写法——目标后接 A/B 两个选项;doc_to_target: label指向样本中的label字段。
2.5 bangla_commonsenseqa.yaml —— 常识问答五选一
文件:bangla_commonsenseqa.yaml
task: bangla_commonsenseqa dataset_path: hishab/commonsenseqa-bn description: "The following are Bangla multiple-choice CommonsenseQA-style questions." test_split: validation fewshot_split: train fewshot_config: sampler: first_n output_type: multiple_choice doc_to_text: |- {{question_stem.strip()}} {% for i in range(choices['label'] | length) -%} {{choices['label'][i]}}. {{choices['text'][i]}} {% endfor -%} Answer: doc_to_choice: ["A", "B", "C", "D", "E"] doc_to_target: answerKey metric_list: - metric: acc aggregation: mean higher_is_better: true - metric: acc_norm aggregation: mean higher_is_better: trueCommonsenseQA 是五选一的常识推理任务。与 OpenBookQA 类似,这里同样用 Jinja2 循环渲染选项,区别在于doc_to_choice扩展为五个字母["A", "B", "C", "D", "E"],评测的是模型在更多干扰项下的判别能力。
三、配置关键项的原理支撑
五个 YAML 文件共享一套配置骨架,理解这些字段的底层实现能帮助你按需修改或复刻新的孟加拉语任务。
3.1 output_type: multiple_choice 的评测机制
所有 Bangla 任务都声明output_type: multiple_choice。在该模式下,框架为doc_to_choice中的每个候选答案分别计算条件对数似然(log-likelihood),选择得分最高的候选作为模型预测,再与doc_to_target给出的参考答案比对。这一机制对应 lm_eval/api/task.py 中multiple_choice输出类型的处理逻辑,属于 lm-evaluation-harness 中最常用的评测范式之一。
3.2 fewshot_config.sampler: first_n 的含义
五个任务均配置了:
fewshot_split: train # 或 dev fewshot_config: sampler: first_nfirst_n是注册在 lm_eval/api/samplers.py 中的采样器FirstNSampler。查看其实现可以看到,它不同于默认ContextSampler的随机抽样:
class FirstNSampler(ContextSampler): def sample(self, n: int, eval_doc=None, df=None, **kwargs): """ Draw the first `n` samples in order from the specified split. Used for tasks with "canonical" ordered fewshot examples, such as MMLU and CMMLU. """ pool = self.rm_eval_doc(eval_doc, self.df) if eval_doc is not None else self.df assert n <= len(pool), (...) return pool[:n]FirstNSampler按顺序取示例集中的前n条作为 few-shot 上下文(必要时剔除与当前评测样本相同的文档),保证评测结果的可复现性。采样器通过SAMPLER_REGISTRY(default与first_n)注册,get_sampler(name)负责按名查找,这与 MMLU、CMMLU 等既有任务保持一致。这也解释了为什么 Bangla MMLU 的 few-shot 示例取自dev集:沿用 MMLU 的"规范有序示例"惯例。
3.3 指标 acc 与 acc_norm 的区别
五个任务全部或部分启用了acc与acc_norm两个指标。二者均在 lm_eval/api/metrics.py 中注册:
acc(acc_fn):直接计算预测与真实答案的匹配准确率,是一个透传函数,最终由注册的mean聚合器求平均;acc_norm(acc_norm_fn):对每个候选答案的对数似然按其 token 长度归一化后再比较,能缓解短答案天然获得更高似然分的问题,常用于多选题场景。
两个指标都声明higher_is_better: true且aggregation: mean,即最终报告的是所有样本正确率的算术平均。mean聚合器同样定义在 lm_eval/api/metrics.py(@register_aggregation("mean")),是框架中最基础的聚合方式。
四、实战:运行 Bangla 任务
4.1 安装与准备
在仓库根目录安装依赖后即可使用。由于仓库尚未安装为包(缺少lm_eval的包元数据),可先执行pip install -e .完成安装;或者直接以仓库源码方式运行。运行前需确保网络可访问 Hugging Face Hub,五个数据集(hishab/titulm-bangla-mmlu等)会在首次加载时自动下载。
4.2 查看任务是否被正确索引
使用lm-eval ls子命令确认任务已注册:
lm-eval ls tasks | grep -i bangla该命令底层调用TaskManager.all_tasks(见 lm_eval/tasks/manager.py),列出内置任务集合中所有任务名。预期输出包含:
bangla_mmluboolqa_bnopenbookqa_bnpiqa_bnbangla_commonsenseqa
4.3 单任务评测
以 Hugging Face 模型为例,评测 Bangla MMLU:
lm-eval run \ --model hf \ --model_args pretrained=<你的孟加拉语模型ID> \ --tasks bangla_mmlu \ --num_fewshot 5 \ --batch_size auto \ --device cuda \ --output_path results/bangla_mmlu.json参数说明(对应 lm_eval/_cli/run.py 中lm-eval run的参数定义):
| 参数 | 含义 | 说明 |
|---|---|---|
--model/-M | 模型后端 | 默认hf;还可选用vllm、gguf、openai-completions等 |
--model_args/-a | 模型参数 | 以key=val形式给出,如pretrained=...、dtype=float32 |
--tasks/-t | 任务列表 | 空格分隔的任务名或分组,可同时传多个 |
--num_fewshot/-f | few-shot 示例数 | 覆盖 YAML 中的默认采样数量 |
--batch_size/-b | 批大小 | 支持auto、auto:N自动调优或整数 |
--device | 设备 | cuda、cuda:0、cpu、mps等 |
--output_path/-o | 输出路径 | 结果 JSON 文件或目录 |
--limit/-L | 每任务样本上限 | 整数条数或小数比例,适合快速冒烟测试 |
4.4 一次性评测全部 Bangla 基准
lm-eval run \ --model hf \ --model_args pretrained=<你的孟加拉语模型ID> \ --tasks bangla_mmlu boolqa_bn openbookqa_bn piqa_bn bangla_commonsenseqa \ --num_fewshot 5 \ --batch_size auto如上所示,--tasks接受空格分隔的多个任务名,五个 Bangla 任务可一次提交。每组任务都会报告acc(以及启用了acc_norm的任务报告该指标),输出中包含每个任务的准确率、样本数及标准误,便于横向对比模型在知识记忆(MMLU)、篇章阅读(BoolQA)、开放书本常识(OpenBookQA)、物理常识(PIQA)与干扰项判别(CommonsenseQA)五个维度上的表现。
4.5 快速验证配置
在完整运行前,可先用--limit参数做小样本冒烟测试,验证提示模板与数据字段是否正常:
lm-eval run \ --model hf \ --model_args pretrained=EleutherAI/pythia-70m \ --tasks bangla_mmlu \ --num_fewshot 0 \ --limit 10如果模板中引用了不存在的字段、或doc_to_choice与数据不匹配,框架会在加载样本时立即报错,便于快速定位配置问题。
五、扩展:如何基于现有配置复刻新任务
了解五个 YAML 的构成后,你可以很容易地复刻同类孟加拉语任务:
- 在 lm_eval/tasks/bangla/ 目录下新建
xxx.yaml; - 参照
bangla_mmlu.yaml填写task、dataset_path、test_split、fewshot_split、output_type; - 根据数据字段编写
doc_to_text模板与doc_to_choice、doc_to_target(字段结构不确定时可先用--limit冒烟测试); - 依据任务性质选择
acc或acc+acc_norm指标组合; - 重新运行
lm-eval ls tasks确认新任务被TaskManager索引到。
TaskManager也支持通过include_path参数扫描仓库外部的自定义任务目录(见 lm_eval/tasks/manager.py),因此自定义任务无需改动仓库内置代码即可参与评测。
六、引用规范
若在论文或报告中使用了 Bangla 数据集与评测结果,请按 bangla/README.md 中的指引引用原论文:
@misc{nahin2025titullmsfamilybanglallms, title={TituLLMs: A Family of Bangla LLMs with Comprehensive Benchmarking}, author={Shahriar Kabir Nahin and Rabindra Nath Nandi and Sagor Sarker and Quazi Sarwar Muhtaseem and Md Kowsher and Apu Chandraw Shill and Md Ibrahim and Mehadi Hasan Menon and Tareq Al Muntasir and Firoj Alam}, year={2025}, eprint={2502.11187}, archivePrefix={arXiv}, primaryClass={cs.CL}, url={https://arxiv.org/abs/2502.11187}, }总结
lm_eval/tasks/bangla/以纯声明式 YAML 的形式,将 TituLLMs 论文配套的五类孟加拉语基准完整接入 lm-evaluation-harness 框架。无论你是在训练自己的孟加拉语模型,还是想对比已有模型的孟加拉语能力,都可以直接通过任务名bangla_mmlu、boolqa_bn、openbookqa_bn、piqa_bn、bangla_commonsenseqa一键运行评测。其配置背后依赖的FirstNSampler、acc/acc_norm指标注册机制以及TaskManager的任务索引体系,与仓库中 MMLU、CMMLU 等成熟任务完全一致,充分体现了 lm-evaluation-harness"以配置定义任务、零代码接入新语言基准"的设计理念。
【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考