如何更改“langchain”相似度搜索中的距离函数

问题描述 投票:0回答:2

我有两个问题:

  1. 如何直接在函数中更改距离度量
    similarity_search
    。因为默认情况下函数
    similarity_search
    使用欧几里德距离,我想要例如余弦。我可以这样做吗?
from eurelis_langchain_solr_vectorstore import Solr

embeddings_model = OpenAIEmbeddings(model="bge-small-en")

vector_store = Solr(embeddings_model, core_kwargs={
    'page_content_field': 'content',  # field containing the text content
    'vector_field': 'content_vec',    # field containing the embeddings of the text content
    'core_name': 'default',         # core name
    'url_base': 'http://localhost:8983/solr' # base url to access solr
})

# here I want to use cosine distance metric
vector_store.similarity_search("relevant question", k=5)

  1. 如何直接在
    as_retriever
    中更改距离度量?
# here I want to use cosine distance metric
retriever = vector_store.as_retriever(search_kwargs={'k': 5}) 

solr langchain large-language-model
2个回答
0
投票

您使用 eurelis_langchain_solr_vectorstore Solr 的第 3 方 Langchain VectorStore 实现。它假设您有一个现有的 Solr 索引。相似度函数是在 Solr 索引配置中为每个向量字段定义的。请参阅示例索引架构中的字段类型定义


0
投票

1-2。你不能那样做。距离函数是您在向量数据库中定义的参数,即在 Solr 中,索引之前的

content_vec
字段类型定义(请参见下面的示例)。

此外,OpenAI 嵌入被标准化为单位长度,这意味着(参见FAQ):

  • 余弦相似度和欧氏距离将导致 相同的排名
  • 仅使用一个点就可以更快地计算余弦相似度 产品

Solr 文档还指出,执行余弦相似性的首选方法是将所有向量标准化为单位长度并使用

dot_product
作为相似性函数,而不是
cosine
(DenseVectorField)。

因此,例如在 Solr schema.xml 中,您将具有以下内容:

<fieldType name="knn_vector" class="solr.DenseVectorField" vectorDimension="1536" similarityFunction="dot_product"/>
<field name="content_vec" type="knn_vector" indexed="true" stored="true"/>

注意

vectorDimension
参数必须与嵌入模型的维度数匹配(例如,text-embedding-3-small 的默认值是 1536,text-embedding-3-large 的默认值是 3072,等等)。

© www.soinside.com 2019 - 2024. All rights reserved.