如何基于Amazon-ESCI数据集微调Sentence Transformers优化语义商品搜索
基于Amazon-ESCI数据集微调Sentence Transformers适配电商商品推荐
一、数据集预处理
Amazon-ESCI数据集的标签分为Exact(E,完全匹配)、Substitute(S,替代商品)、Complement(C,互补商品)、Irrelevant(I,无关),需针对性处理:
- 标签筛选与转换:
- 保留E、S、C类作为正样本,这些都是用户搜索后可能感兴趣的商品;直接剔除I类数据。若需要构造负样本,可从同品类的I类商品或跨品类随机商品中选取。
- 将数据整理为
查询-商品描述-匹配标签的三元组,正样本标签设为1,负样本设为0。
- 文本清洗:
- 去除商品描述和查询中的HTML标签、特殊符号、冗余空格;电商特有术语(如品牌名、型号、SKU)保留原始写法,避免丢失关键信息。
- 截断过长文本:根据所用预训练模型的token长度限制(如BERT-base为512),优先保留商品名称、核心功能等关键内容,截断超出部分。
二、微调任务选择
针对电商语义匹配场景,优先选用以下两种微调任务:
- 对比学习任务:
- 将查询作为anchor(锚点),对应正样本商品描述为positive,负样本为negative,构造
(anchor, positive, negative)三元组。 - 使用
MultipleNegativesRankingLoss,该损失能利用同批次内的其他样本作为负样本,提升训练效率,更适合语义相似度匹配场景。
- 将查询作为anchor(锚点),对应正样本商品描述为positive,负样本为negative,构造
- 分类任务:
- 将查询与商品描述拼接后输入模型,预测二者的匹配类别(可简化为匹配/不匹配二分类,或保留E/S/C/I多分类),使用
CrossEntropyLoss。这种方式能让模型学习到更明确的匹配关系,适合有明确标签的场景。
- 将查询与商品描述拼接后输入模型,预测二者的匹配类别(可简化为匹配/不匹配二分类,或保留E/S/C/I多分类),使用
三、微调流程示例
from sentence_transformers import SentenceTransformer, InputExample, losses from sentence_transformers.datasets import SentencesDataset from torch.utils.data import DataLoader # 加载预训练模型,优先选轻量且通用的模型(如all-MiniLM-L6-v2) model = SentenceTransformer('all-MiniLM-L6-v2') # 构造训练样本(假设preprocessed_data是预处理后的三元组列表) train_examples = [] for query, product_desc, label in preprocessed_data: # 正样本标记为1.0,负样本为0.0 train_label = 1.0 if label in ['E', 'S', 'C'] else 0.0 train_examples.append(InputExample(texts=[query, product_desc], label=train_label)) # 构建数据集与加载器 train_dataset = SentencesDataset(train_examples, model) train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=16) # 定义损失函数 train_loss = losses.MultipleNegativesRankingLoss(model=model) # 启动微调 model.fit( train_objectives=[(train_dataloader, train_loss)], epochs=3, warmup_steps=100, output_path='./ecommerce-sentence-transformer' )
四、验证与优化
- 离线验证:用测试集计算模型的Recall@K、Precision@K、NDCG等指标,对比预训练模型的效果提升。
- 在线验证:将微调后的模型部署到小流量线上测试,观察用户点击、转化等业务指标,验证实际推荐效果。
- 持续迭代:收集线上用户的点击、购买数据,补充到训练集,定期重新微调模型,适配用户偏好变化。
内容的提问来源于stack exchange,提问作者L.D. WEERARATHNE
相关产品推荐
相关产品推荐

