我有两个问题:
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)
as_retriever
中更改距离度量?# here I want to use cosine distance metric
retriever = vector_store.as_retriever(search_kwargs={'k': 5})
您使用 eurelis_langchain_solr_vectorstore Solr 的第 3 方 Langchain VectorStore 实现。它假设您有一个现有的 Solr 索引。相似度函数是在 Solr 索引配置中为每个向量字段定义的。请参阅示例索引架构中的字段类型定义。
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,等等)。