如何利用 LLM 自动化构建高质量的指令微调数据集?
最核心的技巧是:不要让 AI 凭空想场景,要给它“种子”并强制要求它进行“维度发散”。
具体操作流程是这样的:
1. 构建种子指令集(Seed Tasks)
手动写 10-20 条极高质量的、涵盖不同复杂度、不同意图的指令。比如你想让模型学写 Python 异步代码,种子指令必须包含:简单的 asyncio 调用、复杂的并发竞争处理、以及一个带有 Bug 的代码修复请求。
2. 编写发散 Prompt
在 Prompt 中定义具体的“变体维度”。我常用的模板逻辑如下:
你是一个数据集专家。基于提供的种子指令 [Seed_Instruction],请生成 5 个变体。
要求:
- 维度 A(复杂度):将原指令的逻辑复杂度提升,增加边界条件。
- 维度 B(领域):将原指令的场景迁移到另一个相关领域(如:从电商迁移到医疗)。
- 维度 C(语气):改变指令的表达方式(如:从专业术语改为小白口语)。
严禁生成重复逻辑的指令,每条变体必须有明显的差异化。3. 自动化管道(Pipeline)实现
我写了一个简单的 Python 脚本,通过 API 循环调用,将种子指令逐一喂给 LLM,并用 JSONL 格式存储。为了防止 LLM 偷懒,我在 API 调用时将 temperature 设为 0.8-0.9。
4. 质量过滤(这是最关键的坑)
直接生成的指令集里一定有垃圾。我踩过的坑是:很多指令看起来很像,但回答质量参差不齐。我的解决办法是引入一个“评审模型”。
用一个更强的模型(比如 GPT-4o)对生成的数据进行打分,过滤掉得分低于 4 分的样本。评审 Prompt 重点关注:
指令是否清晰 → 回答是否包含幻觉 → 回答是否过于冗长(AI 冗余病)。
配置建议与效率点:
多样性检查:使用 Sentence-Transformers 计算指令之间的余弦相似度,相似度高于 0.85 的直接删掉,避免模型过拟合在某个特定句式上。
格式强制:在 Prompt 结尾强制要求 输出格式必须为 JSONL,禁止输出任何解释性文字,否则解析脚本会频繁报错。
这样跑下来,用 50 条种子指令能扩充出 2000 条高质量、低冗余的指令集,比盲目堆量要有效得多。
全部回复 (0)
还没有回复,来发第一条吧!
