
文章目录【77.PythonAI】微调数据集准备高质量数据才是微调的灵魂不是代码导入语1 ~ 两大主流格式1.1 Alpaca格式单轮指令1.2 ShareGPT格式多轮对话1.3 怎么选2 ~ 六步数据清洗流水线2.1 去重2.2 脱敏2.3 质量过滤2.4 长度与多样性检查3 ~ 数据从哪来三种低成本方案3.1 GPT-4蒸馏的注意事项3.2 数据量参考思考 总结结尾【77.PythonAI】微调数据集准备高质量数据才是微调的灵魂不是代码文章简介本文聚焦微调工程中最被低估的环节——数据集准备。文章系统讲解两大主流数据格式Alpaca单轮指令格式与ShareGPT多轮对话格式的结构差异和适用场景给出一条完整的六步数据清洗流水线去重→脱敏→格式校验→质量过滤→长度截断→多样性平衡并分享三种低成本数据获取方案业务日志提炼、GPT-4蒸馏生成、人工精修种子集数据增强。文中所有清洗步骤均附Python实现代码配以Mermaid流程图展示从原始数据到训练集的完整流水线适合已经选定微调方案、正准备动手构造训练数据的开发者。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语微调圈有句话“垃圾进垃圾出”Garbage in, garbage out。你给它一万条东拼西凑、格式混乱、答非所问的数据哪怕用最先进的QLoRA训出来的也只会是一个更自信的垃圾模型。真实情况是微调代码30行就能写完而数据集的准备往往要占整个项目70%的时间。这篇文章就把这件脏活累活系统化——格式怎么选、数据怎么洗、量不够怎么凑全部讲透。1 ~ 两大主流格式1.1 Alpaca格式单轮指令{instruction:把下面这段话翻译成商务英语,input:我们下周三下午三点开会讨论方案,output:We will hold a meeting at 3:00 PM next Wednesday to discuss the proposal.}三个字段指令要做什么 输入可选的上下文 输出期望的回答。适合任务型微调翻译、分类、格式转换、单轮问答。1.2 ShareGPT格式多轮对话{conversations:[{from:human,value:我买的设备连不上WiFi},{from:gpt,value:别着急我来帮您排查。请问设备指示灯是什么颜色},{from:human,value:红色一直闪},{from:gpt,value:红灯闪烁表示未进入配网模式。请长按设备背部重置键5秒待蓝灯闪烁后重试。}]}适合对话型微调客服、助手、咨询类场景——需要模型学会多轮交互的节奏和话术。1.3 怎么选看你的线上形态 ├─ 用户每次独立提问不依赖历史 → Alpaca └─ 用户会持续多轮对话 → ShareGPT 拿不准就用ShareGPT——它天然兼容单轮conversations里只放一轮即可2 ~ 六步数据清洗流水线原始数据业务日志/爬取/生成1.去重SimHash/MD52.脱敏手机号/身份证/姓名3.格式校验字段完整JSON合法4.质量过滤LLM打分规则过滤5.长度截断超window的样本处理6.多样性平衡场景/难度分布检查训练集2.1 去重importhashlibdefdedup(samples):seenset()result[]forsinsamples:# 用instructioninput的哈希做指纹keyhashlib.md5((s.get(instruction,)s.get(input,)).encode()).hexdigest()ifkeynotinseen:seen.add(key)result.append(s)print(f去重:{len(samples)}→{len(result)})returnresult重复数据会让模型对某些答案过度拟合——同样的问题见过50遍它就会不分场合地输出同一个答案。2.2 脱敏importredefdesensitize(text:str)-str:textre.sub(r1[3-9]\d{9},[手机号],text)textre.sub(r\d{17}[\dXx],[身份证号],text)textre.sub(r[\w.-][\w-]\.[\w.],[邮箱],text)textre.sub(r\d{16,19},[银行卡号],text)returntext脱敏不是可选项——用带真实用户信息的数据训练等于把隐私烙进了模型权重模型可能在任何对话中把它们复述出来。这是合规红线。2.3 质量过滤规则过滤 LLM打分双管齐下defrule_filter(sample)-bool:outputsample.get(output,)# 规则1回答不能太空洞iflen(output)10:returnFalse# 规则2不能包含作为AI我无法类拒绝除非刻意需要if作为AIinoutputand无法inoutput:returnFalse# 规则3不能有明显错乱重复短语ifoutput[:50]output[50:100]:returnFalsereturnTruedefllm_score_filter(sample,llm,threshold7)-bool:让强模型给样本质量打分成本控制可抽样进行promptf给这条训练数据的质量打1-10分只回数字 标准回答准确、完整、无废话、符合指令要求 数据{sample}scoreint(llm.invoke(prompt).content.strip())returnscorethreshold2.4 长度与多样性检查defcheck_distribution(samples):训练前必做的分布体检importcollections# 长度分布lengths[len(s[output])forsinsamples]print(f输出长度: 中位数{sorted(lengths)[len(lengths)//2]}, f最大{max(lengths)})# 场景分布按instruction首词粗分intentscollections.Counter(s[instruction].split()[0]ifs.get(instruction)else其他forsinsamples)print(f场景分布:{intents.most_common(10)})如果某个场景占比超过50%模型会偏科——什么问题都想往那个场景上套。3 ~ 数据从哪来三种低成本方案方案做法质量成本业务日志提炼从客服记录/工单中筛优质对话人工脱敏校对最高真实场景中人工成本GPT-4蒸馏用强模型按种子问题生成回答规则抽检过滤中高低API费种子增强人工精写50~100条用LLM做同义改写扩增高核心场景低3.1 GPT-4蒸馏的注意事项# 蒸馏生成时Prompt里必须带上你的风格要求DISTILL_PROMPT你是一家智能家居公司的资深客服。 请针对以下用户问题生成一条符合公司话术的客服回答。 要求先共情、再给步骤、最后确认是否解决语气亲切不官方。 用户问题{question} 蒸馏数据最大的坑是**AI腔传染**——模型会学会GPT-4的口癖“总而言之”、“希望对您有帮助”。要么在生成Prompt里约束风格要么后处理时过滤这些标志性短语。3.2 数据量参考经验值LoRA微调7B ├─ 让模型学会输出格式 →200~500条就够 ├─ 学会一类业务话术 →500~2000条 ├─ 注入一个领域的问答能力 →2000~10000条 └─ 全面改变模型行为 →10000条此时重新评估是否值得质量1000条 凑数10000条——这是无数项目验证过的铁律。思考 总结数据集准备占微调项目70%的工作量这是常态不是异常代码半天写完数据洗两周——预算排期时就要有这个预期。格式跟着线上形态走单轮任务用Alpaca多轮对话用ShareGPT拿不准用ShareGPT。脱敏是红线不是建议带真实用户信息的数据训进模型就是一颗合规定时炸弹。蒸馏数据要防AI腔生成Prompt约束风格 后处理过滤口癖双管齐下。1000条高质量胜过10000条凑数微调数据的边际收益递减非常快堆量不如提质。微调工程师和调参侠的区别就在这一篇前者把80%精力花在数据上后者把80%精力花在改学习率上。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏把核心知识点存好在需要时随时查、随时用评论分享你的经验或疑问评论区一起交流避坑一键四连不要忘记给博主一键四连哦️寄语技术之路难免有困惑但同行的人会让前进更有方向结语数据准备好了真正的训练反而简单了。下一篇我们用LLaMA-Factory一条命令启动微调——零代码也能把模型训起来。不要忘记给博主一键四连哦