langchain 的色度 `vectordb.similarity_search_with_score()` 和 `vectordb.similarity_search_with_relevancy_scores()` 返回相同的输出

Shu*_*ngh 8 nlp langchain

我一直在使用 langchain 的色度矢量数据库。它有两种使用分数运行相似性搜索的方法。

  1. vectordb.similarity_search_with_score()
  2. vectordb.similarity_search_with_relevance_scores()

根据文档,第一个应该返回 的余弦距离float。 在此输入图像描述

越小越好。

第二个应该返回从 0 到 1 的分数,0 表示不相似,1 表示相似。 在此输入图像描述

但是当我尝试相同的方法时,它给出了完全相同的结果和相同的分数,这超出了上限 1,第二个函数不应该出现这种情况。

这里发生了什么?

小智 8

如果您正在使用 Chroma,则应该在创建集合时设置距离度量:https://docs.trychroma.com/usage-guide#changing-the-distance-function

默认距离为 l2。3626.016357421875这就是为什么对我来说它过去常常像使用函数时那样给出分数similarity_search_with_relevance_scores()。将其更改为 后cosine,分数现在介于 (0, 1] 之间,分数越接近 1 则表示相似性越高。

Chroma.from_documents(documents=documents, embedding=cohere, collection_metadata={"hnsw:space": "cosine"})
Run Code Online (Sandbox Code Playgroud)


msk*_*klc 5

我遇到过这个问题,如下:

vectordb.similarity_search()并以相同的顺序vectordb.similarity_search_with_score()返回完全相同的前 n 个卡盘。similarity_search_with_score()还有分数数据。我认为这些数据对于过滤掉不相关的卡盘很重要。

另一方面,我读到该vectordb.similarity_search_with_relevance_scores()方法更复杂,需要更多处理来计算相似度分数,但vectordb.similarity_search_with_score()在数十次比较中,我得到了与该方法几乎相同持续时间的完全相同的结果。

在这方面引起我注意的另一个问题是这两种方法返回的分数的含义!官方文档中表示,分数越小,相似度越高。我还读到分数的范围在 -1 和 1 之间。

在我的测试中,我得到了不同的分数。例如,一些不相关的结果为 1.9、2.03 和 0.03 ...

这是什么原因呢?为什么ia分数是1.9?

我使用 ChromaDB 作为向量数据库,并且 ChromaDB 在索引和搜索之前标准化嵌入向量作为默认!。因此,使用默认用法,标准化后我们可以获得 1.9。为了获得 -1 到 1 范围内的相似度分数,我们需要normalize_embeddings=False在创建 ChromaDB 实例时禁用标准化。

根据我的经验,我可以说标准化分数在 0.6-1.2 之间具有更高的相似性。