教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载主流评测基准MMLU、TruthfulQA 等衡量的是一般能力推理、数学、代码但在金融、法律、医疗等垂直领域中模型的表现往往无法用通用基准准确刻画。本篇文章以 smol-course 仓库中的 领域评测实战项目 为骨架完整讲解一条从领域文档生成评测数据 → 人工标注 → 构建 Hugging Face 数据集 → 用 LightEval 定义自定义任务并跑分的四步评估管线。读完本文你将掌握如何用 Distilabel 生成带干扰项的结构化考试题、用 Argilla 快速人工校验、以及如何在 LightEval 中注册自定义任务与自定义指标从而为自己的业务领域打造可复用的评测方案。为什么通用基准不够用自定义领域评估的动机大多数公开基准聚焦于通用能力例如 MMLU 覆盖 57 个学科的通识知识、GSM8K 侧重数学推理、WinoGrande 测试常识。这类基准的优势是标准化、可复现、便于跨模型对比但其局限也很明显基准分数高不等于在真实业务场景中表现好。如果你的用例集中在某个专业领域财务条款、法律条文、医学文献通用基准既无法覆盖领域术语也无法反映实际部署中的错误模式。针对这一缺口smol-course 的 自定义评估章节 与 自动基准章节 提出了一套综合策略先跑标准基准建立基线再围绕真实用例构建自定义评测数据集真实用户查询、常见边界情况、高难度场景最后叠加自动化指标、人工评估与领域专家评审等多层验证。本文要展开的project/目录就是这套策略中构建自定义评测数据集 自定义任务的完整落地示例。项目结构总览四个脚本对应四个阶段该实战项目位于 v1/4_evaluation/project/核心逻辑被拆分为四个脚本每个脚本对应一个独立阶段脚本阶段作用generate_dataset.py1. 生成数据用 Distilabel 从多个文本文档生成考试题含正确选项与干扰项annotate_dataset.py2. 人工标注将生成结果写入 Argilla 数据集供领域专家校验正确答案create_dataset.py3. 构建数据集处理 Argilla 标注结果生成并推送 Hugging Face 数据集evaluation_task.py4. 评测定义 LightEval 自定义任务与自定义准确率指标并执行评测示例的业务场景是根据多篇领域文档生成考试题。你完全可以把文档 → 考试题替换成文档 → 问答题/判断题等其他形态四个阶段的流程骨架是通用的。第一步用 Distilabel 从文档生成结构化考试题运行命令与参数进入project目录后按如下命令启动数据生成--input_dir指向存放.txt文档的目录python generate_dataset.py --input_dir path/to/your/documents --model_id your_model_id --output_path output_directory从源码 generate_dataset.py 看该脚本实际支持以下参数参数默认值说明--model_idQwen/Qwen2.5-7B-Instruct用于文本生成的模型 ID通过 HF Inference Endpoints 调用--tokenizer_idQwen/Qwen2.5-7B-Instruct配套的 tokenizer ID--input_dirdata输入文档目录目录下每个.txt文件视为一篇文档--max_new_tokens2048单次生成的最大新 token 数--output_pathexam_questions_output生成结果的保存目录需要注意项目文档中提到的默认模型为 Meta-Llama-3.1-8B-Instruct与当前仓库源码中的默认值Qwen/Qwen2.5-7B-Instruct并不一致实际生效的默认值以源码为准文档示例中的标注阶段则使用了 Llama-3.1-70B-Instruct。建议根据你的算力与领域质量要求自行选择模型。运行完成后输出目录下会得到一个 DistisetDistilabel 的多配置数据集对象其中包含针对输入目录中全部文档生成的考试题。源码拆解提示词、结构化输出与 Pipeline生成逻辑的核心在 generate_dataset.py可分四部分理解1. 文档装载。脚本遍历输入目录下所有.txt文件将每个文件内容作为一条独立的document记录构造成Dataset.from_dict({document: documents})。这里隐含一个假设每个文件是一篇关于同一主题的独立文档你可以按此约定组织自己的领域资料。2. 提示词设计。系统提示词将模型设定为面向学生的出题者并要求输出严格的 JSON 数组格式每个元素含question、answer和distractors三个字段其中distractors是错误但有迷惑性的选项列表指令模板INSTRUCTION_TEMPLATE则把当前文档插入到生成指令中SYSTEM_PROMPT \ You are an exam writer specialized in writing exams for students. Your goal is to create questions and answers based on the document provided, and a list of distractors, that are incorrect but viable answers to the question. Your answer must adhere to the following format: [ { question: Your question, answer: The correct answer to the question, distractors: [wrong answer 1, wrong answer 2, wrong answer 3] }, ... (more questions and answers as required) ] INSTRUCTION_TEMPLATE \ Generate a list of answers and questions about the document. Document:\n\n{{ instruction }}3. 结构化输出约束。脚本用 Pydantic 定义了ExamQuestion与ExamQuestions两个数据模型并把ExamQuestions.model_json_schema()传给 LLM 的structured_output参数格式为json。这样生成结果会被强制约束为合法 JSON且字段结构完全对齐后续评测任务需要的格式避免自由文本生成带来的解析问题。4. 流水线执行。脚本在Pipeline上下文内创建了一个名为exam_generation的TextGeneration任务其 LLM 使用InferenceEndpointsLLM需要环境变量HF_TOKEN提供 API 密钥通过input_mappings{instruction: document}把数据集中的document字段映射为指令、output_mappings{model_name: generation_model}记录生成模型名并设置input_batch_size8控制批大小。最终调用pipeline.run(..., use_cacheFalse, datasetdataset)并把结果save_to_disk(args.output_path)落盘。第二步用 Argilla 让领域专家校验标注LLM 生成的题目未必可靠——尤其是正确答案本身可能出错。第二步通过 annotate_dataset.py 把生成结果导入 Argilla让人最好是有领域背景的专家逐题确认或修正。运行命令与参数python annotate_dataset.py --dataset_path path/to/distiset --output_dataset_name argilla_dataset_name脚本支持的完整参数见 annotate_dataset.py参数默认值说明--argilla_api_keyargilla.apikeyArgilla API 密钥--argilla_api_urlhttp://localhost:6900Argilla 服务地址本地部署默认端口--dataset_pathexam_questions第一步生成的 Distiset 所在路径--dataset_configdefaultDistiset 中使用的配置名--dataset_splittrain使用的数据集划分--output_dataset_nameexam_questions写入 Argilla 的目标数据集名如果还没有 Argilla 环境可在本地或 Spaces 上按官方快速开始指南部署参见 v1/4_evaluation/README.md 中的资源说明。脚本启动时会先删除同名旧数据集再按以下结构重建文本字段fieldsquestion、answer_a、answer_b、answer_c、answer_d标注问题questions一个单选标注correct_answer四个选项标签以及两个可选的文本优化框improved_question改进题目与improved_answer改进最佳答案。源码拆解随机化选项 预填建议数据导入逻辑在 annotate_dataset.py从 Distiset 中读取每条generation记录json.loads(...)[exam]取出题目列表对每题用choices(distractors, k3)从干扰项中抽取 3 个拼上正确答案后用sample(...)打乱顺序写入answer_a~answer_d四个字段记录正确答案被打乱后的位置通过rg.Suggestion(question_namecorrect_answer, valueanswer_names[suggestion_idx])把LLM 认为的正确选项作为建议预填到标注界面但专家仍可改选其他选项。选项随机化是为了避免标注者因选项固定顺序而产生位置偏差建议预填则让标注工作退化为确认/纠错大幅降低人工成本。项目文档给出的实测参考在迁移学习领域使用 Llama-3.1-70B-Instruct 生成的题目1 小时内完成了 150 个样本的标注主要工作就是确认正确选项、剔除错误项。标注界面如下图所示第三步把标注结果转成 Hugging Face 评测数据集标注完成后create_dataset.py 负责把 Argilla 中的记录导出为标准的 Hugging Face 数据集并推送到 Hub。运行命令与参数huggingface_hub login python create_dataset.py --dataset_path argilla_dataset_name --dataset_repo_id your_hf_repo_id脚本参数见 create_dataset.py参数默认值说明--argilla_api_keyargilla.apikeyArgilla API 密钥--argilla_api_urlhttp://localhost:6900Argilla 服务地址--dataset_pathexam_questions要导出的 Argilla 数据集名--dataset_repo_idburtenshaw/exam_questions推送目标 Hugging Face 数据集仓库 ID源码拆解建议与人工响应如何取舍核心处理逻辑在 create_dataset.pyfor record in dataset.records(with_suggestionsTrue, with_responsesTrue): row record.fields if len(record.responses) 0: answer record.suggestions[correct_answer].value row[correct_answer] answer else: for response in record.responses: if response.question_name correct_answer: row[correct_answer] response.value dataset_rows.append(row)即标注者未作答responses为空时采用建议值已作答时采用人工响应值。最终每个样本包含question、answer_a~answer_d、correct_answer五个字段并由hf_dataset.push_to_hub(repo_idargs.dataset_repo_id)推送。这样一个字段结构完全确定的train划分数据集就是第四步 LightEval 自定义任务的输入。数据集在 Hub 上的查看效果如下第四步定义 LightEval 自定义任务并执行评测最后一步是 evaluation_task.py它把上一步的数据集包装成 LightEval 可识别的自定义任务。运行命令lighteval accelerate \ --model_args pretrainedHuggingFaceH4/zephyr-7b-beta \ --tasks community|exam_questions|0|0 \ --custom_tasks domain-eval/evaluation_task.py \ --output_dir ./evals其中--custom_tasks指向自定义任务文件--tasks使用 LightEval 的任务字符串格式{suite}|{task}|{num_few_shot}|{auto_reduce}格式说明详见 automatic_benchmarks.mdcommunity为自定义任务归属的套件名0|0表示零样本且不自动裁剪 few-shot 示例。注意当前仓库源码 evaluation_task.py 中LightevalTaskConfig的name字段为example且文件尾部注释里的示例命令为community|example|0|0与项目文档命令中的exam_questions不一致。实际使用时任务字符串中间段必须与你配置中的任务name完全一致例如当前源码应写为community|example|0|0若你要用文档中的写法需先把name改成exam_questions。源码拆解prompt 函数、自定义指标与任务配置1. prompt 函数evaluation_task.py把数据集行转换为Doc对象将question组装成指令型问句Choose the correct answer for the following exam question: ...把answer_a~answer_d作为choices注意每个选项前都加了一个空格前缀并用[answer_a, answer_b, answer_c, answer_d].index(line[correct_answer])算出标准答案的下标gold_index。2. 自定义准确率指标evaluation_task.pydef 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, )这里用choices_logprob各选项的对数概率取模型预测的选项下标与gold_index比较得到样本级是否正确再由np.mean聚合成语料级准确率——这就是一个典型的多选客观题评估指标定义方式。如果希望调整判定逻辑例如取argmax、加惩罚项或返回多个分数可参照 custom_evaluation.md 中的SampleLevelMetric/SampleLevelMetricGrouping用法扩展。3. 任务配置与注册evaluation_task.pytask 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 [task]其中hf_repo指向第三步推送的数据集仓库metric传入自定义指标列表。文件末尾的TASKS_TABLE [task]是 LightEval 加载自定义任务的约定入口LightEval 会读取该文件中的TASKS_TABLE把其中的LightevalTaskConfig注册进community套件。命令行运行时只需把该.py文件路径传给--custom_tasks即可。从示例到生产注意事项与最佳实践把上述四步管线迁移到自己的领域时有几点值得注意数据质量决定评估质量LLM 生成只是初稿务必经过领域专家的人工校验项目文档给出的经验是 150 个样本约需 1 小时标注工作量可控前提是生成模型的题目质量足够高高比例的仅需确认。选项结构与随机化生成端用 Pydantic 强制 JSON 结构、标注端随机化选项顺序、导出端记录真实标准答案三个环节共同保证后续指标计算的可靠性不要随意跳过其中任何一环否则会出现答案列错位这类隐性错误。任务字符串与配置对齐--tasks中的任务名、--custom_tasks文件路径、配置里的name、suite、hf_repo必须一一对应改动数据集后记得同步更新hf_repo/hf_subset/hf_avail_splits。评估策略分层自定义领域评测是完整评估策略的一部分应叠加 自动基准 建立基线、人工评估补充细节、领域专家评审把关专业性参见 custom_evaluation.md 的 Best Practices 一节。环境要求生成阶段需要HF_TOKENInference Endpoints API 密钥与可用的推理端点标注阶段需要运行中的 Argilla 服务导出阶段需要已登录的huggingface_hub。课程依赖可通过仓库根目录的requirements.txt或uv sync安装参见 v1/README.md 的安装说明。延伸阅读领域评测实战项目 README本文对应的原始项目文档自定义领域评估指南自定义任务、自定义指标的通用方法论自动评测基准指南LightEval 任务字符串格式与结果解读评测模块总览自动基准、自定义评估与领域实战项目的整体编排评测练习 Notebook用 LightEval 评估、对比模型在特定领域的表现关于自定义任务与指标的更细粒度 API 说明可参考 LightEval 官方 wiki 中 Adding a Custom Task 与 Adding a New Metric 等文档仓库文档中给出了对应链接。整体而言这条生成 → 标注 → 建集 → 评测的管线把领域知识与模型评估衔接了起来是让评测结果真正贴合业务场景的实用路径。赞分享教程人工智能大模型NLP微调【免费下载链接】smol-courseA course on aligning smol models.项目地址https://gitcode.com/gh_mirrors/smo/smol-course点击查看免费下载相关推荐smol-course 模型评估实战用 LightEval 跑通自动基准与领域定制评估附 Argilla Distilabel 端到端流水线smol course 模型评估实战用 LightEval 跑通自动基准与领域定制评估附 Argilla Distilabel 端到端流水线 评估是语教程人工智能大模型NLP微调Smol Course 自定义领域评估指南用 LightEval 构建专属评估管线Smol Course 自定义领域评估指南用 LightEval 构建专属评估管线 本篇指南基于 Smol Course 第 4 模块评估中的 custo教程人工智能大模型NLP微调smol-course 自定义领域评估实战基于 LightEval 构建领域专属评测流水线smol course 自定义领域评估实战基于 LightEval 构建领域专属评测流水线 通用基准benchmark如 MMLU 只能反映模型的通用能力教程人工智能大模型NLP微调上一篇多语言支持详解All Contributors如何实现12种语言本地化下一篇揭秘Faster-Whisper本地语音识别性能突破的实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考