У меня есть два вопроса:
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})
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
должен соответствовать количеству измерений вашей модели внедрения (например, 1536 — значение по умолчанию для text-embedding-3-small, 3072 для text-embedding-3-large и т. д.).
как говорили другие, он настраивается в определении типа поля
если вы хотите получить документы и получить их сходство из вектора, нет необходимости выбирать функцию сходства, как это можно запросить в другом векторном хранилище, поскольку для косинуса и евклидова расстояния solr уже напрямую обеспечивает сходство в ответе
обратите внимание, что это не относится к dot_product (более высокое значение означает большее сходство), особенно если оно не нормализовано.