0.6B法律嵌入模型登顶MTEB(Law)第二:高效微调实战指南
在资源受限的条件下,如何将一个小型模型打磨到行业顶尖水平?我们最近发布的0.6B参数法律嵌入模型在MTEB(Law)基准上取得了第二名的成绩,仅次于一个7-8B的专用模型,超越了所有4B、8B甚至14B的开源检索模型。这一成果并非偶然,而是源于一套严谨的微调方法论。本文将完整拆解这套方法,涵盖从基准定义、LoRA微调、硬负样本挖掘、数据检查、权重合并到模型集成的每一个关键步骤,并解释每一步背后的原理与决策依据。
定义“更好”:以基准为锚点
任何优化项目的起点,都是明确什么是“更好”。我们选择MTEB(Law) v1作为衡量标准,并将未修改的基础模型得分作为基线。此后,每一个改动——无论是负样本挖掘策略、训练数据扩充还是权重合并——都必须通过一个简单规则的检验:它是否在基准上超越了基线?如果答案是否定的,无论想法多么巧妙,都会被舍弃。这种纪律性确保了每一步改进都是可验证的,避免了主观臆断。
我们选用Qwen/Qwen3-Embedding-0.6B作为基础模型,因为它足够小,训练速度快,成本低,非常适合我们的时间与算力限制。首先,我们评估基础模型的得分,将其作为后续所有实验的对照点。
小模型,大潜力:LoRA微调
微调采用标准配置,但每个组件都值得深入理解。LoRA(低秩适应)通过训练小型低秩矩阵而非全部权重,大幅降低了训练成本,同时保持了基础模型的冻结状态。对于解码器架构的嵌入模型,如E5-mistral和Qwen3-Embedding,我们采用最后token的隐藏状态作为句子嵌入。损失函数使用InfoNCE,这是一种对比损失,旨在将查询与其对应文档拉近,同时推远批次中的其他文档。
选择0.6B的模型规模,是为了在保证训练效率的同时,能够快速迭代。事实证明,真正推动分数提升的关键在于负样本的选择和后续的权重合并,而非模型规模本身。
硬负样本挖掘:梯度对齐的艺术
硬负样本是指那些看似相关但并非正确答案的文档,它们对训练模型区分细微差别至关重要。例如,对于查询“埃菲尔铁塔有多高?”,正确答案是给出高度的段落,而一个关于铁塔建造时间的段落就是硬负样本。传统方法通常选择与查询最相似但非正确的文档作为负样本,但在法律领域,这种方法往往适得其反:最相似的非正确文档可能是正确答案的近重复,训练模型推开它,也会连带推开正确答案,造成假阴性。
我们采用了一种基于梯度对齐的负样本选择方法,灵感来源于LESS(ICML 2024)。核心思想是:在所有候选负样本中,找出那些训练梯度方向与缩小评估差距所需梯度方向一致的样本。具体实现上,我们计算每个候选负样本对损失函数的贡献,并评估其梯度与目标梯度的余弦相似度。实验结果显示,梯度对齐选择的负样本(+0.093)显著优于随机选择(+0.073),而基于嵌入距离的“最硬”负样本(+0.018)几乎无效。更令人惊讶的是,通过扰动正确答案合成的负样本(如替换实体、日期或数字)得分低于随机,因为99%相似的扰动实际上等同于正确答案。
此外,我们还发现了一个关键问题:某些文档几乎与所有查询都邻近,它们不是硬负样本,而是“引力井”,会污染挖掘结果。通过集线器过滤,移除那些频繁出现在多个查询邻居中的文档,梯度对齐的得分从0.54跃升至0.98。因此,我们的负样本选择策略是:真实、领域内、检索易混淆的文档,经过集线器过滤,既不是最近的邻居,也绝不使用合成样本。
数据直读:超越聚合指标
聚合分数只能告诉你任务卡住了,却无法告诉你原因。要找到原因,必须直接查看查询、正确答案以及模型错误检索到的文档。我们几乎所有的实际修复都源于直接阅读数据,而非盯着指标。
例如,我们的法规检索任务表现平平,聚合指标建议“在主要法典上加深训练”。但阅读评估语料后发现,任务涉及约200部法规,涵盖宪法、程序法典、证据法、仲裁法、合同法等,而我们的训练池仅包含一部法典。模型从未见过测试中大部分的语言,这是覆盖缺口,单纯加深训练无法解决。解决方案是增加来自独立公共领域文本的广度,将数百部额外法案拆分为(标题→正文)对进行训练。这一改动提升了8个任务中的7个,法规任务得分从0.722升至0.783。
当新增训练数据与评估领域重叠时,必须设置泄漏防护。我们使用8词窗口的shingle containment方法,丢弃与评估文档共享超过30% shingle的训练文档。这比精确哈希去重更有效,因为转录文本可能逐字符不同。
对抗灾难性遗忘:WiSE-FT权重合并
微调模型时,一个常见问题是灾难性遗忘:模型在目标任务上表现更好,但在其他任务上退化。我们首先尝试了重放策略,即在训练中混入部分通用数据,但这是一种权衡:重放越多,新任务学习越少。
WiSE-FT提供了一种几乎免费的解决方案。其核心洞察是:微调移动了权重,但丢失的通用能力仍存在于基础权重中,因此可以在训练后通过权重空间插值来恢复。具体地,将基础模型与微调模型的权重按比例混合:θ = (1-α)·基础 + α·微调,并扫描α值。由于LoRA从零增量开始,插值简化为仅缩放LoRA的B矩阵。通过扫描α,我们可以在不重新训练的情况下,恢复遗忘的任务,同时保持学习到的任务。峰值几乎从不在α=1处,这验证了合并的有效性。一个关键检查是:α=0时必须精确复现基础模型,否则合并数学有误。
模型汤:集成多个变体
模型汤是将多个微调模型的权重平均,通常优于任何单一模型,且不增加推理成本。我们训练了两个变体:一个使用挖掘的硬负样本,另一个仅使用批次内负样本。将两个适配器平均,然后对平均值进行α合并。这样做的原因是:仅使用批次内负样本的变体几乎不遗忘,因此平均值受损较小,可以注入更多微调信号而不触发遗忘,从而在α曲线上达到更高点。
一个重要的边界条件:负样本不能跨基础模型大小迁移。我们将0.6B模型挖掘的负样本用于4B模型时,效果适得其反,因为对弱表示而言是硬负样本的,对强表示可能是正确且容易的。因此,必须针对实际训练的基础模型挖掘负样本。
实践与开源
我们已将模型和完整方法开源:Hanno-Labs/dinghy-law-0.6b-v1,这是一个0.6B的法律检索模型,在MTEB(Law)上排名第二,采用商业友好许可。希望这份指南能帮助你在资源有限的情况下,通过系统化的方法,实现模型性能的突破。