Как изменить функцию расстояния в langchainпохожий_поиск

У меня есть два вопроса:

  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}) 

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
209
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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 (более высокое значение означает большее сходство), особенно если оно не нормализовано.

Другие вопросы по теме