Rerank+小模型做判定任务:十六个实验后的失败复盘与选型建议 1. 为什么我会盯上“rerank 小模型”这条路线先说结论这十六个实验跑完我认输了但不是因为 rerank 没用也不是因为小模型不行而是因为“用 rerank 配合小模型复现一个判定模型”这件事在数据量、任务定义和评测方式这三个环节上存在我一开始严重低估的隐性成本。这篇东西不是成功案例分享而是一份完整的失败复盘把我两天里踩过的坑、试过的组合、以及最后为什么放弃全部摊开讲。事情的起点很朴素。我手上有一个判定类任务给一段输入输出一个离散的判定结果比如“通过/不通过”“匹配/不匹配”“合规/不合规”这种二分类或三分类。任务本身不复杂复杂的是标注数据很少大概几百条量级而且正负样本分布不太均衡。我第一反应是这种小样本判定任务直接微调一个大模型不划算成本高、迭代慢那能不能用“检索 重排 小模型判定”的经典三段式来搭一个轻量方案这个思路在信息检索和问答系统里非常成熟先用一个召回模型比如向量检索从候选池里捞出一批候选再用 rerank 模型对候选做精细排序最后交给一个下游模型做最终判定。我当时的假设是rerank 负责把“语义上最相关”的候选排到前面小模型只需要在这个已经收窄的候选集上做判定任务难度被大幅降低小模型应该能扛住。关键词里那几个热搜词其实也印证了这个方向的吸引力“rerank”“小模型”“判定模型”再加上“现在开源小模型有好用的么”“适合小样本仿真数据预测的模型高斯过程回归”。这些搜索词背后是同一类需求在数据少、算力有限、又想要一个能落地的判定能力时怎么用最小的代价搭出一个够用的模型。我就是被这个需求牵着走的结果两天十六个实验下来发现这条路对“判定任务”来说比我想象的要窄得多。先交代一下我的实验环境方便你判断可复现性。硬件是一张消费级显卡显存够跑 7B 级别的模型做推理但训练只能做 LoRA 这种轻量微调。rerank 模型我用的是开源的中文重排模型小模型侧我试了三个量级0.5B、1.5B 和 3B 级别的开源模型。数据是我自己构造的判定数据集约 600 条正负比大概 1:2。评测指标用准确率和 F1因为判定任务里 F1 比单纯准确率更能反映真实能力。我原本的计划是先跑通“召回 rerank 小模型判定”的完整链路然后逐步替换组件看哪个环节是瓶颈。结果第一个实验就给了我一个下马威——rerank 排出来的“最相关”候选和小模型判定所需要的“最有判别力”的候选根本不是一回事。这个认知偏差是我后面所有失败的根源。2. 十六个实验的完整排布与每一轮的真实动机我把十六个实验按“变量控制”的思路排了序每一轮只改一个主要变量目的是定位瓶颈到底在哪。下面这张表是我事后整理的实验矩阵你可以直接看到我试过的组合和结果走向。实验编号召回方式rerank小模型规模判定方式准确率F1E01向量检索 top20无0.5B直接判定0.610.48E02向量检索 top20有0.5B直接判定0.630.51E03向量检索 top10有0.5B直接判定0.640.53E04向量检索 top5有0.5B直接判定0.660.55E05向量检索 top20有1.5B直接判定0.680.58E06向量检索 top20有3B直接判定0.710.62E07关键词召回 top20有1.5B直接判定0.650.54E08混合召回 top20有1.5B直接判定0.690.59E09向量检索 top20有1.5B候选拼接后判定0.700.60E10向量检索 top20有1.5B逐候选判定再投票0.670.57E11向量检索 top20有1.5BLoRA 微调后判定0.730.65E12向量检索 top20有3BLoRA 微调后判定0.750.68E13无召回全量输入无1.5B直接判定0.720.63E14无召回全量输入无3B直接判定0.760.69E15无召回全量输入无3BLoRA 微调后判定0.790.72E16无召回全量输入无7BLoRA 微调后判定0.820.76这张表里最刺眼的一行是 E13 到 E16当我把召回和 rerank 整个拿掉直接把原始输入喂给模型时效果反而比带 rerank 的链路更好。E15 的 0.79 准确率比我前面所有带 rerank 的实验都高。E16 用 7B 模型微调后到了 0.82虽然提升幅度在缩小但趋势非常明确。这就引出了第一个核心问题为什么 rerank 在这个判定任务里不但没帮忙反而拖了后腿2.1 召回和 rerank 优化的是“相关性”不是“判别性”我一开始把“判定”默认成了“先找到相关证据再基于证据下结论”。这个假设在问答和事实核查类任务里成立但在很多判定任务里不成立。判定任务真正需要的是判别性特征也就是那些能把正类和负类区分开的信号而不是语义上最相似的文本。举个具体例子。假设判定任务是“判断这条用户反馈是否属于投诉”。一条反馈是“你们这个功能做得真好我用了三年从来没出过问题”。向量检索会认为它和“投诉”相关的语料语义距离较远rerank 也会把它排到后面。但另一条反馈是“我不想投诉我只是想问一下怎么退款”这条在语义上和“投诉”高度相关rerank 会把它排到前面可它实际上并不是投诉。也就是说rerank 把“像投诉的文本”排到了前面但判定任务要的是“是投诉的文本”。这两者在很多边界样本上是错位的。我的 E01 到 E04 之所以准确率卡在 0.6 出头就是因为 rerank 把一批“语义相关但标签相反”的候选推到了小模型面前小模型被这些干扰项带偏了。2.2 小模型在“被 rerank 收窄的候选集”上并没有变轻松我原本以为候选集从 20 条收窄到 5 条小模型的负担会小很多。实测下来完全不是。E03 和 E04 的准确率只比 E01 高了 3 到 5 个百分点而且 F1 提升更小。原因在于收窄候选集减少的是“数量”不是“难度”。真正难判定的样本恰恰是那些在语义上和目标类别高度相似、但标签相反的样本。rerank 越精准越容易把这些“高相似度陷阱”排到前面小模型面对的就是最难的那一批。我后来做了一个小验证把 E04 里小模型判错的样本单独拉出来看发现超过六成的错误样本其 top1 候选和输入文本的语义相似度都在 0.85 以上。换句话说rerank 干得太好了好到把最像的干扰项都找出来了而小模型没有能力区分“像”和“是”。2.3 判定任务的标签空间太窄rerank 的排序信号被浪费还有一个更隐蔽的问题判定任务的输出空间很小往往就两三个类别。rerank 输出的是一个连续的排序分数这个分数在“从大量候选中挑出最相关的几条”时非常有用但在“二分类判定”里它提供的信息维度太单一了。小模型需要的是“这条输入属于正类的概率”而 rerank 给的是“这条候选和查询的相关性”两者不在一个语义空间里。我试过把 rerank 分数作为特征拼进小模型的输入E09 的变体效果有微弱提升但提升幅度远不如直接把原始输入给模型E13。这说明 rerank 分数在这个任务里携带的判别信息还不如原始文本本身丰富。3. 小模型侧的真实表现0.5B 到 3B 的能力边界在哪聊完 rerank再说小模型。我试了 0.5B、1.5B、3B 三个量级加上最后的 7B 对照基本摸清了这类判定任务上小模型的能力曲线。结论可能和很多人的直觉相反在判定任务上小模型的瓶颈不是“知识不够”而是“指令跟随和边界区分能力不够”。3.1 0.5B 级别能跑通链路但判定几乎靠猜E01 到 E04 用的都是 0.5B 模型。这个量级的模型有个特点你让它做生成它能说出通顺的话你让它做判定它会给你一个看起来像那么回事的答案但准确率基本在随机水平附近晃。0.61 的准确率在正负比 1:2 的数据上其实只比“全猜负类”的基线0.67 左右还低。我后来分析了一下 0.5B 模型的输出分布发现它有一个很强的倾向对输入文本里的显式情感词或关键词过度敏感。只要文本里出现“不”“问题”“差”这类词它就倾向判为负类出现“好”“满意”就判为正类。它没有能力处理否定、反讽、条件句这些稍微复杂一点的语言现象。所以 0.5B 在这个任务上基本可以判死刑除非你的判定规则简单到可以用关键词匹配替代。3.2 1.5B 级别开始有判别能力但极不稳定E05、E07 到 E11 用的是 1.5B 模型。这个量级是明显的分水岭。直接判定E05能到 0.68LoRA 微调后E11能到 0.73。但它的不稳定体现在两个方面一是对 prompt 措辞极其敏感我把“请判断以下内容是否属于投诉”改成“以下内容是否为投诉”准确率能波动 4 到 5 个百分点二是对样本顺序敏感同一批数据换个顺序跑F1 能差 3 个点。这种不稳定性在工程上是很致命的。你没法确定线上效果到底是模型能力还是运气。我试过用固定随机种子、固定 prompt 模板来压波动但只能缓解不能消除。1.5B 模型给我的感觉是它“知道”该怎么做判定但这个知识非常脆弱稍微换个场景就崩。3.3 3B 级别判定能力明显上一个台阶但成本开始不划算E06、E12、E14、E15 用的是 3B 模型。3B 是我这次实验里性价比的拐点。直接判定能到 0.71E06全量输入直接判定能到 0.76E14LoRA 微调后到 0.79E15。这个水平在很多业务场景里已经可以用了。但问题在于成本。3B 模型做 LoRA 微调显存占用和训练时间都比 1.5B 高出一大截。我那张消费级显卡跑 3B 的 LoRAbatch size 只能开到 4训一轮要将近四十分钟。如果要做多轮迭代调参时间成本会迅速累积。而且 3B 的推理延迟在线上也是个问题尤其是当你要对每条输入做多次判定时。3.4 7B 级别效果最好但已经偏离了“小模型”的初衷E16 用 7B 模型做 LoRA 微调准确率 0.82F1 0.76。这是十六个实验里最好的结果。但 7B 已经不能算“小模型”了它的训练和推理成本都上了一个数量级。我跑完 E16 之后意识到一个尴尬的事实如果最终还是要靠 7B 微调才能达到可用效果那我前面折腾 rerank 和小模型组合的意义是什么这就回到了标题里那个“认输”的点。我认的不是 rerank 或小模型本身不行而是认了“用 rerank 配合小模型去复现一个判定模型”这个特定组合在我的任务和数据条件下投入产出比不成立。4. 那些让我卡住的具体坑从数据构造到评测口径十六个实验里真正让我卡住的不是模型本身而是一堆看起来不起眼、但每一个都能让结果偏掉的工程细节。这部分我挑三个最有代表性的坑展开讲都是常规文档里不会写的。4.1 判定任务的“负样本”定义比正样本难十倍我一开始构造数据时正样本定义得很清楚符合判定条件的就算正类。但负样本怎么定义是“明确不符合”还是“不符合但语义相近”这两种负样本对模型的要求完全不同。我第一版数据里的负样本大多是“明显不符合”的比如判定“是否投诉”负样本就是“咨询物流进度”这种。结果模型学到的其实是“有没有投诉关键词”而不是“是不是投诉”。后来我加入了一批“语义相近但标签相反”的难负样本比如“我要投诉你们这个退款流程太慢了”和“我不是要投诉我就是想问退款流程”模型准确率立刻掉了 8 个百分点。这个坑的教训是判定任务的数据质量几乎完全取决于难负样本的构造。如果你只放容易的负样本模型会给你一个虚高的准确率上线就崩。但难负样本的构造又极其耗时我 600 条数据里光是筛选和标注难负样本就花了大半天。4.2 rerank 的 top-k 选择和判定阈值是耦合的我一开始把 rerank 的 top-k 当成一个独立超参来调试了 5、10、20 三档。后来发现top-k 的选择和判定阈值是耦合的。当你把 top-k 调小候选集变窄小模型看到的证据变少它会更倾向于给出“不确定”的判定这时候你需要把判定阈值调低才能维持召回。但阈值一低误报就上来了。这个耦合关系在 E03 和 E04 里体现得特别明显。E04 的 top-k5准确率比 E03 高了一点但 F1 几乎没动因为召回掉了。我后来用网格搜索把 top-k 和阈值一起调找到的最优点在 top-k8、阈值 0.45 附近但那个点的 F1 也只比 E03 高了 1 个百分点。投入产出比极低。4.3 评测口径不一致让我白跑了四个实验这是最让我吐血的一个坑。我前四个实验用的是“逐样本准确率”后来为了和另一个基线对比换成了“按类别加权 F1”。结果发现同样一个模型在两种口径下的排名完全不一样。E02 在准确率口径下比 E01 高 2 个点但在加权 F1 口径下反而低了 1 个点。原因在于我的数据正负比是 1:2准确率会被多数类主导而加权 F1 会惩罚少数类的错误。我前四个实验的结论因此全部要重新审视。这件事的教训很直接在开始跑实验之前先把评测口径定死并且确保它和业务目标一致。如果你的业务更在意少数类的召回那就别用准确率做主指标。5. 如果重来一次我会怎么调整这条技术路线认输归认输但这两天的实验不是白跑的。如果让我重新做一次我会在几个关键决策点上做出完全不同的选择。这部分是我认为对同类任务最有参考价值的内容。5.1 先做基线再决定要不要上 rerank我最大的失误是一上来就假设“rerank 小模型”是正确路线然后花大量时间在这个框架内调参。正确的做法应该是先用最简单的方案跑一个基线。比如直接把原始输入喂给 3B 模型做判定也就是 E14看看效果。如果基线已经能到 0.75 左右那 rerank 的增量空间就非常有限不值得投入。我事后算了一下如果我先跑 E14再跑 E15可能半天就能得出结论这条任务上rerank 的收益是负的。剩下的时间可以用来做更有价值的事比如构造更好的难负样本或者试不同的 prompt 策略。5.2 小模型选型优先看“指令跟随”而不是“参数量”我试的三个量级里1.5B 和 3B 的差距远大于 3B 和 7B 的差距。但同样是 1.5B不同厂商的模型在判定任务上的表现能差 10 个百分点以上。这说明在判定这种强指令任务上模型的指令微调质量比参数量更重要。如果你要选小模型做判定我的建议是先拿几个候选模型用同一套 prompt 在同一批数据上跑一遍看谁的输出格式最稳定、对 prompt 措辞最不敏感。参数量放在第二位考虑。一个指令跟随好的 1.5B可能比一个指令跟随差的 3B 更实用。5.3 判定任务的数据构造应该先于模型选型我这次是先把模型链路搭起来再回头补数据。这个顺序是反的。判定任务的核心资产是数据尤其是难负样本。你应该先花时间把数据的边界定义清楚把难负样本构造好然后再去选模型。因为不同的数据分布对模型的要求完全不同。具体来说我会先做这三件事第一明确正类和负类的判定标准写成可操作的规则文档第二构造至少 200 条难负样本确保它们和正样本在语义上足够接近第三用一个人工规则或关键词基线跑一遍看看这批数据本身的难度上限在哪。做完这三步你才知道模型需要解决的是什么问题。5.4 高斯过程回归这类小样本方法值得在判定任务上试一试热搜词里出现了“适合小样本仿真数据预测的模型高斯过程回归”这其实提醒了我一个被忽略的方向。高斯过程回归GPR在小样本、低维特征的任务上往往能给出比神经网络更稳的结果而且它自带不确定性估计。对于判定任务你可以把判定问题转化成“正类概率回归”用 GPR 在少量特征上建模。我这次没来得及试 GPR但事后想想如果我把判定任务的特征工程做好比如提取文本的长度、关键词密度、情感极性、与正类模板的相似度等然后用 GPR 做回归可能在几百条数据上就能得到一个比 0.5B 模型更稳的基线。这个方向成本低、可解释性强值得在下次实验里优先验证。6. 认输之后我对“小模型 rerank”这件事的真实看法最后说点掏心窝的话。这两天十六个实验让我对小模型和 rerank 的适用边界有了更清醒的认识。我不觉得 rerank 没用也不觉得小模型不行我只是认了“它们组合在一起去复现一个判定模型”这件事在我的场景里不成立。rerank 的价值在于处理“大量候选中的相关性排序”它的主场是检索和问答。判定任务的主场是“边界区分”它需要的是判别性特征和稳定的指令跟随能力。这两件事的优化目标不一样硬凑在一起就会出现我遇到的那种情况rerank 把最像的干扰项找出来了小模型却没有能力区分“像”和“是”。小模型的价值在于低成本和低延迟但它的能力边界在判定任务上体现得特别明显。0.5B 基本不可用1.5B 勉强能用但不稳定3B 是性价比拐点7B 效果最好但已经不算小。如果你要做判定任务我的建议是直接从 3B 起步把精力放在数据构造和 prompt 优化上而不是在 rerank 链路上反复调参。至于“现在开源小模型有好用的么”这个问题我的答案是有但要看任务。生成类任务上小模型的表现已经相当能打判定类任务上小模型的稳定性还是个问题你需要用数据和 prompt 去补它的短板。如果你手上的判定任务数据量在几百条量级我甚至建议你先别急着上模型用规则或 GPR 跑一个基线可能比折腾小模型更快出结果。这两天的实验记录我都留着包括每个实验的 prompt、参数和错误样本分析。如果你也在做类似的判定任务希望这份失败复盘能帮你少走两天弯路。至少你现在知道rerank 不是万能药小模型也不是越小越好判定任务的核心永远在数据和评测口径上而不是在模型组合的花样上。