elasticsearch 使用预训练的BERT模型进行语义搜索,得到高相似度的不相关结果

dsekswqp  于 6个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(74)

我正在尝试创建一个语义搜索系统,并尝试了来自SentenceTransformers库的多个预训练模型: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,但在所有这些模型中看到了相同的行为。

wz8daaqr

wz8daaqr1#

如果你还没有这样做,看看对称和非对称语义搜索之间的区别,以及专门为此训练的相应模型:
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。对于他们的矢量搜索,他们实现了一个AutoCut函数:
https://weaviate.io/developers/weaviate/search/similarity#autocut

Autocut接受一个正整数参数N,查看每个结果与查询之间的距离,并在距离的第N次“跳跃”后停止返回结果。例如,如果nearText返回的六个对象的距离为[0.1899,0.1901,0.191,0.21,0.215,0.23],则autocut:1将返回前三个对象,autocut:2将返回除最后一个对象之外的所有对象,autocut:3将返回所有对象。

Weaviate也有一个nice hybrid search implementation(结合向量和词汇搜索),可能也会帮助你。

相关问题