语义搜索微调:如何优化Sentence-BERT余弦相似度排序结果
预训练BERT句向量搜索排序优化方案
你遇到的问题本质是通用预训练模型没有适配商品搜索场景的语义优先级,普通余弦相似度不会区分query中「核心需求(牛奶类饮品)」和「修饰属性(巧克力味)」的权重,才会把巧克力糖果类结果排在乳饮料前面。
可落地的优化方案
方案1:新增关键词权重规则
先提取query的核心需求关键词(比如本案例中的「milk(牛奶)」),给包含核心关键词的候选结果额外加固定权重分(可根据场景调整,比如设置为0.2~0.3),调整排序逻辑即可,参考修改代码:# 仅展示修改部分,原有模型编码、相似度计算逻辑保留 core_keywords = ['milk'] # 可接入NLP关键词提取工具自动生成核心词 core_kw_weight = 0.25 # 权重可根据业务效果调整 for query, query_embedding in zip(queries, query_embeddings): distances = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, "cosine")[0] # 计算带权重的最终得分 results = [] for idx, distance in enumerate(distances): base_score = 1 - distance # 匹配到核心关键词则加分 for kw in core_keywords: if kw.lower() in corpus[idx].lower(): base_score += core_kw_weight results.append((idx, base_score)) # 按加权后的得分降序排序 results = sorted(results, key=lambda x: -x[1]) print("\n======================\n") print("Query:", query) print("\nTop 10 most similar sentences in corpus:") for idx, score in results[0:closest_n]: print(corpus[idx].strip(), "(Score: %.4f)" % (score))调整后含牛奶的饮品类结果得分会超过巧克力糖果类结果,实现优先排序。
方案2:加入商品分类权重
提前给所有语料库的商品打分类标签,比如本案例中三个商品的分类分别是「饮品/植物蛋白饮」、「零食/巧克力糖果」、「饮品/蛋白饮」,当识别到query属于饮品搜索需求时,给分类为饮品的结果额外加权重,比关键词匹配准确率更高,能避免把含有「milk」关键词的非饮品结果排到前面。方案3:微调预训练模型
如果你有大量的领域搜索点击数据,可以用SentenceTransformer的对比学习训练方式微调现有模型:把用户搜索query和点击的商品标题作为正样本,query和曝光未点击的商品标题作为负样本训练,微调后的模型会自动学习到领域内的语义匹配优先级,无需额外规则即可输出符合需求的排序结果。
内容的提问来源于stack exchange,提问作者Juned Ansari
相关产品推荐
相关产品推荐

