SELF-Instruct 指令集构建详解
背景介绍
SELF-Instruct 是 2022 年 12 月发表的研究论文,旨在通过语言模型自我生成的指令来对齐语言模型。其核心思想类似于非线性插值,利用 LLM 的生成多样性对种子指令集进行 Bootstrap 扩充。该方案后续被用于 Alpaca 项目中生成微调指令集。
核心流程
SELF 提出了一种 Bootstrap 方案,让 LLM 基于种子指令生成新的指令,主要包含三个步骤:新指令生成、样本生成、过滤和后处理。
1. 新指令生成
首先人工构建 175 个种子指令,每个种子由 1 条指令和 1 个样本构成。在每一步中,从种子或已生成的指令中采样 8 个指令(Step 1 全部为种子),构建 Prompt 模板输入模型。
GPT-3 时代的 Prompt 模板:
Come up with a series of tasks:
Task 1: {instruction for existing task 1}
...
Task 8: {instruction for existing task 8}
Task 9:
Alpaca 项目升级后的 Prompt 模板 (Davinci-003): 为了提升指令质量,Alpaca 将 Few-shot 数量缩减至 3 个,并增加了明确的约束条件,例如:
- 尽量不重复使用动词以最大化多样性。
- 表达形式多样化(问题 + 祈使句)。
- 类型多样化(开放式生成、分类、抽取、问答等)。
- 必须是模型可完成的任务(排除图像、视频、动作执行等)。
- 长度控制在 1-2 句话。
2. 样本生成
仅有指令不够,还需生成对应的输入和输出。原论文针对分类任务设计了特殊逻辑:先判断是否为分类任务,若是则先生成输出再生成输入,否则反之。这是因为早期模型倾向于只生成单个标签的输入。
随着模型能力增强(如 Davinci-003),Alpaca 将指令生成与样本生成分离的步骤合并,一步到位。Prompt 模板扩充了以下要求:
- 输入字段应包含具体示例,涉及真实数据而非占位符,内容足够具有挑战性但不超过 100 单词。
- 非特定上下文指令(如常识问答)标记为
<无输入>。 - 输出应是对指令的合适回应,少于 100 单词。
对于自由生成类任务,支持仅输出无输入的模式。
3. 过滤和后处理
生成的指令需经过严格的后处理以保证质量:
不可用指令过滤:
- 截断过滤: 若响应停止原因为
length,过滤最后一个指令。 - 关键词过滤: 移除图片、音频等模型无法完成的任务关键词。
- 长度过滤: 剔除过长或过短的指令。
- 格式过滤: 剔除前几个字非英文/中文的指令。
相似指令过滤: 为保证多样性,每轮计算新生成指令与已有指令的 Rouge-L 相似度(基于最长公共子串计算的 F 值)。仅保留 F 值小于 0.7 的新指令。同时监控整体相似度趋势,决定是否停止生成。


