提问人:Aftaab Zia 提问时间:11/6/2023 更新时间:11/6/2023 访问量:35
使用预训练的 BERT 模型进行语义搜索,提供具有高度相似性的不相关结果
Semantic search with pretrained BERT models giving irrelevant results with high similarity
问:
我正在尝试创建一个语义搜索系统,并尝试了 SentenceTransformer 库中的多个预训练模型:LaBSE、MS-MARCO 等。该系统在首先返回相关文件方面运行良好,概率很高,但问题是不相关的文件也以相对较高的概率出现。因此,很难确定什么是相关的,什么是不相关的。
为了计算向量相似性,我尝试了 Elasticsearch 近似 KNN 和 FAISS,两者的结果相似。还检查了与 Scikit-learn 的确切余弦相似性。
我的语料库一般有15-30个单词的句子,输入的句子<10个单词长。示例如下
语料库文本 1:<brand_name> 是一家时装屋。我们设计、制造和零售男女服装 输入句1:男装 余弦相似度 1:0.21
语料库文本 2:是一款披萨外卖应用 输入句子 2:个人贷款 余弦相似度 2:0.16
请建议可能适合此目的的预训练模型。
我已经尝试了许多预训练模型,例如来自句子转换器的 LaBSE、ms-marco-roberta-base-v3,但在所有这些模型中都看到了相同的行为。期望不同句子的嵌入具有较少的余弦相似性
答:
如果您还没有这样做,请查看对称语义搜索和非对称语义搜索之间的区别,以及专门为此训练的相应模型:
根据我对您的用例的理解,使用非对称搜索可能会获得更好的结果。
重新排名也有很大帮助。看这个:
https://www.sbert.net/examples/applications/retrieve_rerank/README.html
另外,您可能还想看看 Weaviate。对于他们的矢量搜索,他们实现了一个自动切割功能:
https://weaviate.io/developers/weaviate/search/similarity#autocut
自动剪切采用正整数参数 N,查看距离 在每个结果和查询之间,并在以下时间后停止返回结果 距离的第N次“跳跃”。例如,如果距离为 6 nearText 返回的对象为 [0.1899, 0.1901, 0.191, 0.21, 0.215, 0.23] 然后自动剪切:1 将返回前三个对象,自动剪切:2 将返回除最后一个对象之外的所有对象,自动剪切:3 将返回所有对象 对象。
Weaviate也有一个很好的混合搜索实现(结合了向量和词法搜索),也可能对你有所帮助。
评论