日期:2026-07-18
本文为工程实践复盘,客户信息已脱敏;所述数据均为示意值。
我们当时接手的是某垂直行业客户的领域大模型微调项目。这个行业本身的公开语料很少,客户手里真正可用的高质量人工标注数据只有约 1.2 万条,远不足以撑起一次稳定的 LoRA 微调。直接拿这批原始数据训练时,我们很快就踩了坑:原始数据里混着不少重复样本、格式错误的脏数据,还有相当比例的标注噪声。第一次基线训练出来的模型在验证集上表现尚可,但一到真实业务问答就明显"学坏"——会编造行业术语、把规则答错,泛化能力不升反降。
复盘下来问题很清晰:垂直行业微调最大的瓶颈不是算力,而是数据质量与规模之间的失衡。标注少、噪声多,直接训练既学不出领域特征,又容易被脏样本带偏。这个项目里我们的核心目标,就是在不依赖大规模人工扩标的前提下,用"合成扩增 + 质量过滤"的组合拳,把可用训练集从万级提升到十万级,同时把噪声率压到可控范围。
整体方案是基于客户提供的约 1.2 万条种子数据(人工精标的高质量问答/文档片段),通过我们采用的微调工具链做三步处理:
第一步,种子扩增。用强模型基于种子做指令改写、场景补全、多轮对话合成,生成候选训练语料。 第二步,交叉过滤。用多个模型对同一批合成样本独立打分/判错,交叉剔除噪声与低质样本。 第三步,质量打分与去重。对通过初筛的样本做语义相似度去重、困惑度(perplexity)打分,分层入库,再回流给人工做抽检闭环。
最终干净数据进入向量化与微调流水线,交付到私有化推理底座供业务调用。整个 pipeline 跑在客户的 GPU 资源池上,由我们采用的 AI 底座做任务排队与配额管控,日均可稳定产出约 8 万条候选样本。
第一个挑战是种子数据扩增的多样性。简单同义改写会导致合成数据"近重复"严重,模型学不到新分布。我们的做法是引入多策略 prompt 模板池(场景化改写、反向提问、字段抽取、错误示例构造),并对每类模板限定生成占比,避免某一模式主导。同时用温度参数分层采样:
# 多样性采样:同一种子拆成 4 类任务,各自限流
templates = {
"rewrite": 0.35, # 同义改写
"scenario": 0.30, # 场景补全
"reverse_q": 0.20, # 反向提问
"negative": 0.15, # 错误/边界示例
}
for t, ratio in templates.items():
gen_samples[t] = sample(seed, template=t, temperature=0.9, n=ceil(total*ratio))第二个挑战是合成数据的噪声检测与过滤。大模型生成的样本本身就会带幻觉,直接用等于把噪声放大。我们采用多模型交叉过滤:用两个不同家族的模型分别做"事实一致性判定"和"指令遵循判定",只有两者都通过才保留,任一判否即丢弃。判定规则以结构化标签返回:
案例片段(已脱敏): 质量过滤 pipeline 配置片段(节选)
yaml filter: cross_check: models: ["judge-a:7b", "judge-b:13b"] strategy: AND # 两模型均通过才保留 thresholds: fact_consistency: 0.75 # 事实一致性分 ≥ 0.75 instruction_follow: 0.70 # 指令遵循分 ≥ 0.70 drop_on: ["contradiction", "hallucination", "format_error"] sample_log: - id: synth_004812 judge_a: 0.82 judge_b: 0.41 # 未达阈值,判否 action: DROP # 跨模型判否,丢弃
第三个挑战是质量打分与去重。合成样本之间、合成与种子之间都存在语义重叠,直接入库会让模型过拟合热点样本。我们用 sentence-embedding 做向量化,按余弦相似度聚类,簇内保留困惑度最低的代表样本;同时用 MinHash 做精确近似去重,剔除仅标点/同义词差异的重复项。入库前跑一段去重 SQL 兜底:
-- 近似去重:同簇只保留 ppl 最低的一条
DELETE FROM train_candidate t
WHERE EXISTS (
SELECT 1 FROM train_candidate o
WHERE o.cluster_id = t.cluster_id
AND o.ppl < t.ppl
AND o.id <> t.id
);第四个挑战是与人工标注的闭环。自动化过滤仍有漏网噪声,纯自动不可信。我们设计了"自动过滤 → 人工抽检 → 错杀/漏杀回流"的回路:每批入库数据按 5% 比例抽给标注团队复核,错杀的坏样本进入负样本集继续训练判器,漏杀的好样本回灌种子池。这个闭环让判器在两周内把误判率从约 12% 降到约 4%。
经过约三周的迭代,合成与过滤 pipeline 稳定跑通,关键指标对比如下(均为脱敏示意值):
| 指标 | 改造前 | 改造后 |
|---|---|---|
| 可用训练数据规模 | 约 1.2 万条 | 约 23 万条 |
| 训练集噪声率 | 约 18% | 降至约 3% |
| 下游任务准确率 | 约 71% | 提升至约 86% |
| 标注人力成本 | 基线 100% | 下降约 60% |
可以看到,数据规模提升约 19 倍的同时噪声率反而大幅下降,下游任务准确率提升约 15 个百分点,而人工标注成本因为只做抽检闭环,整体下降约六成。这说明在垂直行业微调里,先把脏水滤掉、再做有节制的合成,比盲目堆人工标注重标数据更划算。
第一,数据质量先于数据规模。我们当时最大的教训就是第一次基线训练没做过滤,直接把噪声带进了模型。先做去重和噪声过滤,再谈扩增,顺序错了方向就错了。
第二,合成 + 过滤优于纯人工。垂直行业标注贵且慢,纯人工扩标在成本和时效上都不可持续;用强模型合成、多模型交叉判错,再用少量人工做闭环抽检,是性价比最高的路径。
第三,判器本身也要持续训练。质量过滤器不是一次写好就完事,它跟着数据分布一起演化,错杀漏杀要回流成新的训练信号,否则过滤标准会越来越脱离业务。
第四,去重要贯穿全流程。从模板采样、向量聚类到入库 SQL 兜底,重复样本会在每个环节悄悄累积,任何一层的去重松懈都会让模型过拟合。