Получить известную оценку сходства векторов элементов одного индекса в Redis Stack

Скажем, у меня есть два индекса со следующей схемой.

      SCHEMA = [
  TextField("id"),
  VectorField("embedding", "FLAT", {"TYPE": "FLOAT32", "DIM": 768, "DISTANCE_METRIC": "COSINE"}),
]

У меня есть два известных идентификатора из каждого индекса. Можно ли получить оценку сходства векторов между этими двумя объектами из Redis? Вот пример кода Python, показывающий, как документы примерно описывают запросы.

      query = ???
query_vector = redis.hget(key="embedding", name="products:23")
results = redis.ft("services").search(query, query_params={"vector": query_vector})

1 ответ

Если вы знаете, между какими двумя документами вы хотите получить расстояние, лучший способ, который я могу придумать, - это

  1. Получите встраивание одного из документов.
  2. Выполните гибридный запрос, который будет предварительно фильтровать только второй документ.

Чтобы выполнить второй шаг, вы можете попробовать использовать какое-либо поле (например, тег или числовое) с уникальным значением для каждого документа (например, само имя документа) и искать его перед выполнением запроса KNN.

Вы также можете попробовать использовать параметр запроса INKEYS, чтобы ограничить поиск только вторым документом. Из документации:

INKEYS {num} {attribute} ...ограничивает результат заданным набором ключей, указанных в списке. Первый аргумент должен быть длиной списка и быть больше нуля. Несуществующие ключи игнорируются, если только не существуют все ключи.

Наконец, гибридные запросы в redisarch используют эвристику для определения способа выполнения запроса. Если вы уверены, что предварительный фильтр пропускает один документ, вы можете указать политику для запроса вместо использования эвристики, чтобы убедиться, что он будет использоватьAD-HOC BROUT FORCE, который будет брать документы, прошедшие фильтр, и напрямую сравнивать их с запросом вместо обычного плоского способа (поскольку в вашем примере есть индекс FLAT) умножения запроса на весь набор данных. Эвристика, вероятно, выберет этот путь автоматически, но вы можете сделать это специально, добавивHYBRID_POLICYпараметр запроса:

      <filter here> =>[KNN 1 @emmbedding $BLOB HYBRID_POLICY ADHOC_BF]

И последнее замечание: в случае, если вы ищете только расстояние между двумя векторами, вы можете просто рассмотретьHGETдва вложения и выполнить умножение локально, используя Bumpy или любую другую библиотеку.

Надеюсь, это поможет!

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