日期:2026-08-02
我们做模型迭代时踩过一个典型的坑:评测集是上线前人工攒的一小撮样本,覆盖窄、口味偏,模型在评测集上分数漂亮,一上线遇到真实用户的"花式提问"就翻车——要么被绕晕,要么输出不合规,回归评测形同虚设。更尴尬的是,因为评测集长期不变,团队慢慢开始"对着评测集调参",不知不觉过拟合了评测而非对齐真实需求。
项目负责人当时下了决心:把评测当成工程化的持续链路,而不是上线前的一次性动作。核心诉求有两条——一是评测数据要能自动、持续地构造,覆盖足够宽的边界;二是要有对抗样本挖掘能力,把那些"模型最容易错"的case挖出来,变成回归门禁的硬指标,拦住退化。
我们搭了一条"构造—挖掘—分层—门禁"的评测流水线。构造环节:基于业务真实 query 分布和历史 badcase,用模型辅助生成大量候选评测样本,覆盖常规、边界、异常三类。挖掘环节:对候选样本做对抗扰动(同义替换、指令注入变体、诱导越狱等),找出主模型输出不稳定或违规的样本,标记为对抗坏例。分层环节:按难度和类型给样本打标,分成基础集、边界集、对抗集,分别用于不同阶段的回归。门禁环节:每次模型或 prompt 变更,自动跑全套回归,对抗集上的坏例数若超过阈值则拦截上线,并定位是哪类能力退化。
第一个挑战是评测数据自动构造。不能纯随机生成,否则噪声太大。我们的做法是"以真实为种子":从历史对话、业务工单里抽取 query 模板,用辅助模型做受控改写与扩充,再人工抽检保质量。这样构造出的样本既贴近真实分布,又有足够多样性,避免评测集和实际 usage 两张皮。
第二个挑战是对抗样本挖掘。这是收益最大的一块。我们用多种扰动策略组合:语义保持改写(考验模型鲁棒性)、指令注入变体(考验安全护栏)、少样本诱导(考验边界遵循)。对每条样本,主模型多次推理取一致性,波动大或输出违规的即判定为对抗坏例。关键是"自动发现脆弱点",而不是人拍脑袋想边界。
第三个挑战是难度分层与去重。构造和对抗会产生海量样本,直接全量回归成本高。我们按"模型当前通过率"做难度分层:通过率高的进基础集(轻量跑),通过率中低的进边界/对抗集(重点跑),并做语义去重,避免同质样本刷分。这样回归既能控成本,又能聚焦脆弱区。
第四个挑战是回归门禁联动。门禁不能只报分数,要能定位退化。我们把坏例按能力维度(如"合规""准确性""鲁棒性")归类,回归报告里标出"本次变更导致合规坏例 +3",并关联到具体改动,团队一眼就知道回滚还是修。门禁阈值设得有梯度,对抗集坏例零容忍、基础集允许小幅波动。
案例片段(已脱敏): 评测构造模板:
seed_q = sample(real_query_log, n=500); variants = augment(seed_q, methods=["paraphrase","expand","constrain"])。对抗扰动:adv = perturb(q, attacks=["semantic_keep","inject_variant","fewshot_induce"]); if std(model(q).output) > tau or violates_policy then mark_adversarial。难度分层:tier = "base" if pass_rate>0.9 else ("boundary" if >0.6 else "adv");去重:if simhash(a,b) < 3 then drop(b)。回归门禁:if adv_badcase_delta > 0 then block_deploy() and report(dimension_breakdown)。
这套链路跑了三个月(脱敏示意):评测样本从初始约 800 条人工集,扩充到约 1.2 万条分层集,其中对抗坏例约 1800 条。模型上线后的真实坏例率(用户侧投诉/纠正)较之前下降约 47%,因为对抗集提前拦住了很多"上线才暴露"的问题。回归门禁在一个季度内拦截了约 11 次有退化的发布,其中 3 次是合规维度退化,避免了上线后舆情风险。评测集去重率约 22%,把同质样本清掉后回归耗时降了约三成。
一个实在的体感:团队不再"对评测集调参"了,因为评测集每周都在变、还有对抗集盯着,过拟合的空间被挤没了。
第一,评测先对抗再回归。没有对抗样本,回归就是温室测试,上线必翻车。把"模型最容易错"的case固化成硬指标,是性价比最高的质量护栏。第二,评测数据要以真实为种子自动构造。纯人工攒覆盖不了边界,纯随机又噪声大,真实分布 + 受控改写是平衡点。第三,分层与去重决定回归成本。全量跑不现实,按难度分流、按语义去重,才能既聚焦又省钱。第四,门禁要能定位退化维度。只报"分数降了"没人会用,报"合规坏例 +3、来自某次 prompt 改动"才有行动指引。
给同行一句实话:模型评测不是上线前的仪式,而是贯穿迭代的日常基建。我们这套"构造—挖掘—分层—门禁"的闭环,最大的价值不是分数多好看,而是让每一次发布都"心里有底"——知道改了什么、可能坏了什么、该不该放。
在把这套评测链路接进 CI 时,我们踩过一个小坑:对抗样本挖掘如果每次全量跑,单轮回归要四十多分钟,开发同学等不起,最后干脆跳过。后来我们把对抗挖掘和常规回归解耦——常规回归每次必跑基础集和边界集(约八分钟),对抗集按天增量跑,命中新坏例才并入门禁。这样既保住了发布时效,又没丢掉对抗覆盖。另一个细节是评测结果要可解释:我们给每条坏例附上"期望行为 vs 实际输出"的差异说明,开发看到报告就能直接定位退化点,而不是对着一个总分发呆。可解释性这一条,往往比分数本身更能推动团队修问题。
评测体系的成熟标志,是团队不再害怕发版。当对抗样本成为日常回归的一部分,当门禁能精准定位退化,模型迭代就从"赌一把"变成了"可预期的交付"。这件事没有捷径,但一旦跑顺,回报是持续且复利式的。