Evalita-LLM:在 lm-evaluation-harness 中评估意大利语大语言模型的多任务基准指南
【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness
Evalita-LLM 是专为意大利语大语言模型(LLM)评估设计的基准,由 Magnini 等人在 2025 年提出(arXiv:2502.02289)。本指南围绕该基准在 lm-evaluation-harness 中的完整集成实现展开,讲解其任务分组体系、YAML 配置结构、多提示词(multi-prompt)评估机制以及生成式任务的指标聚合原理,读者将掌握通过lm_eval命令一键评估任意模型在 10 个意大利语任务上表现的具体方法,并理解其评测结果在仓库中的计算方式。
一、基准背景:为什么需要"原生意大利语"评估
Evalita-LLM 是 EVALITA 评测活动(意大利语自然语言处理评测)衍生出的 LLM 基准,其设计目标与仓库中其他多语言基准(如 global_mmlu)不同,它具备三个区分性特征:
- 所有任务均为原生意大利语(native Italian):数据直接以意大利语构建,避免了"从英语翻译成意大利语"所带来的语言损耗和潜在文化偏见;
- 在成熟的多选题任务之外引入生成式任务(generative tasks):使模型评测更接近与 LLM 的自然交互方式,而非仅限于基于困惑度(perplexity)的选项打分;
- 每个任务都使用多个提示词(prompts)进行评估:缓解模型对特定提示词的敏感性,使评测结果更公平、更客观。
在仓库中,该基准的完整实现位于 lm_eval/tasks/evalita_llm,核心入口文档即 lm_eval/tasks/evalita_llm/README.md。
引用信息:如果论文或报告中使用了该基准,README 提供了标准的 BibTeX 引用(Magnini, Zanoli, Resta, Cimmino, Albano, Madeddu, Patti,《Evalita-LLM: Benchmarking Large Language Models on Italian》,2025)。
二、任务分组体系:三个组合评测入口
仓库将 Evalita-LLM 的全部任务组织为三个层级的组(group),分别在三个 YAML 文件中定义:
| 组名 | 别名(group_alias) | 包含内容 | 定义文件 |
|---|---|---|---|
evalita-mp | Evalita-LLM | 全部 10 个任务(perplexity 类 + 生成类) | _evalita-mp.yaml |
evalita-mp_gen | Evalita-LLM - Generative | 仅生成式任务(4 个) | _evalita-mp_gen.yaml |
evalita-mp_mc | Evalita-LLM - PPL-based | 仅基于困惑度的任务(6 个) | _evalita-mp_mc.yaml |
2.1 全量组 evalita-mp
_evalita-mp.yaml 通过task列表聚合 10 个任务,并使用aggregate_metric_list声明组级聚合指标为acc(准确率),且weight_by_size: True表示按样本量加权平均:
group: evalita-mp group_alias: Evalita-LLM task: - evalita-mp_te - evalita-mp_sa - evalita-mp_wic - evalita-mp_hs - evalita-mp_at - evalita-mp_faq - evalita-mp_sum_fp - evalita-mp_ls - evalita-mp_ner_group - evalita-mp_re aggregate_metric_list: - metric: acc weight_by_size: True metadata: version: 12.2 生成式子组 evalita-mp_gen
_evalita-mp_gen.yaml 只保留 4 个generate_until输出类型的任务:Summarization(evalita-mp_sum_fp)、Lexical Substitution(evalita-mp_ls)、Named Entity Recognition(evalita-mp_ner_group)、Relation Extraction(evalita-mp_re)。
2.3 困惑度子组 evalita-mp_mc
_evalita-mp_mc.yaml 只保留 6 个multiple_choice输出类型的任务:Textual Entailment(evalita-mp_te)、Sentiment Analysis(evalita-mp_sa)、Word in Context(evalita-mp_wic)、Hate Speech Detection(evalita-mp_hs)、Admission Tests(evalita-mp_at)、FAQ(evalita-mp_faq)。
三、可单独评估的 10 个任务
README 明确列出以下任务均可脱离组单独评估,每个任务名即--tasks参数可用的任务标识符:
| 任务标识符 | 任务名称(意大利语任务) | 输出类型 |
|---|---|---|
evalita-mp_te | Textual Entailment(文本蕴含) | multiple_choice |
evalita-mp_sa | Sentiment Analysis(情感分析) | multiple_choice |
evalita-mp_wic | Word in Context(上下文词义) | multiple_choice |
evalita-mp_hs | Hate Speech Detection(仇恨言论检测) | multiple_choice |
evalita-mp_at | Admission Tests(入学测试) | multiple_choice |
evalita-mp_faq | FAQ(问答) | multiple_choice |
evalita-mp_sum_fp | Summarization(摘要生成) | generate_until |
evalita-mp_ls | Lexical Substitution(词汇替换) | generate_until |
evalita-mp_ner_group | Named Entity Recognition(命名实体识别) | generate_until |
evalita-mp_re | Relation Extraction(关系抽取) | generate_until |
从源码结构可以推断,每个任务的实现采用"模板 + 提示词变体"的分层组织:底层是_*_template_yaml(定义数据集、输出类型、目标提取与指标),上层是_evalita-mp_*_pN.yaml(N=1..6,定义不同提示词的变体),再由_evalita-mp_*_tasks.yaml通过tag机制聚合。
四、快速上手:运行评估
README 给出的标准评估命令如下,使用 Hugging Face 模型后端(hf),加载 Llama-2-7B,在cuda:0上以auto批大小运行全量基准:
lm_eval --model hf --model_args pretrained=meta-llama/Llama-2-7b-hf --tasks evalita-mp --device cuda:0 --batch_size auto参数含义与仓库 CLI 实现(lm_eval/_cli)对应如下:
--model hf:使用 huggingface.py 实现的本地 Hugging Face 模型加载器;--model_args pretrained=...:指定模型名称或本地路径;--tasks evalita-mp:评测全量组;也可替换为evalita-mp_gen、evalita-mp_mc或上表中的单个任务名(支持逗号分隔多个任务);--device cuda:0:指定推理设备;--batch_size auto:自动选择批大小。
若只评估生成式子集,可运行:
lm_eval --model hf --model_args pretrained=meta-llama/Llama-2-7b-hf --tasks evalita-mp_gen --device cuda:0 --batch_size auto五、基于困惑度的任务实现详解(evalita-mp_mc 组)
这 6 个任务全部使用output_type: multiple_choice,即对每个选项计算对数似然,取概率最高的选项作为答案。所有数据集托管在 Hugging Face 的evalitahf组织下。
5.1 Textual Entailment(evalita-mp_te)
模板 _te_template_yaml 定义:
dataset_path: evalitahf/textual_entailment output_type: multiple_choice test_split: test fewshot_split: dev validation_split: dev doc_to_target: "{{ 0 if entailment == 'SI' else 1 }}" doc_to_choice: ["Sì", "No"] metric_list: - metric: acc aggregation: mean higher_is_better: true- 标签字段
entailment为SI时目标为 0("Sì",是),否则为 1("No",否),选项为意大利语的"是/否"; - 提示词变体 _evalita-mp_te_p1.yaml 定义了
doc_to_text:"La frase: '{{text1}}' implica logicamente che la frase: '{{text2}}' sia vera?"("句子 X 在逻辑上蕴含句子 Y 为真吗?")。仓库保留被注释的旧提示词,用于对比说明多提示词策略的演进; - 任务组 _evalita-mp_te_tasks.yaml 以
tag: evalita-mp_te_tasks关联所有 prompt 变体,并以acc按样本量加权聚合。
5.2 Sentiment Analysis(evalita-mp_sa)
模板 _sa_template_v2_yaml 定义四分类情感任务:
dataset_path: evalitahf/sentiment_analysis output_type: multiple_choice test_split: test fewshot_split: train validation_split: test doc_to_target: !function utils.sa_doc_to_target_v2 doc_to_choice: ["positivo", "negativo", "neutrale", "misto"]- 数据集字段
opos(positive 极性)与oneg(negative 极性)被 utils.py 中的sa_doc_to_target_v2映射为 0/1/2/3 四个类别索引(pos=1,neg=0 → 0;pos=0,neg=1 → 1;双 0 → 2;双 1 → 3),对应选项["positivo", "negativo", "neutrale", "misto"]; - 该任务不是简单用
acc,而是使用 F1 指标,且聚合函数为 metrics.py 中的自定义_aggreg_sa:由于提示词把任务改写成四分类多项选择,而原始标注是"正向/负向"两个独立二分类(opos、oneg),聚合时先通过_map_to_original_labels将四分类预测/标签还原成两个二分类标签序列,再分别计算两个类的 F1 并取平均,从而与原始任务的评分口径对齐; - 提示词变体 _evalita-mp_sa_p1.yaml 的
doc_to_text为:"Qual è il sentiment espresso nel seguente tweet: '{{text}}'?"。
5.3 Word in Context(evalita-mp_wic)
模板 _wic_template_yaml:
dataset_path: evalitahf/word_in_context dataset_name: default output_type: multiple_choice test_split: test fewshot_split: dev validation_split: dev doc_to_target: label # 0: No, 1: Si doc_to_choice: ["No", "Sì"] metric_list: - metric: f1 higher_is_better: true aggregation: f1该任务判断同一单词在两个上下文中是否词义一致,目标字段为label(0 表示否、1 表示是),选用 F1 指标。
5.4 Hate Speech Detection(evalita-mp_hs)
模板 _hs_template_yaml:
dataset_path: evalitahf/hatespeech_detection output_type: multiple_choice test_split: test_all fewshot_split: dev validation_split: dev doc_to_target: hs # 0 = Falso, 1 = Vero doc_to_choice: ["Falso", "Vero"]判断文本是否包含仇恨言论,选项为意大利语"Falso(假)/ Vero(真)",测试划分使用test_all。
5.5 Admission Tests(evalita-mp_at)
模板 _at_template_yaml 为多选题任务:
dataset_path: evalitahf/admission_test output_type: multiple_choice test_split: test fewshot_split: dev validation_split: test doc_to_target: Correct doc_to_choice: ["A", "B", "C", "D", "E"]提示词变体 _evalita-mp_at_task_p1.yaml 将其塑造成医学入学考题:
doc_to_text: "Dato il seguente quesito di medicina: '{{Question}}' qual è la risposta corretta?" doc_to_choice: "{{[A,B,C,D,E]}}" doc_to_target: "{{ A if Correct == 'A' else B if Correct == 'B' else C if Correct == 'C' else D if Correct == 'D' else E}}" metric_list: - metric: acc aggregation: mean higher_is_better: true - metric: acc_norm aggregation: mean higher_is_better: true该变体同时上报acc与acc_norm两种指标(acc_norm按选项长度归一化对数似然),且通过 Jinja 表达式把正确答案字母映射为对应选项文本作为目标。
5.6 FAQ(evalita-mp_faq)
模板 _faq_template_yaml:
dataset_path: evalitahf/faq test_split: test_1 fewshot_split: dev_1 doc_to_target: !function utils.faq_doc_to_target doc_to_choice: ["A", "B", "C", "D"] output_type: multiple_choice目标由 utils.py 的faq_doc_to_target将数据集字段correct_answer("A"/"B"/"C"/"D")映射为选项索引,若取值不在范围内会通过日志发出警告。
六、生成式任务实现详解(evalita-mp_gen 组)
这 4 个任务使用output_type: generate_until,模型自由生成文本,再通过process_results函数与金标对比计算指标。生成停止条件统一使用until: ["</s>"]。
6.1 Summarization(evalita-mp_sum_fp)
模板 _sum_template_fp_yaml 使用 Fanpage 新闻摘要数据集:
dataset_path: ARTeLab/fanpage output_type: generate_until generation_kwargs: until: - "</s>" test_split: test doc_to_target: "{{target}}"指标计算依赖 sum_utils.py:process_results_sum通过evaluate库加载 ROUGE 指标,对每个样本计算rouge1,并以rouge1作为metric_list中的上报指标。组定义 _evalita-mp_sum_fp_task.yaml 声明metric: rouge1、weight_by_size: True。仓库中还存在基于silvia-casola/WITS数据集与test_100划分的另一套摘要模板 _sum_template_yaml,可作为对比参考。
6.2 Lexical Substitution(evalita-mp_ls)
模板 _ls_template_yaml:
dataset_path: evalitahf/lexical_substitution test_split: test validation_split: dev fewshot_split: dev output_type: generate_until generation_kwargs: until: - "</s>" doc_to_target: !function utils.ls_doc_to_target process_results: !function utils.ls_process_results metric_list: - metric: f1 higher_is_better: True aggregation: !function metrics._aggreg_ls该任务要求模型为句子中目标词给出同义词。评分逻辑在 utils.py 中:
- 金标由
ls_doc_to_target序列化为逗号分隔的同义词列表,若无标注则返回占位符&&NOSYN&&; ls_process_results用正则LS_SPLIT_REGEX = r"[^,]+"切分模型输出,最多取前 10 个候选词,与标注者给出的同义词及其频次比对,计算精度(precision),并返回(prec, has_answ, has_annotation)三元组;- 组级聚合 metrics.py 的
_aggreg_ls在语料层面汇总|A|(模型给出答案数)与|T|(有标注数),计算最终 precision、recall 与 F1,并对分母为 0 的情况做了保护。
6.3 Named Entity Recognition(evalita-mp_ner_group)
NER 是唯一拥有子组结构的生成式任务。_evalita-mp_ner_group.yaml 聚合三个领域子组:evalita-mp_ner_tasks_fic(虚构类)、evalita-mp_ner_tasks_adg、evalita-mp_ner_tasks_wn,对应仓库中的_evalita-mp_ner_fic*、_evalita-mp_ner_adg*、_evalita-mp_ner_wn*系列文件。
模板 _ner_template_yaml:
dataset_path: evalitahf/entity_recognition output_type: generate_until generation_kwargs: until: - "</s>" - "\n" doc_to_target: !function utils.ner_doc_to_target process_results: !function utils.ner_process_results metric_list: - metric: f1 higher_is_better: True aggregation: !function metrics._aggreg_ner模型输出采用实体$类型,实体$类型的序列化格式(分隔符见 utils.py 中的NER_ENTITY_SEPARATOR = ","与NER_TYPE_SEPARATOR = "$",无实体时返回&&NOENT&&)。ner_process_results将解析后的(实体文本, 类型)列表与金标实体逐项匹配,把结果映射为 PER/LOC/ORG/O 四类标签(NER_MAPPING),并对"预测多于金标"(补齐假阳性)与"无实体且无预测"(空标签)等边界情况做了显式处理;组级聚合_aggreg_ner将语料内所有预测/金标拼接后计算除O类以外的平均 F1。
6.4 Relation Extraction(evalita-mp_re)
模板 _re_template_yaml:
dataset_path: evalitahf/relation_extraction test_split: test output_type: generate_until generation_kwargs: until: - "</s>" doc_to_target: !function utils.re_doc_to_target process_results: !function utils.rel_process_results_v3 metric_list: - metric: f1 higher_is_better: True aggregation: !function metrics._aggreg_rel输出格式为实体1$实体2%实体3$实体4(INTRA_REL_SEPARATOR = "$"、INTER_REL_SEPARATOR = "%",无关系返回&&NOREL&&)。rel_process_results_v3实现"不区分关系抽取顺序"的评分:完整覆盖四种情形——模型未答且金标存在(假阴性)、均无(真阴性)、模型多答(假阳性)、以及逐条比对匹配(已匹配的关系从候选集中删除,多余预测计为假阳性)。组级聚合_aggreg_rel按 macro 平均计算 F1。
七、多提示词(multi-prompt)机制:同一任务 6 套提示词
README 强调的"所有任务用多个提示词评估"在仓库中体现为_evalita-mp_*_p1.yaml至_evalita-mp_*_p6.yaml的变体文件(各任务变体数量不一,如 TE/SA/WIC/HS/FAQ 有 6 个,LS 有 2 个,AT 有 6 个)。每个变体的结构一致:
tag: evalita-mp_te_tasks # 与组定义中的 task 项对应的 tag include: _te_template_yaml # 继承模板的全部字段 task: evalita-mp_te_prompt-1 # 变体任务名 task_alias: prompt-1 # 报告中的显示别名 doc_to_text: "..." # 该变体独有的提示词以 TE 为例,_evalita-mp_te_p1.yaml 通过include继承模板的dataset_path、output_type、doc_to_target等全部字段,仅重写doc_to_text,并允许在变体级别覆盖metric_list(如 SA 变体即覆盖了聚合函数)。这种"模板继承 + 变体重写"的设计使得新增提示词只需新增一个几行的 YAML 文件,与仓库任务配置规范(见 docs/config_files.md)一致。
八、指标与自定义聚合函数总览
汇总各任务的评测指标与实现位置:
| 任务 | 指标 | 聚合方式 | 实现位置 |
|---|---|---|---|
| TE / AT / FAQ | acc(AT 另有 acc_norm) | mean,组级按样本加权 | 内建指标 |
| SA | f1 | 自定义_aggreg_sa(还原 opos/oneg 二分类后平均) | metrics.py |
| WIC | f1 | 内建 f1 | 内建指标 |
| HS | acc(组级) | mean | 内建指标 |
| SUM_FP | rouge1 | 内建 rouge1 | sum_utils.py |
| LS | f1 | 自定义_aggreg_ls(语料级 P/R/F1) | metrics.py |
| NER | f1 | 自定义_aggreg_ner(去除 O 类的平均 F1) | metrics.py |
| RE | f1 | 自定义_aggreg_rel(macro F1) | metrics.py |
metrics.py 基于sklearn.metrics的f1_score、precision_score、recall_score实现全部自定义聚合,并在文件末尾保留了文档定年(Document Dating)任务的_aggreg_dd,说明该文件随基准演进持续扩展。
九、版本变更记录与维护说明
README 记录了当前唯一一条变更:
- v0.1:将
evalita-mp_sum_fp的小型变体组重命名为evalita-mp_sum_fp_small,以解决其与完整变体(full variant)之间的重复组名冲突。仓库文件系统印证了这一变更:摘要任务目录中同时存在_evalita-mp_sum_fp-small_task.yaml、_evalita-mp_sum_fp-small_p1.yaml、_evalita-mp_sum_fp-small_p2.yaml与_evalita-mp_sum_fp_task.yaml、_evalita-mp_sum_fp_p1.yaml等文件,二者分别对应不同的数据规模变体。
十、配套测试与质量保障
作为 lm-evaluation-harness 的标准任务,Evalita-LLM 的实现遵循仓库统一的配置加载、few-shot 上下文构建与指标上报流程(相关机制见 docs/task_guide.md 与 docs/interface.md)。所有任务的metadata.version均为 1 或 1.0,符合任务版本化要求;README 末尾的 Checklist 也确认:该基准已有公开论文(已引用)、原始实现由基准作者直接贡献,且仓库 README 对各变体的评估目标给出了明确说明。
结语
Evalita-LLM 在 lm-evaluation-harness 中的集成是一个"原生语言基准 + 模板化任务组织 + 多提示词 + 生成式指标定制"的完整范例:通过evalita-mp、evalita-mp_gen、evalita-mp_mc三个入口即可对任意 Hugging Face 模型展开全量或分组的意大利语评测;include继承机制让 10 个任务 60 余个提示词变体得以极简维护;而metrics.py与utils.py中的自定义函数则保证了生成式任务在语料层面的精确评分。读者可直接复制上文命令,将--tasks替换为所需的组名或任务名,快速复现论文中的意大利语评测流程。
【免费下载链接】lm-evaluation-harnessA framework for few-shot evaluation of language models.项目地址: https://gitcode.com/GitHub_Trending/lm/lm-evaluation-harness
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考