Коллекции

Концепция коллекций в векторной базе данных Qdrant может быть аналогичной структуре таблиц в MYSQL, используемых для равномерного хранения данных одного типа векторов. Каждая запись данных, хранящаяся в коллекции, называется точкой в Qdrant. Здесь точка похожа на математическое понятие геометрического пространства, представляющее векторное представление в геометрическом пространстве (просто рассматривайте ее как кусок данных).

В одной и той же коллекции вектор каждой точки должен иметь одинаковое количество измерений и сравниваться с использованием одной метрики. Именованные векторы могут использоваться для включения нескольких векторов в одну точку, при этом каждый вектор имеет свои собственные измерения и требования к метрике.

Метрики расстояния используются для измерения сходства между векторами. Выбор метрики зависит от того, как получены векторы, особенно от метода, используемого для обучения кодировщиков нейронных сетей.

Qdrant поддерживает следующие популярные типы метрик:

  • Скалярное произведение: Dot
  • Косинусная схожесть: Cosine
  • Евклидово расстояние: Euclid

Для повышения эффективности поиска косинусная схожесть достигается путем взятия скалярного произведения нормализованных векторов. При загрузке векторы автоматически нормализуются. В дополнение к метрикам и размерам векторов, каждая коллекция также использует свой набор параметров для управления оптимизацией коллекции, построением индекса и очисткой. Эти настройки могут быть изменены в любое время по соответствующим запросам.

Настройка мультиклиентности

Сколько коллекций следует создать? В большинстве случаев достаточно создать одну коллекцию с разделением на основе нагрузки. Этот подход известен как мультиклиентность. Для большинства пользователей это эффективно, но требует дополнительной конфигурации. Узнайте, как настроить мультиклиентность.

Когда следует создавать несколько коллекций? Когда у вас ограниченное количество пользователей и требуется изоляция. Этот подход более гибок, но может быть более затратным, поскольку создание большого количества коллекций может привести к избыточным ресурсам. Кроме того, необходимо обеспечить, чтобы они не взаимодействовали друг с другом ни в коем случае, включая в плане производительности.

Создание коллекции

PUT /collections/{название_коллекции}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

Помимо обязательных параметров, для следующих параметров коллекции могут быть указаны пользовательские значения:

  • hnsw_config - Для подробной информации о настройках индекса обратитесь к секции индекса.
  • wal_config - Конфигурация, связанная с логированием операций предварительной записи. Для более подробной информации о WAL обратитесь к ней.
  • optimizers_config - Для подробной информации об оптимизаторах обратитесь к секции оптимизаторов.
  • shard_number - Определяет, сколько разделов должно быть у коллекции. Для получения дополнительной информации обратитесь к разделу распределенного развертывания.
  • on_disk_payload - Определяет расположение хранения данных полезной нагрузки. Если установлено значение true, данные полезной нагрузки будут храниться только на диске. Это может быть очень полезно для ограничения использования ОЗУ при работе с большими нагрузками.
  • quantization_config - Для получения подробной информации о квантовании обратитесь к квантованию.

Параметры по умолчанию для необязательных параметров коллекции определены в файле конфигурации.

Для получения дополнительной информации о параметрах коллекции и векторов обратитесь к определению схемы и файлу конфигурации.

Доступно с версии v1.2.0

Векторы хранятся в ОЗУ для быстрого доступа. Параметр on_disk может быть установлен в конфигурации векторов. Если установлено значение true, все векторы будут храниться на диске. Это позволит использовать отображение памяти, подходящее для импорта больших объемов данных.

Создание коллекции из другой коллекции

Доступно с версии v1.0.0

Коллекцию можно инициализировать из уже существующей коллекции.

Это может быть полезно для быстрой попытки различных конфигураций одного и того же набора данных.

При настройке векторной конфигурации в новой коллекции убедитесь, что у векторов одинаковый размер и функция расстояния, как и в исходной коллекции.

PUT /collections/{название_коллекции}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    },
    "init_from": {
       "collection": {название_исходной_коллекции}
    }
}

Многовекторная коллекция

Доступно с v0.10.0

Каждая запись может содержать несколько векторов. Эта функция позволяет хранить несколько векторов в коллекции. Чтобы отличить векторы в каждой записи, укажите их уникальные имена при создании коллекции. У каждого именованного вектора в этой схеме есть свое собственное расстояние и размер:

PUT /collections/{collection_name}

{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}

Для нескольких специальных случаев также можно создать коллекцию без хранения векторов.

Доступно с v1.1.1

Для каждого именованного вектора можно дополнительно указать hnsw_config или quantization_config, чтобы отклониться от конфигурации коллекции. Это можно использовать для оптимизации производительности поиска на уровне вектора.

Доступно с v1.2.0

Векторы хранятся в памяти для быстрого доступа. Для каждого вектора on_disk можно установить в true, чтобы всегда хранить все векторы на диске. Это позволит использовать отображение памяти, подходящее для загрузки больших объемов данных.

Удаление коллекции

DELETE /collections/{collection_name}

Обновление параметров коллекции

Динамическое обновление параметров может быть полезным, например, для более эффективной начальной загрузки векторов. Например, можно отключить индексацию во время загрузки и включить ее сразу после завершения загрузки. Таким образом, вы не будете тратить лишние вычислительные ресурсы на перестройку индекса.

Следующая команда включает индексацию для сегмента, содержащего векторы размером более 10000 килобайт:

PATCH /collections/{collection_name}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

Можно обновить следующие параметры:

  • optimizers_config - См. подробные описания оптимизаторов
  • hnsw_config - См. подробные описания индекса
  • quantization_config - См. подробные описания квантования
  • vectors - Конфигурация для конкретных векторов, включая их соответствующие настройки hnsw_config, quantization_config и on_disk
  • params - Другие параметры коллекции, включая write_consistency_factor и on_disk_payload

Полная спецификация API находится в определениях схемы.

Доступно с v1.4.0

Qdrant 1.4 добавляет поддержку обновления большего числа параметров коллекции во время выполнения. Индекс HNSW, квантование и конфигурация диска теперь могут быть изменены без пересоздания коллекции. Сегменты (с данными индекса и квантования) автоматически перестроятся в фоновом режиме для соответствия обновленным параметрам.

В следующем примере обновляются все коллекция в целом и параметры индекса HNSW и квантования для my_vector:

PATCH /collections/{collection_name}

{
    "vectors": {
        "my_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "product": {
                    "compression": "x32",
                    "always_ram": true
                }
            },
            "on_disk": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "scalar": {
            "type": "int8",
            "quantile": 0.8,
            "always_ram": false
        }
    }
}

Примечание: Для обновления параметров векторов в коллекции без именованных векторов можно использовать пустое значение ("").

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

Информация о коллекции

Qdrant позволяет определить конфигурационные параметры существующей коллекции для лучшего понимания распределения точек и ситуации с индексацией.

GET /collections/{collection_name}

{
    "result": {
        "status": "green",
        "optimizer_status": "ok",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "Cosine"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": false
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ok",
    "time": 0.00010143
}

Если в коллекцию добавляются векторы, поле status может измениться на "yellow" во время оптимизации и вернется к "green", как только все точки успешно обработаны.

Встречаются следующие цветовые состояния:

  • ? green: Коллекция готова
  • ? yellow: Коллекция проходит оптимизацию
  • ? red: Движок столкнулся с неисправимой ошибкой

Некоторые другие интересные свойства включают:

  • points_count - Общее количество объектов (векторов и их нагрузок), хранимых в коллекции
  • vectors_count - Общее количество векторов в коллекции. Если у каждого объекта несколько векторов, это может не совпадать с points_count.
  • indexed_vectors_count - Общее количество векторов, хранимых в индексе HNSW. Qdrant не хранит все векторы в индексе, только те, которые могут создавать сегменты индекса на основе заданной конфигурации.

Индексация векторов в HNSW

В некоторых случаях вы можете обнаружить, что значение indexed_vectors_count меньше, чем vectors_count. Это является намеренным поведением в зависимости от конфигурации оптимизатора. Новый сегмент индекса будет создан, если размер неиндексированных векторов превышает indexing_threshold (в KB). Если ваша коллекция очень мала или размерность вектора низкая, сегменты HNSW могут не создаваться, и indexed_vectors_count может равняться 0.

Вы можете уменьшить значение indexing_threshold в параметрах коллекции, чтобы создать новый сегмент индекса в существующей коллекции.

Псевдонимы коллекции

В производственной среде может возникнуть необходимость без проблем переключаться между различными версиями векторов, например, при обновлении до новой версии нейронных сетей.

В таких случаях может быть невозможно остановить службу и перестроить коллекцию с использованием новых векторов. Псевдоним - это дополнительное имя для существующей коллекции. Запросы могут быть полностью выполнены с использованием псевдонима вместо имени коллекции.

Таким образом, в фоновом режиме можно создать вторую коллекцию, а затем псевдоним можно переключить с старой коллекции на новую коллекцию. Поскольку изменения псевдонима являются атомарными, параллельные запросы не затрагиваются во время процесса переключения.

Создание псевдонима

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "example_collection"
            }
        }
    ]
}

Удаление псевдонима

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        }
    ]
}

Переключение коллекции

Можно атомарно выполнить несколько операций с псевдонимом. Например, вы можете использовать следующую команду для переключения основной коллекции:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        },
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "new_collection"
            }
        }
    ]
}

Псевдонимы коллекций списка

GET /collections/{collection_name}/aliases

Перечислить все псевдонимы

GET /aliases

Перечислить все коллекции

GET /collections