
第19题微调数据集如何构造效果如何评估1. 核心回答微调数据集的构造可以分成四个步骤先定义微调目标 → 构造高质量样本 → 严格划分训练集、验证集和测试集 → 用独立测试集比较微调前后的真实任务效果。如果做的是监督微调Supervised Fine-Tuning, SFT一条数据通常可以抽象为(xi,yi) (x_i,y_i)(xi,yi)其中xix_ixi是实际任务输入yiy_iyi是期望模型生成的高质量答案。对于聊天模型可以进一步表示为system → user → assistant数据设计的核心要求是训练样本应尽可能接近模型最终部署时真正会遇到的输入分布和期望输出形式。2. 先明确为什么要微调构造数据之前我会先定义微调到底要改变模型的什么能力。常见目标包括学习特定任务例如分类、信息抽取、代码生成学习稳定的输出格式例如固定 JSON Schema学习领域任务的处理流程学习特定回答规范提高某类输入上的指令遵循能力。例如如果目标是“漏洞报告结构化抽取”训练样本应该直接对应漏洞报告 → 结构化字段而不能主要使用普通安全问答数据。因此需要先定义Task Input→Expected Output \text{Task Input} \rightarrow \text{Expected Output}Task Input→Expected Output这个映射随后决定数据来源、标签方式和评估指标。3. 微调数据集怎么构造我会从真实任务分布开始收集数据。优先级通常是真实生产或历史任务数据经过专家标注的数据高质量公开数据人工设计的边界样本和困难样本合成数据经过规则或人工复核后加入。每条数据至少需要记录输入内容标准答案数据来源任务类别时间数据版本标签来源或标注者数据许可和隐私状态。如果涉及用户数据、代码、日志或企业内部数据还需要先完成脱敏和权限检查。对于 SFT我通常会覆盖几类样本样本类型作用正常样本学习主要任务边界样本学习决策边界困难样本避免只依赖简单表面特征拒答样本学习信息不足或越界时的行为长输入样本测试长上下文能力少数类别样本防止数据分布严重失衡数据量本身不能单独决定微调质量。大量重复、错误或低质量样本可能进一步强化错误模式。4. 数据清洗和去重怎么做首先进行基础清洗例如删除明显错误标签清理乱码和无效文本统一字段格式删除无法解析的数据修正异常长度样本删除敏感信息检查答案是否真正对应输入。随后进行 Exact Deduplication 和 Near-Deduplication。例如下面两条如何使用 PyTorch 实现多头注意力和请问 PyTorch 里面怎么实现 multi-head attention语义上可能高度接近。如果其中一条进入训练集另一条进入测试集测试结果可能高估模型的泛化能力。研究已经发现语言模型训练语料中的重复数据会增加记忆现象同时训练集与验证集之间的重复会影响评测可信度。因此我会先识别完全重复模板重复高度相似文本同一原始样本的不同改写同一个问题生成的多个近似版本。然后让同一组高度相关样本进入同一个数据划分。5. 训练集、验证集和测试集如何划分三个集合承担不同功能Training Set更新模型参数Validation Set选择超参数、checkpoint 和训练策略Test Set最终评估模型泛化能力。测试集不能用于调整模型、选择 Prompt 或选择超参数。简单情况下可以采用例如80% Train / 10% Validation / 10% Test但实际项目中怎么切分通常比具体比例更重要。例如同一个用户产生了 100 条高度相关数据。如果随机切分80条 → Train10条 → Validation10条 → Test模型可能已经在训练阶段学习到这个用户高度固定的输入模式。因此实际项目中我会根据数据生成机制选择 Group Split例如按用户切分按项目切分按代码仓库切分按漏洞切分按文档切分按攻击活动切分。如果系统面向未来数据还应该进行 Time Split过去数据→Train \text{过去数据} \rightarrow \text{Train}过去数据→Train较新的数据→Validation \text{较新的数据} \rightarrow \text{Validation}较新的数据→Validation未来时间段→Test \text{未来时间段} \rightarrow \text{Test}未来时间段→Test这样更接近真实部署场景。此外所有需要从数据中“学习”的预处理操作都只能在训练集上拟合再应用到验证集和测试集避免 Data Leakage。6. 怎么判断微调有没有效果训练 Loss 只能用于观察优化过程。例如Ltrain↓ L_{\text{train}}\downarrowLtrain↓说明模型越来越能够拟合训练样本。这个现象不能单独证明真实任务能力提高。我会首先建立Base Model Baseline。也就是在微调之前用完全相同的测试集测一次原始模型Mbase M_{\text{base}}Mbase微调完成后再测试Mft M_{\text{ft}}Mft然后比较$$\DeltaMetric(M_{\text{ft}})Metric(M_{\text{base}})$$这样才能直接回答微调究竟带来了多少增量。比较时需要尽量固定测试数据Prompt解码参数最大输出长度工具权限评测程序。7. 不同任务应该使用什么指标评估指标必须与任务目标一致。7.1 分类任务可以使用PrecisionTPTPFP Precision\frac{TP}{TPFP}PrecisionTPFPTPRecallTPTPFN Recall\frac{TP}{TPFN}RecallTPFNTPF12Precision⋅RecallPrecisionRecall F1 2\frac{Precision\cdot Recall} {PrecisionRecall}F12PrecisionRecallPrecision⋅Recall类别不平衡时还应考虑 PR-AUC、Macro-F1 等指标。7.2 信息抽取任务可以使用Exact MatchPrecisionRecallF1字段级准确率。7.3 代码生成任务优先使用可以执行的验证方式例如Unit Test Pass RateCompilation RatePassk功能正确率。7.4 开放式生成任务ROUGE、BLEU 等字符串相似度通常只能覆盖部分质量。可以进一步设计明确的评分 Rubric例如正确性完整性指令遵循格式正确性事实一致性是否出现幻觉。然后使用人工专家评分规则评分器模型评分器进行评估。如果使用 LLM-as-a-Judge也需要先用人工标注样本检查评分器与人工判断的一致性避免直接把 Judge 的输出当成真值。8. 还需要评估哪些泛化能力平均分提高仍然可能掩盖局部退化。因此我会进一步做 Slice Evaluation。例如分别统计简单样本困难样本长输入短输入常见类别少数类别不同领域不同用户不同时间段。假设整体 F1 从0.82→0.87 0.82\rightarrow0.870.82→0.87但少数类别从0.71→0.55 0.71\rightarrow0.550.71→0.55那么这个微调结果仍然存在明显问题。同时还需要检查原模型已有能力是否下降幻觉率是否增加拒答能力是否变化安全能力是否退化推理延迟是否变化输出 Token 数是否显著增长。这相当于检查微调产生的收益和副作用。9. 一个完整的实验流程如果让我实际做一次微调我会按照下面的顺序定义任务和成功指标↓收集真实任务数据↓清洗、脱敏、去重和质量审核↓根据用户/项目/时间等自然边界划分 Train / Validation / Test↓在 Test Set 上记录 Base Model 基线↓只使用 Train Set 训练↓使用 Validation Set 选择超参数和 Checkpoint↓冻结模型设计↓在独立 Test Set 上比较 Base Model 和 Fine-tuned Model↓进行困难样本、长尾类别和域外数据切片分析↓分析失败案例最终需要证明三件事主任务指标确实提高提高能够泛化到未见数据没有产生不可接受的能力退化、安全风险或成本增加。只有这三点同时成立我才会认为这次微调真正有效。10. 面试时可以压缩成下面这段微调数据首先要从任务目标出发。如果做 SFT我会把真实任务整理成input → expected output的高质量样本同时保留数据来源、任务类别和时间等元信息。数据处理阶段重点做清洗、去重、脱敏和标签审核。切分时我会特别防止数据泄漏。对于同一用户、项目、代码仓库或高度相似样本我会按 group 隔离如果模型最终处理未来数据还会做时间切分。训练集用于更新参数验证集用于调参测试集只用于最终评估。效果评估时我会先记录原始模型 baseline再在完全相同的测试集和推理条件下比较微调后的模型。具体指标根据任务选择例如分类看 Precision、Recall、F1代码生成看 Unit Test Pass Rate开放式生成使用明确 rubric 的人工或模型评分。最后还会做长输入、困难样本、少数类别和域外数据的切片评测并检查幻觉、安全、延迟和原有能力退化。这样才能确认微调提升来自真正的任务泛化能力。11. 来源Hugging Face Documentation,Splits and subsets说明 Train、Validation 和 Test 的不同职责。Hugging Face Evaluate,Considerations for model evaluation说明独立数据划分和任务评估的基本原则。scikit-learn Documentation,Common pitfalls and recommended practices — Data leakage说明测试数据进入模型训练或预处理会造成过度乐观的评估。scikit-learn Documentation,GroupShuffleSplit说明可以按照用户、年份或其他领域实体进行分组隔离。Lee et al.,Deduplicating Training Data Makes Language Models Better, ACL 2022研究训练数据去重、模型记忆以及训练—验证数据重叠问题。OpenAI API Documentation,Fine-tuning说明微调数据需要按照具体训练方式组织并支持独立 Validation Data。OpenAI API Documentation,Evals / Graders说明可以使用字符串、文本相似度、程序和模型评分器等不同方式构造任务评测。