1. 电商搜索召回中的多级相关性优化:Mine and Refine框架解析
在电商搜索这个看似简单的功能背后,隐藏着复杂的算法挑战。当用户输入"红色连衣裙"时,系统不仅要返回精确匹配的商品,还需要考虑款式相似但颜色不同的替代品(中等相关),同时避免展示完全不相关的商品如"男式T恤"。这种分级相关性(Graded Relevance)的处理,正是现代电商搜索系统面临的核心难题。
传统方法通常将相关性简化为二元判断(相关/不相关),但实际场景中用户对"红色连衣裙缺货时展示粉色同款"的接受度,与完全无关商品有着本质区别。DoorDash团队提出的"Mine and Refine"框架,通过创新的两阶段训练方案,成功解决了这一挑战。本文将深入解析这一框架的技术细节与实现原理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心挑战与解决方案概览
2.1 电商搜索的特殊性
电商搜索与通用搜索引擎存在三大本质差异:
- 政策约束:某些商品因地区法规可能被限制展示,但这些商品在语义上可能与查询高度相关
- 替代逻辑:用户往往接受功能相似的商品(如"无糖可乐"替代"零度可乐")
- 长尾分布:海量SKU中大部分商品仅有极少量的搜索曝光机会
2.2 Mine and Refine框架设计
该框架的核心创新点在于:
- 三级相关性标注体系:相关(2)、中等相关(1)、不相关(0)
- 两阶段训练架构:
- 第一阶段:构建全局语义空间(SupCon损失)
- 第二阶段:精细化边界划分(改进版Circle Loss)
- LLM辅助的标注系统:通过轻量级LLM实现自动化标注,并结合用户行为数据审计
3. 数据准备与标注系统
3.1 三级相关性定义
| 等级 | 定义 | 示例(查询:"iPhone 13手机壳") |
|---|---|---|
| 2 | 精确匹配 | 专为iPhone 13设计的手机壳 |
| 1 | 中等相关 | 通用型手机壳(标注兼容iPhone 13) |
| 0 | 不相关 | iPhone充电器、其他型号手机壳 |
3.2 LLM标注管道
团队构建了高效的标注流水线:
- 初始标注:微调GPT-4o-mini模型,在3分类任务上达到87.6%准确率
- 行为审计:检测标注与用户实际点击行为的矛盾(如标注为0但高点击的商品)
- 专家复核:对争议案例使用更强大的LLM(GPT-4o、Gemini-1.5)进行最终判定
实践发现:通过行为审计可将标注错误率降低5.74%,这对长尾查询尤为重要
3.3 数据增强策略
为提高模型鲁棒性,采用了三种增强技术:
- 拼写变异:使用NEUSPELL库生成常见拼写错误(如"dress"→"dres")
- 合成查询:基于商品属性生成描述性查询(商品标题:"男士纯棉T恤" → 生成查询:"透气舒适的男式短袖")
- 分类路径融合:将商品分类信息(如"服装/女装/连衣裙")拼接到商品文本中
4. 模型架构与训练细节
4.1 双塔结构设计
采用孪生(Siamese)编码器架构,包含以下关键组件:
- 基础编码器:0.1B参数的多语言预训练模型
- 独立投影层:将768维原始嵌入压缩至128维
- 动态温度系数:可学习的τ参数,初始值0.05

4.2 第一阶段:监督对比学习
使用改进的SupCon损失函数,关键创新在于引入标签权重:
python复制def supervised_contrastive_loss(query_embed, item_embeds, labels, temp=0.05):
# labels取值:2.0, 1.0, 0.0
weights = labels / labels.sum() # 按相关性等级加权
similarities = torch.matmul(query_embed, item_embeds.T) / temp
exp_sim = torch.exp(similarities)
pos_mask = (labels > 0).float()
weighted_pos = (weights * pos_mask) @ torch.log(exp_sim / exp_sim.sum(-1))
return -weighted_pos.mean()
该设计使得:
- 相关商品(2)对损失的贡献 > 中等相关商品(1)
- 完全忽略负样本(0)的相似度计算
4.3 第二阶段:难样本挖掘与Circle Loss
4.3.1 难样本识别策略
- 难负样本:排名前K但标注为0的商品
- 如搜索"素食披萨"时出现的含肉披萨(政策允许但语义不匹配)
- 难正样本:排名靠后但标注≥1的商品
- 如特殊型号的手机壳被错误地排在通用款之后
4.3.2 多级Circle Loss设计
传统Circle Loss针对二分类问题,本文提出三级扩展:
对于相关性等级i和j(i>j),定义边界参数:
- Δ_{i,p} = 0.75(正样本边界)
- Δ_{j,n} = 0.25(负样本边界)
损失函数鼓励:
- 相关vs不相关:相似度差 > 0.75-0.25=0.5
- 相关vs中等相关:相似度差 > 0.4
- 中等相关vs不相关:相似度差 > 0.3
5. 实验与效果验证
5.1 离线评估设置
构建1.55亿查询-商品对的测试集,特点包括:
- 30%查询未出现在训练数据中
- 65%负样本比例(模拟真实场景)
- 多语言、拼写错误、长尾查询全覆盖
5.2 核心指标对比
| 模型 | NDCG@10 | Recall@100 | Precision@50 |
|---|---|---|---|
| BM25基线 | 0.412 | 0.587 | 0.329 |
| 纯SupCon | 0.481 (+16.7%) | 0.642 (+9.4%) | 0.381 (+15.8%) |
| Mine&Refine | 0.523 (+26.9%) | 0.681 (+16.0%) | 0.419 (+27.4%) |
5.3 线上A/B测试结果
在不改变排序模型的情况下,仅替换召回模块:
- 加购率(ATCR)提升:+3.2%(p<0.01)
- 转化率(CVR)提升:+2.7%(p<0.05)
- 订单总额(GOV)提升:+2.9%(p<0.05)
5.4 关键消融实验
5.4.1 模型架构选择
| 架构 | 相对效果 |
|---|---|
| 非对称编码器 | -11% ~ -15% |
| 孪生编码器 | 基准 |
| 孪生+非对称组合 | +13% |
实验表明:参数共享的孪生结构更适合本任务
5.4.2 分类信息粒度
| 分类层级 | Recall@100 |
|---|---|
| 无分类信息 | 0.681 |
| 2级分类 | 0.693 (+1.8%) |
| 4级分类 | 0.684 (+0.4%) |
结果显示:过细的分类粒度反而引入噪声
6. 工程实践中的经验总结
6.1 标注系统优化心得
- 冷启动策略:初期使用人工标注2000个典型case微调LLM,后续通过用户行为数据持续优化
- 长尾处理:对低频查询(月曝光<10次)采用更宽松的中等相关判定
- 政策适配:建立规则引擎覆盖地区限制、年龄限制等硬性政策
6.2 训练调参要点
- 温度系数τ:初始值设为0.05,随训练逐步衰减到0.02
- batch大小:至少需要4096才能保证对比学习效果
- 难样本比例:控制在batch的15-20%之间效果最佳
6.3 线上部署考量
- 延迟优化:通过PQ量化将128维嵌入压缩到64字节
- 索引更新:每天全量更新索引,每小时增量更新热门商品
- 降级方案:当语义召回异常时自动切换至BM25+协同过滤的混合模式
7. 扩展应用与未来方向
该方法的核心思想可推广至:
- 跨模态检索:图文匹配中的分级相关性(精确匹配→风格相似→完全不相关)
- 推荐系统:用户对推荐结果的接受度分级(喜欢→可接受→拒绝)
- 广告投放:广告与搜索词的相关性分级(完全匹配→部分相关→无关)
在实际部署中发现,当商品库超过2亿SKU时,建议:
- 采用分层索引结构(先粗筛类目,再精细检索)
- 对高频查询维护独立的小规模索引
- 实现embedding的局部更新机制,避免全量重建开销
这个框架的成功证实了:在保持模型轻量化的前提下(0.1B参数),通过精心设计的数据策略和损失函数,可以显著提升电商搜索的核心指标。未来的优化方向可能包括引入查询意图识别、融合实时用户行为信号等。
