上一课中,我们已经区分 SFT 样本与偏好对。接下来,研究者还会遇到一个实际问题:训练数据从哪里来,生成出的回答怎样才能符合要求?例如,一条指令要求模型恰好给出两条建议,候选回答却可能写成三条。

AutoIF 将一部分能够明确检查的指令约束转换成验证函数,再利用执行反馈筛选数据。我们可以沿着“约束怎样表示、验证器怎样检查、样本怎样进入训练”这条线理解它。AutoIF 论文

先把指令和回答分开保存

“回答问题”描述内容目标,“恰好列两条建议”描述附加约束。数据准备程序把原问题、约束、候选回答和检查结果分别保存,后续分析才能知道模型到底在哪一项上失败。

整个流程有两个相互联系的问题。第一,验证函数是否准确表达了指令?第二,候选回答是否符合要求,并值得进入训练集?官方实现通过指令增强、验证函数、交叉验证、反向描述、查询增强与筛选等步骤处理这些问题。项目实现

哪些约束容易检查

开发者通常比较容易为固定字段、条目数量、JSON 可解析性、精确标题和数值范围编写规则。即使是字数和语言要求,我们也要先说明怎样处理混合语言、标点与空白,否则自然语言描述与程序计数可能并不一致。

事实正确、解释充分和建议有帮助等要求,需要其他质量评估配合。IFEval 使用可验证指令评估指令遵循能力,研究者构建训练数据时则应排除评估题及其近重复,保持评估的独立性。IFEval

给验证器也写测试

我们先手写一个小规则:回答恰好两行,每行的 item: 后接一个小写 ASCII 单词,而且两个词不同。规则允许文本末尾保留一个换行。下面的程序同时给出了验证函数和正反测试用例。

import re

def verify_format(text):
    if not isinstance(text, str) or len(text) > 200:
        return False
    lines = text.splitlines()
    if len(lines) != 2:
        return False
    matches = [re.fullmatch(r"item: ([a-z]+)", line) for line in lines]
    if not all(matches):
        return False
    return len({match.group(1) for match in matches}) == 2

cases = [
    ("item: apple\nitem: berry", True),
    ("item: apple\nitem: berry\n", True),
    ("item: apple\nitem: apple", False),
    ("item: apple", False),
    ("item: apple\nitem: berry\nitem: cherry", False),
    ("item: Apple\nitem: berry", False),
    ("item: apple\nitem: 中文", False),
    ("item: apple\n\nitem: berry", False),
]
for text, expected in cases:
    assert verify_format(text) is expected
assert verify_format("item: false\nitem: claim")
print("eight cases passed; the final example only satisfies the format")

最后一个例子虽然满足格式,但两个词没有提供有用回答。这个例子让我们看到,格式验证只处理一项约束,数据筛选还需要考虑内容质量。如果验证函数本身写错了,流水线甚至可能反复保留同一类错误。

本例中的验证器由人工编写。实际系统若要运行模型生成的代码,开发者应当使用无密钥、最小权限的隔离环境,并限制时间与资源,不能直接让生成代码在持有凭据的工作 NAS 中执行。

留出独立的难例

验证器也需要面对独立测试。我们可以加入空输入、边界数量、重复、错误类型、混合语言,以及只违反一项约束的样本。如果函数和测试都由同一个模型产生,它们可能共享某种误解,所以人工与其他独立来源的反例很有价值。

反向描述和 NLI 可以辅助比较指令含义,不过我们还要看比较的方向。例如,“至少三条”的回答也满足“至少两条”,两项要求却不能互换,只检查单向蕴含就可能漏掉这个差别。

筛选完怎样接到训练

SFT 数据保留问题与目标回答,偏好训练则需要同一问题下有明确优劣的回答对。数据处理程序还应说明怎样处理答案相同、两个答案都失败,或现有标准无法判优的情况。

我们可以先按原始问题或种子家族划分数据,再在各集合内部生成变体,减少相似改写跨训练与评估出现。流水线保存生成模型、设置、验证器版本和逐项失败原因后,研究者就能追查一条数据为什么被留下。

练习:读者可以自拟一个精确约束,分别编写三条正例、反例和边界例。请再找出一条“规则通过但回答无用”的样本,说明系统还缺少哪一项质量评估。

前置:SFT、LoRA 与 DPO。下一篇:量化与显存估算。

资料:疏锦行大模型专题《项目 2:AutoIF 思路拆解》与配套《第二讲:AutoIF 数据合成》16 页。验证器例子已运行,原项目数据生成和训练尚未执行。