ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

LLM 微调实战(6):评测集是护城河:微调效果的自动化评测

LLM 微调实战(6):评测集是护城河:微调效果的自动化评测 承接与场景数据配比表第五篇交出来那天宠物医疗连锁的分诊助手项目组吵了一架有人说我试了 20 个 case微调后明显变好有人说我试了 10 个没区别。两拨人都是真诚的也都是错的——他们各自跑了一份手搓的、规模不同的、没有版本管理的评测。本篇把效果好不好从主观争论变成可复现的测量一套三层自动评测流水线加一本关于统计显著性的账。需要先声明标题里那句容易被当成口号的话评测集是护城河因为基座会换、数据会重造、训练栈会升级唯有一批代表真实分布、被严格隔离、能持续追加的评测题是跨所有实验的稳定参照系——它决定你能否在两次微调之间做出正确决策。实验仍是标准库确定性模拟生产可替换 deepeval/promptfoo 或自建 LLM judge 服务。三层评测从可判定到难判定第一层硬规则输出必须能通过机械检查——JSON schema、必备字段分诊等级取值域、禁用词、长度窗口。这层是布尔值零歧义成本最低必须全量跑。第二层参考相似度与专家参考答案的字符级 ROUGE-L本质是最长公共子序列比率、关键事实点的命中率正则或枚举匹配。它抓得住答案对不对的大头但对同义改写不宽容分数会系统性低估——没关系低估是有偏但稳定稳定就能做纵向对比。第三层质量 rubric简洁度、语气、危险建议的零容忍检查可用小模型或 LLM judge 按维度打分加权。本实验手写一个迷你版格式 0.3 ROUGE-L 0.4 简洁度 0.3。三层合流成一个 0~1 的综合分但报告时永远分层给明细——综合分用来排序明细用来归因是格式塌了还是内容错了修法完全不同。实验一迷你评测流水线8 个分诊案例4 紧急度 × 犬猫基座输出与微调输出各一份跑完整流水线自动评测流水线: 格式精确匹配 ROUGE-L rubric 加权综合, 确定性。REQUIRED[分诊等级,建议]RUBRIC{格式:0.3,内容重合:0.4,简洁:0.3}deflcs_len(a,b):prev[0]*(len(b)1)foriinrange(len(a)):cur[0]forjinrange(len(b)):cur.append(prev[j]1ifa[i]b[j]elsemax(prev[j1],cur[j]))prevcurreturnprev[-1]defrouge_l(ref,hyp):r,hlist(ref),list(hyp)llcs_len(r,h)pl/len(h)ifhelse0.0rcl/len(r)ifrelse0.0return2*p*rc/(prc)ifprcelse0.0defconciseness(ref,hyp):ratiolen(hyp)/max(1,len(ref))return1.0ifratio1.5elseround(1.5/ratio,3)defscore(ref,hyp):fmt1.0ifall(tinhypfortinREQUIRED)else0.0return(RUBRIC[格式]*fmtRUBRIC[内容重合]*rouge_l(ref,hyp)RUBRIC[简洁]*conciseness(ref,hyp))CASES[(分诊等级: 紧急。建议: 猫持续呕吐伴精神萎靡超24小时, 疑似异物梗阻, 请立即送医拍片。,猫咪呕吐的话建议禁食观察一下, 可能吃坏肚子了, 不放心可以去医院。,分诊等级: 紧急。建议: 持续呕吐超过24小时且精神差, 高度怀疑异物梗阻, 请立即送医影像学检查, 勿自行禁食观察。),(分诊等级: 常规。建议: 犬年度疫苗到期, 预约全科门诊接种, 接种前后各观察三日。,建议尽快带狗狗去接种疫苗哦, 疫苗对狗狗健康很重要, 记得问医生注意事项和禁忌事项有哪些等等问题。,分诊等级: 常规。建议: 预约门诊接种年度疫苗, 接种当天体温正常方可注射, 前后三天避免洗澡与剧烈运动。),(分诊等级: 半紧急。建议: 公猫排尿困难频繁进猫砂盆, 下尿路梗阻风险, 六小时内就医导尿。,可能是泌尿系统问题, 建议多喝水, 观察两天看看情况是否有所好转。,分诊等级: 半紧急。建议: 频繁做出排尿姿势但尿量少是导尿管梗阻前兆, 请在六小时内送医处理, 途中勿按压腹部。),(分诊等级: 常规。建议: 幼犬咬胶吞咽后无干呕呼吸顺畅, 可居家观察48小时待其排出。,分诊等级: 紧急。建议立刻送医催吐, 异物堵塞消化道非常危险, 必须马上去医院进行检查。,分诊等级: 常规。建议: 精神状态与呼吸正常则居家观察两日, 出现呕吐或食欲废绝再急诊。),(分诊等级: 半紧急。建议: 犬腹泻带血但精神尚可, 考虑出血性肠胃炎, 当日门诊便检。,拉血比较严重, 建议当天就医做粪便检查和血液检查, 注意补充水分防止出现脱水等问题。,分诊等级: 半紧急。建议: 血便但精神未差, 当日门诊行便检与炎症指标, 先禁食六小时并少量补水。),(分诊等级: 紧急。建议: 犬误食木糖醇口香糖, 按克数致毒剂量估算需即刻催吐处理。,木糖醇对狗狗是有毒的, 请尽快带它去医院处理吧, 路上注意观察它的精神状态情况。,分诊等级: 紧急。建议: 按体重与摄入量评估已超致毒阈值, 一小时内到院催吐并监测血糖, 携带包装记数量。),(分诊等级: 常规。建议: 猫抓轻微破皮未出血, 碘伏消毒包扎即可, 观察有无红肿热痛。,建议给猫咪修剪爪子以后也要给人伤口消毒啊, 用碘伏擦一擦然后贴上创可贴保持伤口干燥清洁。,分诊等级: 常规。建议: 伤口碘伏消毒后透气包扎, 48小时出现红肿或发热再门诊, 猫需补打狂犬疫苗记录。),(分诊等级: 半紧急。建议: 犬癫痫首次发作持续三分钟, 发作后24小时内急诊神经科评估。,第一次抽搐挺吓人的, 建议录下发作视频给医生看, 尽快去医院做个检查应该会比较稳妥一些。,分诊等级: 半紧急。建议: 记录发作时长与形态, 发作结束后保持环境安静避光, 今日内完成神经科首诊。),]tot_btot_f0.0print(%-4s 基座 微调 明细%案例)fori,(ref,base,ft)inenumerate(CASES,1):sb,sfscore(ref,base),score(ref,ft)tot_bsb tot_fsfprint(案例%d %.3f %.3f | 基座格式%s | 微调格式%s%(i,sb,sf,过ifREQUIRED[0]inbaseelse缺,过ifREQUIRED[0]inftelse缺))print(均分: 基座 %.3f - 微调 %.3f (%.3f)%(tot_b/len(CASES),tot_f/len(CASES),(tot_f-tot_b)/len(CASES)))print(达标率(单案例0.65): 基座 %d/8, 微调 %d/8%(sum(1forref,b,_inCASESifscore(ref,b)0.65),sum(1forref,_,finCASESifscore(ref,f)0.65)))运行输出案例 基座 微调 明细 案例1 0.390 0.882 | 基座格式缺 | 微调格式过 案例2 0.379 0.827 | 基座格式缺 | 微调格式过 案例3 0.361 0.812 | 基座格式缺 | 微调格式过 案例4 0.720 0.793 | 基座格式过 | 微调格式过 案例5 0.375 0.835 | 基座格式缺 | 微调格式过 案例6 0.379 0.762 | 基座格式缺 | 微调格式过 案例7 0.383 0.808 | 基座格式缺 | 微调格式过 案例8 0.373 0.819 | 基座格式缺 | 微调格式过 均分: 基座 0.420 - 微调 0.817 (0.397) 达标率(单案例0.65): 基座 1/8, 微调 8/8明细比均分有信息量基座几乎每个案例都栽在格式缺分诊等级字段唯独案例 4 格式全对却错得最隐蔽——把可居家观察的咬胶误判成紧急催吐三层分数里它照样拿了 0.720因为 ROUGE-L 与格式都满分。这就是纯自动评测的盲区事实性方向错误在字面相似度下是隐形的红线案例必须配人工复核或事实核查层rubric 里加危险建议一票否决这也是分数的达标率不能替代逐条明细的原因。另一点0.397 的提升大部分来自格式合规——真实项目里这很典型微调的第一桶金是学会说规矩话第二桶才是学会判断。实验二60 题评测集测不出 4 个点的进步均分从 0.42 到 0.82 毫无疑问值得上线但第二轮迭代微调只带来 3~5 个点的提升时8 题、60 题的评测集会给你什么把评测抽象为每道题基座有真实通过率 p微调后 pδ模型温度 0、各跑一遍观测是确定的 0/1——不确定性不在模型输出而在你手上的题目只是全量题海的一次抽样。用 bootstrap 重采样题目估计差值的 95% 置信区间评测集规模与统计显著性: 一次确定性评测 题目重采样 bootstrap, 确定性。importrandomdefmake_bank(delta_mu,seed,n600):rngrandom.Random(seed)bank[]for_inrange(n):p_baserng.uniform(0.48,0.72)# 每题基座真实通过率p_ftmin(0.97,max(0.02,p_baserng.gauss(delta_mu,0.05)))bank.append((p_base,p_ft))returnbankdefrun_once(bank,seed):drawrandom.Random(seed)return[(1ifdraw.random()pelse0,1ifdraw.random()qelse0)forp,qinbank]defboot_ci(diff,B2000,seed7):rrandom.Random(seed)nlen(diff)meanssorted(sum(diff[j]forjin(r.randrange(n)for_inrange(n)))/nfor_inrange(B))returnmeans[int(0.025*B)],means[int(0.975*B)]print(模型温度 0 各跑一遍, 不确定性来自题目抽样; 考察不同真实增益下的检出能力)fordelta_mu,seedin((0.04,101),(0.10,202)):obsrun_once(make_bank(delta_mu,seed),4242)fornin(30,60,150,600):diff[b-afora,binobs[:n]]lo,hiboot_ci(diff)verdict显著iflo0orhi0else不显著(CI 含 0)print(真实增益 %.2f n%3d | 观测差 %0.3f | 95%%CI [%.3f,%.3f] %s%(delta_mu,n,sum(diff)/n,lo,hi,verdict))print()运行输出模型温度 0 各跑一遍, 不确定性来自题目抽样; 考察不同真实增益下的检出能力 真实增益 0.04 n 30 | 观测差 -0.067 | 95%CI [-0.267,0.133] 不显著(CI 含 0) 真实增益 0.04 n 60 | 观测差 0.000 | 95%CI [-0.167,0.167] 不显著(CI 含 0) 真实增益 0.04 n150 | 观测差 0.067 | 95%CI [-0.040,0.173] 不显著(CI 含 0) 真实增益 0.04 n600 | 观测差 0.047 | 95%CI [-0.005,0.100] 不显著(CI 含 0) 真实增益 0.10 n 30 | 观测差 0.000 | 95%CI [-0.233,0.200] 不显著(CI 含 0) 真实增益 0.10 n 60 | 观测差 0.067 | 95%CI [-0.100,0.233] 不显著(CI 含 0) 真实增益 0.10 n150 | 观测差 0.107 | 95%CI [0.000,0.207] 不显著(CI 含 0) 真实增益 0.10 n600 | 观测差 0.097 | 95%CI [0.045,0.150] 显著这组数字应当贴在每个微调团队的白板上真实增益 0.04 时60 题集观测到的差值在 -0.067 到 0.000 之间摇摆n30 时甚至把提升测成了倒退600 题也只是勉强摸到显著边缘增益 0.10 也要 600 题才稳定检出。结论不是要算 p 值这种正确废话而是具体的规模设计想在 95% 置信下检出 3~5 个点的迭代收益按 ±SE 估算需要数百到两千题只有 8~60 题的团队只配得上0.4 级别的大结论配不上这次改动好不好的日常决策。护城河的含义在此显形竞品也在微调你们各自迭代 4 个点的小版本谁有千题级评测集谁就在做实验没有的人在掷硬币。建河四步分层抽样从线上真实流量按意图 × 紧急度 × 难度分层每层最小配额红线案例单独成层、永不随机抽中即丢弃。双人标注 仲裁参考答案两名业务专家背靠背写分歧走仲裁仲裁记录本身就是行为规格文档。物理隔离评测集存独立仓库与权限训练数据流水线只允许读取、禁止写入每批训练数据入库前自动跑与评测集的 n-gram 重叠检查第二篇的去重器直接复用阈值压到 0.6 以下命中即报警。版本与退役评测集打版本号报告永远写明v3 上测得被反复用于调参的子集要定期退役换新题防止团队心智过拟合到考卷上。常见陷阱LLM judge 当第二层用judge 适合第三层质量维度拿它判分诊等级对不对这种可机械判定的东西既贵又引入判官自身的偏好噪声。judge 模型与被测模型同源时自评偏高一到两个点是常态。只看均分不看分布0.75 的均分可能是简单题全对红线题全崩。报告模板必须带分桶直方图。评测集三个月不更新线上分布漂移后考高分的模型被用户骂——考卷过期了。绑定第五篇的事件频率表做季度换血。温度与采样不锁定评测跑非零温度分数波动淹没真实差异锁 temperature0、固定 seed、记录解码配置。CI 结论口头化这版比上版高 2 分要过 bootstrap 再宣布尤其在小集上。落地清单评测三层schema/必备字段 → ROUGE-L事实点 → rubric/judge逐层出明细规模红线迭代决策用 ≥600 题发布门槛再加红线子集 100% 通过每次训练数据入库自动跑与评测集重叠检查作为第二篇去重流水线的下游评测报告 分数 CI 分桶分布 版本号 解码配置五件套缺一不可judge 换模型时先在旧评测集上重校准分数不可跨 judge 直接比较有了秤就能称出微调最贵的那笔隐性成本。下一篇《LLM 微调实战7灾难性遗忘与模型合并专业化的代价》分诊模型训完基座的通用问答能力掉了几分遗忘怎么用实验量化LoRA 合并又能不能白嫖回通用能力。参考来源Judging LLM-as-a-Judge with MT-Bench and Chatbot Arenahttps://arxiv.org/abs/2306.05685AlpacaEval: 自动指令跟随评测与人类偏好一致性分析https://arxiv.org/abs/2305.14387MMLU: Measuring Massive Multitask Language Understandinghttps://arxiv.org/abs/2009.03300ROUGE: A Package for Statistical Evaluation of Summaries (Chin-Yu Lin, ACL 2004)https://aclanthology.org/W04-1013/Wikipedia: Bootstrapping (statistics)https://en.wikipedia.org/wiki/Bootstrapping_(statistics)
返回列表