☰
smol-course 第 4 单元深度指南:用 LightEval 构建从自动基准到领域自定义的 LLM 评估体系
2026/10/9 7:41:58 网站建设 项目流程
  • 教程
  • 人工智能
  • 大模型
  • NLP
  • 微调

【免费下载链接】smol-course

A course on aligning smol models.

项目地址:https://gitcode.com/gh_mirrors/smo/smol-course
点击查看免费下载

导读

本指南以 smol-course 仓库 units/vi/unit4/1.md(模型评估单元总览)为骨架,系统讲解小型语言模型(smol model)评估的完整方法论:从 MMLU、TruthfulQA 等自动基准的原理与局限,到 LightEval 任务格式与评估流水线的实操,再到自定义任务、自定义指标以及结合 Argilla、distilabel 的领域专项评估项目。读完本文,你将掌握一套可复现的"标准基准 + 领域自定义"多层评估体系,并能在当前仓库中找到每一步对应的可运行代码与练习。

为什么评估是 LLM 开发的关键环节

评估(Evaluation)是语言模型开发与部署流程中不可或缺的一步:它帮助我们理解模型在不同能力维度上表现如何、找出需要改进的方向,从而为模型选择、微调迭代和上线决策提供依据。一个完整的评估流程通常覆盖多个维度:

  • 任务能力(task-specific capabilities):通过问答、摘要等具体任务评估模型处理不同类型问题的水平;
  • 输出质量(output quality):通过连贯性、事实准确性等要素衡量生成内容的质量;
  • 安全性(safety):识别模型输出中是否包含鼓励恶意行为的倾向或潜在偏见;
  • 领域专业性(domain expertise):验证模型在目标领域的专业知识储备。

在 smol-course 中,评估单元使用的是由 Hugging Face 开发的lighteval对该模块的定位做了相同阐述:既要覆盖标准基准,也要覆盖领域专项评估,以全面评估你的 smol model。

单元学习路径:三个层次递进

按照 units/vi/unit4/1.md 的内容组织,本单元的学习路径分为三步,从"会用标准工具"到"构建专属评估体系":

  1. 自动基准评估:学习用标准化基准与指标评估模型,覆盖MMLU、TruthfulQA等常用基准、关键评估指标与设置,以及可复现评估的最佳实践。对应课程文档 units/vi/unit4/2.md(英文原版见 automatic_benchmarks.md)。
  2. 按需求自定义评估:学习创建贴合自身用例的评估流水线,包括设计自定义评估任务、实现专业指标、构建匹配需求的评估数据集。对应课程文档 units/vi/unit4/3.md(英文原版见 custom_evaluation.md)。
  3. 领域专项评估项目:跟随一个完整的端到端示例,学习生成评估数据集、用Argilla标注数据、创建标准化数据集并用LightEval评估模型。对应 领域评估项目。

配套练习 Notebook 位于 notebooks/vi/4_evaluation/lighteval_evaluate_and_analyse_your_LLM.ipynb,包含三个递进难度的任务:用医疗领域任务评估模型(🐢)、用不同 MMLU 任务创建新的领域评估(🐕)、为你的领域创建自定义评估任务(🦁)。

自动基准:标准化工具与它们的局限

自动基准(Automatic Benchmarks)由精心挑选的数据集构成,每个数据集包含预定义的任务与评估指标,旨在评测从基础语言理解到复杂推理的多种能力。其核心优势是标准化——允许在不同模型之间进行一致比较,并产出可复现的结果。

常见基准速览

类别基准评测内容主要局限
通用知识MMLU(Massive Multitask Language Understanding)覆盖从自然科学到社会科学的57 个学科可能无法反映特定领域所需的专业深度
通用知识TruthfulQA模型复现常见误解(misconception)的倾向无法捕捉所有形式的信息错误
推理能力BBH(Big Bench Hard)逻辑思维与规划能力可能无法体现真实场景中的微妙推理
推理能力GSM8K数学问题求解同上
语言理解HELM整体化综合评估框架无法完整代表自然对话或领域术语的复杂度
语言理解WinoGrande通过代词消解测试常识理解同上

关键认知:基准分数 ≠ 真实效果

必须清醒认识到,基准表现并不总能直接转化为真实世界的有效性。一个在学术基准上表现优异的模型,在特定领域应用或实际使用场景中仍可能遇到困难。这正是本单元强调"标准基准只是评估策略的一部分"的原因——它提供有价值的基线,但不应是唯一的评估手段。

替代评估方法

针对标准基准的局限,业界发展出多种替代评估方法:

  • LLM 作为评审(LLM-as-Judge):用一个语言模型评估另一个模型的输出,能提供比传统指标更细腻的反馈,但会带入评审模型自身的偏见与限制。
  • 评估竞技场(Evaluation Arenas):如 Anthropic 的 Constitutional AI Arena,让模型在受控环境中相互交互与评估,能揭示传统基准中不明显的强项与弱点。
  • 自定义基准套件(Custom Benchmark Suites):许多组织开发针对自身需求的内部基准套件,可包含领域知识测试或镜像真实部署条件的评估场景。

设计你自己的评估策略:四步方法论

标准基准提供了有用的基线,但不应成为唯一评估手段。以下是 units/vi/unit4/2.md 给出的完整方法论:

  1. 从相关标准基准起步:建立基线,并支持与其他模型的横向比较。
  2. 识别用例的具体要求与挑战:你的模型实际执行哪些任务?哪类错误影响最大?
  3. 开发反映真实用例的自定义评估数据集,可包含:领域内用户的真实提问、遇到过的常见边界情况(edge case)、特别困难的场景示例。
  4. 实施多层评估策略:自动指标(快速反馈)+ 人工评估(深入理解)+ 领域专家评审(专业应用)+ 受控环境下的 A/B 测试。

使用 LightEval 实操:任务格式与评估流水线

LightEval 任务定义格式

LightEval 任务使用如下固定格式定义:

{suite}|{task}|{num_few_shot}|{auto_reduce}

四个字段的含义分别是:

  • suite:基准套件名,例如mmlu、truthfulqa;
  • task:套件内的具体任务,例如abstract_algebra;
  • num_few_shot:注入 prompt 的示例数量(0 表示 zero-shot);
  • auto_reduce:当 prompt 过长时是否自动减少 few-shot 示例(取 0 或 1)。

例如,"mmlu|abstract_algebra|0|0"表示以 zero-shot 推理评估 MMLU 的抽象代数任务。

完整评估流水线示例

以下示例针对医疗领域选取了 MMLU 中四个相关任务进行自动评估(代码完整继承自 units/vi/unit4/2.md):

from lighteval.tasks import Task, Pipeline from transformers import AutoModelForCausalLM # 定义要评估的任务(医疗领域相关的 MMLU 子任务) domain_tasks = [ "mmlu|anatomy|0|0", "mmlu|high_school_biology|0|0", "mmlu|high_school_chemistry|0|0", "mmlu|professional_medicine|0|0" ] # 配置流水线参数 pipeline_params = { "max_samples": 40, # 评估的样本数量 "batch_size": 1, # 推理时的 batch 大小 "num_workers": 4 # worker 进程数量 } # 创建评估追踪器 evaluation_tracker = EvaluationTracker( output_path="./results", save_generations=True ) # 加载模型并创建流水线 model = AutoModelForCausalLM.from_pretrained("your-model-name") pipeline = Pipeline( tasks=domain_tasks, pipeline_parameters=pipeline_params, evaluation_tracker=evaluation_tracker, model=model ) # 运行评估 pipeline.evaluate() # 获取并展示结果 results = pipeline.get_results() pipeline.show_results()

运行后,结果以表格形式展示,包含每个任务的版本号、指标(metric)、数值与标准误差:

| Task |Version|Metric|Value | |Stderr| |----------------------------------------|------:|------|-----:|---|-----:| |all | |acc |0.3333|± |0.1169| |leaderboard:mmlu:_average:5 | |acc |0.3400|± |0.1121| |leaderboard:mmlu:anatomy:5 | 0|acc |0.4500|± |0.1141| |leaderboard:mmlu:high_school_biology:5 | 0|acc |0.1500|± |0.0819|

你还可以将结果载入 pandas DataFrame,按自己的方式可视化或进一步加工。更完整的交互式练习可运行 lighteval_evaluate_and_analyse_your_LLM.ipynb。

自定义评估任务与指标:LightEval 框架深入

领域专项任务往往需要专属的评估逻辑。LightEval 提供了灵活的框架来定义自定义任务(Task)与自定义指标(Metric)。

创建自定义任务

from lighteval.tasks import Task, Doc from lighteval.metrics import SampleLevelMetric, MetricCategory, MetricUseCase class CustomEvalTask(Task): def __init__(self): super().__init__( name="custom_task", version="0.0.1", metrics=["accuracy", "f1"], # 你选择的指标 description="描述你的自定义评估任务" ) def get_prompt(self, sample): # 将输入格式化为 prompt return f"Question: {sample['question']}\nAnswer:" def process_response(self, response, ref): # 处理模型输出并与参考答案比较 return response.strip() == ref.strip()

创建返回多值的样本级指标

from aenum import extend_enum from lighteval.metrics import Metrics, SampleLevelMetric, SampleLevelMetricGrouping import numpy as np # 定义样本级指标函数:每个样本返回多个分数 def custom_metric(predictions: list[str], formatted_doc: Doc, **kwargs) -> dict: """示例:每个样本返回多个指标值""" response = predictions[0] return { "accuracy": response == formatted_doc.choices[formatted_doc.gold_index], "length_match": len(response) == len(formatted_doc.reference) } # 创建一个每个样本返回多个值的指标组 custom_metric_group = SampleLevelMetricGrouping( metric_name=["accuracy", "length_match"], # 子指标名称 higher_is_better={ # 每个指标是否越高越好 "accuracy": True, "length_match": True }, category=MetricCategory.CUSTOM, use_case=MetricUseCase.SCORING, sample_level_fn=custom_metric, corpus_level_fn={ # 每个指标的聚合方式 "accuracy": np.mean, "length_match": np.mean } ) # 将指标注册进 LightEval extend_enum(Metrics, "custom_metric_name", custom_metric_group)

创建返回单值的简单指标

def simple_metric(predictions: list[str], formatted_doc: Doc, **kwargs) -> bool: """示例:每个样本返回单一分数""" response = predictions[0] return response == formatted_doc.choices[formatted_doc.gold_index] simple_metric_obj = SampleLevelMetric( metric_name="simple_accuracy", higher_is_better=True, category=MetricCategory.CUSTOM, use_case=MetricUseCase.SCORING, sample_level_fn=simple_metric, corpus_level_fn=np.mean # 跨样本聚合方式 ) extend_enum(Metrics, "simple_metric", simple_metric_obj)

注册后的自定义指标可在任务配置中引用,LightEval 会自动在所有样本上计算并按你指定的函数聚合。对于更复杂的指标,units/vi/unit4/3.md 还建议:利用格式化文档中的元数据(metadata)加权或调整分数、实现自定义的语料级聚合函数、为指标输入增加校验、记录边界情况与预期行为。

领域评估项目实战:Argilla + distilabel + LightEval 四步流水线

理论之外,仓库提供了一个完整的领域专项评估端到端示例(详见 v1/4_evaluation/project/README.md):从多份文档生成考题、人工标注校验、产出标准化数据集,再到用 LightEval 完成模型评估。项目由四个脚本组成,每个脚本对应一个步骤:

脚本职责
generate_dataset.py用指定语言模型从多个文本文档生成考题
annotate_dataset.py创建 Argilla 数据集,供人工标注生成的考题
create_dataset.py处理 Argilla 标注数据并创建 Hugging Face 数据集
evaluation_task.py定义用于评估语言模型的 LightEval 自定义任务

步骤 1:用 distilabel 生成考题

generate_dataset.py 读取输入目录中的所有.txt文档,使用distilabel的Pipeline与TextGeneration步骤,借助InferenceEndpointsLLM调用指定模型生成"问题 + 正确答案 + 干扰项(distractor)"。脚本通过 Pydantic 数据模型ExamQuestions约束输出为 JSON 结构,并内置了考试出题人的系统提示词与文档注入模板。运行方式:

python generate_dataset.py --input_dir path/to/your/documents --model_id your_model_id --output_path output_directory

默认模型为Qwen/Qwen2.5-7B-Instruct,--max_new_tokens默认 2048。产出是一个 Distiset 数据集,保存到输出目录。

步骤 2:用 Argilla 标注与校验

annotate_dataset.py 将生成的考题载入 Argilla:创建包含题目、四个选项等文本字段的数据集,并设置"正确选项"标签题与"改进题目/改进答案"文本题。脚本会随机打乱四个选项的顺序以避免偏差,同时把 LLM 建议的正确选项作为 suggestion 展示在界面中,供你或领域专家快速确认或改选。

运行方式:

python annotate_dataset.py --dataset_path path/to/distiset --output_dataset_name argilla_dataset_name

标注耗时取决于评估集规模、领域数据复杂度与 LLM 质量。若未部署 Argilla,可按其 quickstart 指南在本地或 Spaces 上部署(默认 API 地址为http://localhost:6900)。

步骤 3:创建标准化数据集并推送

create_dataset.py 读取 Argilla 中已标注的记录,同时处理"仅建议答案"(无人工响应时回退到 suggestion)与"人工标注答案"两种情况,最终生成包含题目、四个选项与正确选项列的数据集:

huggingface_hub login python create_dataset.py --dataset_path argilla_dataset_name --dataset_repo_id your_hf_repo_id

运行后数据集会被推送到 Hugging Face Hub 的指定仓库,形成可直接供 LightEval 消费的标准化评估集。

步骤 4:用 LightEval 评估模型

evaluation_task.py 是整套流水线的收官:它定义了prompt_fn(将数据集行转换为包含指令与四个选项的Doc对象)、自定义准确率指标(基于choices_logprob取np.argmin选择预测答案并对比gold_index),以及LightevalTaskConfig任务配置(指定 Hugging Face 数据集仓库、划分、指标等)。核心配置片段如下:

task = LightevalTaskConfig( name="example", prompt_function=prompt_fn, suite=["community"], hf_repo="burtenshaw/exam_questions", hf_subset="default", hf_avail_splits=["train"], evaluation_splits=["train"], few_shots_split=None, few_shots_select=None, metric=[custom_metric], )

随后即可用 LightEval 命令行评估任意模型:

lighteval accelerate \ --model_args "pretrained=HuggingFaceH4/zephyr-7b-beta" \ --tasks "community|exam_questions|0|0" \ --custom_tasks domain-eval/evaluation_task.py \ --output_dir "./evals"

注意这里的任务字符串community|exam_questions|0|0严格遵循前文介绍的{suite}|{task}|{num_few_shot}|{auto_reduce}四段式格式,而--custom_tasks指向自定义任务定义文件——这正是"标准格式 + 自定义任务"结合的典型用法。

最佳实践与可复现性

综合 units/vi/unit4/3.md 与领域评估项目,高质量的评估体系应遵循以下实践:

  • 详尽记录评估方法论,包括所有假设与局限;
  • 覆盖多样化的测试用例,涵盖领域的各个侧面;
  • 兼顾自动指标与人工评估,在合适的场景各取其长;
  • 对评估数据集与代码实施版本控制;
  • 定期更新评估套件,随着新边界情况与新需求的发现不断演进;
  • 评估数据集来源可优先考虑:专家标注(配合 Argilla 等工具提效)、去标识化的真实使用数据、LLM 合成后经专家校验的样本。

参考资源

  • LightEval 官方文档与仓库:lighteval评估库的完整参考;
  • Hugging Face Evaluation Guidebook:LLM 评估概念与实践的综合指南;
  • Argilla 文档:数据标注平台的使用说明;
  • MMLU 论文(arXiv 2009.03300):MMLU 基准的原始描述;
  • LightEval 自定义任务指南、新增指标指南与现有指标列表:分别对应任务与指标扩展的三个 Wiki 页面。

在仓库内,你可以进一步深入:自动基准课程、自定义评估课程、领域评估项目 以及 评估练习 Notebook 组成了从理论到实战的完整闭环——按照"标准基准建立基线 → 自定义数据集与指标贴近业务 → 端到端领域项目落地"的路径,即可为你的 smol model 打造一套既可比对又贴合实际的多层评估体系。

  • 教程
  • 人工智能
  • 大模型
  • NLP
  • 微调

【免费下载链接】smol-course

A course on aligning smol models.

项目地址:https://gitcode.com/gh_mirrors/smo/smol-course
点击查看免费下载

相关推荐

上一篇:LeRobot 数据集卡片模板解析:读懂 README 的生成骨架与发布原理
下一篇:Anthropic-Cybersecurity-Skills 威胁狩猎假设框架:从假设到验证的端到端狩猎工作流

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询