ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

16组实验复现判定模型失败:rerank配合小模型的边界与取舍

16组实验复现判定模型失败:rerank配合小模型的边界与取舍 两天的实验排期16 组配置从 rerank 权重到小模型选型再到判定阈值我几乎把能想到的组合都跑了一遍。结果很直接没有复现出那个判定模型。但这个过程里踩到的坑、看到的边界、摸清的取舍逻辑比一个成功复现的结论值钱得多。这篇就把整个实验链路摊开讲——为什么选 rerank 配合小模型、16 个实验分别卡在哪、哪些方向其实一开始就该放弃、以及最后我为什么认输。如果你也在琢磨用检索增强加轻量模型做判定类任务或者纠结开源小模型到底能不能扛住这种场景这篇应该能帮你省下至少一天半的试错时间。1. 判定模型这个任务到底难在哪1.1 判定和生成是两码事很多人一上来就把判定模型当成让模型输出是或否的生成任务这个理解偏差会直接带偏整个技术选型。生成任务追求的是流畅、合理、信息完整模型可以自由发挥判定任务追求的是稳定、可复现、边界清晰同一个输入跑十次必须给出同一个结论。这两者的优化目标几乎是对立的。我这次要复现的判定模型核心逻辑是给一段查询和一组候选文档判断哪些文档真正满足查询意图。听起来像排序但比排序更严格——排序允许相对更好判定要求绝对达标。这就意味着模型不仅要理解语义相关性还要能识别出那些看起来相关但实际不满足约束的干扰项。举个具体例子。查询是适合小样本仿真数据预测的模型候选文档里有一篇讲高斯过程回归的语义上高度相关但如果这篇文档只讲了理论没讲小样本场景下的参数设置那它就不该被判为满足。这种细粒度的边界判断恰恰是小模型最容易翻车的地方。1.2 为什么想到用 rerank 配合小模型思路本身不复杂。判定任务可以拆成两步第一步用检索把候选集缩小第二步用模型做精细判断。rerank 模型天生就是干第二步的——它接收查询和文档对输出一个相关性分数。如果把这个分数经过阈值映射成判定结果理论上就能复现判定模型。选小模型的原因更现实判定任务往往需要低延迟、高并发、可本地部署。大模型效果可能更好但推理成本和响应时间在判定场景里往往是不可接受的。开源小模型这几年进步明显参数量从 1B 到 7B 都有能打的选手配合 rerank 做两阶段判定看起来是一条性价比很高的路径。我当时的预期是rerank 负责粗筛和打分小模型负责在边界样本上做二次确认两者配合应该能逼近判定模型的效果。这个预期后来被证明过于乐观了。1.3 判定任务的三个硬指标在动手之前我先明确了三个必须同时满足的指标这也是后面 16 个实验的评估基准准确率判定结果和人工标注的一致率目标 90% 以上一致性同一输入多次推理结果完全一致不允许有随机波动延迟单次判定端到端控制在 500ms 以内这是判定场景的硬约束这三个指标里一致性是最容易被忽视但最致命的。很多小模型在温度参数不为零时输出会有微小波动放到判定任务里就是灾难——同一个查询两次判定结果不同下游系统根本没法用。2. 16 个实验的完整排布与变量设计2.1 实验矩阵是怎么搭出来的两天时间要跑 16 个实验必须提前把变量矩阵设计清楚否则就是瞎跑。我把变量分成四组变量组具体变量取值rerank 模型模型类型交叉编码器、双编码器小模型参数量1.5B、3B、7B判定策略阈值方式固定阈值、动态阈值融合方式rerank 与小模型关系串联、并联、加权16 个实验就是从这个矩阵里挑出最有代表性的组合。我没有做全排列因为全排列是 2×3×2×336 组两天根本跑不完。我优先选了那些理论上最可能work和理论上最可能失败的组合这样无论结果如何都能获得最大信息量。2.2 每个实验的固定流程为了保证可比性每个实验都走同一套流程准备 200 条标注好的查询-文档对其中正例 80 条、负例 120 条负例里特意混入了 40 条高相似度干扰项用 rerank 模型对全部候选打分记录分数分布按设定的判定策略生成判定结果小模型对边界样本分数在阈值附近的做二次判定汇总准确率、一致性、延迟三个指标这个流程里最关键的是第 4 步的边界样本定义。我一开始把边界定义为分数在阈值±0.1 范围内的样本后来发现这个范围太宽导致小模型要处理的样本太多延迟直接爆掉。调整到±0.03 之后才勉强可控。2.3 实验编号与配置对照为了后面讲清楚这里先把 16 个实验的编号和核心配置列出来E01-E04交叉编码器 rerank 1.5B 小模型阈值策略分别为固定 0.5、固定 0.6、动态分位数、动态均值E05-E08交叉编码器 rerank 3B 小模型阈值策略同上E09-E12双编码器 rerank 3B 小模型阈值策略同上E13-E16交叉编码器 rerank 7B 小模型阈值策略同上这个排布的逻辑是先固定 rerank 类型看小模型参数量和阈值策略的影响再固定小模型看 rerank 类型的影响。这样能分离出每个变量的独立贡献。3. 跑下来最先暴露的问题rerank 分数不是判定分数3.1 分数分布的真相第一个实验 E01 跑完我就发现了一个根本性问题rerank 输出的相关性分数分布和判定所需的分数完全不是一回事。rerank 分数是相对分数它的绝对值没有意义只有相对排序有意义。也就是说同一批候选里分数 0.8 的文档确实比 0.6 的相关但 0.8 本身不代表满足判定条件。不同查询之间的分数不可比甚至同一查询不同批次的分数也可能因为候选集变化而漂移。我实测下来E01 的分数分布是这样的正例分数集中在 0.7-0.95负例分数集中在 0.3-0.7中间有大量重叠。如果直接卡 0.5 阈值准确率只有 72%远低于 90% 的目标。3.2 固定阈值为什么必然失败E01 到 E04 用的是固定阈值结果全部不理想。根本原因在于判定边界不是全局固定的而是随查询变化的。有的查询语义宽泛正例分数普遍偏高阈值应该上调有的查询语义严格正例分数偏低阈值应该下调。固定阈值等于假设所有查询的判定边界一致这个假设在真实数据上不成立。E03 和 E04 尝试了动态阈值分别用分位数和均值来定阈值。分位数策略是把当前候选集分数的某个分位点作为阈值均值策略是用分数均值加减标准差。这两个策略比固定阈值好一些准确率提到了 78% 左右但还是不够。这里有个反直觉的点动态阈值虽然更合理但它引入了新的不稳定性。同一查询如果候选集变了阈值就变了判定结果也跟着变。这在一致性指标上是扣分项。3.3 小模型二次判定救了多少E02 和 E05 的对比很能说明问题。E02 是 1.5B 小模型做二次判定E05 是 3B。在边界样本上1.5B 的判定准确率只有 65%3B 提到了 74%7BE13到了 79%。这个提升幅度说明小模型确实能捕捉到 rerank 分数捕捉不到的语义细节但代价是延迟。1.5B 单次推理约 80ms3B 约 180ms7B 约 420ms。加上 rerank 本身的耗时E13 的端到端延迟已经逼近 600ms超过了 500ms 的硬约束。更麻烦的是小模型在边界样本上的判定本身也不稳定。我做了 5 次重复推理3B 模型在约 12% 的边界样本上给出了不一致的结果。这个不一致率在判定场景里是不可接受的。4. 小模型选型的现实约束4.1 参数量和能力的非线性关系16 个实验里小模型参数量是最直观的变量。但实测下来参数量和判定能力不是线性关系而是有明显的台阶。1.5B 到 3B 是一个台阶判定准确率提升约 9 个百分点3B 到 7B 是另一个台阶提升约 5 个百分点但延迟翻倍还多。从性价比看3B 是拐点但 3B 的绝对准确率又不够。这里有个容易被忽略的点小模型的判定能力高度依赖训练数据分布。我用的这几个开源小模型预训练数据里判定类任务的比例很低所以它们在边界样本上的表现普遍偏弱。这不是参数量能完全弥补的。4.2 量化对小模型判定的影响为了压延迟我试过对 3B 模型做 4bit 量化。结果很直接延迟从 180ms 降到 110ms但判定准确率从 74% 掉到 68%一致性也变差了不一致率从 12% 升到 19%。量化对生成任务的影响可能还能接受但对判定任务来说精度损失直接体现在边界判断上。那些本来就需要精细语义区分的样本量化后基本判不准。所以在这个场景里量化这条路走不通。4.3 本地部署的硬件现实热词里有人问二手笔记本电脑 32G 内存能跑小模型的推荐我正好用一台 32G 内存的机器做了对照测试。结论是7B 模型在 32G 内存上能加载但推理速度很勉强单次判定延迟在 800ms 以上而且内存占用接近 28G系统已经开始频繁换页。3B 模型在 32G 内存上比较舒服延迟可控内存占用约 12G。1.5B 更轻但能力不够。所以如果硬件是 32G 内存这个级别3B 是上限7B 不要考虑。5. 判定策略的深层矛盾5.1 串联和并联的本质区别E05 到 E08 用的是串联策略rerank 先打分小模型只处理边界样本。E09 到 E12 用的是并联策略rerank 和小模型各自独立判定最后加权融合。串联的优点是延迟低因为小模型只处理少量样本缺点是边界样本的定义很敏感定义宽了延迟高定义窄了漏判多。并联的优点是判定更全面缺点是延迟高因为每个样本都要过两个模型。实测下来串联在延迟上有明显优势但准确率受边界定义影响太大并联准确率略高但延迟直接翻倍。在 500ms 的硬约束下并联基本不可行。5.2 加权融合的权重怎么定E09 到 E12 里我试了三种权重rerank 权重 0.7、0.5、0.3。结果是 0.5 附近最好但提升幅度很小只有 1-2 个百分点。这说明 rerank 和小模型的判定结果高度相关融合带来的增益有限。更关键的是加权融合引入了一个新的超参数而这个超参数在不同查询上的最优值不一样。全局固定的权重本质上和固定阈值是同一个问题。5.3 一致性问题的根源所有实验里一致性问题始终没有彻底解决。根源在于判定任务要求确定性输出但小模型的推理过程本身带有随机性。即使把温度设为 0由于浮点运算的累积误差和批处理顺序的差异输出仍可能有微小波动。在生成任务里这种波动无所谓但在判定任务里一个样本的判定结果翻转就是错误。我试过用多次推理投票来提升一致性但这样延迟直接乘以投票次数不可接受。也试过固定随机种子但只能保证单机单次运行一致跨批次仍然有波动。6. 那些我试过但走不通的方向6.1 用 grep 做本地小模型检索热词里提到grep 在本地小模型我确实试过用 grep 做候选集的粗筛。思路是用关键词匹配先缩小范围再让 rerank 和小模型处理。结果很失望。grep 只能做字面匹配对语义变体完全无能为力。查询适合小样本仿真数据预测的模型grep 匹配不到只讲高斯过程回归但没提小样本的文档。粗筛阶段就漏掉了大量正例后面再怎么精细判定都救不回来。grep 唯一有用的场景是候选集极大、需要快速排除明显无关项的时候。但即便如此它的召回损失也往往得不偿失。6.2 高斯过程回归做判定热词里还有适合小样本仿真数据预测的模型高斯过程回归我认真考虑过用高斯过程回归来做判定。理论上高斯过程回归能给出预测的不确定性这对判定边界很有价值。但实际试下来高斯过程回归的输入必须是数值特征而判定任务的输入是文本。要把文本转成数值特征又得依赖 embedding 模型这就绕回了原点。而且高斯过程回归的计算复杂度是 O(n³)候选集一大就跑不动。这个方向不是不对而是不适合这个场景。如果判定任务的输入本身就是数值型的仿真数据高斯过程回归会是个好选择。6.3 卡帕西知识库那套思路能不能搬热词里卡帕西的知识库可以用小模型做吗这个问题我也想过。那套思路的核心是用高质量数据加精细微调让小模型在特定领域达到接近大模型的效果。但判定任务和知识库问答有个本质区别知识库问答的正确答案是开放的判定任务的正确答案是封闭的是或否。封闭任务的容错率更低小模型在边界上的任何偏差都会被放大。而且微调需要标注数据我手头只有 200 条标注样本这个量级做微调远远不够。要微调出稳定的判定能力至少需要几千条高质量标注这个成本我承担不起。7. 认输之后我重新理解了这件事7.1 判定模型的本质是数据问题不是模型问题16 个实验跑完我最大的收获是判定模型的效果瓶颈不在模型选型而在数据质量。rerank 和小模型都是工具它们能做的只是把已有的语义信息提取出来。如果标注数据本身边界模糊如果负例里的干扰项定义不清再好的模型也判不准。我复盘时发现那 40 条高相似度干扰项里有近三分之一我自己都难以确定该判正还是判负。这意味着即使模型判错了也不一定是模型的错可能是标注标准本身就不一致。判定任务的第一步应该是把判定标准定义清楚而不是急着上模型。7.2 小模型在判定场景的边界在哪经过这轮实验我对小模型在判定场景的能力边界有了比较清晰的认识3B 以下的小模型只能做粗粒度判定边界样本基本靠猜3B 到 7B 之间能做中等粒度判定但一致性无法保证7B 以上判定能力明显提升但延迟和硬件成本开始不可接受如果判定任务的边界清晰、干扰项少3B 配合好的 rerank 有可能达标。但如果边界模糊、干扰项多小模型这条路基本走不通要么上大模型要么回到规则和人工。7.3 如果重来一次我会怎么做如果重新做这个项目我会调整顺序先花一天时间把判定标准写清楚找三个人独立标注同一批样本看标注一致率。如果一致率低于 85%说明标准本身有问题先改标准再谈模型用规则加简单统计做一版 baseline看看不依赖模型能做到什么程度。很多时候 baseline 已经够用了如果 baseline 不够再考虑 rerank 加小模型。而且要先做小规模验证确认边界样本上小模型确实有增益再扩大实验一致性指标要单独设计测试不能等到最后才发现问题这个顺序的核心逻辑是先确认问题定义清楚再确认简单方法不够用最后才上复杂方案。我这次是反过来的先上了复杂方案跑了两天才发现根子在数据上。7.4 一个意外的收获虽然判定模型没复现出来但这两天的实验让我对 rerank 分数的理解深了很多。rerank 分数作为相对排序指标是可靠的但作为绝对判定指标是不可靠的。这个认知在后续做检索排序任务时非常有用。另外我也摸清了 32G 内存机器跑小模型的实际边界3B 是舒适区7B 是极限区再大就别想了。这个经验对做本地部署的同行应该有帮助。最后说一句实在话认输不丢人跑了两天才认输也不丢人。丢人的是明明方向不对还硬撑把时间浪费在不可能work的组合上。16 个实验里真正有价值的不是那些接近成功的而是那些明确告诉你此路不通的。知道哪里走不通比知道哪里走得通更重要。
返回列表