《AI大模型应用开发实战从入门到精通共60篇》022、微调数据准备:如何构建高质量的指令数据集?
022 微调数据准备如何构建高质量的指令数据集上周帮一个做法律AI的团队排查模型输出问题发现一个典型现象模型在“合同条款审查”任务上表现不错但一旦问“请用一句话总结这份合同的风险点”输出就变得支离破碎。翻看他们的微调数据集问题一目了然——指令模板高度同质化全是“请审查以下合同条款”这种固定句式模型根本没学会理解“总结”“一句话概括”这类变体指令。这种坑我踩过不止一次。今天这篇笔记就聊聊构建指令数据集时那些容易翻车的地方以及我摸索出来的实用方法。指令数据集的核心构成一个标准的指令样本通常包含三个字段instruction指令、input输入、output输出。但实际落地时很多人把这三个字段的关系搞拧了。看一个反面案例{instruction:翻译以下英文到中文,input:Hello world,output:你好世界}这个样本看起来没问题对吧问题在于——instruction字段里已经包含了任务描述input字段只给了待处理内容。这种结构在训练时模型会把“翻译以下英文到中文”和“Hello world”拼接成一个长序列然后预测“你好世界”。但推理时如果用户说“帮我把Hello world翻译成中文”模型就懵了因为训练时没见过这种表述。正确的做法是instruction只放任务指令input放上下文或待处理内容output放期望输出。但更关键的是instruction的表述要多样化。指令多样性被严重低估的坑我见过最离谱的数据集5000条样本里instruction只有3种模板。这种数据集训出来的模型本质上就是个模板匹配器。构建指令多样性我一般从三个维度下手句式变换。同一个任务可以写成“请翻译”、“翻译以下内容”、“把下面这段话翻译成中文”、“请将英文内容转换为中文”。别小看这个模型对句首词的敏感度远超你想象。任务粒度变化。比如文本分类任务可以细化为“判断这段文本的情感倾向”、“分析这段话是正面还是负面”、“这段文字表达了什么情绪”。粒度越细模型对任务边界的理解越清晰。隐含指令。有些场景下用户不会给出明确的指令而是直接丢内容。比如用户只发来一段代码期望模型自动识别并解释。训练数据里需要包含这种“无指令”样本让模型学会主动推断任务。数据质量宁可少不要脏去年有个项目团队从网上爬了10万条问答对做微调结果模型越训越傻。排查后发现数据里混了大量“11”这种低质样本模型学到的不是推理能力而是对简单问题的过拟合。数据清洗的几个关键点去重不是简单的字符串匹配。两条样本“请翻译Hello world”和“翻译Hello world”语义完全重复但字符串不同。我一般用embedding相似度做去重阈值设在0.85左右。过滤过短样本。instruction少于5个字符、output少于10个字符的样本大概率是噪声。但注意有些任务如“回答‘是’或‘否’”output确实很短这类需要单独处理。检查指令-输出对齐。这是最容易被忽视的。比如instruction是“总结以下内容”output却是一段翻译。这种错位样本会严重干扰模型。我写了个脚本用原始模型对每条样本做一次推理如果输出和标注输出差异过大就标记出来人工审核。数据增强别只会用GPT生成很多人一提到数据增强就想到用GPT-4批量生成。但这样做有个致命问题生成的数据风格高度统一模型学到的其实是GPT-4的说话方式而不是任务本身。我常用的几种增强手段回译增强。把中文指令翻译成英文再翻译回中文。这样能得到语义相同但表述不同的指令。注意控制回译次数一般1-2轮就够了太多会引入语义漂移。关键词替换。比如“翻译”可以替换为“转译”、“转换”、“译成”。但别用同义词词典硬替换有些词在特定领域有特殊含义。我一般先让模型生成一批同义表达人工筛选后再用。指令模板组合。把任务指令拆成“动作对象约束”三个部分然后随机组合。比如“总结动作合同条款对象不超过50字约束”可以组合出“总结合同条款不超过50字”、“用50字以内总结合同条款”等多种形式。数据规模多少条才够这个问题没有标准答案但有个经验法则质量比数量重要多样性比总量重要。我做过对比实验用5000条高质量、高多样性的数据微调效果优于20000条低质量、低多样性的数据。具体到数字一般任务2000-5000条就够了复杂推理任务可能需要10000条以上。判断数据量是否足够的一个实用方法训练过程中监控验证集loss如果loss持续下降但验证集指标不再提升说明数据多样性不够需要补充新类型的样本而不是简单增加同类型样本的数量。数据格式别在格式上翻车微调数据的格式直接影响训练效果。我踩过的一个坑把instruction和input用特殊token分隔比如|im_start|user\n...|im_end|。这种格式在训练时没问题但推理时如果用户输入不包含这些token模型就不知道如何响应。推荐的做法是训练时使用的格式推理时也要保持一致。如果决定用ChatML格式那么所有训练样本和推理输入都要用这个格式。不要训练时用A格式推理时用B格式。另外注意控制序列长度。有些样本的input很长output很短这种样本在训练时模型会把大部分注意力放在input上对output的学习不足。我一般会截断input到1024token以内如果任务需要长上下文单独准备长文本数据集。经验性建议最后说几点个人经验不是教科书式的总结是踩坑踩出来的先做小规模验证。别一上来就搞几万条数据。先准备200条高质量样本微调后做人工评测。如果这200条都训不好加数据也没用。保留原始数据。清洗、增强后的数据一定要保留原始版本。我见过太多人把原始数据删了结果发现增强后的数据有问题想回溯都找不到源头。关注数据分布。不是所有任务类型都要均匀分布。核心任务多准备一些边缘任务少一些。比如做客服模型“退货流程”相关的样本应该比“查询营业时间”多10倍以上。定期做数据审计。每两周随机抽100条样本人工检查指令-输出对齐情况。这个习惯帮我发现了不少数据漂移问题比如某个新来的标注员把“总结”和“翻译”搞混了。构建指令数据集是个脏活累活但也是微调效果的天花板。模型架构可以抄训练技巧可以学唯独数据质量偷不了懒。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2562495.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!