Векторный поиск Redis не возвращает необходимое количество документов для больших K
Я развернул сервер RedisSearch для проверки поиска по сходству векторов. Я почти точно следовал этому руководству, используя алгоритм HNSW:
Моей основной целью было проверить производительность RedisSearch для наборов данных среднего размера (~20 миллионов документов) и большого количества возвращаемых документов (от ~5_000 до 10_000), поскольку решение ElasticSearch для поиска по сходству векторов работало очень медленно, когда мы начали увеличиватьk
иnum_candidates
чтобы вернуть большой результирующий набор.
У нас есть модель встраивания, и на основе тестов с ES она генерирует адекватные встраивания.
Итак, поскольку нам нужно было только протестировать производительность (временной аспект) Redis VSS, чтобы сэкономить время и деньги на создании реальных внедрений с помощью нашей модели, я создал поддельные внедрения для каждого документа следующим образом:
list(np.random.rand(1024))
а затем проиндексировал 20 миллионов документов в Redis. Итак, теперь, когда я выполняю поиск и запрашиваю 1_000 документов, я постоянно получаю обратно 1_000 документов. Но запрашивая 5_000 документов и более, я начинаю получать либо пустые наборы, либо наборы с количеством документов меньше заданного.
Эту часть я не понимаю. Нигде в коде я не указал, что мне нужны документы с показателем сходства выше какого-то определенного значения. Мне просто нужно 5_000 или 10_000 документов с любым баллом.
Как я могу заставить Redis VSS возвращать необходимое количество документов с любым показателем сходства?
Фрагмент поиска:
def search_redis(
redis_client: redis.Redis,
user_query: str,
index_name: str = INDEX_NAME,
vector_field: str = "embedding",
return_fields: list = ["id", "user_id", "title", "vector_score"],
hybrid_fields = "*",
k: int = 100,
):
embedded_query = get_fake_embeddings() # 1024 random floats
base_query = f'{hybrid_fields}=>[KNN {k} @{vector_field} $vector AS vector_score]'
query = (
Query(base_query)
.return_fields(*return_fields)
.sort_by("vector_score")
.paging(0, k)
.dialect(2)
)
params_dict = {"vector": np.array(embedded_query).astype(dtype=np.float32).tobytes()}
results = redis_client.ft(index_name).search(query, params_dict)
return results.docs