构建指令数据集:Self-Instruct与人工撰写策略
昨天深夜调试模型时,又遇到了那个熟悉的问题:模型对“帮我写个排序算法”这种通用指令响应良好,但一旦问“用C在STM32上实现一个带超时检测的冒泡排序”,输出就开始胡言乱语。这不是模型能力问题,而是指令数据集的覆盖度问题——我们的训练数据里缺少那些真正有工程价值的、场景具体的指令。
指令数据的核心矛盾
所有做微调的人都会面临这个根本矛盾:高质量的人工标注成本极高,但自动生成的数据又往往缺乏深度。上周有个团队给我看他们的微调数据集,三千条指令里有两千八百条是“写一首关于春天的诗”的变体,这样的模型在实际工程场景中根本用不起来。
Self-Instruct的实战改造
直接套用Self-Instruct的原始论文方法效果有限,我们需要做工程化改造。下面是我在多个项目中迭代出来的生成流程:
defgenerate_instruction_batch(seed_tasks,num_generations=5):""" 基于种子任务批量生成指令 seed_tasks: 人工写的几十条高质量种子指令 这里踩过坑:种子指令的质量直接决定生成上限 """instructions=[]fortaskinseed_tasks:# 关键:不是简单改写,而是做场景扩展expanded=expand_engineering_scenarios(task)foriteminexpanded: