Векторный поиск Redis не возвращает необходимое количество документов для больших K

Я развернул сервер RedisSearch для проверки поиска по сходству векторов. Я почти точно следовал этому руководству, используя алгоритм HNSW:

  1. Использование Redis в качестве векторной базы данных с OpenAI

Моей основной целью было проверить производительность 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

0 ответов

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