smol-course 自定义领域评估实战:基于 LightEval 构建领域专属评测流水线

发布时间:2026/10/9 4:39:27
smol-course 自定义领域评估实战:基于 LightEval 构建领域专属评测流水线
教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载通用基准benchmark如 MMLU 只能反映模型的通用能力而真实业务医疗、金融、法律等往往需要贴合自身领域的评测方案。本指南以 smol-course 仓库中的 自定义领域评估文档对应英文版 custom_evaluation.md为主体系统讲解如何设计评估策略、用 LightEval 实现自定义任务与自定义指标并依托仓库内完整的领域评估项目v1/vi/4_evaluation/project带你走通生成数据 → 人工标注 → 构建数据集 → 评测模型的端到端流水线。读完本文你将能独立为自己的领域打造一套可复现、可扩展的模型评估方案。设计评估策略从明确目标开始一套完整的自定义评估策略起点是清晰的目标。在开始写任何代码之前请先回答一个问题你的模型在目标领域里必须展现哪些具体能力这些能力可能包括技术性知识如医学领域的药理机制、金融领域的会计准则推理模式如法律案例分析、多步财务计算领域特有格式如诊断报告、合同条款、交易流水等输出格式。把这些需求认真记录下来它们将同时指导后续任务task设计和指标metric选择——任务决定了模型要面对什么样的输入指标决定了什么样的输出算好。评估还应同时覆盖标准用例与边界用例edge case。例如医疗领域既要评估常见诊断场景也要评估罕见病症金融应用既要测试常规交易也要测试涉及多币种或特殊条件的复杂边界情况。边界用例往往是领域评估区分度最高的部分。使用 LightEval 实现自定义评估任务LightEval 提供了灵活的框架来落地自定义评估。领域文档给出了一种基于Task基类的最小实现范式from lighteval.tasks import Task, Doc from lighteval.metrics import SampleLevelMetric, MetricCategory, MetricUseCase class CustomEvalTask(Task): def __init__(self): super().__init__( namecustom_task, version0.0.1, metrics[accuracy, f1], # 你选择的指标 descriptionDescription of your custom evaluation task ) def get_prompt(self, sample): # 将输入格式化为 prompt return fQuestion: {sample[question]}\nAnswer: def process_response(self, response, ref): # 处理模型输出并与参考答案比较 return response.strip() ref.strip()这个类体现了一个评估任务的核心职责get_prompt负责把数据集样本构造成模型输入process_response负责把模型原始输出加工成可与参考值比较的结果metrics声明该任务使用哪些指标。仓库中的现代实现LightevalTaskConfig从源码结构看仓库内领域评估项目 evaluation_task.py 采用了 LightEval 更新的声明式 API——LightevalTaskConfig更适合任务即配置、随命令行加载的使用方式。其核心结构如下import numpy as np from lighteval.tasks.lighteval_task import LightevalTaskConfig from lighteval.tasks.requests import Doc from lighteval.metrics.utils.metric_utils import ( SampleLevelMetric, MetricCategory, MetricUseCase, ) def prompt_fn(line, task_name: str None): Converts a dataset line to a Doc object for evaluation. instruction Choose the correct answer for the following exam question: return Doc( task_nametask_name, queryf{instruction} {line[question]}, choices[ f {line[answer_a]}, f {line[answer_b]}, f {line[answer_c]}, f {line[answer_d]}, ], gold_index[answer_a, answer_b, answer_c, answer_d].index( line[correct_answer] ), instructioninstruction, ) def sample_level_fn(formatted_doc: Doc, **kwargs) - bool: response np.argmin(kwargs[choices_logprob]) return response formatted_doc.gold_index custom_metric SampleLevelMetric( metric_nameexam_question_accuracy, higher_is_betterTrue, categoryMetricCategory.MULTICHOICE, use_caseMetricUseCase.NONE, sample_level_fnsample_level_fn, corpus_level_fnnp.mean, ) task LightevalTaskConfig( nameexample, prompt_functionprompt_fn, suite[community], hf_repoburtenshaw/exam_questions, hf_subsetdefault, hf_avail_splits[train], evaluation_splits[train], few_shots_splitNone, few_shots_selectNone, metric[custom_metric], ) # 任务必须注册到 TASKS_TABLE 中LightEval 才能发现它 TASKS_TABLE [task]几点值得注意的实现细节prompt_fn把数据集每一行转换成一个Doc对象query是发给模型的提问choices是四个候选答案gold_index通过[answer_a, ...].index(line[correct_answer])计算标准答案的位置sample_level_fn利用choices_logprob各候选答案的对数概率直接取概率最高的选项作为模型预测避免了自回归生成带来的不确定性这也是多选题评测的常用技巧任务通过suite[community]归入社区套件因此命令行任务名以community|开头文件末尾把任务放入TASKS_TABLE列表这是 LightEval 通过--custom_tasks加载自定义任务文件的约定入口该脚本还内置了if __name__ __main__的自检逻辑可打印任务名与数量验证注册成功。运行自定义任务在 项目 README 中使用lighteval accelerate一行命令即可对模型执行自定义评测示例使用zephyr-7b-betalighteval accelerate \ --model_args pretrainedHuggingFaceH4/zephyr-7b-beta \ --tasks community|exam_questions|0|0 \ --custom_tasks domain-eval/evaluation_task.py \ --output_dir ./evals其中--tasks community|exam_questions|0|0的格式为套件名|任务名|样本数|随机种子--custom_tasks指向你编写的任务文件。evaluation_task.py末尾注释中还给出了配合 smol-course 系列模型的用法示例将pretrained换成HuggingFaceTB/SmolLM2-135M-Instruct即可对 smol 模型跑同样的评测。自定义指标捕获领域相关的性能维度领域专属任务往往需要专属指标——通用准确率未必能反映领域内的关键差异。LightEval 提供了灵活的机制创建自定义指标并在注册后自动应用于所有样本、按你指定的函数完成语料级corpus-level聚合。多值样本级指标指标分组当每个样本需要返回多个分数时使用SampleLevelMetricGroupingfrom 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: Example metric that returns multiple scores per sample 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 }, categoryMetricCategory.CUSTOM, use_caseMetricUseCase.SCORING, sample_level_fncustom_metric, corpus_level_fn{ # 每个指标的聚合方式 accuracy: np.mean, length_match: np.mean } ) # 将指标注册进 LightEval extend_enum(Metrics, custom_metric_name, custom_metric_group)这段代码中sample_level_fn返回一个字典每个键对应一个子指标corpus_level_fn则按指标名分别指定聚合函数这里都用np.mean求平均。单值简单指标若每个样本只需要一个分数用更轻量的SampleLevelMetric即可def simple_metric(predictions: list[str], formatted_doc: Doc, **kwargs) - bool: Example metric that returns a single score per sample response predictions[0] return response formatted_doc.choices[formatted_doc.gold_index] simple_metric_obj SampleLevelMetric( metric_namesimple_accuracy, higher_is_betterTrue, categoryMetricCategory.CUSTOM, use_caseMetricUseCase.SCORING, sample_level_fnsimple_metric, corpus_level_fnnp.mean # 跨样本的聚合方式 ) extend_enum(Metrics, simple_metric, simple_metric_obj)注册完成后即可在评估任务的配置中引用这些自定义指标。指标会自动在所有样本上计算并按你指定的函数聚合输出。仓库 evaluation_task.py 中exam_question_accuracy就是一个真实的单值指标实例——它用np.argmin(choices_logprob)预测选项、与gold_index比较得到布尔值再以np.mean聚合为整体准确率。更复杂指标的进阶方向文档还给出了复杂指标的设计建议在格式化文档formatted doc中利用metadata对分数加权或调整为语料级统计实现自定义聚合函数如按领域子类分组求均值为指标输入添加校验检查validation checks防止脏数据污染结果记录边界情况与预期行为保证指标可解释、可复现。构建评估数据集高质量评估依赖精心整理的数据集。文档给出三条数据集构建路径专家标注Expert Annotation与领域专家协作创建并验证评估样本像 Argilla 这样的标注工具能显著提升效率真实世界数据Real-World Data收集并匿名化真实使用数据确保其代表实际部署场景注意合规与隐私合成生成Synthetic Generation先用 LLM 生成初始样本再由专家验证与精修——这是快速扩充领域数据、同时保证质量的主流方式。仓库完整流水线从文档到评测结果仓库在 领域评估项目 中提供了一个可直接运行的端到端示例聚焦从多份文档生成考试题场景用 Argilla、distilabel 与 LightEval 三个工具串成四步流水线每个步骤一个脚本脚本作用generate_dataset.py用指定 LLM 从多份文本文档生成评估题目annotate_dataset.py创建 Argilla 数据集供人工标注生成的题目create_dataset.py处理 Argilla 标注结果生成 Hugging Face 数据集evaluation_task.py定义 LightEval 自定义任务评测模型第 1 步生成题目。generate_dataset.py基于distilabel构建生成流水线。它把所有.txt文档读入一个Dataset用系统提示词system prompt约束模型输出 JSON 格式的问题 正确答案 三个干扰项并通过 Pydantic 数据模型ExamQuestion/ExamQuestions做结构化输出校验。当前代码默认模型为Qwen/Qwen2.5-7B-InstructREADME 示例中曾用 Llama 系列均可通过参数更换输出保存为 Distiset 格式。运行方式python generate_dataset.py --input_dir path/to/your/documents --model_id your_model_id --output_path output_directory第 2 步人工标注。annotate_dataset.py把生成的题目灌入 Argilla 数据集四个选项被随机打乱顺序以避免位置偏差同时把 LLM 建议的正确选项以suggestion形式展示给标注者由你或领域专家逐条批准或改选。标注者还可以通过improved_question、improved_answer文本框优化问题本身。运行方式python annotate_dataset.py --dataset_path path/to/distiset --output_dataset_name argilla_dataset_name该脚本也接受--argilla_api_key默认argilla.apikey与--argilla_api_url默认http://localhost:6900参数以连接自建的 Argilla 服务。上图即 Argilla 中的标注界面标注者看到随机排列的四个选项与 LLM 建议可快速批准或修正正确项。作为效率参考项目 README 记录了一个真实案例在迁移学习transfer learning领域使用 Llama-3.1-70B-Instruct 生成的数据1 小时内即可完成 150 个样本的标注主要工作就是批准正确选项、剔除错误项——标注耗时取决于数据集规模、领域复杂度和生成 LLM 的质量。第 3 步构建标准数据集。create_dataset.py读取 Argilla 标注结果优先采用标注者的最终回答responses无人工回答时回退到 LLM 建议suggestions最终生成包含question、四个选项列与correct_answer列的数据集并推送到 Hugging Face Hubhuggingface_hub login python create_dataset.py --dataset_path argilla_dataset_name --dataset_repo_id your_hf_repo_id上图是推送后的数据集在 Hub 查看器中的预览效果correct_answer列值为answer_a/answer_b等正是第 4 步评测任务计算gold_index的依据。第 4 步评测模型。即前面介绍的 evaluation_task.py将上一步的hf_repo配置进LightevalTaskConfig再用lighteval accelerate运行评测即可得到领域准确率。评估最佳实践文档总结了保持评估长期有效的核心准则完整记录评估方法论包括所有假设与局限便于他人复现与审计纳入多样化测试用例覆盖领域的各个侧面含边界情况酌情结合自动指标与人工评估自动指标可规模化、人工评估可捕捉语义质量对评估数据集和代码做版本控制version control保证结果可追溯持续更新评估套件随着新边界情况或新需求的发现定期扩充。参考资料与下一步围绕本文主题可以继续深入以下材料领域评估项目的完整流水线v1/vi/4_evaluation/project/README.md配套脚本 generate_dataset.py、annotate_dataset.py、create_dataset.py、evaluation_task.py配套练习 notebooklighteval_evaluate_and_analyse_your_LLM.ipynb包含由易到难的三级练习用医疗领域任务评测模型 → 用不同 MMLU 任务构建新领域评测 → 为自己的领域创建自定义评测任务本单元其他文档自动基准评估 与 4 单元 READMELightEval 官方文档中的自定义任务指南、自定义指标指南与指标列表Adding-a-Custom-Task、Adding-a-New-Metric、Metric-ListArgilla 标注文档以及 Hugging Face 的 evaluation guidebook 通用评估原则。从明确领域目标、设计任务与指标到用 Argilla distilabel 构建高质量数据集再到用 LightEval 落地评测——这套方法论既适用于 smol-course 中的小模型也完全可扩展到更大规模的领域模型评估。当通用基准无法回答我的模型在我的业务里到底行不行时自定义领域评估就是那个最可靠的答案。赞分享教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载相关推荐smol-course 自定义领域评估实战基于 LightEval 构建任务、指标与数据集评估管线smol course 自定义领域评估实战基于 LightEval 构建任务、指标与数据集评估管线 本指南聚焦 smol course 第 4 单元的核心主题教程人工智能大模型NLP微调smol-course 评估模块实战用 LightEval 构建从自动基准到领域定制的 LLM 评估体系smol course 评估模块实战用 LightEval 构建从自动基准到领域定制的 LLM 评估体系 本篇技术指南围绕 smol course 仓库葡萄牙教程人工智能大模型NLP微调smol-course 模型评估实战用 LightEval 搭建从标准基准到领域自定义的 LLM 评测体系smol course 模型评估实战用 LightEval 搭建从标准基准到领域自定义的 LLM 评测体系 本篇技术指南围绕 smol course 项目日语教程人工智能大模型NLP微调上一篇深入解析EPUBCheck核心架构OCF、OPF、CSS检查器实现原理下一篇Python 类型注解Type Hints入门驱动 FastAPI 声明式 API 的基石创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考