使用预训练的 BERT 模型进行语义搜索,提供具有高度相似性的不相关结果

Semantic search with pretrained BERT models giving irrelevant results with high similarity

提问人:Aftaab Zia 提问时间:11/6/2023 更新时间:11/6/2023 访问量:35

问:

我正在尝试创建一个语义搜索系统,并尝试了 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,但在所有这些模型中都看到了相同的行为。期望不同句子的嵌入具有较少的余弦相似性

elasticsearch bert-language-model knn 语义搜索

评论

0赞 Corey Alix 11/15/2023
提供的答案对您有帮助吗?你取得进展了吗?

答:

2赞 petezurich 11/6/2023 #1

如果您还没有这样做,请查看对称语义搜索和非对称语义搜索之间的区别,以及专门为此训练的相应模型:

https://www.sbert.net/examples/applications/semantic-search/README.html#symmetric-vs-asymmetric-semantic-search

根据我对您的用例的理解,使用非对称搜索可能会获得更好的结果。

重新排名也有很大帮助。看这个:

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也有一个很好的混合搜索实现(结合了向量和词法搜索),也可能对你有所帮助。

评论

1赞 Aftaab Zia 11/16/2023
自动剪切是非常有用的功能,我没有使用 weaviate,而是使用 python 中的 kneed 包来进行膝盖或肘部检测。我已经用MS MARCO模型研究了不对称语义搜索,这些模型也没有多大用处。